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

上次更新时间:2019 年 1 月 14 日

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

简短描述

AWS KMS 在创建密钥策略时执行安全检查。进行一次安全检查可确认密钥策略的主体拥有调用 CreateKey APIPutKeyPolicy API 所需的权限。此检查使 CMK 不会变的无法管理,这意味着您不能更改密钥策略或删除密钥。

确保您创建的密钥策略使当前用户能够管理 CMK

解决方法

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

1.    当您使用 AWS CloudFormation 创建 CMK 时,请选择用于 CMK 密钥管理员委托人的相同 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 CloudFormation 堆栈由联合用户账户创建,将委托人设置为 Amazon 资源名称 (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 权限。


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助吗?