创建密钥策略 - AWS Key Management Service

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

创建密钥策略

您可以在 AWS KMS 控制台中使用 AWS KMS API 操作(例如CreateKeyReplicateKeyPutKeyPolicy、和)或使用AWS CloudFormation 模板来创建和管理密钥策略。

在 AWS KMS 控制台中创建 KMS 密钥时,控制台将引导您完成基于控制台默认密钥策略创建密钥策略的步骤。使用 CreateKeyReplicateKey API 时,如果您没有指定密钥策略,这些 API 将应用以编程方式创建密钥的默认密钥策略。使用 PutKeyPolicy API 时,需要指定密钥政策。

每个策略文档都可以有一个或多个策略语句。以下示例显示了具有一个策略语句的有效密钥策略文档。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Describe the policy statement", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:user/Alice" }, "Action": "kms:DescribeKey", "Resource": "*", "Condition": { "StringEquals": { "kms:KeySpec": "SYMMETRIC_DEFAULT" } } } ] }

密钥策略格式

密钥策略文档必须符合以下规则:

  • 最多 32KB(32768 字节)

  • 密钥策略语句中的 Sid 元素可以包含空格。(IAM policy 文档的 Sid 元素中禁止使用空格。)

关键策略文档只能包含以下字符:

  • 可打印的 ASCII 字符

  • Basic Latin 和 Latin-1 Supplement 字符集中的可打印字符

  • 制表符(\u0009)、换行符(\u000A)和回车(\u000D)特殊字符

密钥策略中的元素

密钥策略文档必须有以下元素:

版本

指定密钥策略文档版本。将版本设置为 2012-10-17(最新版本)。

语句

随附策略语句。密钥策略文档必须至少包含一个语句。

每个密钥策略语句最多包含六个元素。EffectPrincipalActionResource 是必需元素。

Sid

(可选)语句标识符(Sid),是可用于描述语句的任意字符串。密钥策略中的 Sid 可以包含空格。(您不能在 IAM policy Sid 元素中包含空格。)

效果

(必需)确定是允许还是拒绝该策略语句中的权限。有效值为 AllowDeny。如果您没有显式允许对 KMS 密钥的访问,则隐式拒绝访问。您也可显式拒绝对 KMS 密钥的访问。您可以通过这种方式确保用户无法访问 CMK,即使其他策略允许访问也是如此。

主体

(必需)主题是获取策略语句中指定的权限的身份。您可以在密钥策略中将 IAM 用户、IAM 角色和某些 AWS 服务指定 AWS 账户为委托人。IAM 用户组 在任何策略类型中都不是有效主体。

星号值,例如,"AWS": "*" 表示所有账户中的所有 AWS 身份。

重要

除非您使用条件限制密钥政策,否则不要在允许权限的任何密钥政策语句将主体设置为星号(*)。星号赋予每个身份使用 KMS 密钥的 AWS 账户 权限,除非其他策略声明明确拒绝。其他用户只要在自己的账户中拥有相应权限,就 AWS 账户 可以使用您的 KMS 密钥。

注意

IAM 最佳实践不鼓励使用具有长期凭证的 IAM 用户。而应尽可能使用提供临时凭证的 IAM 角色。有关更多信息,请参阅《IAM 用户指南》中的 IAM 安全最佳实践

当密钥策略语句中的主体是表示为 arn:aws:iam::111122223333:root"AWS 账户 主体时,该策略语句不授予任何 IAM 主体权限。相反,它 AWS 账户 允许使用 IAM 策略委派密钥策略中指定的权限。[尽管在账户标识符中使用了“root”,但是格式为 arn:aws:iam::111122223333:root" 的主体并代表 AWS 账户根用户。但是,账户主体代表账户及其管理员(包括账户根用户)。]

当委托人是另一个 AWS 账户 或其委托人时,只有在使用 KMS 密钥和密钥策略的区域中启用该账户时,权限才会生效。有关默认情况下未启用的区域(“选择加入区域”)的信息,请参阅《AWS 一般参考》 中的 Managing AWS 区域

要允许其他用户 AWS 账户 或其委托人使用 KMS 密钥,您必须在密钥策略和另一个账户的 IAM 策略中提供权限。有关更多信息,请参阅 允许其他账户中的用户使用 KMS 密钥

操作

(必需)指定要允许或拒绝的 API 操作。例如,该kms:Encrypt操作对应于 “ AWS KMS 加密” 操作。您可以在策略语句中列出多个 Action。有关更多信息,请参阅 权限参考

资源

(必需)在密钥策略中,资源元素的值为 "*",这意味着“本 KMS 密钥”。星号 ("*") 标识密钥策略附加到的 KMS 密钥。

注意

如果密钥策略语句中缺少必要的 Resource 元素,则策略语句将无效。没有 Resource 元素的密钥策略语句不适用于任何 KMS 密钥。

当关键策略语句缺少其Resource元素时, AWS KMS 控制台会正确报告错误,但CreateKeyPutKeyPolicyAPI 会成功,即使策略声明无效。

状况

(可选)条件指定要使密钥策略生效而必须满足的要求。使用条件, AWS 可以评估 API 请求的上下文以确定政策声明是否适用。

要指定条件,您可以使用预定义的条件键。 AWS KMS 支持AWS 全局条件键AWS KMS 条件键。为了支持基于属性的访问控制 (ABAC), AWS KMS 提供了基于标签和别名控制对 KMS 密钥的访问的条件密钥。有关更多信息,请参阅 AWS KMS 中的 ABAC

条件的格式为:

"Condition": {"condition operator": {"condition key": "condition value"}}

例如:

"Condition": {"StringEquals": {"kms:CallerAccount": "111122223333"}}

有关 AWS 策略语法的更多信息,请参阅 AWS IAM 用户指南中的 IAM 策略参考

示例密钥策略

以下示例显示了对称加密 KMS 密钥的完整密钥策略。在阅读本章中的密钥策略概念时,您可以将它作为参考。此密钥策略将之前默认密钥策略部分的示例策略语句合并为一个密钥策略,该密钥策略可完成以下操作:

  • 允许示例 AWS 账户 111122223333 对 KMS 密钥的完全访问权限。它其允许账户及其管理员(包括账户根用户在紧急情况下)在该账户中使用 IAM policy 来允许访问 KMS 密钥。

  • 允许 ExampleAdminRole IAM 角色管理 KMS 密钥。

  • 允许 ExampleUserRole IAM 角色使用 KMS 密钥。

{ "Id": "key-consolepolicy", "Version": "2012-10-17", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:root" }, "Action": "kms:*", "Resource": "*" }, { "Sid": "Allow access for Key Administrators", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/ExampleAdminRole" }, "Action": [ "kms:Create*", "kms:Describe*", "kms:Enable*", "kms:List*", "kms:Put*", "kms:Update*", "kms:Revoke*", "kms:Disable*", "kms:Get*", "kms:Delete*", "kms:TagResource", "kms:UntagResource", "kms:ScheduleKeyDeletion", "kms:CancelKeyDeletion", "kms:RotateKeyOnDemand" ], "Resource": "*" }, { "Sid": "Allow use of the key", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/ExampleUserRole" }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": "*" }, { "Sid": "Allow attachment of persistent resources", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/ExampleUserRole" }, "Action": [ "kms:CreateGrant", "kms:ListGrants", "kms:RevokeGrant" ], "Resource": "*", "Condition": { "Bool": { "kms:GrantIsForAWSResource": "true" } } } ] }