在启动脚本/配置文件中存储数据库密码的最佳方法是什么?

8

因此,我们的Web服务器应用程序需要连接到数据库,而其他一些应用程序具有在启动时执行的启动脚本。

就安全性和可维护性而言,存储这些应用程序的名称/密码的最佳方式是什么?例如,我们可能不希望系统管理员知道数据库密码,并且使配置易于更改密码等。

欢迎提供Windows和Linux解决方案!

7个回答

10

5
PostgreSQL在其文档中提供了一个不错的解决方案,用于此类情况。基本上,您使用ssh将本地机器上的端口与远程机器上的PostgreSQL服务器端口桥接起来。这有三个身份验证阶段:
  1. 限制对本地端口的访问,例如只允许特定用户连接。
  2. 使用ssh以特定用户身份设置无密码连接到PostgreSQL主机。
  3. 允许ssh连接的用户在没有密码的情况下访问本地的PostgreSQL。
这将安全性降低到您的用户帐户是否安全以及ssh配置是否正确,并且您不需要在任何地方存储密码。 编辑:我应该补充说明,这将适用于任何监听TCP / IP端口的数据库。它只是在PostgreSQL中描述的。您将需要iptables(或Linux的等效物)来执行端口限制。请参见this

3

我同意lomaxx的观点:如果有人已经在服务器上或者拥有广泛的访问权限(比如系统管理员),那么游戏基本上就结束了。因此,想法就是使用你信任的服务器,以达到你所期望的安全程度。具体来说:

  • 你需要相信系统管理员
  • 你需要信任其他运行在同一台服务器上的人的代码(这就是为什么我认为共享主机是大忌)

除此之外,环境变量似乎是存储这些凭据类型的流行选择,因为这意味着仅访问源(例如通过攻击开发环境)不直接透露它,并且可以很好地本地化至每个服务器(开发、测试等)。


可以想象,Web服务器中的漏洞可能会允许攻击者获取配置文件,但仍然不允许完全访问服务器。因此,出于这个原因,并且因为通常在构建深度防御时需要考虑到这一点,您不应该将敏感数据存储在非加密状态下。 - AJ.

1

纯文本?如果它们在您的服务器上,我希望服务器足够安全,不允许未经授权的访问。如果人们可以访问服务器上的配置文件,那么早期就出了问题。


按照这种策略进行操作将会错失建立深度防御的机会。 - AJ.

1

澄清一下:就安全性和可维护性而言(例如,如果登录需要更改,我能否稍后找到它等),

@lomax:也许我不希望所有有物理服务器访问权限的人(例如系统管理员)都能看到密码。

谢谢!


1
在大多数情况下,我认为将密码混淆在明文文件中(例如使用base64)就足够了。您无法完全保护存储的密码免受具有root访问权限的决心系统管理员的攻击,因此实际上没有必要尝试。然而,简单的混淆可以防止意外地向肩膀窥视者泄露密码。
更复杂的替代方案是设置一个专用的安全密码服务器,该服务器可以提供以下服务之一:
- 提供密码解密服务 - 实际上存储密码以供其他不太安全的服务器使用
根据使用的网络协议,这可能无法防止使用tcpdump的流氓系统管理员的攻击。并且它可能也无法防止具有调试器的决心系统管理员的攻击。此时,可能需要考虑使用Kerberos票证。

0

您可以将对称加密密钥嵌入到二进制文件中,并在启动时从磁盘上的文件中读取加密的用户名/密码。

然而,这实际上不过是混淆,因为您的代码很可能存储在某个源代码库中。

我建议您最好使用防火墙和私有网络气泡来控制物理和网络访问服务器,并将密码明文(或base-64编码)存储在磁盘上,并将权限锁定为Web应用程序的运行用户。

您还可以通过IP锁定数据库服务器,仅接受来自Web应用程序机器的连接。

最终,您的问题在于密钥(您的DB用户名/密码对)需要在Web应用程序中以编程方式进行无人值守使用。


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