Complete a 3 Question Survey and Earn a re:Post Badge
Help improve AWS Support Official channel in re:Post and share your experience - complete a quick three-question survey to earn a re:Post badge!
如何解决我在使用 AWS CloudFormation 创建 AWS KMS 密钥时收到的错误?
当我创建 AWS Key Management Service (AWS KMS) 密钥并通过 AWS CloudFormation 定义 AWS KMS 密钥策略时,密钥创建失败。然后,我收到以下错误消息: “The new key policy will not allow you to update the key policy in the future”(新密钥策略不允许您在未来更新密钥策略)。
简短描述
当对密钥应用密钥策略时,AWS KMS 会执行安全检查。进行一次安全检查可确认密钥策略中的主体具有执行 CreateKey 和 PutKeyPolicy API 操作所需的权限。此项检查可确保 AWS KMS 密钥处于可管理状态。
**重要事项:**确保您创建的密钥策略允许相应的 AWS Identity and Access Management (IAM) 主体管理 AWS KMS 密钥。
解决方法
**注意:**当您创建 AWS CloudFormation 堆栈时,会使用 IAM 用户或角色来执行 CreateStack API 操作。该用户还用于创建在 AWS CloudFormation 模板中指定的资源。
创建 AWS KMS 密钥
完成以下步骤:
- 使用 AWS CloudFormation 创建 AWS KMS 密钥。
- 选择适当的 IAM 用户或角色,以用于在未来管理您的密钥。
- 在包含 kms:PutKeyPolicy 操作的 Allow 语句中包含有效的管理主体后,使用 BypassPolicyLockoutSafetyCheck 资源参数。
在以下示例中,AWS CloudFormation 堆栈由 IAM 用户 arn:aws:iam::123456789012:user/Alice 创建。KeyAdmin 角色被指定为密钥管理员。当使用以下格式的密钥策略创建密钥时,将允许 IAM 角色 KeyAdmin 修改密钥策略:
{ "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:role/KeyAdmin" }, "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:role/KeyUser" }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": "*" } ] } } }
**重要事项:**如果您的策略中未指定有效的主体,则 BypassPolicyLockoutSafetyCheck 可能会导致密钥无法管理。确保在策略中使用有效的主体。
设置密钥管理员主体
要通过联合身份提供者设置密钥管理员主体,请使用角色会话 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 用户、角色或服务角色必须具有 IAM 权限才能执行 CreateKey 和 PutKeyPolicy API 操作。
**重要事项:**当您将密钥管理员主体设置为根 ARN 时,账户中拥有足够 IAM 权限的任何主体都可以修改密钥,而不仅仅是根用户。
在密钥策略中拥有具有 kms:PutKeyPolicy 权限的主体后,您可以使用 AWS CloudFormation 创建 AWS KMS 密钥。在您的 AWS CloudFormation 模板中使用 BypassPolicyLockoutSafetyCheck 属性。
示例:
myKMSKey: Type: 'AWS::KMS::Key' Properties: Description: This key is managed by the KeyAdmin role BypassPolicyLockoutSafetyCheck: true KeyPolicy: Version: 2012-10-17 Id: key-policy-1 Statement: - Sid: Allow administration of the key Effect: Allow Principal: AWS: 'arn:aws:iam::123456789012:role/KeyAdmin' 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:role/KeyUser' Action: - 'kms:DescribeKey' - 'kms:Encrypt' - 'kms:Decrypt' - 'kms:ReEncrypt*' - 'kms:GenerateDataKey' - 'kms:GenerateDataKeyWithoutPlaintext' Resource: '*' EnableKeyRotation: true PendingWindowInDays: 30