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

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

Best way to store a database password in a startup script / config file?

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

就这些应用程序而言,最好的存储名称/密码的方法是

  • 安全性,例如 也许我们不希望系统管理员知道数据库密码
  • 可维护性,例如 可以在更改密码等时轻松更改配置等。

Windows和Linux解决方案均表示赞赏!


保护密码的最佳方法是停止使用一个。使用受信任的连接:
如何:在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上的等效表)进行端口限制。 看到这个。


    我同意lomaxx:如果有人已经在服务器上或可以对其进行广泛访问(例如sysadmin),那么游戏就结束了。因此,想法是使用您信任的服务器,该服务器在您想要的程度内是安全的。特别:

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

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


    在大多数情况下,我认为在纯文本文件中混淆密码就足够了(例如,使用base64)。您无法针对具有root用户访问权限的确定的sysadmin完全保护存储的密码,因此,实际上没有任何需要尝试的操作。但是,简单的混淆处理可以防止意外将密码泄露给肩膀冲浪者。

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

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

    根据所使用的网络协议,这可能无法防止使用tcpdump的恶意sysadmin。而且它也可能无法避免使用调试器来确定系统管理员的身份。到那时,也许是时候来看一下Kerberos票证了。


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

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

    谢谢!


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


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

    但是,这实际上并不仅仅是混淆,因为您的代码可能存储在某个地方的某些源存储库中。

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

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

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


    推荐阅读