我的应用程序需要访问一些敏感数据(在这种情况下是加密密钥)。此时我将它们存储在文件中,以便在脚本被执行时读取它们。
然而,根据我必须遵循的安全标准,它不够安全,因为如果服务器root帐户遭到入侵,则有人可能会轻易阅读&复制它们。
典型的解决方案是安装包含外部存储器的内存,启动应用程序,卸载内存,并使用ram中缓存的数据运行。当然,因为它是PHP,所以不可能。
还有其他解决方案吗?在这一点上,我唯一的想法是小方应用程序将提供密钥,但我不确定它应该如何安全。
答案 0 :(得分:0)
如您所知,无论您做什么,如果密钥可供应用程序使用,它肯定可用于已在服务器上获得root访问权限的恶意代码,并且很可能是已获得访问权限的代码应用程序运行的UID。这只是一个多么容易的问题。
购买,因为您的申请没有长期运行,听起来您将不得不接受超出该水平的风险。
您的想法是使用某种守护进程将密钥保存在RAM中,并且可以由应用程序查询。这可行,但您可能已经意识到,如果您的应用程序可以查询它,那么恶意代码也可以查询它。如果您仍然选择该选项,请考虑使用memcached(为什么重新发明轮子?)。
我能想到的唯一另一个选择是编写一个Apache模块(在C中),它在系统启动时加载秘密(之后卸载秘密的持久副本)和PHP扩展(在C中)从生活在同一进程中的Apache模块获取秘密。假设您使用PHP作为Apache模块,而不是外部进程。但对我来说,这听起来有点矫枉过正,因为它非常复杂,实际上并没有消除风险。
您是否考虑过如何处理交换空间?您可以使用mlock
或类似的(在C中)保密秘密,如果它位于一个受限制的位置,则不会被写入交换,但是一旦将其移交给PHP解释器,就很难以这种方式保护它。所以你最好在没有交换的情况下运行系统。
考虑一个设计更改,它将秘密限制在长期运行的守护程序中的单个位置(可能不是用PHP编写),并让PHP应用程序委托需要访问此守护程序的秘密的加密函数。