如何加密 Web 服务器上的数据库连接凭据?

信息安全 加密
2021-08-12 05:58:09

OWASP 建议不要以纯文本形式存储数据库凭据:

https://www.owasp.org/index.php/Password_in_Configuration_File

但是,他们没有提供有关如何加密数据库访问凭据、存储密钥的位置、如何管理对密钥的访问等的建议。

有没有人在实现这种解决方案方面有任何实际经验,可以在 LAMP 堆栈(ubuntu 10,PHP 5.3)上提出架构建议?

PS - 我不是在寻找“不要打扰 - 如果有人获得 root 访问权限为时已晚”等答案。

3个回答

这里的其他答案在几个关键方面都是正确的。包含您的连接字符串的文件不应保存在世界可读的位置,并且正如您所指出的,如果有人破坏了您的服务器,您无法阻止他们获取密钥。即便如此,加密密钥(或文件)还有其他原因。OWASP 建议不要以纯文本形式存储的部分原因是为了防止将凭据意外泄露给不需要它们的人。

虽然许多人指出在运行系统上加密连接字符串几乎没有实际价值(通过默默无闻的安全性),但这主要在实时系统的上下文中是正确的。假设采用传统的 LAMP 配置,基于文件的权限将阻止除运行 php/apache 进程的脚本用户以外的任何用户进行读取。将文件放在根位置之外会提供更多潜在的安全性(在 MIME 处理程序或 .htaccess 配置错误的情况下),但并非绝对必要。

隔离连接设置的最大价值在于,不再需要将身份验证详细信息和数据分发给可能真正需要连接到服务器的开发人员/测试人员或其他个人。通过使连接细节不受源代码控制和一般分布的影响,您可以减少丢失或泄漏的可能性。

第二个好处是源的分发和备份。当然,最佳做法是只传输包含敏感连接和帐户信息的文件,这些文件本身已加密,但由于许多原因,这并不总是可行的。因此,如果使用加密,则将密钥与连接字符串分开并将连接字符串与源分开是必不可少的操作。这样做将加密密钥(或配置文件)的职责和保护分开,并成为系统管理员功能,而不是开发人员功能。

顺便说一句,在 Apache/php 中你有很多选择。

1.) 根本不要将连接字符串放在 php 代码中。您可以将这些值放在您的httpd.conf或虚拟主机文件中。然后在使用时连接不需要参数mysql_connect()......更详细的使用在这里可用:http ://www.php.net/manual/en/class.mysqli.php

2.) 像往常一样包含 configfile.php 配置文件,但如果可以的话,将连接文件移出 webroot,并对文件本身进行加密。操作系统解密可以由 SA 为将访问文件的进程设置。交替使用如果您无法将文件移出 webroot(共享主机),请使用以下命令保护文件.htaccess

<files configfile> 
     order allow,deny 
     deny from all 
</files> 

对于带有 ASP.NET 的 Microsoft IIS,连接字符串存储在 application.config 或 web.config 文件中,使用的加密可以是静态机器密钥,存储在这些文件中,也可以是 IIS 本身生成的密钥 -它没有存储在可访问的位置。MSDN 上提供了详细信息,因为您的问题是针对 LAMP 的,所以我不会乱扔这个答案。

我还应该注意,如果可能的话,我的偏好是通过使用集成身份验证来完全避免这个问题。将 OS 用户映射到 db 用户几乎完全将保护要求从这个问题的上下文中拉出来。

我对此几乎没有经验,但我一直听说您将其保留为纯文本(如果密钥仍然存在,那么加密有什么意义)并将凭据留在包含文件中,然后对该文件进行非常严格的访问控制.

以我在网络方面的经验……做事的方法有很多……做得好的方法很少。

(来自我的电话,请原谅我的简短)

加密数据库密码几乎没有用处。在 PHP 的情况下,您甚至需要在每个请求上运行加密代码 - 这只是浪费 CPU 时间。除此之外,还有很多其他原因表明这不是一个好主意:

  • 您的应用程序需要解密数据。由于在 PHP 配置文件中很可能也是 PHP 文件,因此有权访问配置文件的人很可能也有权访问包含解密代码/密钥的文件。
  • 解密密码浪费CPU时间。
  • 如果数据库配置正确,密码不会给您带来任何好处 - 访问权限应限制为 localhost(或任何运行 Web 服务器的主机),如果 phpMyAdmin 等工具在服务器上,则应使用不同的保护密码。实际上,如果 PostgreSQL 在本地运行,您可能根本不需要密码,因为您可以简单地授予系统用户访问某个数据库的权限 - 因此,如果您的 PHP 代码以该用户身份运行,您可以避免为数据库存储任何密码。

所以..你做些什么才有意义?很简单,不要在文档根目录中放置超过绝对必要的文件。由于通常好的应用程序使用通过单个 .php 文件路由的干净 URL,因此只会将该文件放在文档根目录中。其他任何东西——即其他应用程序代码、配置文件等都应该在文档根目录之外。这样,服务器配置错误(例如 PHP 引擎被禁用,因此向用户发送纯代码)只会让用户访问单个 PHP 文件,该文件可能只包含一个require调用和一些函数调用。

还要确保您的文件不是全球可写/可读的(尤其是当您必须使用共享主机时)。使用正确配置的服务器(php 不是以 www-data 或类似用户身份运行,而是您的用户),您可以完全禁用对文件的“世界”和可能的“组”访问。