将敏感数据存储在内存中


Storing sensitive data in memory

我的应用程序需要访问一些敏感数据(在本例中为加密密钥)。此时,我将它们存储在文件中,以便在处理脚本时可以读取它们。

但是,根据我必须遵循的安全标准,它不够安全,因为如果服务器root帐户遭到入侵,有人可能很容易读取和复制它们。

典型的解决方案是挂载外部存储器包含密钥,启动应用程序,卸载内存并让其运行缓存在RAM中的数据。当然,因为它是PHP,所以这是不可能的。

还有其他解决方案吗?在这一点上,我唯一的想法是带有将提供密钥的小侧面应用程序,但我不确定它应该如何工作以确保安全。

如您所知,无论您做什么,如果密钥可用于应用程序,那么它肯定会可用于在服务器上获得root访问权限的恶意代码,并且很可能也可用于已获得对运行应用程序的UID的访问权限的代码。这只是一个容易程度的问题。

购买是因为您的应用程序不是长时间运行的,听起来您将不得不接受超出此范围的风险水平。

您的想法是使用某种守护程序,它将密钥保存在RAM中,并且可以由应用程序查询。这有效,但您可能已经意识到,如果您的应用程序可以查询它,那么恶意代码也可以查询它。如果你还是选择这个选项,考虑使用memcached(为什么要重新发明轮子?)。

我能想到的唯一其他选择是编写一个 Apache 模块(用 C 语言),在系统启动时加载密钥(之后卸载密钥的持久副本)和一个 PHP 扩展(用 C 语言)从存在于同一进程中的 Apache 模块获取密钥。这假设你使用PHP作为Apache模块,而不是外部进程。但对我来说,这听起来有点矫枉过正,因为它非常复杂,实际上并没有消除风险。

您是否考虑过如何处理交换空间?如果密钥位于受限位置,您可以使用 mlock 或类似(在 C 中)来防止机密被写入交换,但是一旦将其移交给 PHP 解释器,就很难以这种方式保护它。因此,您最好在没有交换的情况下运行系统。

考虑一个设计更改,它将密钥限制在长时间运行的守护程序中的单个位置(可能不是用 PHP 编写的),并让 PHP 应用程序将需要访问密钥的加密函数委托给此守护程序。