当我尝试使用 AWS CloudFormation 创建 AWS KMS 密钥时,如何解决错误“The new key policy will not allow you to update the key policy in the future”(新密钥策略不允许您在未来更新密钥策略)?

2 分钟阅读
0

当我使用 AWS CloudFormation 创建 AWS KMS 密钥并定义 AWS Key Management Service (AWS KMS) 密钥策略时,AWS KMS 密钥创建失败。然后,我收到以下错误消息:“The new key policy will not allow you to update the key policy in the future.”(新密钥策略不允许您在未来更新密钥策略。)

简短描述

AWS KMS 在创建密钥策略时执行安全检查。进行一次安全检查可确认密钥策略的委托人拥有调用 CreateKey APIPutKeyPolicy API 所需的权限。此检查将消除可能导致 AWS KMS 密钥无法管理的因素,而无法管理意味着您不能更改密钥策略或删除密钥。

重要提示:确保您创建的密钥策略允许当前用户管理 AWS KMS 密钥。

解决方法

当您创建 AWS CloudFormation 堆栈时,将使用 AWS Identity and Access Management(AWS IAM)用户或角色进行 CreateStack API 调用。该用户还用于创建 AWS CloudFormation 模板中指定的资源。

1.    当您使用 AWS CloudFormation 创建 AWS KMS 密钥时,请选择用于 AWS KMS 密钥的密钥管理员委托人的相同 IAM 用户或角色。

在下面的示例中,AWS CloudFormation 堆栈由 IAM 用户 arn:aws:iam::123456789012:user/Alice 创建。委托人被指定为密钥管理员。现在,IAM 用户“Alice”可以在创建密钥策略后修改密钥策略。

"Type" : "AWS::KMS::Key",
  "Properties" : {
      "Description" : "A sample key",
      "KeyPolicy" : {
          "Version": "2012-10-17",
          "Id": "key-default-1",
          "Statement": [
              {
                  "Sid": "Allow administration of the key",
                  "Effect": "Allow",
                  "Principal": { "AWS": "arn:aws:iam::123456789012:user/Alice" },
                  "Action": [
                      "kms:Create*",
                      "kms:Describe*",
                      "kms:Enable*",
                      "kms:List*",
                      "kms:Put*",
                      "kms:Update*",
                      "kms:Revoke*",
                      "kms:Disable*",
                      "kms:Get*",
                      "kms:Delete*",
                      "kms:ScheduleKeyDeletion",
                      "kms:CancelKeyDeletion"
                  ],
                  "Resource": "*"
              },
              {
                  "Sid": "Allow use of the key",
                  "Effect": "Allow",
                  "Principal": { "AWS": "arn:aws:iam::123456789012:user/Bob" },
                  "Action": [
                      "kms:Encrypt",
                      "kms:Decrypt",
                      "kms:ReEncrypt*",
                      "kms:GenerateDataKey*",
                      "kms:DescribeKey"
                  ], 
                  "Resource": "*"
              }
          ]
      }
    }
  }

2.    设置密钥管理员委托人,或将 AWS 账户根用户设置为密钥管理员委托人。

要设置密钥管理员委托人,请使用 Amazon 资源名称(ARN):

如果您的 AWS CloudFormation 堆栈由 SAML 或 Web 联合用户账户创建,将委托人设置为 ARN 的用户代入角色。例如:

"Principal": { "AWS": "arn:aws:sts::123456789012:assumed-role/FederatedAccess/FederatedUsername" }

注意:IAM 角色的名称为 FederatedAccess,联合身份用户的名称为 FederatedUsername

如果使用 AWS CloudFormation 服务角色创建堆栈,则将委托人设置为服务角色 ARN。例如:

"Principal": { "AWS": "arn:aws:iam::123456789012:role/ServiceRoleName” }

注意:AWS CloudFormation 服务角色的名称为 ServiceRoleName

要将 AWS 账户的根用户设置为密钥管理员委托人,请参阅以下示例:

"Principal": { "AWS": "arn:aws:iam::123456789012:root" }

**注意:**如果将密钥管理员委托人设置为根 ARN,请确保您拥有正确的权限。创建 AWS CloudFormation 堆栈的 IAM 用户、角色或服务角色必须拥有进行 CreateKeyPutKeyPolicy API 调用的 IAM 权限。


相关信息

AWS Key Management Service

AWS KMS 的身份验证与访问控制

相关视频

AWS 官方
AWS 官方已更新 1 年前