在 AWS 上安全地存储加密密钥

信息安全 加密 网络服务器 mysql
2021-09-05 19:25:39

无论加密格式如何,在 AWS EC2 服务器上存储加密密钥的最佳方式是什么?

我将加密信息存储在 MySQL 数据库中,并且我的加密密钥存储在代码中。从数据库中保存/检索数据时,使用此密钥对数据进行编码/解码。显然,我不希望任何人有权访问此密钥。如果机器被攻破了,那么源代码也被攻破了(但是这就是生命),也许 MySql 数据库也是如此。由于源可用,因此密钥也是可用的,攻击者可以解密数据。

避免将密钥存储在服务器上的最佳方法是什么?我认为它将把它存储在不同的服务器上,但这似乎有点传球并没有解决实际问题。

另一个问题可能是“我是否应该使用 AWS EC2 服务器”以及如果应用了所有补丁,这些事情的安全性如何。

有没有人对这种情况有任何见解?我是一个很好的程序员,但不是最精通安全性的程序员。

3个回答

这取决于“存储”以及“服务器”的含义。

为了回答,我假设现在有两个“服务器”正在使用,都在 AWS 云上:

MySQL 服务器。

应用程序服务器(当前包含您的加密密钥的代码)。

MySQL 服务器永远没有理由拥有密钥。

我假设的应用程序服务器必须处理解密的数据。

  • 如果应用程序服务器自己进行解密,它将在内存中拥有密钥。
    • 除非您检查硬件,否则您无法知道 AWS 是否曾经将内存保存到磁盘。
  • 如果应用程序服务器不需要自己进行解密,那么可以有一个服务来获取 MySQL 数据并对其进行解密,通过一些您满意的公钥/私钥加密将数据发送回应用程序服务器.

与往常一样,如果密钥在 AWS 上,则任何具有足够访问权限的 AWS 员工以及其他任何具有足够访问权限的人都可以选择(供应商、戴尔在装满硬件的容器在遭受太多故障后运回等) 。 等等。)。

一种方法是将此类敏感密钥、密码或其他凭证存储在特定的 S3 存储桶中。该存储桶不应公开访问/可用。接下来,您创建一个仅对该存储桶具有 S3 只读访问权限的 IAM 角色。最后,在启动您的 EC2 实例时,您将该 IAM 角色分配给该实例。

使用这种方法,您的 EC2 实例不需要您的 AWS 密钥/访问密钥来与 S3 通信;它由 IAM 角色自动允许。然后您的 EC2 实例上的代码/脚本可以从 S3 存储桶下载加密密钥(或其他凭证),启动该过程,然后从磁盘中删除这些凭证(假设您将它们存储在实例的磁盘上);这应该有望确保这些凭据现在仅在该 EC2 实例的内存中。

请注意,如果您尝试这种方法,您可能需要将 S3 存储桶(及其文件)的权限设置为“允许经过身份验证的 AWS 用户”,因为您的 EC2 实例将没有您的 AWS 密钥/访问密钥,因此不会被识别为您对 S3 的帐户。

希望这可以帮助!

这取决于您需要有多安全。例如,对于 PCI,您需要有两个密钥。

第一个是数据加密密钥 (DEK)。第二个是密钥加密密钥(KEK)。您使用 DEK 加密数据。您使用 KEK 来加密 DEK。这不是必需的,但强烈建议您将 KEK 存储在操作系统提供的密钥库中。然后只有创建它的登录用户才能访问它。我们创建了一个隐藏用户,应用程序以该用户身份登录以检索 KEK。

关键是通过需要在多个攻击向量上取得成功来使其更难。一个访问登录凭据,一个访问密钥库,一个访问 DEK,无论您存储什么,然后访问实际数据。这与在数据库中拥有密钥相反。在这种情况下,一旦数据库被破坏,一切都会被破坏。

您可以拆分您的 KEK 并使用一半的代码来增加另一个难度级别。我个人不喜欢以纯文本形式提供它,所以我混淆了那一半,所以他们必须查看文本和代码,这是另一个难度。

可能出于您的目的,您只需为运行您的应用程序的用户存储在密钥库中的一个密钥即可。