8

所以我们的网络服务器应用需要连接到数据库,而其他一些应用有在启动时执行的启动脚本。

就这些应用程序而言,存储名称/密码的最佳方式是什么?

  • 安全性,例如我们可能不希望系统管理员知道数据库密码
  • 可维护性,例如在密码更改时使配置易于更改等。

windows 和 linux 解决方案都赞赏!

4

7 回答 7

10

保护密码的最佳方法是停止使用密码。使用受信任的连接: 如何:在 ASP.NET 2.0 中使用 Windows 身份验证连接到 SQL Server。然后你就没有什么可隐藏的了 - 将你的 web.config 和源发布到全世界,他们仍然无法访问你的数据库。

如果这对您不起作用,请使用ASP.NET 中的内置配置加密系统

于 2008-08-14T09:03:47.627 回答
5

PostgreSQL在他们的文档中为这种情况提供了一个很好的解决方案。本质上,您使用 ssh 将您机器上的端口桥接到远程机器上的 PostgreSQL 服务器端口。这具有三个身份验证阶段:

  1. 限制对本地端口的访问,例如只让特定用户连接到它。
  2. 使用 ssh 作为特定用户设置与 PostgreSQL 主机的无密码连接。
  3. 允许用户 ssh 连接为无需密码即可本地访问 PostgreSQL。

这降低了您的用户帐户是否受到保护以及您的 ssh 配置是否合理的安全性,并且您不需要在任何地方存储密码。

编辑:我应该补充一点,这将适用于任何侦听 TCP/IP 端口的数据库。它恰好在 PostgreSQL 中有描述。而且你会希望 iptables(或 Linux 下的等价物)来做端口限制。看到这个

于 2010-05-25T07:01:51.893 回答
3

我同意 lomaxx 的观点:如果有人已经在服务器上或者可以广泛访问它(比如系统管理员),那么游戏就差不多结束了。因此,我们的想法是使用您信任的服务器,它在您希望的程度上是安全的。具体来说:

  • 您需要信任系统管理员
  • 您需要信任在同一服务器上运行代码的任何其他人(这就是为什么共享主机对我来说是一个很大的禁忌)

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

于 2008-08-14T06:41:12.330 回答
1

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

于 2008-08-14T06:12:31.013 回答
1

澄清:在安全性、可维护性方面(例如如果登录需要更改,我可以稍后找到它等)

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

谢谢!

于 2008-08-14T06:20:30.187 回答
1

在大多数情况下,我相信在纯文本文件(例如使用 base64)中混淆密码就足够了。您无法完全保护存储的密码免受具有 root 访问权限的确定系统管理员的影响,因此实际上没有必要尝试。然而,简单的混淆可以防止意外地将密码泄露给肩冲浪者。

一个更复杂的替代方法是设置一个专用的安全密码服务器,它可以:

  • 提供密码解密服务
  • 实际上存储密码供其他不太安全的服务器使用

根据所使用的网络协议,这可能无法防止使用 tcpdump 的流氓系统管理员。而且它也可能无法使用调试器来防止确定的系统管理员。那时,可能是时候看看 Kerberos 票证之类的东西了。

于 2008-08-14T07:13:19.597 回答
0

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

然而,这并不仅仅是混淆,因为您的代码很可能存储在某个源存储库中的某个地方。

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

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

最终,您的问题是密钥(您的数据库用户名/密码对)需要可供您的 Web 应用程序以编程方式、无人值守的方式使用。

于 2008-08-14T06:39:42.627 回答