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