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

上次更新时间:2020 年 8 月 20 日

当我使用 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 账户根用户设置为密钥管理员委托人。

要设置密钥管理员委托人:

如果您的 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 权限。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?