如何在列级使用AWS KMS在AWS RDS中加密数据?

时间:2019-10-02 11:29:02

标签: amazon-web-services encryption amazon-rds aws-kms

我发现AWS RDS allows encrypting DB resources是使用AWS KMS的。由于它是在AWS基础设施内部完成的,因此可以轻松自动旋转加密密钥。这很酷,但它只是静态加密。

我还想对数据库中的某些特定列进行加密。例如SSN。我想将它们加密存储并解密,以显示在我的应用程序中。而且,我想为每个用户提供一个单独的密钥。

我观察到的主要问题是钥匙的旋转。当我想为一个用户旋转密钥时,我想在我的应用程序中执行此操作:

  • 从KMS获取当前的加密密钥
  • 解密使用当前密钥加密的RDS中的所有数据
  • 生成新的加密密钥
  • 再次加密所有内容并将数据存储在RDS中
  • 将新密钥存储在KMS中

这里的主要问题是使所有内容保持“事务”状态-如果一切正常,则进行“提交”,如果发生问题,则“回滚”所有内容。

我想知道是否可以在AWS基础架构内自动完成这种用于列级别加密的密钥旋转。您对此有什么想法吗?也许您知道任何其他更好的方法来解决这种情况?

3 个答案:

答案 0 :(得分:1)

每个用户拥有单独的密钥,您要解决什么问题? KMS范例是使用策略来授予对客户主密钥(CMK)的访问权限。正如Mark所指出的那样,键的数量是有限制的。

看看this walkthrough

底部有一个有关密钥轮换策略的部分,可能会有所帮助:

“建议的手动密钥轮换方法是在AWS KMS中使用密钥别名。这允许用户在配置数据库时始终选择相同的密钥别名,而密钥管理员则旋转基础CMK。通过保留旧的CMK,您可以只要CMK密钥策略仍授予AWSServiceRoleForRDS角色作为密钥用户的权限,则允许当前使用此密钥的任何应用程序仍对其解密的任何数据进行解密,还允许使用新的密钥对任何新数据进行加密CMK。“

答案 1 :(得分:0)

您是否正在使用类似AWS Cognito的方式为每个用户登录时提供临时IAM权限?否则,我看不到为每个用户提供单独的KMS密钥的意义,因为您将为单个实体(您的服务器)提供对所有密钥的访问权限。另请注意,AWS账户中最多有10,000个KMS密钥。相当多,但是如果您有一个网站可以让任何人注册,那么如果您为每个用户分配密钥,则可能会超出该限制。

对于自动处理键旋转,由于必须编写自定义代码来加密数据库中的各个列值,因此还必须编写代码以执行键旋转过程的所有步骤。您可以将其创建为AWS Lambda函数并将其配置为“自动”运行,但这并不是Amazon在没有任何自定义代码的情况下开箱即用的功能。

答案 2 :(得分:0)

  

我还想对数据库中的某些特定列进行加密。

然后我假设您将使用一种形式的密钥包装(data keys

  

我观察到的主要问题是钥匙的旋转
  ..
  再次加密所有内容并将数据存储在RDS中
  将新密钥存储在KMS中

密钥旋转的目的是限制单个密钥加密的数据量,而不是重新加密整个加密内容。

建议:

  • 已链接-使用随机(每行?)数据密钥加密数据。
  • 使用用户专用密钥对数据密钥进行加密。
  • 用KMS密钥加密用户密钥

键旋转(KMS)对您应该是透明的,无需执行任何操作。

如果您希望手动旋转用户密钥,恕我直言,它并不是那么关键-用户密钥用于加密数据密钥-相对短的数据具有较高的熵。

恕我直言,轮流采取的行动应该是创建一个新密钥,并保留旧密钥用于解密,而不是重新加密所有数据库记录