自动化存储密码的最佳实践

9
我知道这里已经有很多关于“如何安全地存储密码”的问题,而且我也知道答案总是“永远不要这样做!使用哈希函数存储密码!使用bcrypt!”。
但是当你不能使用哈希函数进行身份验证时该怎么办呢?例如自动化过程。比如说我编写了一个需要登录到SFTP站点或某种需要用户名/密码的外部服务的自动化应用程序。我无法使用哈希函数对外部服务进行身份验证,那我应该怎么做呢?
我在这个问题上标记了C#和ASP.NET,因为这两个领域对我的具体情况适用。
编辑:由于评论中提出的讨论,让我澄清一下我试图解决的威胁:我想防止攻击者能够读取用于访问外部服务的明文密码。这意味着如果他们以某种方式获得非管理员访问我们的网络或数据库,即使拥有数据库转储,他们也无法读取明文密码。

3
取决于您需要将密码存储在单个计算机上还是存储在数据库中,以便集群中的任何计算机都可以使用它。此外,您需要一个威胁模型,您需要清楚地知道要防止谁读取密码。是那些获得数据库转储的人?具有数据库转储+源代码但无法在服务器上执行代码的攻击者?可以在与IIS相同的上下文中执行代码的攻击者?具有标准用户权限的攻击者?还是具有计算机管理员权限的攻击者?我们不知道您处于哪种情况,因此无法告诉您最佳实践。 - Scott Chamberlain
@ScottChamberlain 感谢您的评论。我想最好的情况是将其存储在集群中任何机器都可以访问的位置,因为自动化应用程序分布在许多不同的机器上。至于威胁模型问题,为什么不尝试保护所有这些呢?我不希望密码在任何这些情况下被泄露... - Lews Therin
你需要一个特定的威胁模型,因为每个案例都需要时间和金钱来保护。大多数软件项目没有无限的时间和金钱来进行适当的渗透测试和硬化,以防止“所有攻击者”的攻击,除非你正在处理极高价值的软件,这是一个高威胁目标,比如管理银行转账的软件。 - Scott Chamberlain
这个问题有点过于宽泛,无法提供一个好的答案 - 你至少需要更好地定义你试图缓解的问题。 - Rowland Shaw
@ScottChamberlain 我已经编辑了我的问题,以回答你的问题。这样缩小了威胁模型,你现在能回答问题了吗? - Lews Therin
显示剩余4条评论
3个回答

2

有不同的选项,可以使用加密密码使用密钥,并使用HSM模块保护密钥存储。

选项(1):使用带有HSM模块的数据库

您可以将密码加密存储在数据库中,并从SQL 2016的一个功能“Always Encrypted(数据库引擎)”中受益。 Always Encrypted允许客户端在客户端应用程序内加密敏感数据,并永远不会向数据库引擎(SQL数据库或SQL Server)透露加密密钥。

您可以使用硬件安全模块(HSM)与Always Encrypted一起使用。

硬件安全模块(HSM)是一种物理设备,可保护数字密钥并执行加密操作。这些模块通常以插件卡或直接连接到计算机或网络的外部设备的形式出现。

当您获得HSM时,还会获得实现常见API的软件库,例如Microsoft Crypto API和Cryptography API的API提供程序。这些API称为加密服务提供程序(CSP)和加密API:下一代CNG提供程序。

您的应用程序可以使用这些API与HSM通信。

为了更加保护HSM模块,您可以: - 将HSM绑定到您的数据库服务器。 - 将HSM绑定到您的操作系统服务器的管理员登录。

了解更多详情:

始终加密(数据库引擎) 使用硬件安全模块进行始终加密

此外,Oracle数据库和其他引擎可以使用HSM提供加密

使用透明数据加密保护存储的数据

选项(2):使用HSM模块将密码存储在受保护的存储文件中:

  • 加密包含密码的文件。这可以由操作系统、应用程序或专门设计用于保护密码机密性的密码管理软件等专用工具完成。

  • 使用操作系统访问控制功能限制访问包含密码的文件。例如,可以配置主机仅允许管理员和某些以管理员权限运行的进程访问密码文件,从而防止用户和用户级别进程访问密码。

  • 由于您没有使用哈希,因此我排除了此选项,但它是一种存储密码的单向加密哈希而不是存储密码本身的机制。

1
AES加密并将密钥存储在外部加密密钥存储模块中,如果您恰好可以访问其中之一。 否则,您可以尝试将加密密钥的部分散布在不同的服务器上,但这不应该是首选。

0
在我看来,这个问题不应该使用HSM来解决,因为它也需要保存一个密码。更好的方法是只有在重新启动系统时(服务器很少重新启动,所以这没问题)才输入密码。RAM更或多或少是安全的(参见这里)。关于可能有crontab的物理服务器的小项目的讨论,请参见这里

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接