背景: 我在数据库中使用AES(即对称加密)加密了一些数据。在(假设的)安全且隔离的Linux机器上运行的服务器端应用程序使用此数据。它从DB读取加密数据,并写回加密数据,仅处理内存中未加密的数据。 因此,为了做到这一点,应用程序需要将密钥存储在内存中。
问题是,对此有什么好的最佳做法吗?将密钥保存在内存中。
一些想法:
SHM_LOCK
设置shmctl(2)
?)密钥泄漏原因的一些场景:恶意获取mem dump / core dump;检查代码导致信息泄漏的不良界限;
第一个似乎是一个很好而且很简单的事情,但剩下的呢?其他想法?任何标准规范/最佳实践?
感谢您的任何意见!
答案 0 :(得分:8)
全部取决于您的偏执程度和关键/数据的敏感度。在极端情况下,只要您在内存中有未加密的密钥,就可以使用coldboot技术检索它。 frozencache有一个有趣的发展,试图打败它。我只是随意地阅读它,没有在实践中尝试它,但它似乎是一种有趣的尝试方法。
虽然锡箔帽已关闭 - (1),(2),(3)看似合理。 (4)由于你提到的原因,不会精确切割它。 (不仅速度很慢,而且假设您读入堆栈,使用不同的堆栈深度,密钥可能会多次显示)。
假设解密数据是值得的,并且它将在可交换内存中,你肯定也应该加密交换本身。此外,root,/ tmp分区也应加密。这是一个相当标准的设置,在大多数操作系统指南中都可以使用。
然后,当然,您希望确保机器本身的高水平物理安全性和最小化它执行的功能 - 代码运行越少,曝光越少。您还可能希望了解如何绝对最小化远程访问此计算机的可能性 - 即使用基于RSA密钥的ssh,这将被另一个主机控制的另一个ACL阻止。在能够登录到第二个主机之前,portknocking可以用作身份验证的附加向量之一。为确保主机 受到攻击,将数据输出更加困难,确保此主机没有可直接路由到Internet的连接。 一般来说,你越是痛苦地获取敏感数据,人们去那里的机会就越少,但是这也会让普通用户的生活变得痛苦 - 所以需要有一个平衡。
如果应用程序严重且涉及的事物数量很多,最好构建更明确的整体威胁模型,并查看可以预见的可能的攻击向量,并验证您的设置是否有效处理他们。 (并且不要忘记包含human factor: - )
更新:实际上,您可以使用专用硬件来处理加密/解密。然后你不必处理密钥的存储 - 参见Hamish的回答。
答案 1 :(得分:4)
如果您对安全性非常认真,那么您可以考虑使用单独的加密子系统。最好是FIPS 140-2/3认证的(list of certified modules)
然后将密钥保存在防篡改存储器中(不可提取),并且所有加密操作都在加密边界内执行。
价格昂贵,但对于某些必要的应用程序。
答案 2 :(得分:1)
最大的问题是程序必须从某处读取密钥。除非您每次服务器重新启动时都接受直接键盘输入,否则它几乎必须存在于磁盘上。
一般情况下,你必须假设恶人无法访问根级别的操作系统或硬件,因为即使它只是在RAM中,他们最终也会设法获取密钥。
所以你假设服务器的操作系统是安全的。但是,让我们说有人可以来窃取硬盘,所以启动服务器会给他们钥匙。然后让服务器向另一台服务器询问密钥的一半,远程服务器验证请求(使用ip,私钥/公钥对)并提供一半密钥。然后你的服务器有一个完整的密钥,远程服务器永远不会超过一半。在我看来,保护水平有所提高。
答案 3 :(得分:1)
我正在看什么
处理密钥时执行。他们对这些安全问题充满了偏执......
答案 4 :(得分:1)
另外,不要忘记核心转储的威胁和你的记忆被换掉!
在POSIX(如Linux)和Windows系统上,如果您正在处理C语言,有一些技术可以防止这种情况发生 - 请参阅CERT安全编码标准中的这一部分:
MEM06-C. Ensure that sensitive data is not written out to disk
答案 5 :(得分:0)
使用“超级超级用户”硬件内存是理想的选择。所有Intel Mac都具有此SecureEnclave内存区域,并且还在硬件中包含AES解密,以便应用程序和操作系统永远不能访问原始私钥。当机器启动时,输入密码(可选),SecureEnclave将其冷闪存加密版密钥解密到其RAM区域,主操作系统无法访问该区域。
好的副作用是硬件加速加密:我在新格式化的加密磁盘上对我的PCIe存储进行了600 MB /秒的写入基准测试。
在云端,亚马逊拥有此AWS密钥管理服务(KMS)托管服务,可让您轻松创建和控制用于加密数据的加密密钥,并使用经过FIPS 140-2验证的硬件安全模块进行保护密钥的安全性:https://aws.amazon.com/kms/