所以我们的网络服务器应用需要连接到数据库,而其他一些应用有在启动时执行的启动脚本。
就这些应用程序而言,存储名称/密码的最佳方式是什么?
- 安全性,例如我们可能不希望系统管理员知道数据库密码
- 可维护性,例如在密码更改时使配置易于更改等。
windows 和 linux 解决方案都赞赏!
所以我们的网络服务器应用需要连接到数据库,而其他一些应用有在启动时执行的启动脚本。
就这些应用程序而言,存储名称/密码的最佳方式是什么?
windows 和 linux 解决方案都赞赏!
保护密码的最佳方法是停止使用密码。使用受信任的连接: 如何:在 ASP.NET 2.0 中使用 Windows 身份验证连接到 SQL Server。然后你就没有什么可隐藏的了 - 将你的 web.config 和源发布到全世界,他们仍然无法访问你的数据库。
如果这对您不起作用,请使用ASP.NET 中的内置配置加密系统。
PostgreSQL在他们的文档中为这种情况提供了一个很好的解决方案。本质上,您使用 ssh 将您机器上的端口桥接到远程机器上的 PostgreSQL 服务器端口。这具有三个身份验证阶段:
这降低了您的用户帐户是否受到保护以及您的 ssh 配置是否合理的安全性,并且您不需要在任何地方存储密码。
编辑:我应该补充一点,这将适用于任何侦听 TCP/IP 端口的数据库。它恰好在 PostgreSQL 中有描述。而且你会希望 iptables(或 Linux 下的等价物)来做端口限制。看到这个。
我同意 lomaxx 的观点:如果有人已经在服务器上或者可以广泛访问它(比如系统管理员),那么游戏就差不多结束了。因此,我们的想法是使用您信任的服务器,它在您希望的程度上是安全的。具体来说:
除此之外,环境变量似乎是存储这些类型凭据的流行选择,因为这意味着仅访问源(例如通过破坏开发框)不会直接显示它,而且它可以很好地本地化每个服务器(开发、测试等)。
纯文本?如果它们在您的服务器上,我希望服务器足够安全,不会允许未经授权的访问。如果人们可以访问您在服务器上的配置文件,那么早就出现了问题。
澄清:在安全性、可维护性方面(例如如果登录需要更改,我可以稍后找到它等)
@lomax:也许我可能不希望每个有权访问物理服务器的人(例如系统管理员)都看到密码。
谢谢!
在大多数情况下,我相信在纯文本文件(例如使用 base64)中混淆密码就足够了。您无法完全保护存储的密码免受具有 root 访问权限的确定系统管理员的影响,因此实际上没有必要尝试。然而,简单的混淆可以防止意外地将密码泄露给肩冲浪者。
一个更复杂的替代方法是设置一个专用的安全密码服务器,它可以:
根据所使用的网络协议,这可能无法防止使用 tcpdump 的流氓系统管理员。而且它也可能无法使用调试器来防止确定的系统管理员。那时,可能是时候看看 Kerberos 票证之类的东西了。
您可以将对称加密密钥烘焙到二进制文件中,并让该二进制文件在启动时从磁盘上的文件中读取加密的用户名/密码。
然而,这并不仅仅是混淆,因为您的代码很可能存储在某个源存储库中的某个地方。
我建议您最好使用防火墙和专用网络气泡控制对服务器的物理访问和网络访问,并将密码以明文(或 base-64 编码)存储在磁盘上,并锁定权限给您的 Web 应用程序的运行用户。
您还可以锁定数据库服务器以仅接受来自您的 Web 应用程序计算机的 IP 连接。
最终,您的问题是密钥(您的数据库用户名/密码对)需要可供您的 Web 应用程序以编程方式、无人值守的方式使用。