创建密钥策略 - Amazon Key Management Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

创建密钥策略

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

在 Amazon 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,即使其他策略允许访问也是如此。

主体

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

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

重要

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

注意

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

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

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

若要允许不同的 Amazon Web Services 账户 或其主体使用 KMS 密钥,您必须在密钥策略和另一个账户的 IAM policy 中提供权限。有关详细信息,请参阅 允许其他账户中的用户使用 KMS 密钥

操作

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

资源

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

注意

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

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

状况

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

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

条件的格式为:

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

例如:

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

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

示例密钥策略

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

  • 授予此示例 Amazon Web Services 账户 (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" ], "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" } } } ] }