当我创建 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."
您在密钥策略中指定的主体必须具有执行 CreateKey 和 PutKeyPolicy API 操作所需的权限。
**重要事项:**确保您创建的密钥策略允许相应的 AWS Identity and Access Management (IAM) 主体管理 AWS KMS 密钥。
解决方法
**注意:**当您创建 CloudFormation 堆栈时,CloudFormation 会代入 IAM 角色来执行 CreateStack API 操作。CloudFormation 还会使用该角色来创建您在 CloudFormation 模板中指定的资源。
创建 AWS KMS 密钥
完成以下步骤:
- 打开 CloudFormation 控制台。
- 使用 AWS::KMS::Key resource 创建 AWS KMS 密钥。
- 选择可用于管理密钥的 IAM 用户或角色。
- 在包含 kms:PutKeyPolicy 操作的 Allow 语句中加入管理主体。
- 使用 BypassPolicyLockoutSafetyCheck 资源参数。
在以下示例中,当策略采用以下格式时,KeyAdmin 角色可以修改密钥策略:
{ "Type": "AWS::KMS::Key",
"Properties": {
"Description": "A sample key",
"KeyPolicy": {
"Version": "2012-10-17",
"Id": "key-default-1",
"Statement": [
{
"Sid": "Allow access for Key Administrators",
"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" }
注意: 将 FederatedAccess 替换为您的 IAM 角色,将 FederatedUsername 替换为您的用户名。
当您使用 CloudFormation 服务角色创建堆栈时,请将主体设置为服务角色 ARN。
策略语句示例:
"Principal": { "AWS": "arn:aws:iam::123456789012:role/ServiceRoleName" }
**注意:**将 ServiceRoleName 替换为您的服务角色。
要将 AWS 账户根用户设置为密钥管理员主体,请在您的策略中添加以下语句:
"Principal": { "AWS": "arn:aws:iam::123456789012:root" }
**注意:**当您将密钥管理员主体设置为根 ARN 时,账户中拥有足够 IAM 权限的任何主体都可以修改密钥。
当密钥策略中存在具有 kms:PutKeyPolicy 权限的主体时,您可以使用 CloudFormation 创建 AWS KMS 密钥。在 CloudFormation 模板中将 BypassPolicyLockoutSafetyCheck 属性设置为 true。
模板示例:
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 access for Key Administrators
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
相关信息
AWS Key Management Service
KMS 密钥访问和权限