创建密钥策略
您可以使用 Amazon KMS API 操作(例如 CreateKey、ReplicateKey 和 PutKeyPolicy)和 Amazon CloudFormation 模板,在 Amazon KMS 控制台中创建和管理密钥策略。
在 Amazon KMS 控制台中创建 KMS 密钥时,控制台将指导您完成基于控制台默认密钥策略创建密钥策略的步骤。使用 CreateKey
或 ReplicateKey
API 时,如果您没有指定密钥策略,这些 API 将应用以编程方式创建密钥的默认密钥策略。使用 PutKeyPolicy
API 或使用 Amazon CloudFormation 模板创建 KMS 密钥时,需要指定密钥策略。
每个策略文档都可以有一个或多个策略语句。以下示例显示了具有一个策略语句的有效密钥策略文档。
{ "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 策略文档的Sid
元素中禁止使用空格。)
关键策略文档只能包含以下字符:
-
可打印的 ASCII 字符
-
Basic Latin 和 Latin-1 Supplement 字符集中的可打印字符
-
制表符(
\u0009
)、换行符(\u000A
)和回车(\u000D
)特殊字符
密钥策略中的元素
密钥策略文档必须有以下元素:
- 版本
指定密钥策略文档版本。将版本设置为
2012-10-17
(最新版本)。- Statement
随附策略语句。密钥策略文档必须至少包含一个语句。
每个密钥策略语句最多包含六个元素。
Effect
、Principal
、Action
和Resource
是必需元素。- Sid
-
(可选)语句标识符(
Sid
),是可用于描述语句的任意字符串。密钥策略中的Sid
可以包含空格。(您不能在 IAM 策略Sid
元素中包含空格。) - 效果
(必需)确定是允许还是拒绝该策略语句中的权限。有效值为
Allow
或Deny
。如果您没有显式允许对 KMS 密钥的访问,则隐式拒绝访问。您也可显式拒绝对 KMS 密钥的访问。您可以通过这种方式确保用户无法访问 CMK,即使其他策略允许访问也是如此。- 主体
(必需)主题是获取策略语句中指定的权限的身份。您可以指定 Amazon Web Services 账户、IAM 用户、IAM 角色和一些 Amazon 服务作为密钥策略中的主体。IAM 用户组 在任何策略类型中都不是有效主体。
当密钥策略语句中的主体是格式为
arn:aws:iam::
的 Amazon Web Services 账户 主体时,该策略语句不授予任何 IAM 主体权限。相反,此策略语句授予 Amazon Web Services 账户 使用 IAM 策略委托密钥策略中的指定权限。[尽管在账户标识符中使用了“root”,但是格式为111122223333
:root"arn:aws:iam::
的主体 –(必需)不代表 Amazon 账户根用户。但是,账户主体代表账户及其管理员(包括账户根用户)。]111122223333
:root"当委托人是另一个 Amazon Web Services 账户 或其委托人时,只有在使用 KMS 密钥和密钥策略在区域中启用账户时,权限才有效。有关默认情况下未启用的区域(“选择加入区域”)的信息,请参阅 Amazon 一般参考中的管理 Amazon Web Services 区域。
注意 除非您使用条件限制密钥策略,否则不要在允许权限的任何密钥策略语句将委托人设置为星号 (*)。星号表示允许每个 Amazon Web Services 账户 权限中的每个身份使用 KMS 密钥,除非另一个策略语句明确拒绝它。其他 Amazon Web Services 账户 中的用户需要他们自己的账户中相应的 IAM 权限才能使用 KMS 密钥。
若要允许不同的 Amazon Web Services 账户 或其主体使用 KMS 密钥,您必须在密钥策略和另一个账户的 IAM 策略中提供权限。有关详细信息,请参阅允许其他账户中的用户使用 KMS 密钥。
- 操作
(必需)指定要允许或拒绝的 API 操作。例如,
kms:Encrypt
操作对应于 Amazon KMS Encrypt 操作。您可以在策略语句中列出多个 Action。有关更多信息,请参阅权限参考。- 资源
(必需)在密钥策略中,资源元素的值为
"*"
,这意味着“本 KMS 密钥”。星号 ("*"
) 标识密钥策略附加到的 KMS 密钥。注意 如果密钥策略语句中缺少必要
Resource
元素,则 CreateKey 和 PutKeyPolicy API 会成功运行,但策略语句将无效。没有Resource
元素的密钥策略语句不适用于任何 KMS 密钥。- Condition
(可选)条件指定要使密钥策略生效而必须满足的要求。通过使用条件,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 策略参考。
示例密钥策略
以下示例显示了对称加密 KMS 密钥的完整密钥策略。此密钥策略将之前默认密钥策略部分的示例策略语句合并为一个密钥策略,该密钥策略可完成以下操作:
-
授予此示例 Amazon Web Services 账户 (111122223333) 对 KMS 密钥的完全访问权限。其允许账户及其管理员(包括账户根用户)在该账户中使用 IAM 策略以允许访问 KMS 密钥。
-
允许 IAM 用户 KMSAdminUser 和 IAM 角色 KMSAdminRole 管理 KMS 密钥。
-
允许 IAM 用户
ExampleUser
、IAM 角色ExampleRole
和 Amazon Web Services 账户 444455556666 使用 KMS 密钥。
{ "Version": "2012-10-17", "Id": "key-consolepolicy-2", "Statement": [ { "Sid": "Enable IAM policies", "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
:user/KMSAdminUser
", "arn:aws:iam::111122223333
:role/KMSAdminRole
" ]}, "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
:user/ExampleUser
", "arn:aws:iam::111122223333
:role/ExampleRole
", "arn:aws:iam::444455556666
:root" ]}, "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
:user/ExampleUser
", "arn:aws:iam::111122223333
:role/ExampleRole
", "arn:aws:iam::444455556666
:root" ]}, "Action": [ "kms:CreateGrant", "kms:ListGrants", "kms:RevokeGrant" ], "Resource": "*", "Condition": {"Bool": {"kms:GrantIsForAWSResource": "true"}} } ] }