管理员无法在 AWS KMS 中加密/解密

Posted

技术标签:

【中文标题】管理员无法在 AWS KMS 中加密/解密【英文标题】:Administrator cannot encrypt/decrypt in AWS KMS 【发布时间】:2020-03-04 15:22:47 【问题描述】:

我在 AWS 中使用密钥管理服务 (KMS),目前正在设置 key policies。

我创建了两个角色 KmsUserKmsAdmin,并将以下密钥策略附加到我的 CMK:


  "Version": "2012-10-17",
  "Statement": [
    
      "Sid": "KMS KeyAdmin access",
      "Effect": "Allow",
      "Principal": "AWS": [
          "arn:aws:iam::1234567890:role/KmsAdmin",
      "arn:aws:iam::1234567890:user/myadmin"
      ],
      "Action": [
        "kms:Create*",
        "kms:Describe*",
        "kms:Enable*",
        "kms:List*",
        "kms:Put*",
        "kms:Update*",
        "kms:Revoke*",
        "kms:Disable*",
        "kms:Get*",
        "kms:Delete*",
        "kms:TagResource",
        "kms:UntagResource",
        "kms:ScheduleKeyDeletion",
        "kms:CancelKeyDeletion"
      ],
    "Resource": "*"
    ,
    
      "Sid": "KMS KeyUser access",
      "Effect": "Allow",
      "Principal": "AWS": [
          "arn:aws:iam::1234567890:role/KmsUser"
      ],
      "Action": [
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:ReEncrypt*",
        "kms:GenerateDataKey*",
        "kms:DescribeKey"
      ],
      "Resource": "*"
    
  ]

问题是,现在如果我尝试将我的密钥用作 myadmin 用户(附加了 AdministratorAccess 策略),我会在 CLI 中收到错误:

$ aws kms encrypt --key-id "alias/test-key" --plaintext fileb:///tmp/plaintext.dat

An error occurred (AccessDeniedException) when calling the Encrypt operation: User: arn:aws:iam::1234567890:user/myadmin is not authorized to perform: kms:Encrypt on resource: arn:aws:kms:eu-north-1:1234567890:key/99999999-9999-9999-9999-99999999999

特别奇怪的是,IAM policy simulator 告诉我一切都应该按预期工作:

如果我手动将 myadmin 用户添加为 Key User 策略的主体,则一切正常。

【问题讨论】:

其实以上政策是针对职责分离的。密钥管理员不应该能够使用密钥加密或解密数据。所以管理员可以管理密钥,但不能访问数据。密钥用户可以加密或解密数据,但不能管理密钥。所以正确的答案是使用 KmsUser 角色来解密/加密。 【参考方案1】:

您需要在您的密钥策略中添加这样的声明:

        
            "Sid": "Enable IAM User Permissions",
            "Effect": "Allow",
            "Principal": 
                "AWS": "arn:aws:iam::1234567890:root"
            ,
            "Action": "kms:*",
            "Resource": "*"
        

这允许帐户访问密钥,这是启用 IAM 访问密钥所必需的。

【讨论】:

成功了,谢谢。与其他 AWS 服务相比,您知道为什么 KMS 需要明确的管理员权限吗? 那么这是策略模拟器中的错误吗?还是我错过了什么? 这不是bug,模拟器只是在看你给它的数据。它不知道关键政策是什么。它甚至不知道/关心资源是否真实。 Using key policies in KMS 很好地概括了关键政策的运作方式。【参考方案2】:

如果您使用AWS CDK 创建KMS 构造,请确保将trustAccountIdentities 设置为true。 TypeScript 中的示例

const passwordEncryptionKey = new kms.Key(this, 'MyKey', 
  enabled: true,
  trustAccountIdentities: true,
);

文档是here

【讨论】:

以上是关于管理员无法在 AWS KMS 中加密/解密的主要内容,如果未能解决你的问题,请参考以下文章

Boto3 AWS KMS 加密解密文件

使用 KMS 进行 AWS RDS 加密会影响性能吗?

解密aws kms密钥时出现Nodejs异步问题

AWS:无法使用流从 SSE-KMS 加密存储桶下载文件

配置用于复制加密对象的源 KMS 密钥

谷歌云 KMS:加密有效但解密失败