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

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

创建密钥策略

您可以在中创建和管理密钥策略Amazon KMS控制台,使用Amazon KMSAPI 操作,例如CreateKeyReplicateKey,以及PutKeyPolicy,或者使用Amazon CloudFormation模板

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

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

{ "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(最新版本)。

Statement

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

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

Sid

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

效果

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

主体

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

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

重要

除非您使用,否则不要在任何允许权限的密钥策略声明中将 Principal 设置为星号 (*)条件限制密钥策略。星号表示允许每个 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 区域在里面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控制台正确报告了错误,但是CreateKeyPutKeyPolicy尽管政策声明无效,API 还是成功了。

条件

(可选)条件指定要使密钥策略生效而必须满足的要求。通过使用条件,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用于管理 KMS 密钥的 IAM 角色。

  • 允许 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" } } } ] }