

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

# 创建密钥策略
<a name="key-policy-overview"></a>

您可以在 Amazon KMS 控制台中创建和管理密钥策略，也可以使用 Amazon KMS API 操作（例如[CreateKey[ReplicateKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_ReplicateKey.html)](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateKey.html)、和）[PutKeyPolicy](https://docs.amazonaws.cn/kms/latest/APIReference/API_PutKeyPolicy.html)。

在 Amazon KMS 控制台中创建 KMS 密钥时，控制台将引导您完成基于控制[台默认密钥策略创建密钥策略的](key-policy-default.md)步骤。使用`CreateKey`或时 `ReplicateKey` APIs，如果您未指定密钥策略，则这些策略将[对以编程方式创建的密钥 APIs 应用默认密钥策略](key-policy-default.md)。使用 `PutKeyPolicy` API 时，需要指定密钥政策。

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

------
#### [ JSON ]

****  

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

------

**Topics**
+ [密钥策略格式](#key-policy-format)
+ [密钥策略中的元素](#key-policy-elements)
+ [示例 密钥策略](#key-policy-example)

## 密钥策略格式
<a name="key-policy-format"></a>

密钥策略文档必须符合以下规则：
+ 最多 32KB（32768 字节）
+ 密钥策略语句中的 `Sid` 元素可以包含空格。（IAM policy 文档的 `Sid` 元素中禁止使用空格。）

关键策略文档只能包含以下字符：
+ 可打印的 ASCII 字符
+ Basic Latin 和 Latin-1 Supplement 字符集中的可打印字符
+ 制表符（`\u0009`）、换行符（`\u000A`）和回车（`\u000D`）特殊字符

## 密钥策略中的元素
<a name="key-policy-elements"></a>

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

**版本**  
指定密钥策略文档版本。将版本设置为 `2012-10-17`（最新版本）。

**语句**  
随附策略语句。密钥策略文档必须至少包含一个语句。  
每个密钥策略语句最多包含六个元素。`Effect`、`Principal`、`Action` 和 `Resource` 是必需元素。    
**Sid **  
（可选）语句标识符（`Sid`），是可用于描述语句的任意字符串。密钥策略中的 `Sid` 可以包含空格。（您不能在 IAM policy `Sid` 元素中包含空格。)  
**效果**  
（必需）确定是允许还是拒绝该策略语句中的权限。有效值为 `Allow` 或 `Deny`。如果您没有显式允许对 KMS 密钥的访问，则隐式拒绝访问。您也可显式拒绝对 KMS 密钥的访问。您可以通过这种方式确保用户无法访问 CMK，即使其他策略允许访问也是如此。  
**Principal**  
（必需）[主题](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_principal.html#Principal_specifying)是获取策略语句中指定的权限的身份。您可以在密钥策略中将 IAM 用户、IAM 角色和某些 Amazon 服务指定 Amazon Web Services 账户为委托人。IAM [用户组](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_groups.html) 在任何策略类型中都不是有效主体。  
星号值，例如，`"AWS": "*"` 表示所有账户中的所有 Amazon 身份。  
除非您使用[条件](policy-conditions.md)限制密钥政策，否则不要在允许权限的任何密钥政策语句将主体设置为星号（\$1）。星号赋予每个身份使用 KMS 密钥的 Amazon Web Services 账户 权限，除非其他策略声明明确拒绝。其他用户只要在自己的账户中拥有相应权限，就 Amazon Web Services 账户 可以使用您的 KMS 密钥。
IAM 最佳实践不鼓励使用具有长期凭证的 IAM 用户。而应尽可能使用提供临时凭证的 IAM 角色。有关更多信息，请参阅《IAM 用户指南》中的 [IAM 安全最佳实践](https://docs.amazonaws.cn/IAM/latest/UserGuide/best-practices.html)**。
当密钥策略语句中的主体是表示为 `arn:aws:iam::111122223333:root"` 的 [https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_principal.html#principal-accounts](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_principal.html#principal-accounts)时，该策略语句不授予任何 IAM 主体权限。相反，它 Amazon Web Services 账户 允许使用 IAM 策略委派密钥策略中指定的权限。[尽管在账户标识符中使用了“root”，但是格式为 `arn:aws:iam::111122223333:root"` 的主体并*不*代表 [Amazon 账户根用户](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_root-user.html)。但是，账户主体代表账户及其管理员（包括账户根用户）。]  
当委托人是另一个 Amazon Web Services 账户 或其委托人时，只有在使用 KMS 密钥和密钥策略的区域中启用该账户时，权限才会生效。有关默认情况下未启用的区域（“选择加入区域”）的信息，请参阅《Amazon Web Services 一般参考》** 中的 [Managing Amazon Web Services 区域](https://docs.amazonaws.cn/general/latest/gr/rande-manage.html)。  
要允许其他用户 Amazon Web Services 账户 或其委托人使用 KMS 密钥，您必须在密钥策略和另一个账户的 IAM 策略中提供权限。有关更多信息，请参阅 [允许其他账户中的用户使用 KMS 密钥](key-policy-modifying-external-accounts.md)。  
**Action**  
（必需）指定要允许或拒绝的 API 操作。例如，该`kms:Encrypt`操作对应于 “ Amazon KMS [加密](https://docs.amazonaws.cn/kms/latest/APIReference/API_Encrypt.html)” 操作。您可以在策略语句中列出多个 Action。有关更多信息，请参阅 [权限参考](kms-api-permissions-reference.md)。  
如果密钥策略语句中缺少必要的 `Action` 元素，则策略语句将无效。没有 `Action` 元素的密钥策略语句不适用于任何 KMS 密钥。  
当关键策略语句缺少其`Action`元素时， Amazon KMS 控制台会正确报告错误，但是即使策略语句无效，[CreateKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateKey.html)和也会[PutKeyPolicy](https://docs.amazonaws.cn/kms/latest/APIReference/API_PutKeyPolicy.html) APIs 成功。  
**资源**  
（必需）在密钥策略中，资源元素的值为 `"*"`，这意味着“本 KMS 密钥”。星号 (`"*"`) 标识密钥策略附加到的 KMS 密钥。  
如果密钥策略语句中缺少必要的 `Resource` 元素，则策略语句将无效。没有 `Resource` 元素的密钥策略语句不适用于任何 KMS 密钥。  
当关键策略语句缺少其`Resource`元素时， Amazon KMS 控制台会正确报告错误，但是即使策略语句无效，[CreateKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateKey.html)和也会[PutKeyPolicy](https://docs.amazonaws.cn/kms/latest/APIReference/API_PutKeyPolicy.html) APIs 成功。  
**条件**  
（可选）条件指定要使密钥策略生效而必须满足的要求。使用条件， Amazon 可以评估 API 请求的上下文以确定政策声明是否适用。  
要指定条件，您可以使用预定义的*条件键*。 Amazon KMS 支持[Amazon 全局条件键](conditions-aws.md)和[Amazon KMS 条件键](conditions-kms.md)。为了支持基于属性的访问控制 (ABAC)， Amazon KMS 提供了基于标签和别名控制对 KMS 密钥的访问的条件密钥。有关更多信息，请参阅 [ABAC for Amazon KMS](abac.md)。  
条件的格式为：  

```
"Condition": {"condition operator": {"condition key": "condition value"}}
```
例如：  

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

有关 Amazon 策略语法的更多信息，请参阅 [Amazon IAM *用户指南中的 IAM* 策略参考](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies.html)。

## 示例 密钥策略
<a name="key-policy-example"></a>

以下示例显示了对称加密 KMS 密钥的完整密钥策略。在阅读本章中的密钥策略概念时，您可以将它作为参考。此密钥策略将之前[默认密钥策略](key-policy-default.md)部分的示例策略语句合并为一个密钥策略，该密钥策略可完成以下操作：
+ 允许示例 Amazon Web Services 账户 111122223333 对 KMS 密钥的完全访问权限。它其允许账户及其管理员（包括账户根用户在紧急情况下）在该账户中使用 IAM policy 来允许访问 KMS 密钥。
+ 允许 `ExampleAdminRole` IAM 角色管理 KMS 密钥。
+ 允许 `ExampleUserRole` IAM 角色使用 KMS 密钥。

------
#### [ JSON ]

****  

```
{
    "Id": "key-consolepolicy",
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "EnableIAMUserPermissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Sid": "AllowKeyAdministratorsAccess",
            "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": "AllowKeyUse",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:role/ExampleUserRole"
            },
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*",
                "kms:DescribeKey"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AllowAttachmentPersistentResources",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:role/ExampleUserRole"
            },
            "Action": [
                "kms:CreateGrant",
                "kms:ListGrants",
                "kms:RevokeGrant"
            ],
            "Resource": "*",
            "Condition": {
                "Bool": {
                    "kms:GrantIsForAWSResource": "true"
                }
            }
        }
    ]
}
```

------