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

Best practice for storing passwords for automation

我知道 "how do I securely store a password?" 问题已经在这里问了很多次了;我知道答案总是 "Never do this! Store hashes, never store passwords! Use bcrypt!"

但是,当您不能使用散列进行身份验证时怎么办?例如:自动化流程。假设我编写了一个自动化应用程序,需要登录 SFTP 站点或某种需要 username/password 的外部服务。我无法使用散列对外部服务进行身份验证,那我该怎么办?

我用 C#ASP.NET 标记了这个问题,因为这是这个问题专门针对我的情况适用的两个领域。

编辑:由于评论中提出的讨论,让我澄清一下我试图解决的威胁:我想防止攻击者能够阅读普通内容- 用于访问外部服务的文本密码。这意味着,如果他们以某种方式获得了对我们的网络或数据库的非管理员访问权限,即使使用数据库转储,他们也无法读取明文密码。

AES 加密并将密钥存储在外部加密密钥存储模块中,如果您碰巧可以访问其中一个。 否则,您可以尝试将部分加密密钥分散在不同的服务器或其他服务器上,但它不应该是首选。

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

选项 (1):将数据库与 HSM 模块一起使用

您可以在数据库中存储加密的密码,并受益于 SQL 2016 "Always Encrypted (Database Engine)" 中的一项功能。 Always Encrypted 允许客户端加密客户端应用程序内的敏感数据,并且永远不会向数据库引擎(SQL 数据库或 SQL 服务器)泄露加密密钥。

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

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

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

您的应用程序可以使用那些 APIs 与 HSM 通信。

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

更多详情:

Always Encrypted (Database Engine) Using Hardware Security Modules with Always Encrypted

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

Securing Stored Data Using Transparent Data Encryption

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

  • 正在加密包含密码的文件。这可以通过操作系统、应用程序或专用实用程序(例如专门设计用于保护密码机密性的密码管理软件)来完成。

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

  • 由于您不使用散列,我排除了这个选项,但它是一种存储密码的单向加密散列而不是存储密码本身的机制。