

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

# KMS 密钥访问权限和权限


要使用 Amazon KMS，您必须拥有 Amazon 可用于对请求进行身份验证的凭证。证书必须包括访问 Amazon 资源的权限 Amazon KMS keys 和[别名](kms-alias.md)。除非明确提供了 KMS 密钥的权限，否则任何 Amazon 委托人均无权访问 KMS 密钥，并且从不被拒绝。不存在使用或管理 KMS 密钥的隐式权限或自动权限。

要控制对 KMS 密钥的访问，您可以使用下列策略机制。
+ [密钥策略](key-policies.md)：每个 KMS 密钥都有密钥策略。密钥策略也是控制访问 KMS 密钥的主要机制。您只能使用密钥策略来控制访问，这意味着对 KMS 密钥的所有访问均在单个文档（密钥策略）中进行定义。有关使用密钥策略的更多信息，请参阅[密钥政策](key-policies.md)。
+ [IAM policy ](iam-policies.md)：您可以将 IAM policy 与密钥策略和授权结合使用，以控制对 KMS 密钥的访问。通过用这种方式控制访问，您可以管理 IAM 中各 IAM 身份的所有权限。若要使用 IAM policy 允许访问 KMS 密钥，密钥策略必须明确允许此访问。有关使用 IAM; 策略的更多信息，请参阅 [IAM 策略](iam-policies.md)。
+ [授权](grants.md)：您可以将密钥策略与 IAM policy 结合使用，以允许对 KMS 密钥的访问。通过用这种方式控制访问权限，您可以在密钥策略中允许访问 KMS 密钥，并允许有关身份将其访问权限委托给其他身份。有关使用授权的更多信息，请参阅[补助金 Amazon KMS](grants.md)。

## KMS 密钥政策


管理 Amazon KMS 资源访问权限的主要方法是使用*策略*。策略是用于描述哪些委托人可以访问什么资源的文档。附加到 IAM 身份的策略称为*基于身份的策略*（或 *IAM 策略*），附加到其他类型资源的策略称为*资源*策略。 Amazon KMS KMS 密钥的资源策略称为*密钥策略*。

所有 KMS 密钥都具有密钥策略。如果您不提供一个，请为您 Amazon KMS 创建一个。 Amazon KMS 使用的[默认密钥策略](key-policy-default.md)会有所不同，具体取决于您是在 Amazon KMS 控制台中创建密钥还是使用 Amazon KMS API。我们建议您编辑默认密钥政策，使其符合贵组织对[最低权限](least-privilege.md)的要求。

如果密钥和 IAM 委托人位于同一个 Amazon 账户中，则可以单独使用密钥策略来控制访问权限，这意味着对 KMS 密钥的全部访问范围是在单个文档（密钥策略）中定义的。但是，当一个账户中的调用者必须访问另一个账户中的密钥时，您不能仅使用密钥政策来授予访问权限。在跨账户场景中，必须将 IAM 策略附加到调用者的用户或角色上，明确允许调用者进行 API 调用。

您也可以将 IAM 策略与密钥政策和授权结合使用，以控制对 KMS 密钥的访问权限。要使用 IAM 策略控制对 KMS 密钥的访问权限，密钥政策必须授予账户使用 IAM 策略的权限。您可以指定[启用 IAM 策略的密钥政策语句](key-policy-default.md#key-policy-default-allow-root-enable-iam)，也可以在密钥政策中明确[指定允许的主体](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_principal.html#Principal_specifying)。

在制定策略时，请确保有严格的控制措施，限制可以执行以下操作的人员：
+ 更新、创建和删除 IAM 和 KMS 密钥政策
+ 对用户、角色和组附加和分离 IAM 策略
+ 对您的 KMS 密钥附加和分离 KMS 密钥政策

## KMS 密钥授权


除了 IAM 和密钥策略外，还 Amazon KMS 支持[授权](grants.md)。授权提供了一种灵活而强大的权限委托方式。您可以使用授权向您的 Amazon 账户或其他 Amazon 账户中的 IAM 委托人发放有时限的 KMS 密钥访问权限。如果您在创建策略时不知道主体的名称，或者需要访问权限的主体经常发生变化，我们建议您授予有时限的访问权限。[被授权者主体](grants.md#terms-grantee-principal)可以与 KMS 密钥位于同一账户中，也可以位于不同的账户中。如果主体和 KMS 密钥位于不同的账户中，则除了授予之外，您还必须指定 IAM 策略。授权需要额外的管理，因为您必须调用 API 来创建授权，并在不再需要时停用或撤销授权。

# 中的关键政策 Amazon KMS
密钥政策

密钥策略是的资源策略 Amazon KMS key。密钥政策是控制对 KMS 密钥访问的主要方法。每个 KMS 密钥必须只有一个密钥策略。密钥策略中的语句确定谁有权限使用 KMS 密钥以及如何使用 KMS 密钥。您还可使用 [IAM policy](iam-policies.md) 和[授权](grants.md)来控制对 KMS 密钥的访问，但每个 KMS 密钥必须有一个密钥策略。

任何 Amazon 委托人（包括账户根用户或密钥创建者）都无权访问 KMS 密钥，除非在密钥策略、IAM 策略或授权中明确允许且从不被拒绝。

除非密钥策略明确允许，否则您不能使用 IAM policy *允许*访问 KMS 密钥。未经密钥策略许可，允许权限的 IAM policy 无效。（您可以使用 IAM policy 来*拒绝*在未经密钥策略许可的情况下对 KMS 密钥的访问权限。） 默认密钥策略启用 IAM policy。若要在密钥策略中启用 IAM policy，请添加 [允许访问 Amazon Web Services 账户 并启用 IAM 策略](key-policy-default.md#key-policy-default-allow-root-enable-iam) 中所述的策略语句。

与全局性的 IAM policy 不同，密钥策略是区域性策略。密钥策略仅控制对同一区域中 KMS 密钥的访问。该策略对其他地区的 KMS 密钥无效。

**Topics**
+ [

# 创建密钥策略
](key-policy-overview.md)
+ [

# 默认密钥策略
](key-policy-default.md)
+ [

# 查看密钥政策
](key-policy-viewing.md)
+ [

# 更改密钥政策
](key-policy-modifying.md)
+ [Amazon 服务权限](key-policy-services.md)

# 创建密钥策略


您可以在 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)

## 密钥策略格式


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

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

## 密钥策略中的元素


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

**版本**  
指定密钥策略文档版本。将版本设置为 `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)。

## 示例 密钥策略


以下示例显示了对称加密 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"
                }
            }
        }
    ]
}
```

------

# 默认密钥策略


创建 KMS 密钥时，您可以为新的 KMS 密钥指定密钥策略。如果您不提供一个，请为您 Amazon KMS 创建一个。 Amazon KMS 使用的默认密钥策略会有所不同，具体取决于您是在 Amazon KMS 控制台中创建密钥还是使用 Amazon KMS API。

**以编程方式创建 KMS 密钥时采用的默认密钥策略**  
当您使用 [Amazon KMS API](https://docs.amazonaws.cn/kms/latest/APIReference/) 以编程方式创建 KMS 密钥（包括使用[Amazon SDKs](https://www.amazonaws.cn/tools/#sdk)、[Amazon Command Line Interface](https://docs.amazonaws.cn/cli/latest/userguide/)或 [Amazon Tools for PowerShell](https://docs.amazonaws.cn/powershell/latest/userguide/)），并且未指定密钥策略时，会 Amazon KMS 应用非常简单的默认密钥策略。此默认密钥策略有一个策略声明，该声明向拥有 KMS 密钥的用户授予使用 IAM 策略的权限，以允许对 KMS 密钥进行所有 Amazon KMS 操作。 Amazon Web Services 账户 有关此策略语句的更多信息，请参阅[允许访问 Amazon Web Services 账户 并启用 IAM 策略](#key-policy-default-allow-root-enable-iam)。

**使用创建 KMS 密钥时的默认密钥策略 Amazon Web Services 管理控制台**  
使用[创建 KMS 密钥](create-keys.md)时 Amazon Web Services 管理控制台，密钥策略[以允许访问 Amazon Web Services 账户 并启用 IAM 策略的策略](#key-policy-default-allow-root-enable-iam)声明开头。然后，控制台会添加[密钥管理员声明](#key-policy-default-allow-administrators)、[密钥用户声明](#key-policy-default-allow-users)以及（对于大多数密钥类型）一条允许委托人将 KMS 密钥用于[其他 Amazon 服务的](#key-policy-service-integration)声明。您可以使用 Amazon KMS 控制台的功能来指定 IAM 用户、IAM 角色、 Amazon Web Services 账户 谁是密钥管理员以及谁是关键用户（或两者兼而有之）。

**权限**
+ [允许访问 Amazon Web Services 账户 并启用 IAM 策略](#key-policy-default-allow-root-enable-iam)
+ [允许密钥管理员管理 KMS 密钥](#key-policy-default-allow-administrators)
+ [允许密钥用户使用 KMS 密钥](#key-policy-default-allow-users)
  + [允许密钥用户使用 KMS 密钥进行加密操作](#key-policy-users-crypto)
  + [允许密钥用户将 KMS 密钥用于 Amazon 服务](#key-policy-service-integration)

## 允许访问 Amazon Web Services 账户 并启用 IAM 策略


以下默认密钥策略语句至关重要。
+ 它为拥有 KMS 密钥的人提供对 KMS 密钥的完全访问权限。 Amazon Web Services 账户 

  与其他 Amazon 资源策略不同， Amazon KMS 密钥策略不会自动向账户或其任何身份授予权限。若要授予账户管理员权限，密钥策略必须包含提供此权限的显式语句，如下所示。
+ 除密钥策略外，还允许账户使用 IAM policy 允许对 KMS 密钥进行访问。

  如果没有此权限，尽管拒绝访问密钥的 IAM policy 仍然有效，但是允许访问密钥的 IAM policy 将无效。
+ 此权限通过向账户管理员（包括账户根用户）授予无法删除的访问控制权限，来降低密钥变得无法管理的风险。

以下密钥策略语句是以编程方式创建的 KMS 密钥的完整默认密钥策略。这是 Amazon KMS 控制台中创建的 KMS 密钥的默认密钥策略中的第一条策略声明。

```
{
  "Sid": "Enable IAM User Permissions",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:root"
   },
  "Action": "kms:*",
  "Resource": "*"
}
```

**允许 IAM policy 允许对 KMS 密钥的访问。**  <a name="allow-iam-policies"></a>
上面显示的密钥策略声明为拥有密钥的用户提供了使用 IAM 策略和密钥策略的权限，以允许对 KMS 密钥执行所有操作 (`kms:*`)。 Amazon Web Services 账户   
本密钥策略声明中的主体是[账户主体](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_principal.html#principal-accounts)，其由此格式 (`arn:aws:iam::account-id:root`) 的 ARN 进行表示。账户委托人代表 Amazon 账户及其管理员。  
当密钥策略语句中的主体是账户主体时，该策略语句不会向任何 IAM 主体授予使用 KMS 密钥的权限。相反，其授予账户使用 IAM policy *委托*密钥语句中指定的权限。此默认密钥策略语句允许账户使用 IAM policy 委托 KMS 密钥上所有操作 (`kms:*`) 的权限。

** 可以降低 KMS 密钥变得不可管理的风险。**  
与其他 Amazon 资源策略不同， Amazon KMS 密钥策略不会自动向账户或其任何委托人授予权限。若要授予任何主体（包括[账户主体](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_principal.html#principal-accounts)）权限，您必须使用明确提供权限的密钥策略语句。您无需授予账户主体或任何主体访问 KMS 密钥的权限。但是，授予账户主体访问权限有助于防止无法管理密钥。  
例如，假设您创建的密钥策略仅授予一个用户访问 KMS 密钥的权限。如果删除该用户，则密钥将变得无法管理，您必须[联系 Amazon Support](https://console.amazonaws.cn/support/home#/case/create) 才能重新获得 KMS 密钥的访问权限。  
上面显示的密钥策略语句将向[账户主体](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_principal.html#principal-accounts)授予控制密钥的权限。账户委托人代表 Amazon Web Services 账户 及其管理员，包括[账户 root 用户](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_root-user.html)。除非您删除 Amazon Web Services 账户，否则账户根用户是唯一无法删除的主体。IAM 最佳实践不鼓励代表账户根用户采取操作，但紧急情况除外。但是，如果删除所有其他具有 KMS 密钥访问权限的用户和角色，则您可能需要充当账户根用户。

## 允许密钥管理员管理 KMS 密钥


控制台创建的默认密钥策略允许您选择账户中的 IAM 用户和角色，并使其成为*密钥管理员*。此语句称为*密钥管理员语句*。密钥管理员有权管理 KMS 密钥，但无权在[加密操作](kms-cryptography.md#cryptographic-operations)中使用 KMS 密钥。在原定设置视图或策略视图中创建 KMS 密钥时，您可以将 IAM 用户和角色添加到密钥管理员列表。

**警告**  
由于密钥管理员有权更改密钥策略和创建授权，因此他们可以向自己和其他人 Amazon KMS 授予此策略中未指定的权限。  
有权管理标签和别名的委托人也可以控制对 KMS 密钥的访问。有关更多信息，请参阅 [ABAC for Amazon KMS](abac.md)。

**注意**  
IAM 最佳实践不鼓励使用具有长期凭证的 IAM 用户。而应尽可能使用提供临时凭证的 IAM 角色。有关更多信息，请参阅《IAM 用户指南》中的 [IAM 安全最佳实践](https://docs.amazonaws.cn/IAM/latest/UserGuide/best-practices.html)**。

以下示例在 Amazon KMS 控制台的原定设置视图中显示了密钥管理员语句。

![\[控制台默认密钥策略中的密钥管理员，默认视图\]](http://docs.amazonaws.cn/kms/latest/developerguide/images/console-key-policy-administrators-60.png)


以下示例是 Amazon KMS 控制台的策略视图中的密钥管理员语句。此密钥管理员语句适用于单区域对称加密 KMS 密钥。

**注意**  
 Amazon KMS 控制台在语句标识符下将密钥管理员添加到密钥策略中`"Allow access for Key Administrators"`。如果修改此语句标识符，则可能会影响控制台显示您对该语句所做修改的方式。

```
{
  "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": "*"
}
```

最常见 KMS 密钥、单区域对称加密 KMS 密钥的原定设置密钥管理员语句允许以下权限。有关每个权限的详细信息，请参阅 [Amazon KMS 权限](kms-api-permissions-reference.md)。

当您使用 Amazon KMS 控制台创建 KMS 密钥时，控制台会将您指定的用户和角色添加到密钥管理员语句中的`Principal`元素中。

这些权限中有很多都包含通配符 (`*`)，使用它可以允许以指定动词开头的所有权限。因此，在 Amazon KMS 添加新的 API 操作时，自动允许密钥管理员使用它们。您不必更新密钥策略即可包含新操作。如果您希望将密钥管理员限制在一组固定的 API 操作中，则可以[更改密钥策略](key-policy-modifying.md)。

**`kms:Create*`**  
允许 [`kms:CreateAlias`](kms-alias.md) 和 [`kms:CreateGrant`](grants.md)。（`kms:CreateKey` 权限仅在 IAM policy 中有效。）

**`kms:Describe*`**  
允许 [`kms:DescribeKey`](viewing-keys.md)。需要 `kms:DescribeKey` 权限才能查看 Amazon Web Services 管理控制台中 KMS 密钥的密钥详细信息页面。

**`kms:Enable*`**  
允许 [`kms:EnableKey`](enabling-keys.md)。对于对称加密 KMS 密钥，它还允许 [`kms:EnableKeyRotation`](rotate-keys.md)。

**`kms:List*`**  
允许 [`kms:ListGrants`](grants.md)、[https://docs.amazonaws.cn/kms/latest/APIReference/API_ListKeyPolicies.html](https://docs.amazonaws.cn/kms/latest/APIReference/API_ListKeyPolicies.html) 和 [`kms:ListResourceTags`](tagging-keys.md)。（查看 Amazon Web Services 管理控制台中的 KMS 密钥所需的 `kms:ListAliases` 和 `kms:ListKeys` 权限仅在 IAM policy 中有效。）

**`kms:Put*`**  
允许 [https://docs.amazonaws.cn/kms/latest/APIReference/API_PutKeyPolicy.html](https://docs.amazonaws.cn/kms/latest/APIReference/API_PutKeyPolicy.html)。此权限允许密钥管理员更改此 KMS 密钥的密钥策略。

**`kms:Update*`**  
允许 [`kms:UpdateAlias`](alias-update.md) 和 [https://docs.amazonaws.cn/kms/latest/APIReference/API_UpdateKeyDescription.html](https://docs.amazonaws.cn/kms/latest/APIReference/API_UpdateKeyDescription.html)。对于多区域密钥，它允许此 KMS 密钥上的 [`kms:UpdatePrimaryRegion`](multi-region-update.md#update-primary-console)。

**`kms:Revoke*`**  
允许 [`kms:RevokeGrant`](grant-delete.md)，即允许密钥管理员[删除授权](grant-delete.md)，即使管理员不是授权中的[停用主体](grants.md#terms-retiring-principal)。

**`kms:Disable*`**  
允许 [`kms:DisableKey`](enabling-keys.md)。对于对称加密 KMS 密钥，它还允许 [`kms:DisableKeyRotation`](rotate-keys.md)。

**`kms:Get*`**  
允许 [`kms:GetKeyPolicy`](key-policy-viewing.md) 和 [`kms:GetKeyRotationStatus`](rotate-keys.md)。对于具有导入密钥材料的 KMS 密钥，它允许 [https://docs.amazonaws.cn/kms/latest/APIReference/API_GetParametersForImport.html](https://docs.amazonaws.cn/kms/latest/APIReference/API_GetParametersForImport.html)。对于非对称 KMS 密钥，它允许 [https://docs.amazonaws.cn/kms/latest/APIReference/API_GetPublicKey.html](https://docs.amazonaws.cn/kms/latest/APIReference/API_GetPublicKey.html)。需要 `kms:GetKeyPolicy` 权限才能查看 Amazon Web Services 管理控制台中 KMS 密钥的密钥策略。

**`kms:Delete*`**  
允许 [`kms:DeleteAlias`](kms-alias.md)。对于具有导入密钥材料的密钥，它允许 [`kms:DeleteImportedKeyMaterial`](importing-keys.md)。`kms:Delete*` 权限不允许密钥管理员删除 KMS 密钥 (`ScheduleKeyDeletion`)。

**`kms:TagResource`**  
允许 [`kms:TagResource`](tagging-keys.md)，以此允许密钥管理员向 KMS 密钥添加标签。由于标签也可用于控制对 KMS 密钥的访问，因此管理员通过此权限可允许或拒绝对 KMS 密钥的访问。有关更多信息，请参阅 [ABAC for Amazon KMS](abac.md)。

**`kms:UntagResource`**  
允许 [`kms:UntagResource`](tagging-keys.md)，以此允许密钥管理员从 KMS 密钥删除标签。由于标签可用于控制对密钥的访问，因此管理员通过此权限可允许或拒绝对 KMS 密钥的访问。有关更多信息，请参阅 [ABAC for Amazon KMS](abac.md)。

**`kms:ScheduleKeyDeletion`**  
允许 [https://docs.amazonaws.cn/kms/latest/APIReference/API_ScheduleKeyDeletion.html](https://docs.amazonaws.cn/kms/latest/APIReference/API_ScheduleKeyDeletion.html)，以此允许密钥管理员[删除此 KMS 密钥](deleting-keys.md)。要删除此权限，请清除 **Allow key administrators to delete this key**（允许密钥管理员删除此密钥）选项。

**`kms:CancelKeyDeletion`**  
允许 [https://docs.amazonaws.cn/kms/latest/APIReference/API_CancelKeyDeletion.html](https://docs.amazonaws.cn/kms/latest/APIReference/API_CancelKeyDeletion.html)，以此允许密钥管理员[取消此 KMS 密钥的删除](deleting-keys.md)。要删除此权限，请清除 **Allow key administrators to delete this key**（允许密钥管理员删除此密钥）选项。

**`kms:RotateKeyOnDemand`**  
允许 [https://docs.amazonaws.cn/kms/latest/APIReference/API_RotateKeyOnDemand.html](https://docs.amazonaws.cn/kms/latest/APIReference/API_RotateKeyOnDemand.html)，此操作将允许密钥管理员[按需轮换此 KMS 密钥中的密钥材料](rotating-keys-on-demand.md)。

 

Amazon KMS 在创建特殊用途密钥时，将以下权限添加到默认密钥管理员语句中。

**`kms:ImportKeyMaterial`**  
[https://docs.amazonaws.cn/kms/latest/APIReference/API_ImportKeyMaterial.html](https://docs.amazonaws.cn/kms/latest/APIReference/API_ImportKeyMaterial.html) 权限允许密钥管理员将密钥材料导入 KMS 密钥。仅当[创建不含密钥材料的 KMS 密钥](importing-keys-create-cmk.md)时，此权限才包含在密钥策略中。

**`kms:ReplicateKey`**  
该[https://docs.amazonaws.cn/kms/latest/APIReference/API_ReplicateKey.html](https://docs.amazonaws.cn/kms/latest/APIReference/API_ReplicateKey.html)权限允许密钥管理员在不同的 Amazon 区域中[创建多区域主密钥的副本](multi-region-keys-replicate.md)。仅当您创建多区域主键或副本键时，此权限才会包含在密钥策略中。

**`kms:UpdatePrimaryRegion`**  
[https://docs.amazonaws.cn/kms/latest/APIReference/API_UpdatePrimaryRegion.html](https://docs.amazonaws.cn/kms/latest/APIReference/API_UpdatePrimaryRegion.html) 权限允许密钥管理员[将多区域副本密钥更改为多区域主键](multi-region-update.md)。仅当您创建多区域主键或副本键时，此权限才会包含在密钥策略中。

## 允许密钥用户使用 KMS 密钥


控制台为 KMS 密钥创建的默认密钥策略允许您在账户中选择 IAM 用户和 IAM 角色以及外部角色 Amazon Web Services 账户，并使其成为*密钥用户*。

控制台将两个策略语句添加到密钥用户的密钥策略中。
+ [直接使用 KMS 密钥](#key-policy-users-crypto) — 第一个密钥策略语句授予密钥用户将 KMS 密钥直接用于该类型 KMS 密钥支持的所有[加密操作](kms-cryptography.md#cryptographic-operations)的权限。
+ 将 [KMS 密钥用于 Amazon 服务](#key-policy-service-integration) — 第二项策略声明允许密钥用户允许与其集成的 Amazon 服务代表他们使用 KMS 密钥 Amazon KMS 来保护资源，例如 Amazon S3 存储桶和 Amazon DynamoDB 表。

创建 KMS 密钥时，您可以将 IAM 用户、IAM 角色和其他 Amazon Web Services 账户 角色添加到密钥用户列表中。您也可以使用控制台的默认密钥策略视图来编辑该列表，如下图所示。默认密钥策略视图可从密钥详细信息页面获取。有关允许其他 Amazon Web Services 账户 用户使用 KMS 密钥的更多信息，请参阅[允许其他账户中的用户使用 KMS 密钥](key-policy-modifying-external-accounts.md)。

**注意**  
IAM 最佳实践不鼓励使用具有长期凭证的 IAM 用户。而应尽可能使用提供临时凭证的 IAM 角色。有关更多信息，请参阅《IAM 用户指南》中的 [IAM 安全最佳实践](https://docs.amazonaws.cn/IAM/latest/UserGuide/best-practices.html)**。

![\[控制台默认密钥策略中的密钥用户，默认视图\]](http://docs.amazonaws.cn/kms/latest/developerguide/images/console-key-policy-users-sm.png)


单区域对称的原定设置*密钥用户语句*允许以下权限。有关每个权限的详细信息，请参阅 [Amazon KMS 权限](kms-api-permissions-reference.md)。

当您使用 Amazon KMS 控制台创建 KMS 密钥时，控制台会将您指定的用户和角色添加到每个密钥用户语句中的`Principal`元素中。

**注意**  
 Amazon KMS 控制台在语句标识符`"Allow use of the key"`和下将密钥用户添加到密钥策略中`"Allow attachment of persistent resources"`。如果修改这些语句标识符，则可能会影响控制台显示您对该语句所做修改的方式。

```
{
  "Sid": "Allow use of the key",
  "Effect": "Allow",
  "Principal": {"AWS": [
    "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:role/ExampleRole",
    "arn:aws:iam::444455556666:root"
  ]},
  "Action": [
    "kms:CreateGrant",
    "kms:ListGrants",
    "kms:RevokeGrant"
  ],
  "Resource": "*",
  "Condition": {"Bool": {"kms:GrantIsForAWSResource": true}}
}
```

## 允许密钥用户使用 KMS 密钥进行加密操作


密钥用户有权在 KMS 密钥支持的所有[加密操作](kms-cryptography.md#cryptographic-operations)中直接使用 KMS 密钥。他们还可以使用该[DescribeKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_DescribeKey.html)操作在 Amazon KMS 控制台或使用 Amazon KMS API 操作来获取有关 KMS 密钥的详细信息。

默认情况下， Amazon KMS 控制台会将密钥用户语句添加到默认密钥策略中，如下例所示。由于支持的 API 操作不同，策略语句中针对对称加密 KMS 密钥、HMAC KMS 密钥、用于公有密钥加密的非对称 KMS 密钥以及用于签名和验证的非对称 KMS 密钥的操作略有不同。

**对称加密 KMS 密钥**  
控制台将以下语句添加到对称加密 KMS 密钥的密钥策略中。  

```
{
  "Sid": "Allow use of the key",
  "Effect": "Allow",  
  "Principal": {"AWS": "arn:aws:iam::111122223333:role/ExampleKeyUserRole"},
  "Action": [
    "kms:Decrypt",
    "kms:DescribeKey",
    "kms:Encrypt",
    "kms:GenerateDataKey*",
    "kms:ReEncrypt*"
  ],
  "Resource": "*"
}
```

**HMAC KMS 密钥**  
控制台将以下语句添加到 HMAC KMS 密钥的密钥策略中。  

```
{
  "Sid": "Allow use of the key",
  "Effect": "Allow",  
  "Principal": {"AWS": "arn:aws:iam::111122223333:role/ExampleKeyUserRole"},
  "Action": [
    "kms:DescribeKey",
    "kms:GenerateMac",
    "kms:VerifyMac"
  ],
  "Resource": "*"
}
```

**用于公有密钥加密的非对称 KMS 密钥**  
对于密钥用法为 **Encrypt and decrypt**（加密和解密）的非对称 KMS 密钥，控制台将以下语句添加到其密钥策略中。  

```
{
  "Sid": "Allow use of the key",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/ExampleKeyUserRole"
  },
  "Action": [
    "kms:Encrypt",
    "kms:Decrypt",
    "kms:ReEncrypt*",
    "kms:DescribeKey",
    "kms:GetPublicKey"
  ],
  "Resource": "*"
}
```

**用于签名和验证的非对称 KMS 密钥**  
对于密钥用法为 **Sign and verify**（签名和验证）的非对称 KMS 密钥，控制台将以下语句添加到其密钥策略中。  

```
{
  "Sid": "Allow use of the key",
  "Effect": "Allow",
  "Principal": {"AWS": "arn:aws:iam::111122223333:role/ExampleKeyUserRole"},
  "Action": [
    "kms:DescribeKey",
    "kms:GetPublicKey",
    "kms:Sign",
    "kms:Verify"
  ],
  "Resource": "*"
}
```

**用于派生共享密钥的非对称 KMS 密钥**  
对于密钥用法为**密钥协议**的非对称 KMS 密钥，控制台会将以下语句添加到其密钥政策中。  

```
{
  "Sid": "Allow use of the key",
  "Effect": "Allow",
  "Principal": {"AWS": "arn:aws:iam::111122223333:role/ExampleKeyUserRole"},
  "Action": [
    "kms:DescribeKey",
    "kms:GetPublicKey",
    "kms:DeriveSharedSecret"
  ],
  "Resource": "*"
}
```

这些语句中的操作赋予密钥用户以下权限。

[https://docs.amazonaws.cn/kms/latest/APIReference/API_Encrypt.html](https://docs.amazonaws.cn/kms/latest/APIReference/API_Encrypt.html)  
允许密钥用户使用此 KMS 密钥加密数据。

[https://docs.amazonaws.cn/kms/latest/APIReference/API_Decrypt.html](https://docs.amazonaws.cn/kms/latest/APIReference/API_Decrypt.html)  
允许密钥用户使用此 KMS 密钥解密数据。

[https://docs.amazonaws.cn/kms/latest/APIReference/API_DeriveSharedSecret.html](https://docs.amazonaws.cn/kms/latest/APIReference/API_DeriveSharedSecret.html)  
允许密钥用户使用此 KMS 密钥派生共享密钥。

[https://docs.amazonaws.cn/kms/latest/APIReference/API_DescribeKey.html](https://docs.amazonaws.cn/kms/latest/APIReference/API_DescribeKey.html)  
允许密钥用户获取有关此 KMS 密钥的详细信息，包括其标识符、创建日期和密钥状态。它还允许密钥用户在 Amazon KMS 控制台中显示有关 KMS 密钥的详细信息。

`kms:GenerateDataKey*`  
允许密钥用户请求对称数据密钥或非对称数据密钥对，以执行客户端加密操作。控制台使用\$1 通配符表示对以下 API 操作的权限：[GenerateDataKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKey.html)、[GenerateDataKeyWithoutPlaintext[GenerateDataKeyPair](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKeyPair.html)](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKeyWithoutPlaintext.html)、和[GenerateDataKeyPairWithoutPlaintext](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKeyPairWithoutPlaintext.html)。这些权限仅对加密数据密钥的对称 KMS 密钥有效。

[kms: GenerateMac](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateMac.html)  
允许密钥用户使用 HMAC KMS 密钥生成 HMAC 标签。

[kms: GetPublicKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_GetPublicKey.html)  
允许密钥用户下载非对称 KMS 密钥的公有密钥。与您共享此公钥的各方可以对外部的数据进行加密 Amazon KMS。但是，这些密文只能通过调用 Amazon KMS中的 [Decrypt](https://docs.amazonaws.cn/kms/latest/APIReference/API_Decrypt.html) 操作进行解密。

[kms: ReEncrypt](https://docs.amazonaws.cn/kms/latest/APIReference/API_ReEncrypt.html) \$1   
允许密钥用户重新加密最初使用此 KMS 密钥加密的数据，或使用此 KMS 密钥重新加密之前已加密的数据。该[ReEncrypt](https://docs.amazonaws.cn/kms/latest/APIReference/API_ReEncrypt.html)操作需要同时访问源 KMS 密钥和目标 KMS 密钥。为此，可以允许对源 KMS 密钥具备 `kms:ReEncryptFrom` 权限，对目标 KMS 密钥具备 `kms:ReEncryptTo` 权限。但是，为简单起见，控制台允许对两个 KMS 密钥具备 `kms:ReEncrypt*` 权限（采用 `*` 通配符）。

[kms:Sign](https://docs.amazonaws.cn/kms/latest/APIReference/API_Sign.html)  
允许密钥用户使用此 KMS 密钥签署消息。

[kms:Verify](https://docs.amazonaws.cn/kms/latest/APIReference/API_Verify.html)  
允许密钥用户使用此 KMS 密钥验证签名。

[kms: VerifyMac](https://docs.amazonaws.cn/kms/latest/APIReference/API_VerifyMac.html)  
允许密钥用户使用 HMAC KMS 密钥验证 HMAC 标签。

## 允许密钥用户将 KMS 密钥用于 Amazon 服务


控制台中的默认密钥策略还为密钥用户提供了在使用授权的 Amazon 服务中保护其数据所需的授予权限。 Amazon 服务通常使用授权来获得使用 KMS 密钥的特定和有限权限。

此密钥策略声明允许密钥用户创建、查看和撤消对 KMS 密钥的授权，但前提是授权操作请求来自[与 Amazon KMS集成的Amazon 服务](https://www.amazonaws.cn/kms/features/#AWS_Service_Integration)。[kms: GrantIsFor AWSResource](conditions-kms.md#conditions-kms-grant-is-for-aws-resource) 策略条件不允许用户直接调用这些授权操作。当密钥用户允许时， Amazon 服务可以代表用户创建授权，允许该服务使用 KMS 密钥来保护用户的数据。

密钥用户必须具备这些授权权限，才能一起使用 KMS 密钥和集成服务，但仅有这些权限还不够。密钥用户还必须具备使用集成服务的权限。有关向用户提供与集成的 Amazon 服务的访问权限的详细信息 Amazon KMS，请参阅集成服务的文档。

```
{
  "Sid": "Allow attachment of persistent resources",
  "Effect": "Allow",
  "Principal": {"AWS": "arn:aws:iam::111122223333:role/ExampleKeyUserRole"},
  "Action": [
    "kms:CreateGrant",
    "kms:ListGrants",
    "kms:RevokeGrant"
  ],
  "Resource": "*",
  "Condition": {"Bool": {"kms:GrantIsForAWSResource": true}}
}
```

例如，密钥用户可以通过以下方式对 KMS 密钥使用这些权限。
+ 将此 KMS 密钥与 Amazon Elastic Block Store (Amazon EBS) 和 Amazon Elastic Compute Cloud (Amazon EC2) 结合使用，将加密的 EBS 卷附加到 EC2 实例。密钥用户向 Amazon EC2 隐式授予使用 KMS 密钥将加密卷挂载到实例的权限。有关更多信息，请参阅[亚马逊 Elastic Block Store (Amazon EBS) 的使用方式 Amazon KMS](services-ebs.md)。
+ 将此 KMS 密钥用于 Amazon Redshift 以启动加密集群。密钥用户向 Amazon Redshift 隐式授予使用 KMS 密钥启动加密集群并创建加密快照的权限。有关更多信息，请参阅[亚马逊 Redshift 的使用方式 Amazon KMS](services-redshift.md)。
+ 将此 KMS 密钥与其他[与 Amazon KMS集成的Amazon 服务](service-integration.md)一起使用，这些服务使用授权服务创建、管理或使用这些服务加密的资源。

默认密钥策略允许密钥用户向*所有*使用授权的集成服务委托授权权限。但是，您可以创建自定义密钥策略，将权限限制为指定 Amazon 服务。有关更多信息，请参阅 [kms: ViaService](conditions-kms.md#conditions-kms-via-service) 条件键。

# 查看密钥政策


您可以使用 Amazon KMS 控制台或 Amazon KMS API [Amazon 托管式密钥](concepts.md#aws-managed-key)中的[GetKeyPolicy](https://docs.amazonaws.cn/kms/latest/APIReference/API_GetKeyPolicy.html)操作查看 Amazon KMS [客户托管密钥](concepts.md#customer-mgn-key)或账户中的密钥策略。但这些技术不能用于查看其他 Amazon Web Services 账户中的 KMS 密钥的密钥策略。

要了解有关 Amazon KMS 密钥策略的更多信息，请参阅[中的关键政策 Amazon KMS](key-policies.md)。要了解如何确定哪些用户和角色有权访问 KMS 密钥，请参阅 [确定访问权限 Amazon KMS keys](determining-access.md)。

## 使用控制 Amazon KMS 台


授权用户可以在 Amazon Web Services 管理控制台的 **Key policy**（密钥策略）选项卡上查看 [Amazon 托管式密钥](concepts.md#aws-managed-key) 或[客户托管密钥](concepts.md#customer-mgn-key)的密钥策略。

要在中查看 KMS 密钥的密钥策略 Amazon Web Services 管理控制台，您必须拥有 k [ms: ListAliases](https://docs.amazonaws.cn/kms/latest/APIReference/API_ListAliases.html)、[kms: DescribeKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_DescribeKey.html) 和 [kms: GetKeyPolicy](https://docs.amazonaws.cn/kms/latest/APIReference/API_GetKeyPolicy.html) 权限。

1. 登录 Amazon Web Services 管理控制台 并在 [https://console.aws.amazon.com/km](https://console.amazonaws.cn/kms) s 处打开 Amazon Key Management Service (Amazon KMS) 控制台。

1. 要更改 Amazon Web Services 区域，请使用页面右上角的区域选择器。

1. 

   要查看您的账户中为您 Amazon 创建和管理的密钥，请在导航窗格中选择**Amazon 托管密钥**。要查看您账户中自己所创建和管理的密钥，请在导航窗格中选择 **Customer managed keys (客户托管密钥)**。

1. 在 KMS 密钥列表中，选择要检查的 KMS 密钥的别名或密钥 ID。

1. 选择 **Key policy (密钥策略)** 选项卡。

   在 **Key policy**（密钥策略）选项卡中，您可能会看到密钥策略文档。这是*策略视图*。在密钥策略语句中，可以看到由密钥策略授予 KMS 密钥访问权限的委托人，还可以看到他们能执行的操作。

   以下示例显示了[默认密钥策略](key-policy-default.md)的策略视图。  
![\[Amazon KMS 控制台策略视图中的默认密钥策略视图\]](http://docs.amazonaws.cn/kms/latest/developerguide/images/console-key-policy-view.png)

   或者，如果您在中创建了 KMS 密钥 Amazon Web Services 管理控制台，则会看到*默认视图*，其中包含**密钥管理员**、**密钥删除**和**密钥用户**部分。要查看密钥策略文档，请选择 **Switch to policy view (切换到策略视图)**。

   以下示例显示了[默认密钥策略](key-policy-default.md)的默认视图。  
![\[在 Amazon KMS 控制台的默认视图中查看默认密钥策略\]](http://docs.amazonaws.cn/kms/latest/developerguide/images/console-key-policy-full-vsm.png)

## 使用 Amazon KMS API


要在中获取 KMS 密钥的密钥策略 Amazon Web Services 账户，请使用 Amazon KMS API 中的[GetKeyPolicy](https://docs.amazonaws.cn/kms/latest/APIReference/API_GetKeyPolicy.html)操作。此操作不能用于查看其他帐户中的密钥策略。

以下示例使用 Amazon Command Line Interface (Amazon CLI) 中的[get-key-policy](https://docs.amazonaws.cn/cli/latest/reference/kms/get-key-policy.html)命令，但您可以使用任何 Amazon SDK 来发出此请求。

请注意，`PolicyName` 参数是必需的，即使其唯一的有效值为 `default`。此外，此命令请求以文本而不是 JSON 形式输出，以便更易于查看。

在运行此命令之前，请将示例密钥 ID 替换为您账户中的有效密钥 ID。

```
$ aws kms get-key-policy --key-id 1234abcd-12ab-34cd-56ef-1234567890ab --policy-name default --output text
```

响应应类似于下图，返回[默认密钥策略](key-policy-default.md)。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Id" : "key-consolepolicy-3",
  "Statement" : [ {
  "Sid" : "EnableIAMUserPermissions",
    "Effect" : "Allow",
    "Principal" : {
      "AWS" : "arn:aws:iam::111122223333:root"
    },
    "Action" : "kms:*",
    "Resource" : "*"
  } ]
}
```

------

# 更改密钥政策


您可以使用 Amazon Web Services 管理控制台 或[PutKeyPolicy](https://docs.amazonaws.cn/kms/latest/APIReference/API_PutKeyPolicy.html)操作更改中某个 KMS 密钥的密钥策略。 Amazon Web Services 账户 但这些技术不能用于更改其他 Amazon Web Services 账户中的 KMS 密钥的密钥策略。

当更改密钥策略时，请注意以下规则：
+ 您可以查看 [Amazon 托管式密钥](concepts.md#aws-managed-key) 或[客户托管密钥](concepts.md#customer-mgn-key)的密钥策略，但只能更改客户托管密钥的密钥策略 的策略由 Amazon 托管式密钥 在您的账户中创建 KMS 密钥的 Amazon 服务创建和管理。您无法查看或更改 [Amazon 拥有的密钥](concepts.md#aws-owned-key) 的密钥策略。
+ 您可以在密钥策略 Amazon Web Services 账户 中添加或删除 IAM 用户、IAM 角色以及更改允许或拒绝这些委托人的操作。有关在密钥策略中指定委托人和权限的方法的更多信息，请参阅[密钥政策](key-policies.md)。
+ 您无法向密钥策略添加 IAM 组，但可以添加多个 IAM 用户和 IAM 角色。有关更多信息，请参阅 [允许多个 IAM 主体访问 KMS 密钥](iam-policies.md#key-policy-modifying-multiple-iam-users)。
+ 如果您在密钥策略中 Amazon Web Services 账户 添加外部策略，则还必须在外部账户中使用 IAM 策略向这些账户中的 IAM 用户、群组或角色授予权限。有关更多信息，请参阅 [允许其他账户中的用户使用 KMS 密钥](key-policy-modifying-external-accounts.md)。
+ 所生成的密钥策略文档不能超过 32 KB（32,768 字节）。

## 如何更改密钥策略


您可以通过三种不同的方式更改密钥策略，如以下各部分所述。

**Topics**
+ [

### 使用 Amazon Web Services 管理控制台 默认视图
](#key-policy-modifying-how-to-console-default-view)
+ [

### 使用 Amazon Web Services 管理控制台 策略视图
](#key-policy-modifying-how-to-console-policy-view)
+ [

### 使用 Amazon KMS API
](#key-policy-modifying-how-to-api)

### 使用 Amazon Web Services 管理控制台 默认视图


您可以使用控制台中名为*默认视图*的图形界面来更改密钥策略。

如果以下步骤与您在此控制台中看到的内容不一致，可能意味着，此密钥策略不是由此控制台创建的。也可能意味着，修改此密钥策略的方式不受控制台的默认视图的支持。在这种情况下，请按照[使用 Amazon Web Services 管理控制台 策略视图](#key-policy-modifying-how-to-console-policy-view)或[使用 Amazon KMS API](#key-policy-modifying-how-to-api)中的步骤操作。

1. 查看客户托管密钥的密钥策略，如 [使用控制 Amazon KMS 台](key-policy-viewing.md#key-policy-viewing-console) 中所述。（您无法更改的密钥策略 Amazon 托管式密钥。）

1. 确定要更改的内容。
   + 要添加或删除[密钥管理员](key-policy-default.md#key-policy-default-allow-administrators)以及允许或阻止密钥管理员[删除 KMS 密钥](deleting-keys.md)，请使用此页面的 **Key administrators**（密钥管理员）部分中的控件。密钥管理员管理 KMS 密钥，包括启用和禁用它、设置密钥策略以及[启用密钥轮换](rotate-keys.md)。
   + 要添加或删除[密钥用户](key-policy-default.md#key-policy-default-allow-users)，以及允许或禁止外部 Amazon Web Services 账户 用户使用 KMS 密钥，请使用页面**密钥用户**部分中的控件。密钥用户可以在[加密操作](kms-cryptography.md#cryptographic-operations)（如加密、解密、重新加密和生成数据密钥）中使用 KMS 密钥。

### 使用 Amazon Web Services 管理控制台 策略视图


您可以使用控制台的*策略视图*更改密钥策略文档。

1. 查看客户托管密钥的密钥策略，如 [使用控制 Amazon KMS 台](key-policy-viewing.md#key-policy-viewing-console) 中所述。（您无法更改的密钥策略 Amazon 托管式密钥。）

1. 在**密钥策略**部分中，选择**切换到策略视图**。

1. 选择**编辑**。

1. 确定要更改的内容。
   + 要添加新语句，请选择**添加新语句**。然后，您可以从语句构建器面板列出的选项中选择新密钥策略语句的操作、主体和条件，也可手动输入策略语句元素。
   + 要移除密钥策略中的某个语句，请选择该语句，然后选择**移除**。检查所选的策略语句并确认您要将其移除。如果您决定不移除该语句，请选择**取消**。
   + 要编辑现有的密钥策略语句，请选择该语句。然后，您可以使用语句生成器面板来选择要修改的特定元素，也可手动编辑该语句。

1. 选择**保存更改**。

### 使用 Amazon KMS API


您可以使用该[PutKeyPolicy](https://docs.amazonaws.cn/kms/latest/APIReference/API_PutKeyPolicy.html)操作来更改您的 KMS 密钥的密钥策略 Amazon Web Services 账户。但不能对其他 Amazon Web Services 账户中的 KMS 密钥使用此 API。

1. 使用[GetKeyPolicy](https://docs.amazonaws.cn/kms/latest/APIReference/API_GetKeyPolicy.html)操作获取现有的密钥策略文档，然后将密钥策略文档保存到文件中。有关多种编程语言中的示例代码，请参阅 [`GetKeyPolicy`与 Amazon SDK 或 CLI 配合使用](example_kms_GetKeyPolicy_section.md)。

1. 在您的首选文本编辑器中打开该密钥策略文档，编辑该密钥策略文档，然后保存文件。

1. 使用[PutKeyPolicy](https://docs.amazonaws.cn/kms/latest/APIReference/API_PutKeyPolicy.html)操作将更新的密钥策略文档应用于 KMS 密钥。有关多种编程语言中的示例代码，请参阅 [`PutKeyPolicy`与 Amazon SDK 或 CLI 配合使用](example_kms_PutKeyPolicy_section.md)。

有关将密钥策略从一个 KMS 密钥复制到另一个 KMS 密钥的[GetKeyPolicy 示例，请参阅 Amazon CLI 命令参考中的示例](https://docs.amazonaws.cn/cli/latest/reference/kms/get-key-policy.html#examples)。

# 关键策略中的 Amazon 服务权限
Amazon 服务权限

许多 Amazon 服务 Amazon KMS keys 用来保护其管理的资源。在服务使用 [Amazon 拥有的密钥](concepts.md#aws-owned-key) 或 [Amazon 托管式密钥](concepts.md#aws-managed-key) 时，该服务会为这些 KMS 密钥建立和维护密钥策略。

但是，当您通过 Amazon 服务使用[客户托管式密钥](concepts.md#customer-mgn-key)时，您可以设置并维护密钥策略。该密钥策略必须允许服务具有代表您保护资源所需的最低权限。建议您遵循最低权限原则：仅授予服务所需的权限。您可以通过了解服务需要哪些权限，并使用 [Amazon 全局条件键](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html)和 [Amazon KMS 条件键](policy-conditions.md)来优化权限，以有效做到这一点。

要查找服务在客户托管式密钥上需要的权限，请参阅该服务的加密文档。以下列表包含一些服务文档的链接：
+ **Amazon CloudTrail**权限-[为配置 Amazon KMS 密钥策略 CloudTrail](https://docs.amazonaws.cn/awscloudtrail/latest/userguide/create-kms-key-policy-for-cloudtrail.html#create-kms-key-policy-for-cloudtrail-decrypt)
+ **Amazon Elastic Block Store** 权限：[Amazon EC2 用户指南](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/EBSEncryption.html#ebs-encryption-permissions)和 [Amazon EC2 用户指南](https://docs.amazonaws.cn/AWSEC2/latest/WindowsGuide/EBSEncryption.html#ebs-encryption-permissions)
+ **Amazon Lambda** 权限：[Lambda 的静态数据加密](https://docs.amazonaws.cn/lambda/latest/dg/security-encryption-at-rest.html)
+ **Amazon Q** 权限：[Data encryption for Amazon Q](https://docs.amazonaws.cn/amazonq/latest/qbusiness-ug/data-encryption.html)
+ **Amazon Relational Database Service** 权限：[Amazon KMS 密钥管理](https://docs.amazonaws.cn/AmazonRDS/latest/UserGuide/Overview.Encryption.Keys.html)
+ **Amazon Secrets Manager** 权限：[Authorizing use of the KMS key](https://docs.amazonaws.cn/secretsmanager/latest/userguide/security-encryption.html#security-encryption-authz)
+ **Amazon Simple Queue Service** 权限：[Amazon SQS Key management](https://docs.amazonaws.cn/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-key-management.html)

# 将 IAM 策略与配合使用 Amazon KMS
IAM 策略

您可以使用 IAM 策略以及[密钥策略](key-policies.md)、[授权](grants.md)和 [VPC 终端节点策略](https://docs.amazonaws.cn/vpc/latest/privatelink/interface-endpoints.html#edit-vpc-endpoint-policy)来控制对您 Amazon KMS keys 的 in 的访问权限 Amazon KMS。

**注意**  
要使用 IAM policy 控制对 KMS 密钥的访问，KMS 密钥的密钥政策必须授予账户使用 IAM policy 的权限。具体而言，密钥策略必须包含[启用 IAM policy 的策略语句](key-policy-default.md#key-policy-default-allow-root-enable-iam)。  
本节介绍如何使用 IAM 策略来控制对 Amazon KMS 操作的访问权限。有关 IAM 的更多一般信息，请参阅 [IAM 用户指南](https://docs.amazonaws.cn/IAM/latest/UserGuide/)。

所有 KMS 密钥都必须具有密钥策略。IAM policy 是可选的。要使用 IAM policy 控制对 KMS 密钥的访问，KMS 密钥的密钥政策必须授予账户使用 IAM policy 的权限。具体而言，密钥策略必须包含[启用 IAM policy 的策略语句](key-policy-default.md#key-policy-default-allow-root-enable-iam)。

IAM 策略可以控制对任何 Amazon KMS 操作的访问权限。与密钥策略不同，IAM 策略可以控制对多个 KMS 密钥的访问权限，并为多个相关 Amazon 服务的操作提供权限。但是，IAM 策略对于控制对操作的访问特别有用 [CreateKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateKey.html)，例如无法由密钥策略控制的操作，因为它们不涉及任何特定的 KMS 密钥。

如果您 Amazon KMS 通过亚马逊虚拟私有云 (Amazon VPC) 终端节点进行访问，则还可以在使用终端节点时使用 VPC 终端节点策略来限制对 Amazon KMS 资源的访问。例如，在使用 VPC 终端节点时，您可能只允许您的委托人 Amazon Web Services 账户 访问您的客户托管密钥。有关详细信息，请参阅 [VPC 端点策略](https://docs.amazonaws.cn/vpc/latest/privatelink/interface-endpoints.html#edit-vpc-endpoint-policy)。

有关编写和格式化 JSON 策略文档的帮助，请参阅 *IAM 用户指南*中的 [IAM JSON 策略参考](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies.html)。

您可以通过以下方式使用 IAM policy：
+ **将权限策略附加到角色以启用联合身份验证或跨账户权限** – 您可以将 IAM policy 附加到 IAM 角色以启用联合身份验证，允许跨账户权限，或者向运行在 EC2 实例上的应用程序授予权限。有关 IAM 角色各种使用场景的更多信息，请参阅 *IAM 用户指南*中的 [IAM 角色](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles.html)。
+ **将权限策略附加到用户或组** – 您可以附加允许某个用户或用户组调用 Amazon KMS 操作的策略。但是，IAM 最佳实践建议您尽可能使用具有临时凭证的身份，例如 IAM 角色。

以下示例显示了具有 Amazon KMS 权限的 IAM 策略。此策略允许附加到其上的 IAM 身份获取列出所有 KMS 密钥和别名。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": [
      "kms:ListKeys",
      "kms:ListAliases"
    ],
    "Resource": "*"
  }
}
```

------

与所有 IAM policy 一样，此策略没有 `Principal` 元素。将 IAM policy 附加到 IAM 身份时，该身份将获取策略中指定的权限。

有关显示所有 Amazon KMS API 操作及其适用的资源的表格，请参阅[权限参考](kms-api-permissions-reference.md)。

## 允许多个 IAM 主体访问 KMS 密钥


IAM 组不是密钥策略中的有效委托人。要允许多个 IAM 用户和角色访问 KMS 密钥，请执行下列操作中的一种：
+ 将 IAM 角色作为密钥策略中的主体。多个授权用户可以根据需要代入该角色。有关详细信息，请参阅《IAM 用户指南》中的 [IAM 角色](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles.html)**。

  虽然您可以在密钥策略中列出多个 IAM 用户，但不建议采用这种做法，因为这将要求您在每次授权用户列表发生变化时更新密钥策略。此外，IAM 最佳实践也不鼓励使用具有长期凭证的 IAM 用户。有关更多信息，请参阅《IAM 用户指南》中的 [IAM 安全最佳实践](https://docs.amazonaws.cn/IAM/latest/UserGuide/best-practices.html)**。
+ 使用 IAM policy 向 IAM 组授予权限。要执行此操作，请确保密钥策略包含一个 [启用 IAM policy 以允许访问 KMS 密钥](key-policy-default.md#key-policy-default-allow-root-enable-iam) 的语句，[创建一个 IAM policy](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_managed-using.html#create-managed-policy-console) 以允许访问该 KMS 密钥，然后 [将该策略附加到 IAM 组](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_managed-using.html#attach-managed-policy-console)（其中包含授权 IAM 用户）。使用此方式，您不需要在授权用户列表发生更改时更改任何策略。相反，您只需在相应的 IAM 组中添加或删除这些用户。有关详细信息，请参阅《IAM 用户指南》中的 [IAM 用户组](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_groups.html)**。

有关 Amazon KMS 密钥策略和 IAM 策略如何协同工作的更多信息，请参阅[Amazon KMS 权限疑难解答](policy-evaluation.md)。

# IAM policy 的最佳实践


确保访问 Amazon KMS keys 权限对您的所有 Amazon 资源的安全至关重要。KMS 密钥用于保护您的 Amazon Web Services 账户中很多最敏感的资源。花点时间设计控制对 KMS 密钥的访问权限的[密钥政策](key-policies.md)、IAM 策略、[授权](grants.md)和 VPC 端点策略。

在控制对 KMS 密钥的访问的 IAM policy 语句中，使用[最低权限原则](https://docs.amazonaws.cn/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)。仅为 IAM 委托人授予他们对必须使用或管理的 KMS 密钥的所需权限。

以下最佳实践适用于控制 Amazon KMS 密钥和别名访问权限的 IAM 策略。有关一般性的 IAM policy 最佳实践，请参阅《IAM 用户指南》中的 [IAM 安全最佳实践](https://docs.amazonaws.cn/IAM/latest/UserGuide/best-practices.html)**。

**使用密钥策略**  
尽可能在影响一个 KMS 密钥的密钥策略中提供权限，而不是在可应用于许多 KMS 密钥的 IAM policy 中提供权限，包括其他 Amazon Web Services 账户中的权限。[这对于诸如 [kms: PutKeyPolicy 和 kms:](https://docs.amazonaws.cn/kms/latest/APIReference/API_PutKeyPolicy.html) 之类的敏感权限尤其重要，对于决定如何保护数据的加密操作ScheduleKeyDeletion也是如此。](https://docs.amazonaws.cn/kms/latest/APIReference/API_ScheduleKeyDeletion.html)

**限制 CreateKey 权限**  
仅向需要密钥 (kms[:CreateKey) 的委托人授予创建密钥](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateKey.html) (kms:) 的权限。创建 KMS 密钥的委托人还会设置其密钥策略，以便他们可以授予自己和其他人使用和管理他们创建的 KMS 密钥的权限。允许此权限时，请考虑通过使用[策略条件](policy-conditions.md)限制它。例如，您可以使用 [kms: KeySpec](conditions-kms.md#conditions-kms-key-spec) 条件来限制对称加密 KMS 密钥的权限。

**在 IAM policy 中指定 KMS 密钥**  
最佳实践是在策略语句的 `Resource` 元素中指定权限所应用到的每个 KMS 密钥的[密钥 ARN](concepts.md#key-id-key-ARN)。此实践限制委托人需要的 KMS 密钥的权限。例如，此 `Resource` 元素仅列出主体需要使用的 KMS 密钥。  

```
"Resource": [
    "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
    "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321"
]
```
指定 KMS 密钥不切实际时，请使用一个限制访问可信 Amazon Web Services 账户 和区域（例如）中的 KMS 密钥的`Resource``arn:aws:kms:region:account:key/*`值。或者限制对受信任方所有区域 (\$1) 的 KMS 密钥的访问权限 Amazon Web Services 账户，例如`arn:aws:kms:*:account:key/*`。  
不能在 IAM 策略的 `Resource` 字段中使用[密钥 ID](concepts.md#key-id-key-id)、[别名名称](concepts.md#key-id-alias-name)或者[别名 ARN](concepts.md#key-id-alias-ARN) 来表示 KMS 密钥。如果您指定别名 ARN，则策略将应用于别名，而不是 KMS 密钥。有关别名的 IAM policy 的信息，请参阅。[控制对别名的访问](alias-access.md)

**在 IAM policy 中避免使用 "Resource": "\$1"**  <a name="avoid-resource-star"></a>
谨慎地使用通配符 (\$1)。在密钥策略中，`Resource` 元素中的通配符表示密钥策略附加到的 KMS 密钥。但是在 IAM 策略中，仅在`Resource`元素 (`"Resource": "*"`) 中使用通配符即可将权限应用于委托人账户有权 Amazon Web Services 账户 使用的所有 KMS 密钥。这可能包括[其他密钥中的](key-policy-modifying-external-accounts.md) KMS 密钥 Amazon Web Services 账户，以及委托人账户中的 KMS 密钥。  
例如，要在另一个账户中使用 KMS 密钥 Amazon Web Services 账户，委托人需要获得外部账户中 KMS 密钥的密钥策略以及自己账户中的 IAM 策略的许可。假设一个任意账户授予了您对其 KMS 密钥的 Amazon Web Services 账户 [kms:Decrypt](https://docs.amazonaws.cn/kms/latest/APIReference/API_Decrypt.html) 权限。若如此，您账户中授予角色对所有 KMS 密钥 (`"Resource": "*"`) 的 `kms:Decrypt` 权限的 IAM policy 将满足要求的 IAM 部分。因此，可以担任该角色的委托人现在可以使用不可信账户中的 KMS 密钥解密密文。他们的操作条目会出现在两个账户的 CloudTrail 日志中。  
特别是，避免在允许以下 API 操作的策略语句中使用 `"Resource": "*"`。可以在其他的 KMS 密钥上调用这些操作 Amazon Web Services 账户。  
+ [DescribeKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_DescribeKey.html)
+ [GetKeyRotationStatus](https://docs.amazonaws.cn/kms/latest/APIReference/API_GetKeyRotationStatus.html)
+ [加密操作](kms-cryptography.md#cryptographic-operations)[（[加密、[解密](https://docs.amazonaws.cn/kms/latest/APIReference/API_Decrypt.html)](https://docs.amazonaws.cn/kms/latest/APIReference/API_Encrypt.html)、、、、、[GenerateDataKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKey.html)、[GenerateDataKeyPair](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKeyPair.html)、、[GenerateDataKeyWithoutPlaintext[GenerateDataKeyPairWithoutPlaintext](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKeyPairWithoutPlaintext.html)](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKeyWithoutPlaintext.html)、[签名[GetPublicKey[ReEncrypt](https://docs.amazonaws.cn/kms/latest/APIReference/API_ReEncrypt.html)](https://docs.amazonaws.cn/kms/latest/APIReference/API_GetPublicKey.html)](https://docs.amazonaws.cn/kms/latest/APIReference/API_Sign.html)、验证）](https://docs.amazonaws.cn/kms/latest/APIReference/API_Verify.html)
+ [CreateGrant](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateGrant.html), [ListGrants](https://docs.amazonaws.cn/kms/latest/APIReference/API_ListGrants.html), [ListRetirableGrants](https://docs.amazonaws.cn/kms/latest/APIReference/API_ListRetirableGrants.html), [RetireGrant](https://docs.amazonaws.cn/kms/latest/APIReference/API_RetireGrant.html), [RevokeGrant](https://docs.amazonaws.cn/kms/latest/APIReference/API_RevokeGrant.html)

**何时使用 "Resource": "\$1"**  <a name="require-resource-star"></a>
在 IAM policy 中，仅将 `Resource` 元素中的通配符用于需要它的权限。只有以下权限才需要 `"Resource": "*"` 元素。  
+ [kms: CreateKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateKey.html)
+ [kms: GenerateRandom](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateRandom.html)
+ [kms: ListAliases](https://docs.amazonaws.cn/kms/latest/APIReference/API_ListAliases.html)
+ [kms: ListKeys](https://docs.amazonaws.cn/kms/latest/APIReference/API_ListKeys.html)
+ 自定义密钥存储库的权限，例如 k [ms: CreateCustomKeyStore](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateCustomKeyStore.html) 和 [kms: ConnectCustomKeyStore](https://docs.amazonaws.cn/kms/latest/APIReference/API_ConnectCustomKeyStore.html)。
别名操作（[kms:、kms: CreateAlias](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateAlias.html) [、k](https://docs.amazonaws.cn/kms/latest/APIReference/API_UpdateAlias.html) ms[: UpdateAlias、kms: DeleteAlias](https://docs.amazonaws.cn/kms/latest/APIReference/API_DeleteAlias.html)）的权限必须附加到别名和 KMS 密钥。您可以使用 IAM policy 中的 `"Resource": "*"` 来表示别名和 KMS 密钥，或者在 `Resource` 元素中指定别名和 KMS 密钥。有关示例，请参阅 [控制对别名的访问](alias-access.md)。

 

本主题中的示例提供了有关设计 KMS 密钥的 IAM policy 的详细信息和指导。有关所有 Amazon 资源的 IAM 最佳实践，请参阅 [IAM *用户指南中的 IAM* 安全最佳实践](https://docs.amazonaws.cn/IAM/latest/UserGuide/best-practices.html)。

# 在 IAM policy 语句中指定 KMS 密钥


您可以使用 IAM policy 来允许委托人使用或管理 KMS 密钥。KMS 密钥在策略语句的 `Resource` 元素中指定。
+ 要在 IAM policy 语句中指定 KMS 密钥，必须使用其[密钥 ARN](concepts.md#key-id-key-ARN)。您不能使用[密钥 ID](concepts.md#key-id-key-id)、[别名名称](concepts.md#key-id-alias-name)或[别名 ARN](concepts.md#key-id-alias-ARN) 来标识 IAM policy 语句中的 KMS 密钥。

  例如：“`Resource": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab`”

  要根据别名控制对 KMS 密钥的访问权限，请使用 k [ms: RequestAlias](conditions-kms.md#conditions-kms-request-alias) 或 k [ms: ResourceAliases](conditions-kms.md#conditions-kms-resource-aliases) 条件密钥。有关更多信息，请参阅 [ABAC for Amazon KMS](abac.md)。

  仅在控制别名操作（例如、或）访问权限的策略声明中使用别名 ARN 作为[CreateAlias](https://docs.amazonaws.cn/kms/latest/APIReference/CreateAlias.html)资源。[UpdateAlias[DeleteAlias](https://docs.amazonaws.cn/kms/latest/APIReference/DeleteAlias.html)](https://docs.amazonaws.cn/kms/latest/APIReference/UpdateAlias.html)有关更多信息，请参阅 [控制对别名的访问](alias-access.md)。
+ 要在账户和区域中指定多个 KMS 密钥，请在密钥 ARN 的区域或资源 ID 位置中使用通配符 (\$1)。

  例如，要指定账户的美国西部（俄勒冈）区域中的所有 KMS 密钥，请使用“`Resource": "arn:aws:kms:us-west-2:111122223333:key/*`”。要指定账户的所有区域中的所有 KMS 密钥，请使用“`Resource": "arn:aws:kms:*:111122223333:key/*`”。
+ 要表示所有 KMS 密钥，请单独使用通配符 (`"*"`)。对于不使用任何特定 KMS 密钥（即、和）的操作 [CreateKey[GenerateRandom[ListAliases](https://docs.amazonaws.cn/kms/latest/APIReference/API_ListAliases.html)](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateRandom.html)](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateKey.html)，请使用此格式[ListKeys](https://docs.amazonaws.cn/kms/latest/APIReference/API_ListKeys.html)。

在编写策略语句时，[最佳实践](iam-policies-best-practices.md)是只指定委托人需要使用的 KMS 密钥，而不是授予他们对所有 KMS 密钥的访问权限。

例如，以下 IAM 策略声明仅允许委托人对策略声明`Resource`元素中列出的 KMS 密钥调用[DescribeKey[GenerateDataKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKey.html)](https://docs.amazonaws.cn/kms/latest/APIReference/API_DescribeKey.html)、、[Decrypt](https://docs.amazonaws.cn/kms/latest/APIReference/API_Decrypt.html) 操作。通过密钥 ARN 指定 KMS 密钥是一种最佳实践，可确保权限仅限于指定的 KMS 密钥。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": [
      "kms:DescribeKey",
      "kms:GenerateDataKey",
      "kms:Decrypt"
    ],
    "Resource": [
     "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
     "arn:aws:kms:us-west-2:111122223333:key/01234abcd-12ab-34cd-56ef-1234567890ab"
    ]
  }
}
```

------

要将权限应用于特定可信对象中的所有 KMS 密钥 Amazon Web Services 账户，可以在区域和密钥 ID 位置中使用通配符 (\$1)。例如，以下策略语句允许委托人对两个可信示例账户的中的 KMS 密钥调用指定操作。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": [
      "kms:DescribeKey",
      "kms:GenerateDataKey",
      "kms:GenerateDataKeyPair"
    ],
    "Resource": [
      "arn:aws:kms:*:111122223333:key/*",
      "arn:aws:kms:*:444455556666:key/*"
    ]
  }
}
```

------

您还可以单独在 `Resource` 元素中使用通配符 (`"*"`)。由于它允许访问帐户有权使用的所有 KMS 密钥，因此建议主要用于没有特定 KMS 密钥的操作和 `Deny` 语句。您还可以在仅允许不太敏感的只读操作的策略语句中使用它。要确定某项 Amazon KMS 操作是否涉及特定的 KMS 密钥，请在中表的 “**资源**” 列中查找 **KMS 密钥**值[Amazon KMS 权限](kms-api-permissions-reference.md)。

例如，以下策略语句使用 `Deny` 效果来禁止委托人对任何 KMS 密钥使用指定的操作。它在 `Resource` 元素中使用通配符来表示所有 KMS 密钥。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Deny",
    "Action": [
      "kms:CreateKey",
      "kms:PutKeyPolicy",
      "kms:CreateGrant",
      "kms:ScheduleKeyDeletion"
    ],
    "Resource": "*"
  }
}
```

------

以下策略语句单独使用通配符来表示所有 KMS 密钥。但它只允许不太敏感的只读操作和不适用于任何特定 KMS 密钥的操作。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": [
      "kms:CreateKey",
      "kms:ListKeys",
      "kms:ListAliases",
      "kms:ListResourceTags"
    ],
    "Resource": "*"
  }
}
```

------

# IAM 策略示例
示例

在此部分中，可以找到允许执行各种 Amazon KMS 操作的权限的示例 IAM policy。

**重要**  
仅当 KMS 密钥的密钥策略也允许时，才允许提供以下策略中的某些权限。有关更多信息，请参阅 [权限参考](kms-api-permissions-reference.md)。

有关编写和格式化 JSON 策略文档的帮助，请参阅 *IAM 用户指南*中的 [IAM JSON 策略参考](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies.html)。

**Topics**
+ [

## 允许用户在 Amazon KMS 控制台中查看 KMS 密钥
](#iam-policy-example-read-only-console)
+ [

## 允许用户创建 KMS 密钥
](#iam-policy-example-create-key)
+ [

## 允许用户使用特定 KMS 密钥进行加密和解密 Amazon Web Services 账户
](#iam-policy-example-encrypt-decrypt-one-account)
+ [

## 允许用户使用特定 Amazon Web Services 账户 和区域中的任何 KMS 密钥进行加密和解密
](#iam-policy-example-encrypt-decrypt-one-account-one-region)
+ [

## 允许用户使用特定 KMS 密钥进行加密和解密
](#iam-policy-example-encrypt-decrypt-specific-cmks)
+ [

## 阻止用户禁用或删除任何 KMS 密钥
](#iam-policy-example-deny-disable-delete)

## 允许用户在 Amazon KMS 控制台中查看 KMS 密钥


以下 IAM 策略允许用户以只读方式访问 Amazon KMS 控制台。拥有这些权限的用户可以查看其中的所有 KMS 密钥 Amazon Web Services 账户，但他们无法创建或更改任何 KMS 密钥。

要在**Amazon 托管式密钥**和**客户托管密钥页面上查看 [K](https://docs.amazonaws.cn/kms/latest/APIReference/API_ListKeys.html) MS 密钥**，即使密钥没有[标签或别名ListAliases，委托人也需要 k [m](https://docs.amazonaws.cn/kms/latest/APIReference/API_ListAliases.html) s:、kms: 和 tag: GetResources](https://docs.amazonaws.cn/resourcegroupstagging/latest/APIReference/API_GetResources.html) 权限。ListKeys在 [KMS 密钥详细信息页面上查看可选的 KMS 密钥表列和数据需要其余权限，尤其是 kms: DescribeKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_DescribeKey.html)。需要 ia [m: ListUsers](https://docs.amazonaws.cn/IAM/latest/APIReference/API_ListUsers.html) 和 ia ListRoles m[: 权限](https://docs.amazonaws.cn/IAM/latest/APIReference/API_ListRoles.html)才能在默认视图中毫无错误地显示密钥策略。要查看**自定义密钥存储库页面上的数据以及自定义密钥存储库**中 KMS 密钥的详细信息，委托人还需要 k [ms: DescribeCustomKeyStores](https://docs.amazonaws.cn/kms/latest/APIReference/API_DescribeCustomKeyStores.html) 权限。

如果您限制用户的控制台对特定 KMS 密钥的访问，控制台将显示不可见的每个 KMS 密钥的错误。

此策略包含两个策略语句。第一个策略语句中的 `Resource` 元素允许对示例 Amazon Web Services 账户的所有区域中的所有 KMS 密钥的指定权限。控制台查看器不需要额外的访问权限，因为 Amazon KMS 控制台仅显示委托人账户中的 KMS 密钥。即使他们有权在其他版本中查看 KMS 密钥，也是如此 Amazon Web Services 账户。其余 Amazon KMS 和 IAM 权限需要一个`"Resource": "*"`元素，因为它们不适用于任何特定的 KMS 密钥。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "ReadOnlyAccessForAllKMSKeysInAccount",
      "Effect": "Allow",
      "Action": [
        "kms:GetPublicKey",        
        "kms:GetKeyRotationStatus",
        "kms:GetKeyPolicy",
        "kms:DescribeKey",
        "kms:ListKeyPolicies",
        "kms:ListResourceTags",
        "tag:GetResources"
      ],
      "Resource": "arn:aws:kms:*:111122223333:key/*"
    },
    {
      "Sid": "ReadOnlyAccessForOperationsWithNoKMSKey",
      "Effect": "Allow",
      "Action": [
        "kms:ListKeys",
        "kms:ListAliases",
        "iam:ListRoles",
        "iam:ListUsers"
      ],
      "Resource": "*"
    }
  ]
}
```

------

## 允许用户创建 KMS 密钥


以下 IAM policy 允许用户创建所有类型的 KMS 密钥。该`Resource`元素的值`*`是因为该`CreateKey`操作不使用任何特定的 Amazon KMS 资源（KMS 密钥或别名）。

要限制用户使用特定类型的 KMS 密钥，请使用 k [ms: KeySpec](conditions-kms.md#conditions-kms-key-spec)、[kms: KeyUsage](conditions-kms.md#conditions-kms-key-usage) 和 k [ms: KeyOrigin](conditions-kms.md#conditions-kms-key-origin) 条件密钥。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": "kms:CreateKey",
    "Resource": "*"
  }
}
```

------

创建密钥的委托人可能需要一些相关权限。
+ **kms: PutKeyPolicy** — 拥有`kms:CreateKey`权限的委托人可以为 KMS 密钥设置初始密钥策略。但是，`CreateKey`调用者必须拥有 k [ms: PutKeyPolicy](https://docs.amazonaws.cn/kms/latest/APIReference/API_PutKeyPolicy.html) 权限，允许他们更改 KMS 密钥策略，或者必须指定`BypassPolicyLockoutSafetyCheck`参数`CreateKey`，但不建议这样做。`CreateKey` 调用方可以从 IAM policy 中获得对 KMS 密钥的 `kms:PutKeyPolicy` 权限，也可以将此权限包含在他们正在创建的 KMS 密钥的密钥策略中。
+ **kms: TagResource** — 要在`CreateKey`操作期间向 KMS 密钥添加标签，`CreateKey`调用者必须在 IAM 策略中TagResource拥有 [kms:](https://docs.amazonaws.cn/kms/latest/APIReference/API_TagResource.html) 权限。将此权限包含在新 KMS 密钥的密钥策略中是不够的。但是，如果 `CreateKey` 调用方在初始密钥策略中包括 `kms:TagResource`，他们可以在创建 KMS 密钥后在单独调用中添加标签。
+ **kms: CreateAlias** — 在 Amazon KMS 控制台中创建 KMS 密钥的委托人必须对 [KMS 密钥和别名拥有 kms: CreateAlias](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateAlias.html) 权限。（控制台进行两次调用；一次对 `CreateKey`，一次对 `CreateAlias`）。您必须在 IAM policy 中提供别名权限。您可以在密钥策略或 IAM policy 中提供 KMS 密钥权限。有关更多信息，请参阅 [控制对别名的访问](alias-access.md)。

此外`kms:CreateKey`，以下 IAM 策略提供`kms:TagResource`对中所有 KMS 密钥的`kms:CreateAlias`权限 Amazon Web Services 账户 以及对账户所有别名的权限。它还包括一些只能在 IAM policy 中提供的有用的只读权限。

此 IAM policy 不包含 `kms:PutKeyPolicy` 权限或可以在密钥策略中设置的任何其他权限。它是在密钥策略中设置这些权限的[最佳实践](iam-policies-best-practices.md)，在该密钥策略中，这些权限专门应用于一个 KMS 密钥。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "IAMPermissionsForParticularKMSKeys",
      "Effect": "Allow",
      "Action": "kms:TagResource",
      "Resource": "arn:aws:kms:*:111122223333:key/*"
    },
    {
      "Sid": "IAMPermissionsForParticularAliases",
      "Effect": "Allow",
      "Action": "kms:CreateAlias",
      "Resource": "arn:aws:kms:*:111122223333:alias/*"
    },
    {
      "Sid": "IAMPermissionsForAllKMSKeys",
      "Effect": "Allow",
      "Action": [
        "kms:CreateKey",
        "kms:ListKeys",
        "kms:ListAliases"
      ],
      "Resource": "*"
    }
  ]
}
```

------

## 允许用户使用特定 KMS 密钥进行加密和解密 Amazon Web Services 账户


以下 IAM 策略允许用户使用 111122223333 中的 Amazon Web Services 账户 任何 KMS 密钥加密和解密数据。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": [
      "kms:Encrypt",
      "kms:Decrypt"
    ],
    "Resource": "arn:aws:kms:*:111122223333:key/*"
  }
}
```

------

## 允许用户使用特定 Amazon Web Services 账户 和区域中的任何 KMS 密钥进行加密和解密


以下 IAM 策略允许用户使用美国西部（俄勒冈）地区的任何 KMS 密钥加密和解密数据。 Amazon Web Services 账户 `111122223333`

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": [
      "kms:Encrypt",
      "kms:Decrypt"
    ],
    "Resource": [
      "arn:aws:kms:us-west-2:111122223333:key/*"
    ]
  }
}
```

------

## 允许用户使用特定 KMS 密钥进行加密和解密


以下 IAM policy 允许用户使用 `Resource` 元素中指定的两个 KMS 密钥来加密和解密数据。在 IAM policy 语句中指定 KMS 密钥时，必须使用 KMS 密钥的[密钥 ARN](concepts.md#key-id-key-ARN)。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": [
      "kms:Encrypt",
      "kms:Decrypt"
    ],
    "Resource": [
      "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
      "arn:aws:kms:us-west-2:111122223333:key/01234abc-d12a-b34c-d56e-f1234567890a'"
    ]
  }
}
```

------

## 阻止用户禁用或删除任何 KMS 密钥


以下 IAM policy 阻止用户禁用或删除任何 KMS 密钥，即使其他 IAM policy 或密钥策略允许这些权限时也是如此。以显式方式拒绝权限的策略将覆盖所有其他策略，甚至包括那些以显式方式允许相同权限的策略。有关更多信息，请参阅 [Amazon KMS 权限疑难解答](policy-evaluation.md)。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Deny",
    "Action": [
      "kms:DisableKey",
      "kms:ScheduleKeyDeletion"
    ],
    "Resource": "*"
  }
}
```

------

# 中的资源控制策略 Amazon KMS
资源控制策略

资源控制策略 (RCPs) 是一种组织策略，可用于对组织中的 Amazon 资源实施预防性控制。 RCPs 帮助您大规模集中限制外部访问您的 Amazon 资源。 RCPs 补充服务控制策略 (SCPs)。虽然 SCPs 可用于集中设置组织中 IAM 角色和用户的最大权限，但 RCPs 可用于集中设置组织中 Amazon 资源的最大权限。

您可以使用 RCPs 管理组织中客户托管的 KMS 密钥的权限。 RCPs 仅凭向您的客户托管密钥授予权限是不够的。RCP 不会授予任何权限。RCP 针对各种身份可对受影响账户中资源执行的操作定义权限护栏或设置限制。管理员仍然必须将基于身份的策略附加到 IAM 用户或角色，或者附加密钥策略，才能实际授予权限。

**注意**  
组织中的资源控制策略不适用于 [Amazon 托管式密钥](concepts.md#aws-managed-key)。  
Amazon 托管式密钥 由 Amazon 服务代表您创建、管理和使用，您无法更改或管理其权限。

**了解详情**
+ 有关的更多一般信息 RCPs，请参阅《*Amazon Organizations 用户指南》*中的[资源控制策略](https://docs.amazonaws.cn/organizations/latest/userguide/orgs_manage_policies_rcps.html)。
+ 有关如何定义的详细信息（包括示例） RCPs，请参阅《*Amazon Organizations 用户指南》*中的 [RCP 语法](https://docs.amazonaws.cn/organizations/latest/userguide/orgs_manage_policies_rcps_syntax.html)。

以下示例展示了如何使用 RCP 来阻止外部主体访问您组织中的客户自主管理型密钥。此策略仅为示例，需要根据您自己独特的业务和安全需求对其进行定制。例如，您可能需要对该策略进行自定义，以允许业务合作伙伴访问。有关更多详细信息，请参阅 [data perimeter policy examples repository](https://github.com/aws-samples/data-perimeter-policy-examples/tree/main/resource_control_policies)。

**注意**  
即使 `Action` 元素将星号（\$1）指定为通配符，`kms:RetireGrant` 权限在 RCP 中也无效。  
要详细了解如何确定 `kms:RetireGrant` 权限，请参阅[停用和撤销授权](grant-delete.md)。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "RCPEnforceIdentityPerimeter",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "kms:*",
            "Resource": "*",
            "Condition": {
                "StringNotEqualsIfExists": {
                    "aws:PrincipalOrgID": "my-org-id"
                },
                "Bool": {
                    "aws:PrincipalIsAWSService": "false"
                }
            }
        }
    ]
}
```

------

以下示例 RCP 要求 Amazon 服务委托人只有在请求来自您的组织时才能访问您的客户托管的 KMS 密钥。此策略仅对存在的 `aws:SourceAccount` 请求执行控制。这样可以确保不需要使用 `aws:SourceAccount` 的服务集成不会受到影响。如果请求上下文中存在 `aws:SourceAccount`，则 `Null` 条件将评估为 `true`，从而强制执行 `aws:SourceOrgID` 键。

有关混淆代理问题的更多信息，请参阅《IAM 用户指南》中的[混淆代理问题](https://docs.amazonaws.cn/IAM/latest/UserGuide/confused-deputy.html)**。

```
```

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "RCPEnforceConfusedDeputyProtection",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "kms:*",
            "Resource": "*",
            "Condition": {
                "StringNotEqualsIfExists": {
                    "aws:SourceOrgID": "my-org-id"
                },
                "Bool": {
                    "aws:PrincipalIsAWSService": "true"
                },
                "Null": {
                    "aws:SourceAccount": "false"
                }
            }
        }
    ]
}
```

------

# 补助金 Amazon KMS
授权

*授权*是一种策略分析工具，允许 [Amazon 主体](https://docs.amazonaws.cn/IAM/latest/UserGuide/intro-structure.html#intro-structure-principal)将 KMS 密钥用于加密操作中。它还可以让他们查看 KMS 密钥 (`DescribeKey`) 以及创建和管理授权。在授权访问 KMS 密钥时，将考虑授权与[密钥策略](key-policies.md)和 [IAM policy](iam-policies.md)。授权通常用于临时权限，因为您可以在不更改密钥策略或 IAM policy 的情况下创建授权、使用其权限并将其删除。

与之集成的 Amazon 服务通常使用赠款 Amazon KMS 来加密您的静态数据。该服务代表账户中的用户创建授权，使用其权限，并在其任务完成后立即停用授权。有关 Amazon 服务如何使用授权的详细信息，请参阅服务用户指南或开发者指南中的*静态加密*主题。

授权是一种非常灵活且有用的访问控制机制。当您为 KMS 密钥创建授权时，授权允许被授权主体对 KMS 密钥调用指定授权操作，前提是该授权中指定的所有条件都得到满足。
+ 每个授权只允许访问一个 KMS 密钥。您可以在不同的 Amazon Web Services 账户中为 KMS 密钥创建授权。
+ 授权可以允许访问 KMS 密钥，但不能拒绝访问。
+ 每个授权都有一名[被授权主体](#terms-grantee-principal)。被授权者委托人可以代表一个或多个与 KMS 密钥 Amazon Web Services 账户 相同的身份，也可以在不同的账户中代表一个或多个身份。
+ 授权只能允许[授权操作](#terms-grant-operations)。授权操作必须由授权中的 KMS 密钥支持。如果您指定了不支持的操作，则[CreateGrant](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateGrant.html)请求会失败并出现`ValidationError`异常。
+ 被授权主体可以使用授权给予他们的权限，而无需指定授权，就像权限来自密钥策略或 IAM policy 一样。但是，由于 Amazon KMS API 遵循[最终一致性](#terms-eventual-consistency)模型，因此当您创建、停用或撤销授权时，可能会有短暂的延迟，直到更改始终 Amazon KMS可用。要立即使用授权中的权限，[请使用授权令牌](using-grant-token.md)。
+ 授权委托人可以删除授权（[停用](#terms-retire-grant)或者[撤销](#terms-revoke-grant)它）。删除授权会清除授权允许的所有权限。您不必确定要添加或删除哪些策略来撤销授权。
+ Amazon KMS 限制每个 KMS 密钥的授权数量。有关更多信息，请参阅 [每个 KMS 密钥的授权数：50000](resource-limits.md#grants-per-key)。

在创建授权和给予其他人创建授权的权限时务必谨慎。创建授权的权限会带来安全影响，就像允许 [kms: PutKeyPolicy](https://docs.amazonaws.cn/kms/latest/APIReference/API_PutKeyPolicy.html) 权限设置策略一样。
+ 有权为 KMS 密钥创建授权的用户可以使用授权来允许用户和角色（包括 Amazon 服务`kms:CreateGrant`）使用 KMS 密钥。委托人可以是您自己的身份，也可以是其他账户 Amazon Web Services 账户 或组织中的身份。
+ 授权只能允许一部分 Amazon KMS 操作。您可以使用授权允许委托人查看 KMS 密钥，在加密操作中使用它，以及创建和停用授权。有关详细信息，请参阅[授权操作](#terms-grant-operations)。您还可以使用[授权约束](create-grant-overview.md#grant-constraints)来限制对称加密密钥授权中的权限。
+ 委托人可以获得从密钥策略或 IAM policy 创建授权的权限。通过策略获得的 `kms:CreateGrant` 权限的主体可以为基于 KMS 密钥的任何[授权操作](#terms-grant-operations)创建授权。这些主体无需拥有他们对密钥的授权权限。当您在策略中允许 `kms:CreateGrant` 权限时，您可以使用[策略条件](grant-authorization.md)来限制此权限。
+ 委托人还可以获得从授权创建授权的权限。这些主体只能委派他们被授予的权限，即使他们具有来自策略的其他权限也是如此。有关更多信息，请参阅 [授予 CreateGrant 权限](create-grant-overview.md#grant-creategrant)。

## 授权概念


为了有效地使用授权，您需要了解 Amazon KMS 使用的术语和概念。

**授权约束**  <a name="terms-grant-constraint"></a>
限制授权中的权限的条件。目前， Amazon KMS 支持基于加密操作请求中的[加密上下文](encrypt_context.md)的授予限制。有关更多信息，请参阅 [使用授权约束](create-grant-overview.md#grant-constraints)。

**授权 ID**  <a name="terms-grant-id"></a>
KMS 密钥的授权的唯一标识符。您可以使用授权 ID 和[密钥标识符](concepts.md#key-id)来标识[RetireGrant](https://docs.amazonaws.cn/kms/latest/APIReference/API_RetireGrant.html)或[RevokeGrant](https://docs.amazonaws.cn/kms/latest/APIReference/API_RevokeGrant.html)请求中的授权。

**授权操作**  <a name="terms-grant-operations"></a>
您可以在授权中允许的 Amazon KMS 操作。如果您指定其他操作，则[CreateGrant](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateGrant.html)请求会失败，但会出现`ValidationError`异常。这些也是接受[授权令牌](#grant_token)的操作。有关这些权限的详细信息，请参阅 [Amazon KMS 权限](kms-api-permissions-reference.md)。  
这些授权操作实际上代表使用操作的权限。因此，对于 `ReEncrypt` 操作，您可以指定 `ReEncryptFrom`、`ReEncryptTo` 或此两者 `ReEncrypt*`。  
授权操作包括：  
+ 加密操作
  + [Decrypt](https://docs.amazonaws.cn/kms/latest/APIReference/API_Decrypt.html)
  + [DeriveSharedSecret](https://docs.amazonaws.cn/kms/latest/APIReference/API_DeriveSharedSecret.html)
  + [Encrypt](https://docs.amazonaws.cn/kms/latest/APIReference/API_Encrypt.html)
  + [GenerateDataKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKey.html)
  + [GenerateDataKeyPair](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKeyPair.html)
  + [GenerateDataKeyPairWithoutPlaintext](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKeyPairWithoutPlaintext.html)
  + [GenerateDataKeyWithoutPlaintext](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKeyWithoutPlaintext.html)
  + [GenerateMac](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateMac.html)
  + [ReEncryptFrom](https://docs.amazonaws.cn/kms/latest/APIReference/API_ReEncrypt.html)
  + [ReEncryptTo](https://docs.amazonaws.cn/kms/latest/APIReference/API_ReEncrypt.html)
  + [Sign](https://docs.amazonaws.cn/kms/latest/APIReference/API_Sign.html)
  + [Verify](https://docs.amazonaws.cn/kms/latest/APIReference/API_Verify.html)
  + [VerifyMac](https://docs.amazonaws.cn/kms/latest/APIReference/API_VerifyMac.html)
+ 其他操作
  + [CreateGrant](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateGrant.html)
  + [DescribeKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_DescribeKey.html)
  + [GetPublicKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_GetPublicKey.html)
  + [RetireGrant](https://docs.amazonaws.cn/kms/latest/APIReference/API_RetireGrant.html)
您允许的授权操作必须由授权中的 KMS 密钥支持。如果您指定了不支持的操作，则[CreateGrant](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateGrant.html)请求会失败并出现`ValidationError`异常。例如，对称加密 KMS 密钥的授权不能允许 [Sign](https://docs.amazonaws.cn/kms/latest/APIReference/API_Sign.html)、[Verify](https://docs.amazonaws.cn/kms/latest/APIReference/API_Verify.html)、[https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateMac.html](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateMac.html) 或 [https://docs.amazonaws.cn/kms/latest/APIReference/API_VerifyMac.html](https://docs.amazonaws.cn/kms/latest/APIReference/API_VerifyMac.html) 操作。非对称 KMS 密钥的授权不能允许生成数据密钥或数据密钥对的操作。

**授权令牌**  <a name="grant_token"></a>
 Amazon KMS API 遵循[最终一致性](#terms-eventual-consistency)模型。当您创建授权时，可能会出现短暂的延迟，才能使更改在整个 Amazon KMS中可用。更改通常需要不到几秒钟的时间即可在整个系统中传播，但在某些情况下，可能需要几分钟。如果您尝试在系统中完全传播之前使用授权，您可能会收到访问被拒绝的错误。授权令牌允许您引用授权并立即使用授权权限。  
*授权令牌*是代表授权的唯一、非秘密、长度可变的 base64 编码字符串。您可以使用授权令牌来标识任何[授权操作](#terms-grant-operations)中的授权。但是，由于令牌值是哈希摘要，它不会显示有关授权的任何详细信息。  
授权令牌设计为仅在授权传播到整个 Amazon KMS中时使用。之后，[被授权者委托人](#terms-grantee-principal)可以在不提供授权令牌或授权的任何其他证据的情况下使用授权中的权限。您可以随时使用授权令牌，但是一旦授权最终保持一致，就 Amazon KMS 使用授权而不是授权令牌来确定权限。  
例如，以下命令调用该[GenerateDataKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKey.html)操作。它使用授权令牌来表示给予调用者（被授权者委托人）对指定的 KMS 密钥调用 `GenerateDataKey` 的权限的授权。  

```
$ aws kms generate-data-key \
        --key-id 1234abcd-12ab-34cd-56ef-1234567890ab \
        --key-spec AES_256 \
        --grant-token $token
```
您还可以使用授权令牌来标识管理授权的操作中的授权。例如，[即将退休的委托](#terms-retiring-principal)人可以在调用[RetireGrant](https://docs.amazonaws.cn/kms/latest/APIReference/API_RetireGrant.html)操作时使用授权令牌。  

```
$ aws kms retire-grant \
        --grant-token $token
```
`CreateGrant` 是返回授权令牌的唯一操作。您无法从任何其他 Amazon KMS 操作或该操作的[CloudTrail 日志事件](ct-creategrant.md)中获取授权令牌。 CreateGrant [ListGrants](https://docs.amazonaws.cn/kms/latest/APIReference/API_ListGrants.html)和[ListRetirableGrants](https://docs.amazonaws.cn/kms/latest/APIReference/API_ListRetirableGrants.html)操作返回[授权 ID](#terms-grant-id)，但不返回授权令牌。  
有关更多信息，请参阅 [使用授权令牌](using-grant-token.md)。

**被授权者委托人**  <a name="terms-grantee-principal"></a>
获取授权中指定的权限的身份。每个授权都有一个被授权主体，但被授权主体可以代表多个身份。  
被授权者委托人可以是任何 Amazon 委托人，包括 Amazon Web Services 账户 （根）、I [AM 用户](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_users.html)、[IAM 角色](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles.html)[、联合角色或用户](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_providers.html)或代入角色用户。被授权者委托人可以与 KMS 密钥位于同一账户中，也可以位于不同的账户中。但是，被授权者委托人不能是[服务委托人](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_principal.html#principal-services)、[IAM 组](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_groups.html)，或 [Amazon 组织](https://docs.amazonaws.cn/organizations/latest/userguide/)。  
IAM 最佳实践不鼓励使用具有长期凭证的 IAM 用户。而应尽可能使用提供临时凭证的 IAM 角色。有关更多信息，请参阅《IAM 用户指南》中的 [IAM 安全最佳实践](https://docs.amazonaws.cn/IAM/latest/UserGuide/best-practices.html)**。

**停用（授权）**  <a name="terms-retire-grant"></a>
终止授权。当您使用完权限时，将停用授权。  
撤销和停用授权都会删除授权。但是，停用由授权中指定的委托人完成。撤消通常由密钥管理员执行。有关更多信息，请参阅 [停用和撤销授权](grant-delete.md)。

**停用委托人**  <a name="terms-retiring-principal"></a>
可以[停用授权](#terms-retire-grant)的委托人。您可以在授权中指定停用委托人，但这不是必需的。即将退出的委托人可以是任何 Amazon 委托人，包括 Amazon Web Services 账户 IAM 用户、IAM 角色、联合用户和代入角色用户。停用委托人可以与 KMS 密钥位于同一账户中，也可以位于不同的账户中。  
IAM 最佳实践不鼓励使用具有长期凭证的 IAM 用户。而应尽可能使用提供临时凭证的 IAM 角色。有关更多信息，请参阅《IAM 用户指南》中的 [IAM 安全最佳实践](https://docs.amazonaws.cn/IAM/latest/UserGuide/best-practices.html)**。
除了补助金中规定的退休本金外，补助金还可由设立补助金 Amazon Web Services 账户 的所在地收回。如果授权允许 `RetireGrant` 操作，[被授权者委托人](#terms-grantee-principal)可以停用授权。此外，即将退休 Amazon Web Services 账户 的委托人 Amazon Web Services 账户 或可以将撤回补助金的权限委托给同 Amazon Web Services 账户一个IAM委托人。有关更多信息，请参阅 [停用和撤销授权](grant-delete.md)。

**撤销（授予）**  <a name="terms-revoke-grant"></a>
终止授权。您将撤销积极拒绝授权允许的权限的授权。  
撤销和停用授权都会删除授权。但是，停用由授权中指定的委托人完成。撤消通常由密钥管理员执行。有关更多信息，请参阅 [停用和撤销授权](grant-delete.md)。

**最终一致性（用于授权）**  <a name="terms-eventual-consistency"></a>
 Amazon KMS API 遵循[最终一致性](https://en.wikipedia.org/wiki/Eventual_consistency)模型。当您创建、停用或撤销授权时，可能会出现短暂的延迟，才能使更改在整个 Amazon KMS中可用。更改通常需要不到几秒钟的时间即可在整个系统中传播，但在某些情况下，可能需要几分钟。  
如果您遇到意外错误，您可能会注意到这个短暂的延迟。例如，如果您尝试管理新的授权，或者在新授权中使用这些权限 Amazon KMS，则可能会收到拒绝访问的错误。如果您停用或撤销授权，则被授权者委托人可能仍然能够在短时间内使用其权限，直到完全删除该授权为止。典型的策略是重试请求，有些策略 Amazon SDKs 包括自动退避和重试逻辑。  
Amazon KMS 具有缓解这种短暂延迟的功能。  
+ 要立即使用新授权中的权限，请使用[授权令牌](using-grant-token.md)。您可以使用授权令牌来引用任何[授权操作](#terms-grant-operations)中的授权。有关说明，请参阅[使用授权令牌](using-grant-token.md)。
+ 该[CreateGrant](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateGrant.html)操作具有防止重试操作创建重复授权的`Name`参数。
授权令牌将取代授权的有效性，直到服务中的所有终端节点都使用新的授权状态更新为止。在大多数情况下，最终一致性将在五分钟内实现。
有关更多信息，请参阅[Amazon KMS 最终一致性](accessing-kms.md#programming-eventual-consistency)。

# Amazon KMS 补助金的最佳实践
最佳实践

Amazon KMS 建议在创建、使用和管理拨款时采用以下最佳做法。
+ 将授权中的权限限制为被授权者委托人所需的权限。使用[最小特权访问权限](https://docs.amazonaws.cn/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)的原则。
+ 使用特定的被授权者委托人（如 IAM 角色），并授予被授权委托人仅使用他们所需的 API 操作的权限。
+ 使用加密上下文[授权约束](grants.md#terms-grant-constraint)以确保调用方正在将 KMS 密钥用于预期目的。有关如何在请求中使用加密上下文来保护数据的详细信息，请参阅*Amazon 安全博客 EncryptionContext*中的[如何使用 Amazon Key Management Service 和保护加密数据的完整性](https://www.amazonaws.cn/blogs/security/how-to-protect-the-integrity-of-your-encrypted-data-by-using-aws-key-management-service-and-encryptioncontext/)。
**提示**  
尽可能使用[EncryptionContextEqual](create-grant-overview.md#grant-constraints)授权约束。[EncryptionContextSubset](create-grant-overview.md#grant-constraints)授权约束更难正确使用。如果您需要使用它，请仔细阅读文档并测试授权约束以确保它按预期工作。
+ 删除重复的授权。重复授权具有相同的密钥 ARN、API 操作、被授权者委托人、加密上下文和名称。如果您停用或撤销原始授予，但保留重复项授权，则剩余的重复授权将构成意外的权限提升。为了在重试 `CreateGrant` 请求时避免重复授权，请使用 [`Name` 参数](create-grant-overview.md#grant-create)。要检测重复的授权，请使用[ListGrants](https://docs.amazonaws.cn/kms/latest/APIReference/API_ListGrants.html)操作。如果您意外创建了重复授权，请尽快停用或撤销该授权。
**注意**  
[Amazon 托管密钥](concepts.md#aws-managed-key)的授权可能看起来像重复授权，但具有不同的被授权者委托人。  
`ListGrants` 响应中的 `GranteePrincipal` 字段通常包含授权的被授权者委托人。但是，当赠款中的受赠方委托人是 Amazon 服务时，该`GranteePrincipal`字段包含[服务委托](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_principal.html#principal-services)人，它可能代表几个不同的受赠方委托人。
+ 请记住，授权不会自动过期。当权限不再需要时，立即[停用或撤销授权](grant-delete.md)。未删除的授权可能会对加密资源造成安全风险。

# 控制对授权的访问


您可以控制对在密钥策略、IAM policy 和授权中创建和管理授权的操作的访问权限。从授权中获得 `CreateGrant` 权限的委托人具有[更有限的授权权限](create-grant-overview.md#grant-creategrant)。


| API 操作 | 密钥策略或 IAM policy | 授权 | 
| --- | --- | --- | 
| CreateGrant | ✓ | ✓ | 
| ListGrants | ✓ | - | 
| ListRetirableGrants | ✓ | - | 
| 停用授权 | （有限。请参阅 [停用和撤销授权](grant-delete.md)） | ✓ | 
| RevokeGrant | ✓ | - | 

当您使用密钥策略或 IAM 策略来控制对创建和管理授权的操作的访问权限时，您可以使用以下一个或多个策略条件来限制权限。 Amazon KMS 支持以下所有与 Grant 相关的条件键。有关详细信息和示例，请参阅 [Amazon KMS 条件键](conditions-kms.md)。

[kms: GrantConstraintType](conditions-kms.md#conditions-kms-grant-constraint-type)  
允许委托人仅在授权包含指定的[授权约束](create-grant-overview.md#grant-constraints)时创建授权。

[kms: GrantIsFor AWSResource](conditions-kms.md#conditions-kms-grant-is-for-aws-resource)  
`RevokeGrant`仅当[与之集成的 Amazon 服务代表委托人 Amazon KMS发送请求时，](https://www.amazonaws.cn/kms/features/#AWS_Service_Integration)才允许委托人拨打`CreateGrant``ListGrants`、或。

[kms: GrantOperations](conditions-kms.md#conditions-kms-grant-operations)  
允许委托人创建授权，但将授权限制为指定操作。

[kms: GranteePrincipal](conditions-kms.md#conditions-kms-grantee-principal)  
允许委托人仅为指定的[被授权者委托人](grants.md#terms-grantee-principal)创建授权。

[kms: RetiringPrincipal](conditions-kms.md#conditions-kms-retiring-principal)  
允许委托人仅在授权指定特定的[停用委托人](grants.md#terms-retiring-principal)时创建授权。

# 创建授权


在创建授权之前，请了解用于自定义授权的选项。您可以使用*授权约束*来限制授权中的权限。此外，了解授予 `CreateGrant` 权限的相关信息。获得从授权创建授权的权限的委托人在其可以创建的授权中受到限制。

**Topics**
+ [

## 创建授予
](#grant-create)
+ [

## 授予 CreateGrant 权限
](#grant-creategrant)

## 创建授予


要创建授权，请调用该[CreateGrant](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateGrant.html)操作。指定 KMS 密钥，[被授权者委托人](grants.md#terms-grantee-principal)，以及允许的[授权操作](grants.md#terms-grant-operations)的列表。您还可以指定一个可选的[停用委托人](grants.md#terms-retiring-principal)。要自定义授权，请使用可选 `Constraints` 参数来定义[授予约束](https://docs.amazonaws.cn/kms/latest/APIReference/API_GrantConstraints.html)。

当您创建、停用或撤销授权时，可能会出现短暂的延迟（通常不到五分钟），才能使更改在整个 Amazon KMS中可用。有关更多信息，请参阅[最终一致性（用于授权）](grants.md#terms-eventual-consistency)。

例如，以下 `CreateGrant` 命令会创建一个授权，以允许被授权代入 `keyUserRole` 角色的用户对指定的 [对称 KMS 密钥](symm-asymm-choose-key-spec.md#symmetric-cmks) 调用 [解密](https://docs.amazonaws.cn/kms/latest/APIReference/API_Decrypt.html) 操作。授权使用 `RetiringPrincipal` 参数，指定可以停用授权的委托人。其中还包含一个授权约束，仅当请求中的[加密上下文](encrypt_context.md)包含 `"Department": "IT"` 时才允许该权限。

```
$  aws kms create-grant \
    --key-id 1234abcd-12ab-34cd-56ef-1234567890ab \
    --grantee-principal arn:aws:iam::111122223333:role/keyUserRole \
    --operations Decrypt \
    --retiring-principal arn:aws:iam::111122223333:role/adminRole \
    --constraints EncryptionContextSubset={Department=IT}
```

如果您的代码重试 `CreateGrant` 操作，或者使用[自动重试请求的Amazon SDK](https://docs.amazonaws.cn/general/latest/gr/api-retries.html)，请使用可选的 [Name](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateGrant.html#KMS-CreateGrant-request-Name) 参数来防止创建重复授权。如果 Amazon KMS 收到的授权`CreateGrant`请求具有与现有授权相同的属性（包括名称），则它会将该请求识别为重试，并且不会创建新的授权。您无法使用 `Name` 值来标识任何 Amazon KMS 操作中的授权。

**重要**  
不要在授权名称中包含机密或敏感信息。它可能以纯文本形式出现在 CloudTrail 日志和其他输出中。

```
$ aws kms create-grant \
    --name IT-1234abcd-keyUserRole-decrypt \
    --key-id 1234abcd-12ab-34cd-56ef-1234567890ab \
    --grantee-principal arn:aws:iam::111122223333:role/keyUserRole \
    --operations Decrypt \
    --retiring-principal arn:aws:iam::111122223333:role/adminRole \
    --constraints EncryptionContextSubset={Department=IT}
```

有关演示如何通过多种编程语言创建授权的代码示例，请参阅 [`CreateGrant`与 Amazon SDK 或 CLI 配合使用](example_kms_CreateGrant_section.md)。

### 使用授权约束


[授权约束](https://docs.amazonaws.cn/kms/latest/APIReference/API_GrantConstraints.html)设置授权给予被授权者委托人的权限的条件。授权约束取代[密钥策略](key-policies.md)或 [IAM policy](iam-policies.md) 中的[条件键](policy-conditions.md)。每个授权约束值最多可以包含 8 个加密上下文对。每个授权约束中的加密上下文值不能超过 384 个字符。

**重要**  
不要在此字段中包含机密或敏感信息。此字段可能会以纯文本形式显示在 CloudTrail 日志和其他输出中。

Amazon KMS 支持两个授予限制，`EncryptionContextEquals`和`EncryptionContextSubset`，这两个约束都规定了[加密操作请求中的加密上下](encrypt_context.md)文的要求。

加密上下文授权约束旨在与具有加密上下文参数的[授权操作](grants.md#terms-grant-operations)结合使用。
+ 加密上下文约束仅在对称加密 KMS 密钥的授权中有效。使用其他 KMS 密钥的加密操作不支持加密上下文。
+ 对于 `DescribeKey` 和 `RetireGrant` 操作，加密上下文约束将被忽略。`DescribeKey` 和 `RetireGrant` 不包括加密上下文参数，但您可以将这些操作包含在具有加密上下文约束的授权中。
+ 您可以将授权中的加密上下文约束用于 `CreateGrant` 操作。加密上下文约束要求使用 `CreateGrant` 权限创建的任何授权具有同样严格或更严格的加密上下文约束。

Amazon KMS 支持以下加密上下文授予限制。

**EncryptionContextEquals**  
使用 `EncryptionContextEquals` 为允许的请求指定精确的加密上下文。  
`EncryptionContextEquals` 要求请求中的加密上下文对与授权约束中加密上下文对区分大小写的完全匹配。上下文对可以按任意顺序显示，不过每一对中的键和值不能有改变。  
例如，如果 `EncryptionContextEquals` 授权约束需要 `"Department": "IT"` 加密上下文对，则授权仅在请求中的加密上下文完全是 `"Department": "IT"` 时，允许指定类型的请求。

**EncryptionContextSubset**  
使用 `EncryptionContextSubset` 来要求请求包含特定的加密上下文对。  
`EncryptionContextSubset` 要求请求中包含授权约束中的所有加密上下文对（区分大小写的完全匹配），但请求也可以包含其他的加密上下文对。上下文对可以按任意顺序显示，不过每一对中的键和值不能有改变。  
例如，如果 `EncryptionContextSubset` 授权约束需要 `Department=IT` 加密上下文对，则授权在请求中的加密上下文为 `"Department": "IT"` 或者包含 `"Department": "IT"` 以及其他加密上下文对（例如 `"Department": "IT","Purpose": "Test"`）时，允许指定类型的请求。

要在对称加密 KMS 密钥的授权中指定加密上下文约束，请在[CreateGrant](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateGrant.html)操作中使用`Constraints`参数。此命令创建的授权将向被授权代入 `keyUserRole` 角色的用户调用 [解密](https://docs.amazonaws.cn/kms/latest/APIReference/API_Decrypt.html) 操作的权限。不过，该权限仅在 `Decrypt` 请求中的加密上下文是 `"Department": "IT"` 加密上下文对时有效。

```
$ aws kms create-grant \
    --key-id 1234abcd-12ab-34cd-56ef-1234567890ab \
    --grantee-principal arn:aws:iam::111122223333:role/keyUserRole \
    --operations Decrypt \
    --retiring-principal arn:aws:iam::111122223333:role/adminRole \
    --constraints EncryptionContextEquals={Department=IT}
```

生成的授权与以下项目类似。请注意，向 `keyUserRole` 角色授予的权限仅在 `Decrypt` 请求使用授权约束中指定的相同加密上下文对时有效。要查找 KMS 密钥的授权，请使用[ListGrants](https://docs.amazonaws.cn/kms/latest/APIReference/API_ListGrants.html)操作。

```
$ aws kms list-grants --key-id 1234abcd-12ab-34cd-56ef-1234567890ab
{
    "Grants": [
        {
            "Name": "",
            "IssuingAccount": "arn:aws:iam::111122223333:root",
            "GrantId": "abcde1237f76e4ba7987489ac329fbfba6ad343d6f7075dbd1ef191f0120514a",
            "Operations": [
                "Decrypt"
            ],
            "GranteePrincipal": "arn:aws:iam::111122223333:role/keyUserRole",
            "Constraints": {
                "EncryptionContextEquals": {
                    "Department": "IT"
                }
            },
            "CreationDate": 1568565290.0,
            "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
            "RetiringPrincipal": "arn:aws:iam::111122223333:role/adminRole"
        }
    ]
}
```

为了满足 `EncryptionContextEquals` 授权约束，`Decrypt` 操作的请求中的加密上下文必须是 `"Department": "IT"` 对。来自被授予者委托人的以下请求将满足 `EncryptionContextEquals` 授权约束。

```
$ aws kms decrypt \
    --key-id arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab\
    --ciphertext-blob fileb://encrypted_msg \
    --encryption-context Department=IT
```

当授权约束为 `EncryptionContextSubset` 时，请求中的加密上下文对必须在授权约束中包含加密上下文对，不过请求也可以包括其他加密上下文对。以下授权约束要求请求中的一个加密上下文对是 `"Deparment": "IT"`。

```
"Constraints": {
   "EncryptionContextSubset": {
       "Department": "IT"
   }
}
```

来自被授权者委托人的以下请求将满足本示例中 `EncryptionContextEqual` 和 `EncryptionContextSubset` 授权约束的要求。

```
$ aws kms decrypt \
    --key-id arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab \
    --ciphertext-blob fileb://encrypted_msg \
    --encryption-context Department=IT
```

但是，来自被授权者委托人的以下请求将满足 `EncryptionContextSubset` 授权约束，但不满足 `EncryptionContextEquals` 授权约束。

```
$ aws kms decrypt \
    --key-id arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab \
    --ciphertext-blob fileb://encrypted_msg \
    --encryption-context Department=IT,Purpose=Test
```

Amazon 服务通常在授权中使用加密上下文限制，从而允许他们在您的中使用 KMS 密钥 Amazon Web Services 账户。例如，Amazon DynamoDB 使用类似下面的授权来获得为账户中的 DynamoDB 使用 [Amazon 托管式密钥](concepts.md#aws-managed-key) 的权限。此授权中的 `EncryptionContextSubset` 授权约束使授权中的权限仅在请求中的加密上下文包含 `"subscriberID": "111122223333"` 和 `"tableName": "Services"` 对时有效。此授权约束意味着，授权仅允许 DynamoDB 将指定的 KMS 密钥用于 Amazon Web Services 账户中的特定表。

要获得此输出，请在您的账户中[ListGrants](https://docs.amazonaws.cn/kms/latest/APIReference/API_ListGrants.html)对 Dynam Amazon 托管式密钥 oDB 运行该操作。

```
$ aws kms list-grants --key-id 0987dcba-09fe-87dc-65ba-ab0987654321

{
    "Grants": [
        {
            "Operations": [
                "Decrypt",
                "Encrypt",
                "GenerateDataKey",
                "ReEncryptFrom",
                "ReEncryptTo",
                "RetireGrant",
                "DescribeKey"
            ],
            "IssuingAccount": "arn:aws:iam::111122223333:root",
            "Constraints": {
                "EncryptionContextSubset": {
                    "aws:dynamodb:tableName": "Services",
                    "aws:dynamodb:subscriberId": "111122223333"
                }
            },
            "CreationDate": 1518567315.0,
            "KeyId": "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321",
            "GranteePrincipal": "dynamodb.us-west-2.amazonaws.com",
            "RetiringPrincipal": "dynamodb.us-west-2.amazonaws.com",
            "Name": "8276b9a6-6cf0-46f1-b2f0-7993a7f8c89a",
            "GrantId": "1667b97d27cf748cf05b487217dd4179526c949d14fb3903858e25193253fe59"
        }
    ]
}
```

## 授予 CreateGrant 权限


授权可以包括调用 `CreateGrant` 操作的权限。但是，当[被授权者委托人](grants.md#terms-grantee-principal)获取从授权中，而不是从策略中调用 `CreateGrant` 的权限时，该权限将收到限制。
+ 被授权者委托人只能创建允许父授权中部分或全部操作的授权。
+ 他们创建的授权中的[授权约束](#grant-constraints)必须至少与父授权中的约束一样严格。

这些限制不适用于从策略中获取 `CreateGrant` 权限的委托人，尽管它们的权限可以由[策略条件](grant-authorization.md)限制。

例如，考虑一个授权，该授权允许被授权委托人调用 `GenerateDataKey`、`Decrypt` 和 `CreateGrant` 操作。我们将允许 `CreateGrant` 权限的授权称为*父授权*。

```
# The original grant in a ListGrants response.
{
    "Grants": [
        {
            "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
            "CreationDate": 1572216195.0,
            "GrantId": "abcde1237f76e4ba7987489ac329fbfba6ad343d6f7075dbd1ef191f0120514a",
            "Operations": [
                "GenerateDataKey",
                "Decrypt",
                "CreateGrant
            ]
            "RetiringPrincipal": "arn:aws:iam::111122223333:role/adminRole",
            "Name": "",
            "IssuingAccount": "arn:aws:iam::111122223333:root",
            "GranteePrincipal": "arn:aws:iam::111122223333:role/keyUserRole",
            "Constraints": {
                "EncryptionContextSubset": {
                    "Department": "IT"
                }
            },
        }
    ]
}
```

被授权者委托人 exampleUser 可以使用此权限创建授权，其中包括在原始授权中指定的操作的任意子集，例如 `CreateGrant` 和 `Decrypt`。*子级授权*不能包含其他操作，如 `ScheduleKeyDeletion` 或者 `ReEncrypt`。

此外，子授权中的[授权约束](https://docs.amazonaws.cn/kms/latest/APIReference/API_GrantConstraints.html)必须与父授权具有相同的限制或更严格的限制。例如，子授权可以添加对到父授权中的 `EncryptionContextSubset` 约束，但不能从中删除对。子授权可以将 `EncryptionContextSubset` 约束更改为 `EncryptionContextEquals` 约束，但不能反之。

IAM 最佳实践不鼓励使用具有长期凭证的 IAM 用户。而应尽可能使用提供临时凭证的 IAM 角色。有关更多信息，请参阅《IAM 用户指南》中的 [IAM 安全最佳实践](https://docs.amazonaws.cn/IAM/latest/UserGuide/best-practices.html)**。

例如，被授权者委托人可以使用从父级授权那里获得的 `CreateGrant` 权限以创建以下子级授权。子级授权中的操作是父级授权中操作的子集，并且授权约束更严格。

```
# The child grant in a ListGrants response.
{
    "Grants": [
        {
            "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
            "CreationDate": 1572249600.0,
            "GrantId": "fedcba9999c1e2e9876abcde6e9d6c9b6a1987650000abcee009abcdef40183f",
            "Operations": [
                "CreateGrant"
                "Decrypt"
            ]
            "RetiringPrincipal": "arn:aws:iam::111122223333:user/exampleUser",
            "Name": "",
            "IssuingAccount": "arn:aws:iam::111122223333:root",
            "GranteePrincipal": "arn:aws:iam::111122223333:user/anotherUser",
            "Constraints": {
                "EncryptionContextEquals": {
                    "Department": "IT"
                }
            },
        }
    ]
}
```

子级授权中的被授权者委托人 `anotherUser` 可以使用它们的 `CreateGrant` 权限来创建授权。然而，`anotherUser` 创建的授权必须将操作包含在其父授权或子集中，并且授权约束必须相同或更严格。

# 查看授权


要查看授权，请使用[ListGrants](https://docs.amazonaws.cn/kms/latest/APIReference/API_ListGrants.html)操作。您必须指定授权所适用的 KMS 密钥。您还可以按授权 ID 或被授权者委托人筛选授权列表。有关更多示例，请参阅[`ListGrants`与 Amazon SDK 或 CLI 配合使用](example_kms_ListGrants_section.md)。

要查看 Amazon Web Services 账户 和地区中具有特定[退休本金的所有补助金](grants.md#terms-retiring-principal)，请使用[ListRetirableGrants](https://docs.amazonaws.cn/kms/latest/APIReference/API_ListRetirableGrants.html)。响应包括每项授权的详细信息。

**注意**  
`ListGrants` 响应中的 `GranteePrincipal` 字段通常包含授权的被授权者委托人。但是，当赠款中的受赠方委托人是 Amazon 服务时，该`GranteePrincipal`字段包含[服务委托](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_principal.html#principal-services)人，它可能代表几个不同的受赠方委托人。

例如，以下命令列出 KMS 密钥的所有授权。

```
$  aws kms list-grants --key-id 1234abcd-12ab-34cd-56ef-1234567890ab
{
    "Grants": [
        {
            "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
            "CreationDate": 1572216195.0,
            "GrantId": "abcde1237f76e4ba7987489ac329fbfba6ad343d6f7075dbd1ef191f0120514a",
            "Constraints": {
                "EncryptionContextSubset": {
                    "Department": "IT"
                }
            },
            "RetiringPrincipal": "arn:aws:iam::111122223333:role/adminRole",
            "Name": "",
            "IssuingAccount": "arn:aws:iam::111122223333:root",
            "GranteePrincipal": "arn:aws:iam::111122223333:user/exampleUser",
            "Operations": [
                "Decrypt"
            ]
        }
    ]
}
```

# 使用授权令牌


 Amazon KMS API 遵循[最终一致性](grants.md#terms-eventual-consistency)模型。创建授权时，授权可能不会立即生效。可能会出现短暂的延迟，才能使更改在整个 Amazon KMS中可用。更改通常需要不到几秒钟的时间即可在整个系统中传播，但在某些情况下，可能需要几分钟。更改完全传播到整个系统后，被授权者主体可以使用授权中的权限，而无需指定授权令牌或授权的任何证据。但是，如果拨款过于新以至于所有人都不知道 Amazon KMS，则请求可能会因`AccessDeniedException`错误而失败。

要立即使用新授权中的权限，请使用该授权的[授权令牌](grants.md#grant_token)。保存[CreateGrant](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateGrant.html)操作返回的授权令牌。然后在 Amazon KMS 操作请求中提交授权令牌。您可以向任何 Amazon KMS 授权[操作](grants.md#terms-grant-operations)提交授权令牌，也可以在同一个请求中提交多个授权令牌。



以下示例使用该`CreateGrant`操作创建允许[GenerateDataKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKey.html)和[解密](https://docs.amazonaws.cn/kms/latest/APIReference/API_Decrypt.html)操作的授权。它将保存 `CreateGrant` 在 `token` 变量中返回的授权令牌。然后，在调用 `GenerateDataKey` 操作时，它使用 `token` 变量中的授权令牌。

```
# Create a grant; save the grant token 
$ token=$(aws kms create-grant \
    --key-id 1234abcd-12ab-34cd-56ef-1234567890ab \
    --grantee-principal arn:aws:iam::111122223333:user/appUser \
    --retiring-principal arn:aws:iam::111122223333:user/acctAdmin \
    --operations GenerateDataKey Decrypt \
    --query GrantToken \
    --output text)

# Use the grant token in a request
$ aws kms generate-data-key \
    --key-id 1234abcd-12ab-34cd-56ef-1234567890ab \
    –-key-spec AES_256 \
    --grant-tokens $token
```

具有权限的主体也可以使用授权令牌来停用新授权，即使授权在整个 Amazon KMS中可用之前。（`RevokeGrant` 操作不接受授权令牌。） 有关更多信息，请参阅 [停用和撤销授权](grant-delete.md)。

```
# Retire the grant
$ aws kms retire-grant --grant-token $token
```

# 停用和撤销授权


要删除某个授权，请停用或撤销该授权。

[RetireGrant](https://docs.amazonaws.cn/kms/latest/APIReference/API_RetireGrant.html)和[RevokeGrant](https://docs.amazonaws.cn/kms/latest/APIReference/API_RevokeGrant.html)操作彼此非常相似。这两个操作都会删除授权，从而消除授权允许的权限。这些操作之间的主要区别在于它们是如何获得授权的。

**RevokeGrant**  
与大多数 Amazon KMS 操作一样，对`RevokeGrant`操作的访问权限通过[密钥策略](key-policies.md)和 [IAM 策略](iam-policies.md)进行控制。任何`kms:RevokeGrant`获得许可的委托人都可以调用[RevokeGrant](https://docs.amazonaws.cn/kms/latest/APIReference/API_RevokeGrant.html)该 API。该权限包含在授予给密钥管理员的标准权限中。通常，管理员会撤销授权以拒绝授权允许的权限。

**RetireGrant**  
授权决定谁可以停用它。此设计使您能够控制授权的生命周期，而无需更改密钥策略或 IAM policy。通常，当您使用授权的权限时，将停用授权。  
授权可以通过授权中指定的可选[停用委托人](grants.md#terms-retiring-principal)停用。[被授权者委托人](grants.md#terms-grantee-principal)还可以停用授权，但只有当他们也是停用委托人或者授权包括 `RetireGrant` 操作时。作为备份，创建补助金 Amazon Web Services 账户 的用户可以停用补助金。  
有一个可用于 IAM policy 的 `kms:RetireGrant` 权限，但它具有有限的实用工具。授权中指定的委托人无需 `kms:RetireGrant` 权限即可停用授权。单独的 `kms:RetireGrant` 权限不允许委托人停用授权。`kms:RetireGrant` 权限在[密钥策略](key-policies.md)或[资源控制策略](resource-control-policies.md)中无效。  
+ 要拒绝停用授权的权限，您可以使用 IAM 策略中的 `kms:RetireGrant` 权限来执行 `Deny` 操作。
+ 拥有 KMS 密钥的人可以将`kms:RetireGrant`权限委托给账户中的 IAM 委托人。 Amazon Web Services 账户 
+ 如果即将退休的委托人不同 Amazon Web Services 账户，则另一个账户中的管理员可以使用`kms:RetireGrant`向该账户中的 IAM 委托人委托人委托授予撤销授权。

 Amazon KMS API 遵循[最终一致性](grants.md#terms-eventual-consistency)模型。当您创建、停用或撤销授权时，可能会出现短暂的延迟，才能使更改在整个 Amazon KMS中可用。更改通常需要不到几秒钟的时间即可在整个系统中传播，但在某些情况下，可能需要几分钟。如果您需要在新的授权开始使用之前立即将其删除 Amazon KMS，[请使用授权令牌](using-grant-token.md)停用该授权。您不能使用授权令牌撤销授权。

# 的条件键 Amazon KMS
条件键

您可以在[密钥策略和 [IAM 策略](iam-policies.md)](key-policies.md)中指定控制 Amazon KMS 资源访问的条件。仅当条件为 True 时，策略语句才有效。例如，您可能希望策略语句仅在特定日期后生效。或者，您可能希望策略语句根据 API 请求中是否存在特定值来控制访问。

要指定条件，请结合使用策略语句的 [`Condition` 元素](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_condition.html)中的*条件键*与 [IAM 条件运算符](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html)。有些条件键通常适用于 Amazon；另一些则特定于 Amazon KMS。

条件密钥值必须遵守密 Amazon KMS 钥策略和 IAM 策略的字符和编码规则。有关密钥策略文档规则的详细信息，请参阅 [密钥策略格式](key-policy-overview.md#key-policy-format)。有关 IAM policy 文档规则的详细信息，请参阅*《IAM 用户指南》*中的 [IAM 名称要求](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_iam-quotas.html#reference_iam-quotas-names)。

**Topics**
+ [

# Amazon 全局条件键
](conditions-aws.md)
+ [

# Amazon KMS 条件键
](conditions-kms.md)
+ [

# Amazon KMS 经过验证的平台的条件密钥
](conditions-attestation.md)

# Amazon 全局条件键


Amazon 定义[全局条件密钥](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#AvailableKeys)，这是一组策略条件密钥，适用于使用 IAM 进行访问控制的所有 Amazon 服务。 Amazon KMS 支持所有全局条件键。您可以在 Amazon KMS 密钥策略和 IAM 策略中使用它们。

例如，只有当请求中的委托人由条件键值中的 [Amazon 资源名称 Amazon KMS key (ARN) 表示时，您才可以使用 aws: PrincipalArn](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-principalarn) 全局条件密钥允许访问 (KMS 密钥)。要在中支持[基于属性的访问控制](abac.md) (AB [AC) Amazon KMS，您可以在 IAM 策略中使用 aws:ResourceTag/*tag-key*](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag) 全局条件密钥来允许访问带有特定标签的 KMS 密钥。

在委托人为 Amazon 服务主体的策略中，为了防止[Amazon 服务](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_principal.html#principal-services)被用作混淆的副手，您可以使用[https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn)或[https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount)全局条件键。有关更多信息，请参阅 [使用 `aws:SourceArn` 或 `aws:SourceAccount` 条件键](least-privilege.md#least-privilege-source-arn)。

有关 Amazon 全局条件密钥的信息，包括可用的请求类型，请参阅 *IAM 用户指南*中的[Amazon 全局条件上下文密钥](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html)。有关在 IAM policy 中使用全局条件键的示例，请参阅 *IAM 用户指南*中的[控制对请求的访问](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_tags.html#access_tags_control-requests)和[控制标签密钥](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_tags.html#access_tags_control-tag-keys)。

以下主题提供有关使用基于 IP 地址和 VPC 终端节点的条件键的特殊指导。

**Topics**
+ [

## 在具有 Amazon KMS 权限的策略中使用 IP 地址条件
](#conditions-aws-ip-address)
+ [

## 在具有 Amazon KMS 权限的策略中使用 VPC 终端节点条件
](#conditions-aws-vpce)
+ [

## 在 IAM 和 Amazon KMS 密钥策略中使用 IPv6 地址
](#KMS-IPv6-policies)

## 在具有 Amazon KMS 权限的策略中使用 IP 地址条件
使用 IP 地址条件

您可以使用 Amazon KMS 在[集成 Amazon 服务](service-integration.md)中保护您的数据。但是，在允许或拒绝访问的同一策略声明中指定 [IP 地址`aws:SourceIp`条件运算符](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_IPAddress)或条件密钥时，请谨慎行事 Amazon KMS。例如，“[Amazon 基于源 IP 拒绝访问” 中的Amazon策略将](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_examples_aws_deny-ip.html) Amazon 操作限制为来自指定 IP 范围的请求。

请考虑以下情况：

1. 您向 IAM 身份附加了如下所示[的策略Amazon： Amazon 基于源 IP 拒绝访问](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_examples_aws_deny-ip.html)。您将`aws:SourceIp` 条件键的值设置为该用户公司的 IP 地址范围。此 IAM 身份还附加了允许其使用 Amazon EBS、Amazon EC2 和 Amazon KMS的其他策略。

1. 该身份试图将一个加密的 EBS 卷挂载到 EC2 实例。即使用户有权使用所有相关服务，此操作也会失败并显示授权错误。

第 2 步失败，因为解密卷加密数据密钥的请求来自与 Amazon EC2 基础设施关联的 IP 地址。 Amazon KMS 要想成功，请求必须来自始发用户的 IP 地址。由于步骤 1 中的策略明确拒绝除来自指定 IP 地址以外的所有请求，因此将不允许 Amazon EC2 对 EBS 卷的加密数据密钥进行解密。

此外，当请求来自 [Amazon VPC 终端节点](https://docs.amazonaws.cn/vpc/latest/userguide/vpc-endpoints.html)时，`aws:SourceIP` 条件键也不起作用。要限制对 VPC 终端节点（包括 [Amazon KMS VPC 终端节点](kms-vpc-endpoint.md)）的请求，请使用 `aws:SourceVpce` 或 `aws:SourceVpc` 条件键。有关更多信息，请参阅 [Amazon VPC 用户指南](https://docs.amazonaws.cn/vpc/latest/userguide/vpc-endpoints.html#vpc-endpoints-iam-access) 中的 *VPC 终端节点 - 控制终端节点的使用*。

## 在具有 Amazon KMS 权限的策略中使用 VPC 终端节点条件
使用 VPC 和 VPC 终端节点条件

[Amazon KMS 支持由提供支持的亚马逊虚拟私有云（亚马逊 VPC）终端节点[Amazon PrivateLink](https://docs.amazonaws.cn/vpc/latest/userguide/VPC_Introduction.html#what-is-privatelink)](kms-vpc-endpoint.md)。当请求来自 VPC 或使用 VPC 终端节点时，您可以在[密钥策略和 IAM 策略中使用以下全局条件密钥](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#AvailableKeys)来控制对 Amazon KMS 资源的访问。有关更多信息，请参阅 [使用 VPC 终端节点控制对 Amazon KMS 资源的访问](vpce-policy-condition.md)。
+ `aws:SourceVpc` 将访问限制为来自指定 VPC 的请求。
+ `aws:SourceVpce` 将访问限制为来自指定 VPC 端点的请求。

如果您使用这些条件密钥来控制对 KMS 密钥的访问，则可能会无意中拒绝访问代表您使用的 Amazon Amazon KMS 服务。

请注意避免出现类似 [IP 地址条件键](#conditions-aws-ip-address)示例的情况。如果您将对 KMS 密钥的请求限制在 VPC 或 VPC 终端节点上，则 Amazon KMS 从 Amazon S3 或 Amazon EBS 等集成服务对的调用可能会失败。即使源请求最终来源于 VPC 或 VPC 终端节点，也会发生这种情况。

## 在 IAM 和 Amazon KMS 密钥策略中使用 IPv6 地址
在 IAM 和 KMS 密钥策略中使用 IPv6 地址

在尝试访问 Amazon KMS 之前 IPv6，请确保所有包含 IP 地址限制的密钥和 IAM 策略都已更新为包含 IPv6 地址范围。未更新以处理 IPv6 地址的基于 IP 的策略可能会导致客户端在开始使用时错误地丢失或获得访问权限 IPv6。有关 KMS 访问控制的一般指南，请参阅 [KMS 密钥访问权限和权限](control-access.md)。要了解 KMS 和双栈支持，请参阅[双堆栈端点支持](ipv6-kms.md)。

**重要**  
这些语句并未允许任何操作。请将这些语句与允许特定操作的其他语句结合使用。

以下语句明确拒绝来自 IPv4 地址`192.0.2.*`范围的请求访问所有 KMS 权限。此范围之外的所有 IP 地址均未被显式拒绝 KMS 权限。由于所有 IPv6 地址都在被拒绝的范围之外，因此此语句并未明确拒绝任何 IPv6 地址的 KMS 权限。

```
{
     "Sid": "DenyKMSPermissions",
     "Effect": "Deny",
    "Action": [
        "kms:*"
    ],
    "Resource": "*",
    "Condition": {
        "NotIpAddress": {
            "aws:SourceIp": [ 
                "192.0.2.0/24"
            ]
        }
    }
}
```

您可以修改`Condition`元素以拒绝 IPv4 (`192.0.2.0/24`) 和 IPv6 (`2001:db8:1234::/32`) 地址范围，如以下示例所示。

```
{
    "Sid": "DenyKMSPermissions",
    "Effect": "Deny",
    "Action": [
        "kms:*"
    ],
    "Resource": "*",
    "Condition": {
        "NotIpAddress": {
            "aws:SourceIp": [ 
                "192.0.2.0/24",
                "2001:db8:1234::/32"
            ]
        }
    }
}
```

# Amazon KMS 条件键


Amazon KMS 提供了一组可在密钥策略和 IAM 策略中使用的条件密钥。这些条件键特定于 Amazon KMS。例如，在控制对对称加密 KMS 密钥的访问时，您可以使用 `kms:EncryptionContext:context-key` 条件键以请求特定的[加密上下文](encrypt_context.md)。

**API 操作请求的条件**

许多 Amazon KMS 条件密钥根据 Amazon KMS 操作请求中参数的值来控制对 KMS 密钥的访问。例如，您可以在 IAM 策略中使用 k [ms: KeySpec](#conditions-kms-key-spec) 条件密钥，仅当`CreateKey`请求中的`KeySpec`参数值为时才允许使用该[CreateKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateKey.html)操作`RSA_4096`。

即使该参数未出现在请求中（例如当使用参数的默认值时），此类条件也会起作用。例如，您可以使用 k [ms: KeySpec](#conditions-kms-key-spec) 条件密钥允许用户仅在`KeySpec`参数值为（默认值）时才使用该`CreateKey`操作。`SYMMETRIC_DEFAULT`此条件允许 `KeySpec` 参数值为 `SYMMETRIC_DEFAULT` 的请求，以及无 `KeySpec` 参数的请求。

**API 操作中使用的 KMS 密钥的条件**

某些 Amazon KMS 条件密钥可以根据操作中使用的 KMS 密钥的属性来控制对操作的访问。例如，您可以使用 [kms: KeyOrigin](#conditions-kms-key-origin) 条件允许委托人仅[GenerateDataKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKey.html)在 KMS 密钥的密钥为时调用 KMS 密钥。`Origin` `AWS_KMS`要了解某个条件键能否以这种方式使用，请参阅条件键的说明。

该操作必须是 *KMS 密钥资源操作*，即为特定 KMS 密钥授权的操作。若要标识 KMS 密钥资源操作，请在[操作和资源表](kms-api-permissions-reference.md#kms-api-permissions-reference-table)中，在操作的 `Resources` 列中查找的 `KMS key` 的值。如果您将这种类型的条件密钥用于未经特定 KMS 密钥资源授权的操作（例如）[ListKeys](https://docs.amazonaws.cn/kms/latest/APIReference/API_ListKeys.html)，则该权限将无效，因为条件永远无法满足。授权 `ListKeys` 操作时未涉及 KMS 密钥资源，也无 `KeySpec` 属性。

以下主题描述了每个 Amazon KMS 条件键，并包括演示策略语法的示例策略语句。

**使用带有条件键的集合运算符**

当策略条件比较两组值（例如请求中的标签集和策略中的标签集）时，您需要告诉 Amazon 如何比较这两组值。为此，IAM 定义了两个集合运算符 `ForAnyValue` 和 `ForAllValues`。仅将集合运算符用于需要它们的*多值条件键*。不要将集合运算符用于*单值条件键*。像往常一样，在生产环境中使用策略语句之前，始终全面测试这些策略语句。

条件键是单值或多值。要确定 Amazon KMS 条件键是单值还是多值，请参阅条件**键描述中的值类型**列。
+ *单值*条件键在授权上下文（请求或资源）中最多具有一个值。例如，由于每个 API 调用只能来自一个 Amazon Web Services 账户，因此 k [m CallerAccount s:](#conditions-kms-caller-account) 是单值条件密钥。不要将集合运算符用于单值条件键。
+ *多值*条件键在授权上下文（请求或资源）中具有多个值。例如，由于每个 KMS 密钥可以有多个别名，因此 k [ms: ResourceAliases](#conditions-kms-resource-aliases) 可以有多个值。多值条件键需要一个集合运算符。

请注意，单值条件键和多值条件键之间的差异取决于授权上下文中的值数量；而不是策略条件中的值数量。

**警告**  
将集合运算符用于单值条件键可能会创建过于宽容（或过于限制）的策略语句。仅将集合运算符用于多值条件键。  
如果您创建或更新包含带有 kms:EncryptionContext:*上下文密钥*或`aws:RequestTag/tag-key`条件键的`ForAllValues`集合运算符的策略， Amazon KMS 则会返回以下错误消息：  
`OverlyPermissiveCondition: Using the ForAllValues set operator with a single-valued condition key matches requests without the specified [encryption context or tag] or with an unspecified [encryption context or tag]. To fix, remove ForAllValues.`

有关 `ForAnyValue` 和 `ForAllValues` 集合运算符的详细信息，请参阅 *IAM 用户指南*中的[使用多个键和值](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_multi-value-conditions.html#reference_policies_multi-key-or-value-conditions)。有关在单值条件下使用`ForAllValues`集合运算符的风险的信息，请参阅 *IAM 用户指南*中的[安全警告- ForAllValues 使用单值密钥](https://docs.amazonaws.cn/IAM/latest/UserGuide/access-analyzer-reference-policy-checks.html#access-analyzer-reference-policy-checks-security-warning-forallvalues-with-single-valued-key)。

**Topics**
+ [

## kms: BypassPolicyLockoutSafetyCheck
](#conditions-kms-bypass-policy-lockout-safety-check)
+ [

## kms: CallerAccount
](#conditions-kms-caller-account)
+ [

## kms:CustomerMasterKeySpec （已弃用）
](#conditions-kms-key-spec-replaced)
+ [

## kms:CustomerMasterKeyUsage （已弃用）
](#conditions-kms-key-usage-replaced)
+ [

## kms: DataKeyPairSpec
](#conditions-kms-data-key-spec)
+ [

## kms: EncryptionAlgorithm
](#conditions-kms-encryption-algorithm)
+ [

## kms:EncryptionContext: *上下文*密钥
](#conditions-kms-encryption-context)
+ [

## kms: EncryptionContextKeys
](#conditions-kms-encryption-context-keys)
+ [

## kms: ExpirationModel
](#conditions-kms-expiration-model)
+ [

## kms: GrantConstraintType
](#conditions-kms-grant-constraint-type)
+ [

## kms: GrantIsFor AWSResource
](#conditions-kms-grant-is-for-aws-resource)
+ [

## kms: GrantOperations
](#conditions-kms-grant-operations)
+ [

## kms: GranteePrincipal
](#conditions-kms-grantee-principal)
+ [

## kms: KeyAgreementAlgorithm
](#conditions-kms-key-agreement-algorithm)
+ [

## kms: KeyOrigin
](#conditions-kms-key-origin)
+ [

## kms: KeySpec
](#conditions-kms-key-spec)
+ [

## kms: KeyUsage
](#conditions-kms-key-usage)
+ [

## kms: MacAlgorithm
](#conditions-kms-mac-algorithm)
+ [

## kms: MessageType
](#conditions-kms-message-type)
+ [

## kms: MultiRegion
](#conditions-kms-multiregion)
+ [

## kms: MultiRegionKeyType
](#conditions-kms-multiregion-key-type)
+ [

## kms: PrimaryRegion
](#conditions-kms-primary-region)
+ [

## kms: ReEncryptOnSameKey
](#conditions-kms-reencrypt-on-same-key)
+ [

## kms: RequestAlias
](#conditions-kms-request-alias)
+ [

## kms: ResourceAliases
](#conditions-kms-resource-aliases)
+ [

## kms: ReplicaRegion
](#conditions-kms-replica-region)
+ [

## kms: RetiringPrincipal
](#conditions-kms-retiring-principal)
+ [

## kms: RotationPeriodInDays
](#conditions-kms-rotation-period-in-days)
+ [

## kms: ScheduleKeyDeletionPendingWindowInDays
](#conditions-kms-schedule-key-deletion-pending-window-in-days)
+ [

## kms: SigningAlgorithm
](#conditions-kms-signing-algorithm)
+ [

## kms: ValidTo
](#conditions-kms-valid-to)
+ [

## kms: ViaService
](#conditions-kms-via-service)
+ [

## kms: WrappingAlgorithm
](#conditions-kms-wrapping-algorithm)
+ [

## kms: WrappingKeySpec
](#conditions-kms-wrapping-key-spec)

## kms: BypassPolicyLockoutSafetyCheck



| Amazon KMS 条件键 | 条件类型 | 值类型 | API 操作 | 策略类型 | 
| --- | --- | --- | --- | --- | 
|  `kms:BypassPolicyLockoutSafetyCheck`  |  布尔值  | 单值 |  `CreateKey` `PutKeyPolicy`  |  仅限 IAM policy 密钥策略和 IAM policy  | 

`kms:BypassPolicyLockoutSafetyCheck`条件键根据请求中`BypassPolicyLockoutSafetyCheck`参数的值控制对[CreateKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateKey.html)和[PutKeyPolicy](https://docs.amazonaws.cn/kms/latest/APIReference/API_PutKeyPolicy.html)操作的访问权限。

以下示例 IAM policy 语句阻止用户绕过策略锁定安全检查，方式为当 `CreateKey` 请求中 `BypassPolicyLockoutSafetyCheck` 参数的值为 `true.` 时，拒绝用户创建 KMS 密钥的权限 

```
{
  "Effect": "Deny",
  "Action": [
    "kms:CreateKey",
    "kms:PutKeyPolicy"
  ],
  "Resource": "*",
  "Condition": {
    "Bool": {
      "kms:BypassPolicyLockoutSafetyCheck": true
    }
  }
}
```

您还可以在 IAM policy 或密钥策略中使用 `kms:BypassPolicyLockoutSafetyCheck` 条件键控制对 `PutKeyPolicy` 操作的访问权限。密钥策略中的以下示例策略语句阻止用户在更改 KMS 密钥的策略时绕过策略锁定安全检查。

此策略语句不是使用显式 `Deny`，而是结合使用 `Allow` 和 [Null 条件运算符](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Null)，以仅当请求不含 `BypassPolicyLockoutSafetyCheck` 参数时，允许访问。如果未使用此参数，则默认值为 `false`。此较弱的策略语句在少数有必要绕过的情况下可覆盖。

```
{
  "Effect": "Allow",
  "Action": "kms:PutKeyPolicy",
  "Resource": "*",
  "Condition": {
    "Null": {
      "kms:BypassPolicyLockoutSafetyCheck": true
    }
  }
}
```

**另请参阅**
+ [kms: KeySpec](#conditions-kms-key-spec)
+ [kms: KeyOrigin](#conditions-kms-key-origin)
+ [kms: KeyUsage](#conditions-kms-key-usage)

## kms: CallerAccount



| Amazon KMS 条件键 | 条件类型 | 值类型 | API 操作 | 策略类型 | 
| --- | --- | --- | --- | --- | 
|  `kms:CallerAccount`  |  字符串  | 单值 |  KMS 密钥资源操作 自定义密钥存储操作  |  密钥策略和 IAM 策略  | 

您可以使用此条件键允许或拒绝对 Amazon Web Services 账户中所有身份（用户和角色）的访问。在密钥策略中，您可以使用 `Principal` 元素来指定策略语句所适用的身份。`Principal` 元素的语法未提供指定 Amazon Web Services 账户账户中的所有身份的方式。但是你可以通过将此条件键与指定所有 Amazon 身份的`Principal`元素结合起来来实现这种效果。

您可以使用它来控制对任何 *KMS 密钥资源操作*（即使用特定 KMS 密钥的任何 Amazon KMS 操作）的访问权限。若要标识 KMS 密钥资源操作，请在[操作和资源表](kms-api-permissions-reference.md#kms-api-permissions-reference-table)中，在操作的 `Resources` 列中查找的 `KMS key` 的值。它也适用于管理[自定义密钥存储](key-store-overview.md#custom-key-store-overview)的操作。

例如，以下密钥策略语句演示了如何使用 `kms:CallerAccount` 条件键。本政策声明包含在 Amazon EBS Amazon 托管式密钥 的关键政策中。它将指定所有 Amazon 身份的`Principal`元素与`kms:CallerAccount`条件键相结合，以有效地允许访问 Amazon Web Services 账户 111122223333 中的所有身份。它包含一个额外的 Amazon KMS 条件密钥 (`kms:ViaService`)，通过仅允许通过 Amazon EBS 发出的请求来进一步限制权限。有关更多信息，请参阅 [kms: ViaService](#conditions-kms-via-service)。

```
{
  "Sid": "Allow access through EBS for all principals in the account that are authorized to use EBS",
  "Effect": "Allow",
  "Principal": {"AWS": "*"},
  "Condition": {
    "StringEquals": {
      "kms:CallerAccount": "111122223333",
      "kms:ViaService": "ec2.us-west-2.amazonaws.com"
    }
  },
  "Action": [
    "kms:Encrypt",
    "kms:Decrypt",
    "kms:ReEncrypt*",
    "kms:GenerateDataKey*",
    "kms:CreateGrant",
    "kms:DescribeKey"
  ],
  "Resource": "*"
}
```

## kms:CustomerMasterKeySpec （已弃用）


`kms:CustomerMasterKeySpec` 条件键已弃用。而是使用 [kms: KeySpec](#conditions-kms-key-spec) 条件密钥。

`kms:CustomerMasterKeySpec` 和 `kms:KeySpec` 条件键的运行方式相同。只有名称不同。建议使用 `kms:KeySpec`。但是，为避免重大更改， Amazon KMS 支持两个条件键。

## kms:CustomerMasterKeyUsage （已弃用）


`kms:CustomerMasterKeyUsage` 条件键已弃用。而是使用 [kms: KeyUsage](#conditions-kms-key-usage) 条件密钥。

`kms:CustomerMasterKeyUsage` 和 `kms:KeyUsage` 条件键的运行方式相同。只有名称不同。建议使用 `kms:KeyUsage`。但是，为避免重大更改， Amazon KMS 支持两个条件键。

## kms: DataKeyPairSpec



| Amazon KMS 条件键 | 条件类型 | 值类型 | API 操作 | 策略类型 | 
| --- | --- | --- | --- | --- | 
|  `kms:DataKeyPairSpec`  |  字符串  | 单值 |  `GenerateDataKeyPair` `GenerateDataKeyPairWithoutPlaintext`  |  密钥策略和 IAM policy  | 

您可以使用此条件键根据请求中`KeyPairSpec`参数的值来控制对[GenerateDataKeyPair](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKeyPair.html)和[GenerateDataKeyPairWithoutPlaintext](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKeyPairWithoutPlaintext.html)操作的访问权限。例如，您可以仅允许用户生成特定类型的数据密钥对。

以下示例密钥策略语句使用 `kms:DataKeyPairSpec` 条件键，以仅允许用户使用 KMS 密钥生成 RSA 数据密钥对。

```
{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/ExampleRole"
  },
  "Action": [
    "kms:GenerateDataKeyPair",
    "kms:GenerateDataKeyPairWithoutPlaintext"
  ],
  "Resource": "*",
  "Condition": {
    "StringLike": {
      "kms:DataKeyPairSpec": "RSA*"
    }
  }
}
```

**另请参阅**
+ [kms: KeySpec](#conditions-kms-key-spec)
+ [kms: EncryptionAlgorithm](#conditions-kms-encryption-algorithm)
+ [kms:EncryptionContext: *上下文*密钥](#conditions-kms-encryption-context)
+ [kms: EncryptionContextKeys](#conditions-kms-encryption-context-keys)

## kms: EncryptionAlgorithm



| Amazon KMS 条件键 | 条件类型 | 值类型 | API 操作 | 策略类型 | 
| --- | --- | --- | --- | --- | 
|  `kms:EncryptionAlgorithm`  |  字符串  | 单值 |  `Decrypt` `Encrypt` `GenerateDataKey` `GenerateDataKeyPair` `GenerateDataKeyPairWithoutPlaintext` `GenerateDataKeyWithoutPlaintext` `ReEncrypt`  |  密钥策略和 IAM 策略  | 

您可以使用 `kms:EncryptionAlgorithm` 条件键，根据操作中使用的加密算法，控制对加密操作的访问。对于 “[加密](https://docs.amazonaws.cn/kms/latest/APIReference/API_Encrypt.html)”、“[解密](https://docs.amazonaws.cn/kms/latest/APIReference/API_Decrypt.html)” 和 “[ReEncrypt](https://docs.amazonaws.cn/kms/latest/APIReference/API_ReEncrypt.html)操作”，它根据请求中[EncryptionAlgorithm](https://docs.amazonaws.cn/kms/latest/APIReference/API_Decrypt.html#KMS-Decrypt-request-EncryptionAlgorithm)参数的值来控制访问权限。对于生成数据密钥和数据密钥对的操作，则根据用于加密数据密钥的加密算法控制访问。

此条件密钥对以外执行的操作没有影响 Amazon KMS，例如使用外部非对称 KMS 密钥对中的公钥进行加密。 Amazon KMS

**EncryptionAlgorithm 请求中的参数**

要允许用户仅将特定加密算法用于 KMS 密钥，请使用包含 `Deny` 效果和 `StringNotEquals` 条件运算符的策略语句。例如，以下示例密钥策略语句禁止可担任 `ExampleRole` 角色的主体，在指定的加密操作中使用此对称 KMS 密钥，除非请求中的加密算法为 `RSAES_OAEP_SHA_256`，与 RSA KMS 密钥结合使用的非对称加密算法。

与允许用户使用特定加密算法的策略语句不同，具有双重否定的策略语句（如上例），会阻止此 KMS 密钥的其他策略和授权允许此角色使用其他加密算法。此密钥策略语句中的 `Deny` 优先于任何包含 `Allow` 效果的密钥策略或 IAM policy，并且优先于此 KMS 密钥及其委托人的所有授权。

```
{
  "Sid": "Allow only one encryption algorithm with this asymmetric KMS key",
  "Effect": "Deny",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/ExampleRole"
  },
  "Action": [
    "kms:Encrypt",
    "kms:Decrypt",
    "kms:ReEncrypt*"
  ],
  "Resource": "*",
  "Condition": {
    "StringNotEquals": {
      "kms:EncryptionAlgorithm": "RSAES_OAEP_SHA_256"
    }
  }
}
```

**用于操作的加密算法**

您也可以使用 `kms:EncryptionAlgorithm` 条件键基于操作中使用的加密算法控制对操作的访问权限，即使在请求中未指定算法时也是如此。这使您能够要求或禁止 `SYMMETRIC_DEFAULT` 算法，它可能不会在请求中指定，因为它是默认值。

通过此功能，您还可以使用 `kms:EncryptionAlgorithm` 条件键，控制对生成数据密钥和数据密钥对的操作的访问。这些操作仅使用对称加密 KMS 密钥和 `SYMMETRIC_DEFAULT` 算法。

例如，此 IAM policy 限制其委托人只能使用对称加密。除非请求中指定的或操作中使用的加密算法为 SYMMETRIC\$1DEFAULT，否则策略将拒绝对示例帐户中的任何 KMS 密钥进行加密操作的访问。包括对权限的`GenerateDataKey*`添加[GenerateDataKey[GenerateDataKeyWithoutPlaintext[GenerateDataKeyPair](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKeyPair.html)](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKeyWithoutPlaintext.html)](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKey.html)、、和[GenerateDataKeyPairWithoutPlaintext](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKeyPairWithoutPlaintext.html)。条件对这些操作没有影响，因为它们始终使用对称加密算法。

```
{
  "Sid": "AllowOnlySymmetricAlgorithm",
  "Effect": "Deny",
  "Action": [
    "kms:Encrypt",
    "kms:Decrypt",
    "kms:ReEncrypt*",
    "kms:GenerateDataKey*"
  ],
  "Resource": "arn:aws:kms:us-west-2:111122223333:key/*",
  "Condition": {
    "StringNotEquals": {
      "kms:EncryptionAlgorithm": "SYMMETRIC_DEFAULT"
    }
  }
}
```

**另请参阅**
+ [kms: MacAlgorithm](#conditions-kms-mac-algorithm)
+ [kms: SigningAlgorithm](#conditions-kms-signing-algorithm)

## kms:EncryptionContext: *上下文*密钥



| Amazon KMS 条件键 | 条件类型 | 值类型 | API 操作 | 策略类型 | 
| --- | --- | --- | --- | --- | 
|  `kms:EncryptionContext:context-key`  |  字符串  | 单值 |  `CreateGrant` `Encrypt` `Decrypt` `GenerateDataKey` `GenerateDataKeyPair` `GenerateDataKeyPairWithoutPlaintext` `GenerateDataKeyWithoutPlaintext` `ReEncrypt` `RetireGrant`  |  密钥策略和 IAM policy  | 

您可以使用 `kms:EncryptionContext:context-key` 条件键，根据[加密操作](kms-cryptography.md#cryptographic-operations)请求中的[加密上下文](encrypt_context.md)，控制对[对称加密 KMS 密钥](symm-asymm-choose-key-spec.md#symmetric-cmks)的访问。使用此条件键可评估加密上下文对中的键和值。要仅评估加密上下文密钥或无论密钥或值如何，都需要加密上下文，请使用 k [ms: EncryptionContextKeys](#conditions-kms-encryption-context-keys) 条件密钥。

**注意**  
条件键值必须遵守密钥策略和 IAM policy 的字符规则。在加密上下文中有效的某些字符在策略中无效。您可能无法使用此条件键来表示全部有效的加密上下文值。有关密钥策略文档规则的详细信息，请参阅 [密钥策略格式](key-policy-overview.md#key-policy-format)。有关 IAM policy 文档规则的详细信息，请参阅*《IAM 用户指南》*中的 [IAM 名称要求](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_iam-quotas.html#reference_iam-quotas-names)。

您不能在使用[非对称 KMS 密钥](symmetric-asymmetric.md)或 [HMAC KMS 密钥](hmac.md)的加密操作中指定加密上下文。非对称算法和 MAC 算法不支持加密上下文。

要使用 kms:EncryptionContext:*上下文密钥条件密钥*，请将*context-key*占位符替换为加密上下文密钥。使用加密上下文值替换 *context-value* 占位符。

```
"kms:EncryptionContext:context-key": "context-value"
```

例如，下面的条件键指定一个加密上下文，其键为 `AppName`，值为 `ExampleApp` (`AppName = ExampleApp`)。

```
"kms:EncryptionContext:AppName": "ExampleApp"
```

这是一个[单值条件键](#set-operators)。条件键中的密钥指定特定的加密上下文键 (*context-key*)。尽管您可以在每个 API 请求中包含多个加密上下文对，但具有指定 *context-key* 的加密上下文对只能有一个值。例如，`kms:EncryptionContext:Department` 条件键仅适用于具有 `Department` 密钥的加密上下文对，任何具有 `Department` 密钥的给定加密上下文对都只能有一个值。

不要将集合运算符用于 `kms:EncryptionContext:context-key` 条件键。如果您创建一个具有 `Allow` 操作，`kms:EncryptionContext:context-key` 条件键和 `ForAllValues` 集合运算符的策略语句，则条件允许没有加密上下文的请求以及带有未在策略条件中指定的加密上下文对的请求。

**警告**  
请勿将 `ForAnyValue` 或 `ForAllValues` 集合运算符用于此单值条件键。这些集合运算符可以创建一个策略条件，该条件不需要您计划要求的值，并允许您计划禁止的值。  
如果您创建或更新包含带有:conte *xt-key* 的`ForAllValues`集合运算符的策略， Amazon KMS 则会返回以下错误消息 kms:EncryptionContext：  
`OverlyPermissiveCondition:EncryptionContext: Using the ForAllValues set operator with a single-valued condition key matches requests without the specified encryption context or with an unspecified encryption context. To fix, remove ForAllValues.`

若要要求特定的加密上下文对，请结合使用 `kms:EncryptionContext:context-key` 条件键与 `StringEquals` 运算符。

以下示例密钥策略语句允许可以担任角色的委托人仅在请求中的加密上下文包括 `AppName:ExampleApp` 对时使用 `GenerateDataKey` 请求中的 KMS 密钥。允许使用其他加密上下文对。

密钥名称区分大小写。值是否区分大小写由条件运算符确定，例如 `StringEquals`。有关更多信息，请参阅 [加密上下文条件区分大小写](#conditions-kms-encryption-context-case)。

```
{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/RoleForExampleApp"
  },
  "Action": "kms:GenerateDataKey",
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "kms:EncryptionContext:AppName": "ExampleApp"
    }
  }
}
```

要要求加密上下文对并禁止所有其他加密上下文对，请在策略声明[`kms:EncryptionContextKeys`](#conditions-kms-encryption-context-keys)中同时使用 kms:EncryptionContext：*上下文密钥和上下*文密钥。以下密钥策略语句使用 `kms:EncryptionContext:AppName` 条件要求请求中的 `AppName=ExampleApp` 加密上下文对。它还结合使用 `kms:EncryptionContextKeys` 条件键与 `ForAllValues` 集合运算符以仅允许 `AppName` 加密上下文键。

`ForAllValues` 集合运算符将请求中的加密上下文键限制为 `AppName`。如果 `kms:EncryptionContextKeys` 条件与 `ForAllValues` 集合运算符在策略语句中单独使用，则此集合运算符将允许没有加密上下文的请求。但是，如果请求没有加密上下文，则 `kms:EncryptionContext:AppName` 条件将失败。有关 `ForAllValues` 集合运算符的详细信息，请参阅 *IAM 用户指南*中的[使用多个键和值](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_multi-value-conditions.html#reference_policies_multi-key-or-value-conditions)。

```
{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/KeyUsers"
  },
  "Action": "kms:GenerateDataKey",
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "kms:EncryptionContext:AppName": "ExampleApp"
    },
    "ForAllValues:StringEquals": {
      "kms:EncryptionContextKeys": [
        "AppName"
      ]
    }
  }
}
```

您还可以使用此条件键拒绝对特定操作的 KMS 密钥的访问。如果请求中的加密上下文包含 `Stage=Restricted` 加密上下文对，以下示例密钥策略语句使用 `Deny` 效果，以禁止委托人使用 KMS 密钥。此条件允许使用其他加密上下文对进行请求，包括具有 `Stage` 键和其他值的加密上下文对，例如 `Stage=Test`。

```
{
  "Effect": "Deny",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/RoleForExampleApp"
  },
  "Action": "kms:GenerateDataKey",
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "kms:EncryptionContext:Stage": "Restricted"
    }
  }
}
```

### 使用多个加密上下文对


您可以要求或禁止多个加密上下文对。您还可以要求几个加密上下文对之一。有关用于解释这些条件的逻辑的详细信息，请参阅 IAM 用户指南中的[创建具有多个键或值的条件](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_multi-value-conditions.html)。

**注意**  
本主题的早期版本显示了使用`ForAnyValue`和`ForAllValues`集合运算符和 kms:EncryptionContext:conte *xt-key 条件键*的策略声明。将集合运算符与[单值条件键](#set-operators)结合使用可能会导致允许没有加密上下文和未指定加密上下文对的请求的策略。  
例如，具有 `Allow` 效果、`ForAllValues` 集合运算符和 `"kms:EncryptionContext:Department": "IT"` 条件键的策略条件不会将加密上下文限制为“Department=IT”对。它允许没有加密上下文的请求和具有未指定加密上下文对的请求，例如 `Stage=Restricted`。  
请查看您的政策，并使用*上下文*密钥将集合 kms:EncryptionContext运算符从任何条件中删除。尝试使用此格式创建或更新策略失败，并显示 `OverlyPermissiveCondition` 异常。要纠正此错误，请删除集合运算符。

若需要多个加密上下文对，请列出相同条件下的对。以下示例密钥策略语句需要两个加密上下文对 `Department=IT` 和 `Project=Alpha`。由于条件具有不同的键（`kms:EncryptionContext:Department` 和 `kms:EncryptionContext:Project`）它们由 AND 运算符隐式连接。允许其他加密上下文对，但它们不是必需的。

```
{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/RoleForExampleApp"
  },
  "Action": "kms:Decrypt",
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "kms:EncryptionContext:Department": "IT",
      "kms:EncryptionContext:Project": "Alpha"
    }
  }
}
```

若需要一个加密上下文对或另一个加密上下文对，请将每个条件键放在单独的策略语句中。以下示例密钥策略需要 `Department=IT` *或* `Project=Alpha` 对，或此两者。允许其他加密上下文对，但它们不是必需的。

```
{
 "Effect": "Allow",
 "Principal": {
  "AWS": "arn:aws:iam::111122223333:role/RoleForExampleApp"
 },
 "Action": "kms:GenerateDataKey",
 "Resource": "*",
 "Condition": {
  "StringEquals": {
   "kms:EncryptionContext:Department": "IT"
  }
 }
},
{
 "Effect": "Allow",
 "Principal": {
  "AWS": "arn:aws:iam::111122223333:role/RoleForExampleApp"
 },
 "Action": "kms:GenerateDataKey",
 "Resource": "*",
 "Condition": {
  "StringEquals": {
   "kms:EncryptionContext:Project": "Alpha"
  }
 }
}
```

要要求特定的加密对并排除所有其他加密上下文对，请在策略声明[`kms:EncryptionContextKeys`](#conditions-kms-encryption-context-keys)中同时使用 kms:EncryptionContext：*上下文密钥*。以下密钥策略声明使用 kms:EncryptionContext:conte *xt-key* 条件来要求同时包含`Department=IT`*和*`Project=Alpha`对的加密上下文。它结合使用 `kms:EncryptionContextKeys` 条件键与 `ForAllValues` 集合运算符以仅允许 `Department` 和 `Project` 加密上下文键。

`ForAllValues` 集合运算符将请求中的加密上下文键限制为 `Department` 和 `Project`。如果在条件中单独使用它，则此集合运算符将允许没有加密上下文的请求，但是在此配置中，此条件下的 kms:EncryptionContext:conte *xt-key* 将失败。

```
{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/RoleForExampleApp"
  },
  "Action": "kms:GenerateDataKey",
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "kms:EncryptionContext:Department": "IT",
      "kms:EncryptionContext:Project": "Alpha"
    },
    "ForAllValues:StringEquals": {
      "kms:EncryptionContextKeys": [
        "Department",
        "Project"
      ]
    }
  }
}
```

您还可以禁止多个加密上下文对。如果请求中的加密上下文包含 `Stage=Restricted` 或 `Stage=Production` 对，以下示例密钥策略语句使用 `Deny` 效果，以禁止委托人使用 KMS 密钥。

相同键 (`kms:EncryptionContext:Stage`) 的多个值（`Restricted` 和 `Production`）用 OR 隐式连接。有关详细信息，请参阅 *IAM 用户指南*中的[具有多个键或值的条件的评估逻辑](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_multi-value-conditions.html#reference_policies_multiple-conditions-eval)。

```
{
  "Effect": "Deny",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/RoleForExampleApp"
  },
  "Action": "kms:GenerateDataKey",
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "kms:EncryptionContext:Stage": [
         "Restricted",
         "Production"
      ] 
    }
  }
}
```

### 加密上下文条件区分大小写


在解密操作中指定的加密上下文，与加密操作中指定的加密上下文必须是区分大小写的精确匹配。只有当加密上下文中有多个上下文对时，上下文对的顺序可以改变。

但是，在策略条件中，条件键不区分大小写。条件值是否区分大小写由您使用的[策略条件运算符](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html)确定，例如 `StringEquals` 或 `StringEqualsIgnoreCase`。

因此，由 `kms:EncryptionContext:` 前缀和 *`context-key`* 替换组成的条件键不区分大小写。使用此条件的策略不检查条件键任何元素的大小写。条件值（即 *`context-value`* 替换）是否区分大小写由策略条件运算符确定。

例如，以下策略语句在加密上下文包含 `Appname` 键时允许操作，不论其大小写如何。`StringEquals` 条件要求 `ExampleApp` 按照其指定的大小写。

```
{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/RoleForExampleApp"
  },
  "Action": "kms:Decrypt",
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "kms:EncryptionContext:Appname": "ExampleApp"
    }
  }
}
```

要要求使用区分大小写的加密上下文密钥，请使用 k [ms: EncryptionContextKeys](#conditions-kms-encryption-context-keys) 策略条件和区分大小写的条件运算符，例如。`StringEquals`在此策略条件中，由于加密上下文键是此策略条件中的值，它是否区分大小写由条件运算符确定。

```
{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/RoleForExampleApp"
  },
  "Action": "kms:GenerateDataKey",
  "Resource": "*",
  "Condition": {
    "ForAnyValue:StringEquals": {
      "kms:EncryptionContextKeys": "AppName"
    }
  }
}
```

要要求对加密上下文密钥和值进行区分大小写的评估，请在同一个策略声明中同时使用 `kms:EncryptionContextKeys` an kms: EncryptionContext d: conte *xt-key* 策略条件。区分大小写的条件运算符（例如 `StringEquals`）始终适用于条件的值。加密上下文键（例如 `AppName`）是 `kms:EncryptionContextKeys` 条件的值。加密上下文值（例如`ExampleApp`）是 kms:EncryptionContext:*上下文密钥*条件的值。

例如，在以下示例密钥策略语句中，由于 `StringEquals` 运算符区分大小写，加密上下文键和加密上下文值均区分大小写。

```
{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/RoleForExampleApp"
  },
  "Action": "kms:GenerateDataKey",
  "Resource": "*",
  "Condition": {
    "ForAnyValue:StringEquals": {
      "kms:EncryptionContextKeys": "AppName"
    },
    "StringEquals": {
      "kms:EncryptionContext:AppName": "ExampleApp"
    }
  }
}
```

### 在加密上下文条件中使用变量


加密上下文对中的键和值必须是简单的文本字符串。它们不能是整数或对象，也不能是任何未完全解析的类型。如果您使用其他类型，例如整数或浮点数，则将其 Amazon KMS 解释为文字字符串。

```
"encryptionContext": {
    "department": "10103.0"
}
```

不过，`kms:EncryptionContext:context-key` 条件键的值可以是 [IAM policy 变量](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_variables.html)。在运行时根据请求中的值解析这些策略变量。例如，`aws:CurrentTime `解析为请求的时间，`aws:username` 解析为调用方的友好名称。

您可以使用这些策略变量来创建一个策略语句，该语句包含的条件需要加密上下文中非常具体的信息，例如调用方的用户名。由于它包含一个变量，因此，您可以对所有能够代入该角色的用户使用相同的策略语句。您无需为每个用户编写单独的策略语句。

请考虑这样一种情况：您希望所有能够代入角色的用户都使用同一 KMS 密钥来加密和解密其数据。但是，您希望仅允许这些用户解密其加密的数据。首先，要求每个请求都 Amazon KMS 包含加密上下文，其中密钥是`user`，值是调用者的 Amazon 用户名，例如以下内容。

```
"encryptionContext": {
    "user": "bob"
}
```

然后，要强制执行此要求，您可以使用与以下示例中的策略语句类似的策略语句。此策略语句向 `TestTeam` 角色授予使用 KMS 密钥加密和解密数据的权限。不过，此权限仅在请求中的加密上下文包含 `"user": "<username>"` 对时有效。为了表示用户名，条件使用 [https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_variables.html#policy-vars-infotouse](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_variables.html#policy-vars-infotouse) 策略变量。

在评估请求时，调用方的用户名将替换条件中的变量。同样地，条件要求 `"user": "bob"`（对于“bob”）和 `"user": "alice"`（对于“alice”）的加密上下文。

```
{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/TestTeam"
  },
  "Action": [
    "kms:Decrypt",
    "kms:Encrypt"
  ],
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "kms:EncryptionContext:user": "${aws:username}"
    }
  }
}
```

您只能在 `kms:EncryptionContext:context-key` 条件键的值中使用 IAM policy 变量。不能在键中使用变量。

也可以在变量中使用[提供程序特定的上下文键](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_providers_oidc_user-id.html)。这些上下文密钥唯一标识使用 Web 联合身份验证登录 Amazon 的用户。

与所有变量一样，这些变量只能用于 `kms:EncryptionContext:context-key` 策略条件，而不能用于实际加密上下文。此外，它们只能用于条件的值，而不能用于条件的键。

例如，以下键策略语句与上一个类似。不过，条件需要加密上下文，其中键为 `sub`，并且值唯一标识已登录 Amazon Cognito 用户池的用户。有关识别 Amazon Cognito 中的用户和角色的详细信息，请参阅 [Amazon Cognito 开发人员指南](https://docs.amazonaws.cn/cognito/latest/developerguide/)中的 [IAM 角色](https://docs.amazonaws.cn/cognito/latest/developerguide/iam-roles.html)。

```
{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/TestTeam"
  },
  "Action": [
    "kms:Decrypt",
    "kms:Encrypt"
  ],
  "Resource": "*",
  "Condition": {
    "StringEquals": {
       "kms:EncryptionContext:sub": "${cognito-identity.amazonaws.com:sub}"
    }
  }
}
```

**另请参阅**
+ [kms: EncryptionContextKeys](#conditions-kms-encryption-context-keys)
+ [kms: GrantConstraintType](#conditions-kms-grant-constraint-type)

## kms: EncryptionContextKeys



| Amazon KMS 条件键 | 条件类型 | 值类型 | API 操作 | 策略类型 | 
| --- | --- | --- | --- | --- | 
|  `kms:EncryptionContextKeys`  |  字符串（列表）  | 多值 |  `CreateGrant` `Decrypt` `Encrypt` `GenerateDataKey` `GenerateDataKeyPair` `GenerateDataKeyPairWithoutPlaintext` `GenerateDataKeyWithoutPlaintext` `ReEncrypt` `RetireGrant`  |  密钥策略和 IAM policy  | 

您可以使用 `kms:EncryptionContextKeys` 条件键，根据加密操作请求中的[加密上下文](encrypt_context.md)，控制对[对称加密 KMS 密钥](symm-asymm-choose-key-spec.md#symmetric-cmks)的访问。使用此条件键仅评估各个加密上下文对中的键。要同时评估加密上下文中的键和值，请使用 `kms:EncryptionContext:context-key` 条件键。

您不能在使用[非对称 KMS 密钥](symmetric-asymmetric.md)或 [HMAC KMS 密钥](hmac.md)的加密操作中指定加密上下文。非对称算法和 MAC 算法不支持加密上下文。

**注意**  
条件密钥值（包括加密上下文密钥）必须符合密 Amazon KMS 钥策略的字符和编码规则。您可能无法使用此条件键来表示所有有效的加密上下文键。有关密钥策略文档规则的详细信息，请参阅 [密钥策略格式](key-policy-overview.md#key-policy-format)。有关 IAM policy 文档规则的详细信息，请参阅*《IAM 用户指南》*中的 [IAM 名称要求](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_iam-quotas.html#reference_iam-quotas-names)。

这是一个[多值条件键](#set-operators)。您可以在每个 API 请求中指定多个加密上下文对。`kms:EncryptionContextKeys` 会将请求中的加密上下文键与策略中的加密上下文键集进行比较。要确定如何比较这些集，您必须在策略条件中提供 `ForAnyValue` 或 `ForAllValues` 集合运算符。有关集合运算符的详细信息，请参阅 IAM 用户指南中的[使用多个键和值](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_multi-value-conditions.html#reference_policies_multi-key-or-value-conditions)。
+ `ForAnyValue`：请求中的至少一个加密上下文键必须匹配策略条件中的加密上下文键。允许其他加密上下文键。如果请求中没有加密上下文，则不满足此条件。
+ `ForAllValues`：请求中的每个加密上下文键必须匹配策略条件中的加密上下文键。此集合运算符将加密上下文键限制为策略条件中的键。它不需要任何加密上下文键，但禁止未指定的加密上下文键。

以下示例密钥策略语句结合使用 `kms:EncryptionContextKeys` 条件键与 `ForAnyValue` 集合运算符。此策略语句允许对指定运算使用 KMS 密钥，但仅当请求中至少有一个加密上下文对包括 `AppName` 键（忽视其值）时，才允许为指定运算使用 KMS 密钥。

例如，此密钥策略语句允许包含两个加密上下文对 `AppName=Helper` 和 `Project=Alpha` 的 `GenerateDataKey` 请求，因为第一个加密上下文对满足此条件。只有 `Project=Alpha` 或没有加密上下文的请求都会失败。

由于[StringEquals](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html)条件操作区分大小写，因此此策略声明要求加密上下文密钥的拼写和大小写。不过您可以使用忽略键大小写的条件运算符，例如 `StringEqualsIgnoreCase`。

```
{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/RoleForExampleApp"
  },
  "Action": [
    "kms:Encrypt",
    "kms:GenerateDataKey*"
  ],
  "Resource": "*",
  "Condition": {
    "ForAnyValue:StringEquals": {
      "kms:EncryptionContextKeys": "AppName"
    }
  }
}
```

您也可以使用 `kms:EncryptionContextKeys` 条件键在使用 KMS 密钥的加密操作中要求加密上下文（任何加密上下文）。

以下示例密钥策略语句结合使用 `kms:EncryptionContextKeys` 条件键和 [Null 条件运算符](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Null)，仅允许在 API 请求中的加密上下文不为 null 时允许访问 KMS 密钥。此条件不检查加密上下文的键或值。它只验证加密上下文是否存在。

```
{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/RoleForExampleApp"
  },
  "Action": [
    "kms:Encrypt",
    "kms:GenerateDataKey*"
  ],
  "Resource": "*",
  "Condition": {
    "Null": {
      "kms:EncryptionContextKeys": false
    }
  }
}
```

**另请参阅**
+ [kms:EncryptionContext: *上下文*密钥](#conditions-kms-encryption-context)
+ [kms: GrantConstraintType](#conditions-kms-grant-constraint-type)

## kms: ExpirationModel



| Amazon KMS 条件键 | 条件类型 | 值类型 | API 操作 | 策略类型 | 
| --- | --- | --- | --- | --- | 
|  `kms:ExpirationModel`  |  字符串  | 单值 |  `ImportKeyMaterial`  |  密钥策略和 IAM policy  | 

`kms:ExpirationModel`条件键根据请求中[ExpirationModel](https://docs.amazonaws.cn/kms/latest/APIReference/API_ImportKeyMaterial.html#KMS-ImportKeyMaterial-request-ExpirationModel)参数的值控制对[ImportKeyMaterial](https://docs.amazonaws.cn/kms/latest/APIReference/API_ImportKeyMaterial.html)操作的访问权限。

`ExpirationModel` 是可选参数，用于确定导入的密钥材料是否过期。有效值为 `KEY_MATERIAL_EXPIRES` 和 `KEY_MATERIAL_DOES_NOT_EXPIRE`。默认值为 `KEY_MATERIAL_EXPIRES`。

到期日期和时间由[ValidTo](https://docs.amazonaws.cn/kms/latest/APIReference/API_ImportKeyMaterial.html#KMS-ImportKeyMaterial-request-ValidTo)参数的值决定。除非 `ExpirationModel` 参数的值为 `KEY_MATERIAL_DOES_NOT_EXPIRE`，否则 `ValidTo` 参数是必需的。您也可以使用 k [ms: ValidTo](#conditions-kms-valid-to) 条件密钥要求特定的到期日期作为访问条件。

以下示例策略语句使用 `kms:ExpirationModel` 条件键，以仅允许用户在请求包含 `ExpirationModel` 参数且其值为 `KEY_MATERIAL_DOES_NOT_EXPIRE` 时将密钥材料导入 KMS 密钥。

```
{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/RoleForExampleApp"
  },
  "Action": "kms:ImportKeyMaterial",
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "kms:ExpirationModel": "KEY_MATERIAL_DOES_NOT_EXPIRE"
    }
  }
}
```

您也可以使用 `kms:ExpirationModel` 条件键，以仅允许用户在密钥材料过期时导入密钥材料。以下示例密钥策略语句结合使用 `kms:ExpirationModel` 条件键和 [空值条件运算符](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Null)，以仅允许用户在请求没有 `ExpirationModel` 参数时导入密钥材料。的默认值 ExpirationModel 为`KEY_MATERIAL_EXPIRES`。

```
{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/RoleForExampleApp"
  },
  "Action": "kms:ImportKeyMaterial",
  "Resource": "*",
  "Condition": {
    "Null": {
      "kms:ExpirationModel": true
    }
  }
}
```

**另请参阅**
+ [kms: ValidTo](#conditions-kms-valid-to)
+ [kms: WrappingAlgorithm](#conditions-kms-wrapping-algorithm)
+ [kms: WrappingKeySpec](#conditions-kms-wrapping-key-spec)

## kms: GrantConstraintType



| Amazon KMS 条件键 | 条件类型 | 值类型 | API 操作 | 策略类型 | 
| --- | --- | --- | --- | --- | 
|  `kms:GrantConstraintType`  |  字符串  | 单值 |  `CreateGrant` `RetireGrant`  |  密钥策略和 IAM policy  | 

您可以使用此条件键根据请求中的[授权约束类型来控制对[CreateGrant](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateGrant.html)操作的访问权限](create-grant-overview.md#grant-constraints)。

创建授权时，您可以选择性地指定授权约束，以仅在存在特定[加密上下文](encrypt_context.md)时允许授予操作权限。授权约束可以是以下两种类型之一：`EncryptionContextEquals` 或 `EncryptionContextSubset`。您可以使用此条件键来检查请求中包含哪种类型。

**重要**  
不要在此字段中包含机密或敏感信息。此字段可能会以纯文本形式显示在 CloudTrail 日志和其他输出中。

以下示例密钥策略语句使用 `kms:GrantConstraintType` 条件键，以仅允许用户在请求中包含 `EncryptionContextEquals` 授权约束时创建授权。以下示例显示了密钥策略中的策略语句。

```
{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/RoleForExampleApp"
  },
  "Action": "kms:CreateGrant",
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "kms:GrantConstraintType": "EncryptionContextEquals"
    }
  }
}
```

**另请参阅**
+ [kms:EncryptionContext: *上下文*密钥](#conditions-kms-encryption-context)
+ [kms: EncryptionContextKeys](#conditions-kms-encryption-context-keys)
+ [kms: GrantIsFor AWSResource](#conditions-kms-grant-is-for-aws-resource)
+ [kms: GrantOperations](#conditions-kms-grant-operations)
+ [kms: GranteePrincipal](#conditions-kms-grantee-principal)
+ [kms: RetiringPrincipal](#conditions-kms-retiring-principal)

## kms: GrantIsFor AWSResource



| Amazon KMS 条件键 | 条件类型 | 值类型 | API 操作 | 策略类型 | 
| --- | --- | --- | --- | --- | 
|  `kms:GrantIsForAWSResource`  |  布尔值  | 单值 |  `CreateGrant` `ListGrants` `RevokeGrant`  |  密钥策略和 IAM policy  | 

仅当与之[集成的Amazon 服务代表用户 Amazon KMS调用[RevokeGrant](https://docs.amazonaws.cn/kms/latest/APIReference/API_RevokeGrant.html)](https://www.amazonaws.cn/kms/features/#AWS_Service_Integration)操作时 [CreateGrant](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateGrant.html)，才允许或拒绝对[ListGrants](https://docs.amazonaws.cn/kms/latest/APIReference/API_ListGrants.html)、或操作的权限。此策略条件不允许用户直接调用这些授权操作。

以下示例密钥策略语句使用 `kms:GrantIsForAWSResource` 条件键。它允许与 Amazon KMS之集成的 Amazon 服务（例如 Amazon EBS）代表指定的委托人针对此 KMS 密钥创建授权。

```
{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/ExampleRole"
  },
  "Action": "kms:CreateGrant",
  "Resource": "*",
  "Condition": {
    "Bool": {
      "kms:GrantIsForAWSResource": true
    }
  }
}
```

**另请参阅**
+ [kms: GrantConstraintType](#conditions-kms-grant-constraint-type)
+ [kms: GrantOperations](#conditions-kms-grant-operations)
+ [kms: GranteePrincipal](#conditions-kms-grantee-principal)
+ [kms: RetiringPrincipal](#conditions-kms-retiring-principal)

## kms: GrantOperations



| Amazon KMS 条件键 | 条件类型 | 值类型 | API 操作 | 策略类型 | 
| --- | --- | --- | --- | --- | 
|  `kms:GrantOperations`  |  字符串  | 多值 |  `CreateGrant`  |  密钥策略和 IAM policy  | 

您可以使用此条件密钥根据请求中的授权[CreateGrant](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateGrant.html)操作来控制对[操作的访问权限](grants.md#terms-grant-operations)。例如，您可以允许用户创建委托加密权限（但不委托解密权限）的授权。有关授权的更多信息，请参阅[使用授权](grants.md)。

这是一个[多值条件键](#set-operators)。`kms:GrantOperations` 将比较 `CreateGrant` 请求中的授权操作集合与策略中的授权操作集合。要确定如何比较这些集，您必须在策略条件中提供 `ForAnyValue` 或 `ForAllValues` 集合运算符。有关集合运算符的详细信息，请参阅 IAM 用户指南中的[使用多个键和值](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_multi-value-conditions.html#reference_policies_multi-key-or-value-conditions)。
+ `ForAnyValue`：请求中的至少一个授权操作必须匹配策略条件中的授权操作之一。允许其他授权操作。
+ ForAllValues：请求中的每个授予操作都必须与策略条件中的授权操作相匹配。此集合运算符将授权操作限制为策略条件中指定的操作。它不需要任何授权操作，但它禁止未指定的授权操作。

  ForAllValues 当请求中没有授予操作但`CreateGrant`不允许时，也会返回 true。如果 `Operations` 参数缺失或具有 null 值，则 `CreateGrant` 请求失败。

以下示例密钥策略语句使用 `kms:GrantOperations` 条件键，以仅允许在授权操作为 `Encrypt`、`ReEncryptTo` 或此两者时创建授权。如果授权包括任何其他操作，则 `CreateGrant` 请求失败。

```
{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/ExampleRole"
  },
  "Action": "kms:CreateGrant",
  "Resource": "*",
  "Condition": {
    "ForAllValues:StringEquals": {
      "kms:GrantOperations": [
        "Encrypt",
        "ReEncryptTo"
      ]
    }
  }
}
```

如果将策略条件中的集合运算符更改为 `ForAnyValue`，则策略语句将要求授权中至少有一个授权操作是 `Encrypt` 或 `ReEncryptTo`，但它允许其他授权操作，例如 `Decrypt` 或 `ReEncryptFrom`。

**另请参阅**
+ [kms: GrantConstraintType](#conditions-kms-grant-constraint-type)
+ [kms: GrantIsFor AWSResource](#conditions-kms-grant-is-for-aws-resource)
+ [kms: GranteePrincipal](#conditions-kms-grantee-principal)
+ [kms: RetiringPrincipal](#conditions-kms-retiring-principal)

## kms: GranteePrincipal



| Amazon KMS 条件键 | 条件类型 | 值类型 | API 操作 | 策略类型 | 
| --- | --- | --- | --- | --- | 
|  `kms:GranteePrincipal`  |  字符串  | 单值 |  `CreateGrant`  |  IAM 和密钥策略  | 

您可以使用此条件键根据请求中[GranteePrincipal](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateGrant.html#KMS-CreateGrant-request-GranteePrincipal)参数的值来控制对[CreateGrant](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateGrant.html)操作的访问权限。例如，您可以仅允许在 `CreateGrant` 请求中的被授权主体与条件语句中指定的主体匹配时创建使用 KMS 密钥的授权。

要指定被授权者主体，请使用 Amazon 主体的 Amazon 资源名称（ARN）。有效的委托人包括 Amazon Web Services 账户 IAM 用户、IAM 角色、联合用户和代入角色用户。有关委托人的 ARN 语法的帮助，请参阅 [IAM 用户指南 ARNs](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_identifiers.html#identifiers-arns)*中的 IAM*。

以下示例密钥策略语句使用 `kms:GranteePrincipal` 条件键，以仅允许在授权中的被授权主体为 `LimitedAdminRole` 时创建 KMS 密钥授权。

```
{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/ExampleRole"
  },
  "Action": "kms:CreateGrant",
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "kms:GranteePrincipal": "arn:aws:iam::111122223333:role/LimitedAdminRole"
    }
  }
}
```

**另请参阅**
+ [kms: GrantConstraintType](#conditions-kms-grant-constraint-type)
+ [kms: GrantIsFor AWSResource](#conditions-kms-grant-is-for-aws-resource)
+ [kms: GrantOperations](#conditions-kms-grant-operations)
+ [kms: RetiringPrincipal](#conditions-kms-retiring-principal)

## kms: KeyAgreementAlgorithm



| Amazon KMS 条件键 | 条件类型 | 值类型 | API 操作 | 策略类型 | 
| --- | --- | --- | --- | --- | 
|  `kms:KeyAgreementAlgorithm`  |  字符串  | 单值 | `DeriveSharedSecret` |  密钥策略和 IAM policy  | 

您可以使用`kms:KeyAgreementAlgorithm`条件键根据请求中`KeyAgreementAlgorithm`参数的值来控制对[DeriveSharedSecret](https://docs.amazonaws.cn/kms/latest/APIReference/API_DeriveSharedSecret.html)操作的访问权限。对于 `KeyAgreementAlgorithm`，唯一的有效值为 `ECDH`。

例如，以下密钥策略声明使用`kms:KeyAgreementAlgorithm`条件密钥拒绝所有访问权限， DeriveSharedSecret 除非`KeyAgreementAlgorithm`是`ECDH`。

```
{
       "Effect": "Deny",
       "Principal": {
         "AWS": "arn:aws:iam::111122223333:role/ExampleRole"
       },
       "Action": "kms:DeriveSharedSecret",
       "Resource": "*",
       "Condition": {
            "StringNotEquals": {
               "kms:KeyAgreementAlgorithm": "ECDH"
         }
       }
}
```

**另请参阅**
+ [kms: KeyUsage](#conditions-kms-key-usage)

## kms: KeyOrigin



| Amazon KMS 条件键 | 条件类型 | 值类型 | API 操作 | 策略类型 | 
| --- | --- | --- | --- | --- | 
|  `kms:KeyOrigin`  |  字符串  | 单值 |  `CreateKey` KMS 密钥资源操作  |  IAM 策略 密钥策略和 IAM 策略  | 

`kms:KeyOrigin` 条件键根据操作创建的或操作中使用的 KMS 密钥的 `Origin` 属性值，控制对操作的访问。它作为资源条件或请求条件工作。

您可以使用此条件键根据请求中 O [rigin](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateKey.html#KMS-CreateKey-request-Origin) 参数的值来控制对[CreateKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateKey.html)操作的访问权限。`Origin` 的有效值为 `AWS_KMS`、`AWS_CLOUDHSM`、`EXTERNAL_KEY_STORE` 和 `EXTERNAL`。

例如，只有在 Amazon KMS (`AWS_KMS`) 中生成密钥材料时，才能创建 KMS 密钥，仅当密钥材料是在与 [CloudHSM 自定义密钥存储库 `AWS_CLOUDHSM` () 关联的 Amazon CloudHSM 集群中生成时，才可以创建 KMS 密](key-store-overview.md#custom-key-store-overview)钥，仅当密钥材料是在[外部密钥](key-store-overview.md#custom-key-store-overview)存储中生成的 `EXTERNAL_KEY_STORE` ()，或者仅当[密钥材料是](importing-keys.md)从外部来源导入时 ()。`EXTERNAL`

以下示例密钥策略声明仅在创建密钥材料时才使用`kms:KeyOrigin`条件密钥创 Amazon KMS 建 KMS 密钥。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:role/ExampleRole"
      },
      "Action": "kms:CreateKey",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "kms:KeyOrigin": "AWS_KMS"
        }
      }
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:role/ExampleRole"
      },
      "Action": [
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:GenerateDataKey",
        "kms:GenerateDataKeyWithoutPlaintext",
        "kms:GenerateDataKeyPair",
        "kms:GenerateDataKeyPairWithoutPlaintext",
        "kms:ReEncrypt*"
      ],
      "Resource": "arn:aws:kms:us-west-2:111122223333:key/*",
      "Condition": {
        "StringEquals": {
          "kms:KeyOrigin": "AWS_CLOUDHSM"
        }
      }
    }
  ]
}
```

------

还可以使用 `kms:KeyOrigin` 条件键，根据用于操作的 KMS 密钥的 `Origin` 属性，控制对使用或管理 KMS 密钥的操作的访问。该操作必须是 *KMS 密钥资源操作*，即为特定 KMS 密钥授权的操作。若要标识 KMS 密钥资源操作，请在[操作和资源表](kms-api-permissions-reference.md#kms-api-permissions-reference-table)中，在操作的 `Resources` 列中查找的 `KMS key` 的值。

例如，以下 IAM policy 允许委托人执行指定的 KMS 密钥资源操作，但只能使用账户中在自定义密钥存储中创建的 KMS 密钥。

```
{
  "Effect": "Allow",  
  "Action": [
    "kms:Encrypt",
    "kms:Decrypt",
    "kms:GenerateDataKey",
    "kms:GenerateDataKeyWithoutPlaintext",
    "kms:GenerateDataKeyPair",
    "kms:GenerateDataKeyPairWithoutPlaintext",
    "kms:ReEncrypt*"
  ],
  "Resource": "arn:aws:kms:us-west-2:111122223333:key/*",
  "Condition": {
    "StringEquals": {
      "kms:KeyOrigin": "AWS_CLOUDHSM"
    }
  }
}
```

**另请参阅**
+ [kms: BypassPolicyLockoutSafetyCheck](#conditions-kms-bypass-policy-lockout-safety-check)
+ [kms: KeySpec](#conditions-kms-key-spec)
+ [kms: KeyUsage](#conditions-kms-key-usage)

## kms: KeySpec



| Amazon KMS 条件键 | 条件类型 | 值类型 | API 操作 | 策略类型 | 
| --- | --- | --- | --- | --- | 
|  `kms:KeySpec`  |  字符串  | 单值 |  `CreateKey` KMS 密钥资源操作 |  IAM 策略 密钥策略和 IAM 策略  | 

`kms:KeySpec` 条件键根据操作创建的或操作中使用的 KMS 密钥的 `KeySpec` 属性值，控制对操作的访问。

您可以在 IAM 策略中使用此条件密钥，根据`CreateKey`请求中[KeySpec](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateKey.html#KMS-CreateKey-request-KeySpec)参数的值来控制对[CreateKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateKey.html)操作的访问权限。例如，您可以使用此条件允许用户仅创建对称加密 KMS 密钥或仅创建 HMAC KMS 密钥。

以下示例 IAM policy 语句使用 `kms:KeySpec` 条件键，允许主体仅创建 RSA 非对称 KMS 密钥。权限仅在请求中的 `KeySpec` 以 `RSA_` 开头时有效。

```
{
  "Effect": "Allow",
  "Action": "kms:CreateKey",
  "Resource": "*",
  "Condition": {
    "StringLike": {
      "kms:KeySpec": "RSA_*"
    }
  }
}
```

还可以使用 `kms:KeySpec` 条件键，根据用于操作的 KMS 密钥的 `KeySpec` 属性，控制对使用或管理 KMS 密钥的操作的访问。该操作必须是 *KMS 密钥资源操作*，即为特定 KMS 密钥授权的操作。若要标识 KMS 密钥资源操作，请在[操作和资源表](kms-api-permissions-reference.md#kms-api-permissions-reference-table)中，在操作的 `Resources` 列中查找的 `KMS key` 的值。

例如，以下 IAM policy 允许主体执行指定的 KMS 密钥资源操作，但只能使用账户中的对称加密 KMS 密钥。

```
{
  "Effect": "Allow",
  "Action": [
    "kms:Encrypt",
    "kms:Decrypt",
    "kms:ReEncrypt*",
    "kms:DescribeKey"
  ],
  "Resource": "arn:aws:kms:us-west-2:111122223333:key/*",
  "Condition": {
    "StringEquals": {
      "kms:KeySpec": "SYMMETRIC_DEFAULT"
    }
  }
}
```

**另请参阅**
+ [kms: BypassPolicyLockoutSafetyCheck](#conditions-kms-bypass-policy-lockout-safety-check)
+ [kms:CustomerMasterKeySpec （已弃用）](#conditions-kms-key-spec-replaced)
+ [kms: DataKeyPairSpec](#conditions-kms-data-key-spec)
+ [kms: KeyOrigin](#conditions-kms-key-origin)
+ [kms: KeyUsage](#conditions-kms-key-usage)

## kms: KeyUsage



| Amazon KMS 条件键 | 条件类型 | 值类型 | API 操作 | 策略类型 | 
| --- | --- | --- | --- | --- | 
|  `kms:KeyUsage`  |  字符串  | 单值 |  `CreateKey` KMS 密钥资源操作  |  IAM 策略 密钥策略和 IAM 策略  | 

`kms:KeyUsage` 条件键根据操作创建的或操作中使用的 KMS 密钥的 `KeyUsage` 属性值，控制对操作的访问。

您可以使用此条件键根据请求中[KeyUsage](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateKey.html#KMS-CreateKey-request-KeyUsage)参数的值来控制对[CreateKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateKey.html)操作的访问权限。`KeyUsage` 的有效值为 `ENCRYPT_DECRYPT`、`SIGN_VERIFY`、`GENERATE_VERIFY_MAC` 和 `KEY_AGREEMENT`。

例如，您可以仅在 `KeyUsage` 为 `ENCRYPT_DECRYPT` 时允许创建 KMS 密钥，或者在 `KeyUsage` 为 `SIGN_VERIFY` 时拒绝用户权限。

以下示例 IAM policy 语句使用 `kms:KeyUsage` 条件键，以仅允许在 `KeyUsage` 为 `ENCRYPT_DECRYPT` 时创建 KMS 密钥。

```
{
  "Effect": "Allow",  
  "Action": "kms:CreateKey",
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "kms:KeyUsage": "ENCRYPT_DECRYPT"
    }
  }
}
```

还可以使用 `kms:KeyUsage` 条件键，根据操作中的 KMS 密钥的 `KeyUsage` 属性，控制对使用或管理 KMS 密钥的操作的访问。该操作必须是 *KMS 密钥资源操作*，即为特定 KMS 密钥授权的操作。若要标识 KMS 密钥资源操作，请在[操作和资源表](kms-api-permissions-reference.md#kms-api-permissions-reference-table)中，在操作的 `Resources` 列中查找的 `KMS key` 的值。

例如，以下 IAM policy 允许委托人执行指定的 KMS 密钥资源操作，但只能使用账户中用于签名和验证的 KMS 密钥。

```
{
  "Effect": "Allow",
  "Action": [
    "kms:CreateGrant",
    "kms:DescribeKey",
    "kms:GetPublicKey",
    "kms:ScheduleKeyDeletion"
  ],
  "Resource": "arn:aws:kms:us-west-2:111122223333:key/*",
  "Condition": {
    "StringEquals": {
      "kms:KeyUsage": "SIGN_VERIFY"
    }
  }
}
```

**另请参阅**
+ [kms: BypassPolicyLockoutSafetyCheck](#conditions-kms-bypass-policy-lockout-safety-check)
+ [kms:CustomerMasterKeyUsage （已弃用）](#conditions-kms-key-usage-replaced)
+ [kms: KeyOrigin](#conditions-kms-key-origin)
+ [kms: KeySpec](#conditions-kms-key-spec)

## kms: MacAlgorithm



| Amazon KMS 条件键 | 条件类型 | 值类型 | API 操作 | 策略类型 | 
| --- | --- | --- | --- | --- | 
|  `kms:MacAlgorithm`  |  字符串  | 单值 | `GenerateMac``VerifyMac` |  密钥策略和 IAM policy  | 

您可以使用`kms:MacAlgorithm`条件键根据请求中`MacAlgorithm`参数的值来控制对[GenerateMac](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateMac.html)和[VerifyMac](https://docs.amazonaws.cn/kms/latest/APIReference/API_VerifyMac.html)操作的访问权限。

以下示例密钥策略允许可以代入 `testers` 角色的用户仅在请求中的 MAC 算法为 `HMAC_SHA_384` 或 `HMAC_SHA_512` 时使用 HMAC KMS 密钥生成和验证 HMAC 标签。此策略使用两个独立的策略语句，每个语句都有自己的条件。如果在单个条件语句中指定多个 MAC 算法，则该条件需要两种算法，而不是其中一种算法。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:role/testers"
      },
      "Action": [
        "kms:GenerateMac",
        "kms:VerifyMac"
      ],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "kms:MacAlgorithm": "HMAC_SHA_384"
        }
      }
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:role/testers"
      },
      "Action": [
        "kms:GenerateMac",
        "kms:VerifyMac"
      ],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "kms:MacAlgorithm": "HMAC_SHA_512"
        }
      }
    }
  ]
}
```

------

**另请参阅**
+ [kms: EncryptionAlgorithm](#conditions-kms-encryption-algorithm)
+ [kms: SigningAlgorithm](#conditions-kms-signing-algorithm)

## kms: MessageType



| Amazon KMS 条件键 | 条件类型 | 值类型 | API 操作 | 策略类型 | 
| --- | --- | --- | --- | --- | 
|  `kms:MessageType`  |  字符串  | 单值 |  `Sign` `Verify`  | 密钥策略和 IAM 策略 | 

`kms:MessageType` 条件键基于请求中 `MessageType` 参数的值控制对 [Sign](https://docs.amazonaws.cn/kms/latest/APIReference/API_Sign.html) 和 [Verify](https://docs.amazonaws.cn/kms/latest/APIReference/API_Verify.html) 操作的访问权限。`MessageType` 的有效值为 `RAW` 和 `DIGEST`。

例如，以下密钥策略语句使用 `kms:MessageType` 条件键，以允许使用非对称 KMS 密钥签署消息，而不是消息摘要。

```
{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/ExampleRole"
  },
  "Action": "kms:Sign",
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "kms:MessageType": "RAW"
    }
  }
}
```

**另请参阅**
+ [kms: SigningAlgorithm](#conditions-kms-signing-algorithm)

## kms: MultiRegion



| Amazon KMS 条件键 | 条件类型 | 值类型 | API 操作 | 策略类型 | 
| --- | --- | --- | --- | --- | 
|  `kms:MultiRegion`  |  布尔值  | 单值 |  `CreateKey` KMS 密钥资源操作  |  密钥策略和 IAM 策略  | 

您可以使用此条件键以允许仅对单区域密钥或仅对[多区域密钥](multi-region-keys-overview.md)进行操作。`kms:MultiRegion`条件密钥根据 KMS 密钥的`MultiRegion`属性值控制对 KMS 密钥的[CreateKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateKey.html)操作和操作的访问权限。 Amazon KMS 有效值为 `true`（多区域）或 `false`（单区域）。所有 KMS 密钥都具有 `MultiRegion` 属性。

例如，以下 IAM policy 语句使用 `kms:MultiRegion` 条件键，允许委托人仅创建单区域密钥。

```
{
  "Effect": "Allow",
  "Action": "kms:CreateKey",
  "Resource": "*",
  "Condition": {
    "Bool": {
      "kms:MultiRegion": false
    }
  }
}
```

## kms: MultiRegionKeyType



| Amazon KMS 条件键 | 条件类型 | 值类型 | API 操作 | 策略类型 | 
| --- | --- | --- | --- | --- | 
|  `kms:MultiRegionKeyType`  |  字符串  | 单值 |  `CreateKey` KMS 密钥资源操作  |  密钥策略和 IAM 策略  | 

您可以使用此条件键以允许仅对[多区域主键](multi-region-keys-overview.md#mrk-primary-key)或仅对[多区域副本密钥](multi-region-keys-overview.md#mrk-replica-key)执行操作。`kms:MultiRegionKeyType`条件密钥根据 KMS 密钥的`MultiRegionKeyType`属性控制对 KMS 密钥的[CreateKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateKey.html)操作和操作的访问权限。 Amazon KMS 有效值为 `PRIMARY` 和 `REPLICA`。只有多区域密钥具有 `MultiRegionKeyType` 属性。

通常情况下，您可以使用 IAM policy 中的 `kms:MultiRegionKeyType` 条件键以控制对多个 KMS 密钥的访问。但是，由于给定的多区域密钥可以更改为主密钥或副本密钥，因此您可能希望在密钥策略中使用此条件，以便仅当特定的多区域密钥为主密钥或副本密钥时才允许操作。

IAM policy 语句使用 `kms:MultiRegionKeyType` 条件键，以允许委托人仅对 Amazon Web Services 账户中指定的多区域副本密钥计划和取消删除密钥。

```
{
  "Effect": "Allow",
  "Action": [
    "kms:ScheduleKeyDeletion",
    "kms:CancelKeyDeletion"
  ],
  "Resource": "arn:aws:kms:*:111122223333:key/*",
  "Condition": {
    "StringEquals": {
      "kms:MultiRegionKeyType": "REPLICA"
    }
  }
}
```

要允许或拒绝访问所有多区域密钥，您可以将这两个值或 null 值用于 `kms:MultiRegionKeyType`。但是，为此，建议使用 k [ms: MultiRegion](#conditions-kms-multiregion) 条件密钥。

## kms: PrimaryRegion



| Amazon KMS 条件键 | 条件类型 | 值类型 | API 操作 | 策略类型 | 
| --- | --- | --- | --- | --- | 
|  `kms:PrimaryRegion`  |  字符串（列表）  | 单值 |  `UpdatePrimaryRegion`  |  密钥策略和 IAM policy  | 

您可以使用此条件键来限制[UpdatePrimaryRegion](https://docs.amazonaws.cn/kms/latest/APIReference/API_UpdatePrimaryRegion.html)操作中的目标区域。它们 Amazon Web Services 区域 可以托管您的多区域主密钥。

`kms:PrimaryRegion`条件键根据`PrimaryRegion`参数的值控制对[UpdatePrimaryRegion](https://docs.amazonaws.cn/kms/latest/APIReference/API_UpdatePrimaryRegion.html)操作的访问权限。该`PrimaryRegion`参数指定要提升 Amazon Web Services 区域 为主[密钥的多区域副本密钥](multi-region-keys-overview.md#mrk-replica-key)。条件的值是一个或多个 Amazon Web Services 区域 名称，例如`us-east-1`或`ap-southeast-2`，或者区域名称模式，例如 `eu-*`

例如，以下密钥策略语句使用 `kms:PrimaryRegion` 条件键，以允许委托人将多区域密钥的主区域更新为四个指定的区域之一。

```
{
  "Effect": "Allow",
  "Action": "kms:UpdatePrimaryRegion",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/Developer"
  },
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "kms:PrimaryRegion": [ 
         "us-east-1",
         "us-west-2",
         "eu-west-3",
         "ap-southeast-2"
      ]
    }
  }
}
```

## kms: ReEncryptOnSameKey



| Amazon KMS 条件键 | 条件类型 | 值类型 | API 操作 | 策略类型 | 
| --- | --- | --- | --- | --- | 
|  `kms:ReEncryptOnSameKey`  |  布尔值  | 单值 |  `ReEncrypt`  |  密钥策略和 IAM policy  | 

您可以使用此条件密钥来控制对[ReEncrypt](https://docs.amazonaws.cn/kms/latest/APIReference/API_ReEncrypt.html)操作的访问权限，具体取决于请求指定的目标 KMS 密钥是否与用于原始加密的目标密钥相同。

例如，以下密钥策略语句使用 `kms:ReEncryptOnSameKey` 条件键，以仅允许在目标 KMS 密钥与用于原始加密的 KMS 密钥相同时进行重新加密。

```
{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/ExampleRole"
  },
  "Action": "kms:ReEncrypt*",
  "Resource": "*",
  "Condition": {
    "Bool": {
      "kms:ReEncryptOnSameKey": true
    }
  }
}
```

## kms: RequestAlias



| Amazon KMS 条件键 | 条件类型 | 值类型 | API 操作 | 策略类型 | 
| --- | --- | --- | --- | --- | 
|  `kms:RequestAlias`  |  字符串（列表）  | 单值 |  [加密操作](kms-cryptography.md#cryptographic-operations) [DescribeKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_DescribeKey.html) [GetPublicKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_GetPublicKey.html)  |  密钥策略和 IAM policy  | 

您可以使用此条件键，仅在请求使用特定别名来标识 KMS 密钥时允许操作。`kms:RequestAlias` 条件键基于标识请求中的 KMS 密钥的[别名](kms-alias.md)控制对加密操作中使用的 KMS 密钥 `GetPublicKey` 或 `DescribeKey` 的访问。（此策略条件对[GenerateRandom](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateRandom.html)操作没有影响，因为该操作不使用 KMS 密钥或别名。） 

此条件支持中的[基于属性的访问控制](abac.md) (ABAC) Amazon KMS，允许您根据 KMS 密钥的标签和别名控制对 KMS 密钥的访问。您可以使用标签和别名，在不更改策略或授权的情况下，允许或拒绝对 KMS 密钥的访问权限。有关更多信息，请参阅 [ABAC for Amazon KMS](abac.md)。

要在此策略条件下指定别名，请使用[别名名称](concepts.md#key-id-alias-name)，例如 `alias/project-alpha`，或别名名称模式，例如 `alias/*test*`。您无法在此条件键的值中指定[别名 ARN](concepts.md#key-id-alias-ARN)。

为了满足此条件，请求中的 `KeyId` 参数的值必须是匹配的别名名称或别名 ARN。如果请求使用不同的[密钥标识符](concepts.md#key-id)，即使标识相同的 KMS 密钥，它也不能满足条件。

例如，以下密钥策略声明允许委托人对 KMS 密钥调用[GenerateDataKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKey.html)操作。但是，仅当请求中的 `KeyId` 参数的值为 `alias/finance-key` 或具有该别名名称（例如 `arn:aws:kms:us-west-2:111122223333:alias/finance-key`）的别名 ARN 时才允许此操作。

```
{
  "Sid": "Key policy using a request alias condition",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/developer"
  },
  "Action": "kms:GenerateDataKey",
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "kms:RequestAlias": "alias/finance-key"
    }
  }
}
```

您不能使用此条件键来控制对别名操作（例如[CreateAlias](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateAlias.html)或）的访问权限[DeleteAlias](https://docs.amazonaws.cn/kms/latest/APIReference/API_DeleteAlias.html)。有关控制对别名操作的访问的信息，请参阅 [控制对别名的访问](alias-access.md)。

## kms: ResourceAliases



| Amazon KMS 条件键 | 条件类型 | 值类型 | API 操作 | 策略类型 | 
| --- | --- | --- | --- | --- | 
|  `kms:ResourceAliases`  |  字符串（列表）  | 多值 | KMS 密钥资源操作 |  仅限 IAM policy  | 

使用此条件键可根据与 KMS 密钥关联的[别名](kms-alias.md)来控制对 KMS 密钥的访问。该操作必须是 *KMS 密钥资源操作*，即为特定 KMS 密钥授权的操作。若要标识 KMS 密钥资源操作，请在[操作和资源表](kms-api-permissions-reference.md#kms-api-permissions-reference-table)中，在操作的 `Resources` 列中查找的 `KMS key` 的值。

此条件在 Amazon KMS中支持基于属性的访问控制 (ABAC)。使用 ABAC，您可以根据分配给 KMS 密钥的标签以及与 KMS 密钥关联的别名来控制对 KMS 密钥的访问。您可以使用标签和别名，在不更改策略或授权的情况下，允许或拒绝对 KMS 密钥的访问权限。有关更多信息，请参阅 [ABAC for Amazon KMS](abac.md)。

别名在 Amazon Web Services 账户 和区域中必须是唯一的，但此条件允许您控制对同一区域中的多个 KMS 密钥（使用`StringLike`比较运算符）或每个账户中不同的 KMS 密钥 Amazon Web Services 区域 的访问权限。

**注意**  
仅当 [KMS 密钥符合[每个 KMS 密钥配额的别名时，km](resource-limits.md#aliases-per-key) s: ResourceAliases](#conditions-kms-resource-aliases) 条件才有效。如果 KMS 密钥超出此配额，则由 `kms:ResourceAliases` 条件授权使用 KMS 密钥的委托人将被拒绝访问 KMS 密钥。

要在此策略条件下指定别名，请使用[别名名称](concepts.md#key-id-alias-name)，例如 `alias/project-alpha`，或别名名称模式，例如 `alias/*test*`。您无法在此条件键的值中指定[别名 ARN](concepts.md#key-id-alias-ARN)。要满足条件，操作中使用的 KMS 密钥必须具有指定的别名。是否或者如何在操作请求中标识 KMS 密钥并不重要。

这是一个多值条件键，用于将与 KMS 密钥关联的别名集与策略中的别名集进行比较。要确定如何比较这些集，您必须在策略条件中提供 `ForAnyValue` 或 `ForAllValues` 集合运算符。有关集合运算符的详细信息，请参阅 IAM 用户指南中的[使用多个键和值](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_multi-value-conditions.html#reference_policies_multi-key-or-value-conditions)。
+ ForAnyValue：至少有一个与 KMS 密钥关联的别名必须与策略条件中的别名匹配。允许使用其他别名。如果 KMS 密钥没有别名，则不满足条件。
+ ForAllValues：与 KMS 密钥关联的每个别名都必须匹配策略中的别名。此集合运算符将与 KMS 密钥关联的别名限制为策略条件中的别名。它不需要任何别名，但它会禁止未指定的别名。

例如，以下 IAM 策略声明允许委托人对指定 Amazon Web Services 账户 的 KMS 密钥中与`finance-key`别名关联的任何 KMS 密钥调用该[GenerateDataKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKey.html)操作。（受影响的 KMS 密钥的密钥策略还必须允许委托人的账户将它们用于此操作。） 为了指示条件在可能与 KMS 密钥关联的很多别名中的一个为 `alias/finance-key` 时得到满足，条件使用 `ForAnyValue` 集合运算符。

由于 `kms:ResourceAliases` 条件基于资源，而不是请求，因此对于与 `finance-key` 别名关联的任何 KMS 密钥，对 `GenerateDataKey` 的调用将会成功，即使请求使用[密钥 ID](concepts.md#key-id-key-id) 或[密钥 ARN](concepts.md#key-id-key-ARN) 来标识 KMS 密钥。

```
{
  "Sid": "AliasBasedIAMPolicy",
  "Effect": "Allow",
  "Action": "kms:GenerateDataKey",
  "Resource": [
    "arn:aws:kms:*:111122223333:key/*",
    "arn:aws:kms:*:444455556666:key/*"
  ],
  "Condition": {
    "ForAnyValue:StringEquals": {
      "kms:ResourceAliases": "alias/finance-key"
    }
  }
}
```

以下示例 IAM policy 语句允许委托人启用和禁用 KMS 密钥，但仅当 KMS 密钥的所有别名都包含“`Test`”时。此策略语句使用两个条件。带有 `ForAllValues` 集合运算符的条件要求与 KMS 密钥关联的所有别名都包括“Test”。带有 `ForAnyValue` 集合运算符的条件要求 KMS 密钥至少具有一个带有“Test”的别名。如果不使用 `ForAnyValue` 条件，此策略语句将允许委托人使用没有别名的 KMS 密钥。

```
{
  "Sid": "AliasBasedIAMPolicy",
  "Effect": "Allow",
  "Action": [
    "kms:EnableKey",
    "kms:DisableKey"
  ],
  "Resource": "arn:aws:kms:*:111122223333:key/*",
  "Condition": {
    "ForAllValues:StringLike": {
      "kms:ResourceAliases": [
        "alias/*Test*"
      ]
    },
    "ForAnyValue:StringLike": {
      "kms:ResourceAliases": [
        "alias/*Test*"
      ]
    }
  }
}
```

## kms: ReplicaRegion



| Amazon KMS 条件键 | 条件类型 | 值类型 | API 操作 | 策略类型 | 
| --- | --- | --- | --- | --- | 
|  `kms:ReplicaRegion`  |  字符串（列表）  | 单值 |  `ReplicateKey`  |  密钥策略和 IAM policy  | 

您可以使用此条件密钥来限制委托人 Amazon Web Services 区域 可以复制[多区域密钥](multi-region-keys-overview.md)的范围。`kms:ReplicaRegion`条件键根据请求中[ReplicaRegion](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateGrant.html#KMS-CreateGrant-request-RetiringPrincipal)参数的值控制对[ReplicateKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateGrant.html)操作的访问权限。此参数为新的[副本密钥](multi-region-keys-overview.md#mrk-replica-key)指定 Amazon Web Services 区域 。

条件的值是一个或多个 Amazon Web Services 区域 名称，例如`us-east-1`或`ap-southeast-2`，或者名称模式，例如`eu-*`。有关 Amazon KMS 支持的名称列表 Amazon Web Services 区域 ，请参阅中的[Amazon Key Management Service 终端节点和配额](https://docs.amazonaws.cn/general/latest/gr/kms.html) Amazon Web Services 一般参考。

例如，以下密钥策略声明使用`kms:ReplicaRegion`条件密钥，仅当`ReplicaRegion`参数的值为指定区域之一时，委托人才能调用该[ReplicateKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_ReplicateKey.html)操作。

```
{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/Administrator"
  },
  "Action": "kms:ReplicateKey"
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "kms:ReplicaRegion": [ 
         "us-east-1",
         "eu-west-3",
         "ap-southeast-2"
      ]
    }
  }
}
```

此条件键仅控制对[ReplicateKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_ReplicateKey.html)操作的访问权限。要控制对[UpdatePrimaryRegion](https://docs.amazonaws.cn/kms/latest/APIReference/API_UpdatePrimaryRegion.html)操作的访问权限，请使用 k [ms: PrimaryRegion](#conditions-kms-primary-region) 条件密钥。

## kms: RetiringPrincipal



| Amazon KMS 条件键 | 条件类型 | 值类型 | API 操作 | 策略类型 | 
| --- | --- | --- | --- | --- | 
|  `kms:RetiringPrincipal`  |  字符串（列表）  | 单值 |  `CreateGrant`  |  密钥策略和 IAM policy  | 

您可以使用此条件键根据请求中[RetiringPrincipal](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateGrant.html#KMS-CreateGrant-request-RetiringPrincipal)参数的值来控制对[CreateGrant](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateGrant.html)操作的访问权限。例如，您可以仅在 `CreateGrant` 请求中的 `RetiringPrincipal` 与条件语句中的 `RetiringPrincipal` 匹配时，允许创建使用 KMS 密钥的授权。

要指定停用主体，请使用 Amazon 主体的 Amazon 资源名称（ARN）。有效的委托人包括 Amazon Web Services 账户 IAM 用户、IAM 角色、联合用户和代入角色用户。有关委托人的 ARN 语法的帮助，请参阅 [IAM 用户指南 ARNs](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_identifiers.html#identifiers-arns)*中的 IAM*。

以下示例密钥政策语句允许用户为 KMS 密钥创建授权。`kms:RetiringPrincipal` 条件键将权限限制为 `CreateGrant` 请求，其中授权的停用主体是 `LimitedAdminRole`。

```
{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/ExampleRole"
  },
  "Action": "kms:CreateGrant",
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "kms:RetiringPrincipal": "arn:aws:iam::111122223333:role/LimitedAdminRole"
    }
  }
}
```

**另请参阅**
+ [kms: GrantConstraintType](#conditions-kms-grant-constraint-type)
+ [kms: GrantIsFor AWSResource](#conditions-kms-grant-is-for-aws-resource)
+ [kms: GrantOperations](#conditions-kms-grant-operations)
+ [kms: GranteePrincipal](#conditions-kms-grantee-principal)

## kms: RotationPeriodInDays



| Amazon KMS 条件键 | 条件类型 | 值类型 | API 操作 | 策略类型 | 
| --- | --- | --- | --- | --- | 
|  `kms:RotationPeriodInDays`  |  数值  | 单值 |  `EnableKeyRotation`  |  密钥策略和 IAM policy  | 

您可以使用此条件键来限制委托人可以在[EnableKeyRotation](https://docs.amazonaws.cn/kms/latest/APIReference/API_EnableKeyRotation.html)请求`RotationPeriodInDays`参数中指定的值。

`RotationPeriodInDays`指定每个自动密钥轮换日期之间的天数。 Amazon KMS 允许您指定介于 90 到 2560 天之间的轮换周期，但您可以使用`kms:RotationPeriodInDays`条件键进一步限制轮换周期，例如在有效范围内强制规定最短轮换周期。

例如，以下密钥政策语句使用 `kms:RotationPeriodInDays` 条件键，以防止主体在轮换时间小于或等于 180 天时启用密钥轮换。

```
{
  "Effect": "Deny",
  "Action": "kms:EnableKeyRotation",
  "Principal": "*",
  "Resource": "*",
  "Condition" : {
      "NumericLessThanEquals" : {
        "kms:RotationPeriodInDays" : "180"
      }
  }
}
```

## kms: ScheduleKeyDeletionPendingWindowInDays



| Amazon KMS 条件键 | 条件类型 | 值类型 | API 操作 | 策略类型 | 
| --- | --- | --- | --- | --- | 
|  `kms:ScheduleKeyDeletionPendingWindowInDays`  |  数值  | 单值 |  `ScheduleKeyDeletion`  |  密钥策略和 IAM policy  | 

您可以使用此条件键来限制委托人可以在[ScheduleKeyDeletion](https://docs.amazonaws.cn/kms/latest/APIReference/API_ScheduleKeyDeletion.html)请求`PendingWindowInDays`参数中指定的值。

`PendingWindowInDays`指定删除密钥之前等待 Amazon KMS 的天数。 Amazon KMS 允许您指定 7 到 30 天之间的等待期，但您可以使用`kms:ScheduleKeyDeletionPendingWindowInDays`条件键进一步限制等待时间，例如在有效范围内强制规定最短等待时间。

例如，以下密钥政策语句使用 `kms:ScheduleKeyDeletionPendingWindowInDays` 条件键，以防止主体安排在等待时间小于或等于 21 天时删除密钥。

```
{
  "Effect": "Deny",
  "Action": "kms:ScheduleKeyDeletion",
  "Principal": "*",
  "Resource": "*",
  "Condition" : {
      "NumericLessThanEquals" : {
        "kms:ScheduleKeyDeletionPendingWindowInDays" : "21"
      }
  }
}
```

## kms: SigningAlgorithm



| Amazon KMS 条件键 | 条件类型 | 值类型 | API 操作 | 策略类型 | 
| --- | --- | --- | --- | --- | 
|  `kms:SigningAlgorithm`  |  字符串  | 单值 |  `Sign`  `Verify`  |  密钥策略和 IAM policy  | 

您可以使用`kms:SigningAlgorithm`条件键根据请求中[SigningAlgorithm](https://docs.amazonaws.cn/kms/latest/APIReference/API_Sign.html#KMS-Sign-request-SigningAlgorithm)参数的值来控制对 “[签名](https://docs.amazonaws.cn/kms/latest/APIReference/API_Sign.html)” 和 “[验证](https://docs.amazonaws.cn/kms/latest/APIReference/API_Verify.html)” 操作的访问权限。此条件密钥对以外执行的操作没有影响 Amazon KMS，例如使用外部非对称 KMS 密钥对中的公钥验证签名。 Amazon KMS

以下示例密钥策略允许可担任 `testers` 角色的用户，仅当用于请求的签名算法为 RSASSA\$1PSS 算法（如 `RSASSA_PSS_SHA512`）时，才能使用 KMS 密钥签署消息。

```
{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/testers"
  },
  "Action": "kms:Sign",
  "Resource": "*",
  "Condition": {
    "StringLike": {
      "kms:SigningAlgorithm": "RSASSA_PSS*"
    }
  }
}
```

**另请参阅**
+ [kms: EncryptionAlgorithm](#conditions-kms-encryption-algorithm)
+ [kms: MacAlgorithm](#conditions-kms-mac-algorithm)
+ [kms: MessageType](#conditions-kms-message-type)

## kms: ValidTo



| Amazon KMS 条件键 | 条件类型 | 值类型 | API 操作 | 策略类型 | 
| --- | --- | --- | --- | --- | 
|  `kms:ValidTo`  |  Timestamp  | 单值 |  `ImportKeyMaterial`  |  密钥策略和 IAM policy  | 

`kms:ValidTo`条件密钥根据请求中[ValidTo](https://docs.amazonaws.cn/kms/latest/APIReference/API_ImportKeyMaterial.html#KMS-ImportKeyMaterial-request-ValidTo)参数的值控制对[ImportKeyMaterial](https://docs.amazonaws.cn/kms/latest/APIReference/API_ImportKeyMaterial.html)操作的访问权限，该值决定了导入的密钥材料何时过期。此值用 [Unix 时间](https://en.wikipedia.org/wiki/Unix_time)表示。

默认情况下，`ImportKeyMaterial` 请求中需要 `ValidTo` 参数。但是，如果[ExpirationModel](https://docs.amazonaws.cn/kms/latest/APIReference/API_ImportKeyMaterial.html#KMS-ImportKeyMaterial-request-ExpirationModel)参数的值为`KEY_MATERIAL_DOES_NOT_EXPIRE`，则该`ValidTo`参数无效。您也可以使用 k [ms: ExpirationModel](#conditions-kms-expiration-model) 条件键来要求`ExpirationModel`参数或特定的参数值。

以下示例策略语句允许用户在 KMS 密钥中导入密钥材料。`kms:ValidTo` 条件键将权限限制为 `ImportKeyMaterial` 请求，其中 `ValidTo` 值小于或等于 `1546257599.0`（2018 年 12 月 31 日晚上 11:59:59）。

```
{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/ExampleRole"
  },
  "Action": "kms:ImportKeyMaterial",
  "Resource": "*",
  "Condition": {
    "NumericLessThanEquals": {
      "kms:ValidTo": "1546257599.0"
    }
  }
}
```

**另请参阅**
+ [kms: ExpirationModel](#conditions-kms-expiration-model) 
+ [kms: WrappingAlgorithm](#conditions-kms-wrapping-algorithm)
+ [kms: WrappingKeySpec](#conditions-kms-wrapping-key-spec)

## kms: ViaService



| Amazon KMS 条件键 | 条件类型 | 值类型 | API 操作 | 策略类型 | 
| --- | --- | --- | --- | --- | 
|  `kms:ViaService`  |  字符串  | 单值 |  KMS 密钥资源操作  |  密钥策略和 IAM policy  | 

`kms:ViaService`条件密钥将 KMS 密钥的使用限制为来自指定的请求 Amazon Web Services 服务。此条件密钥仅适用于[转发访问会话](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_forward_access_sessions.html)。您可以在每个 `kms:ViaService` 条件键中指定一个或多个服务。该操作必须是 *KMS 密钥资源操作*，即为特定 KMS 密钥授权的操作。若要标识 KMS 密钥资源操作，请在[操作和资源表](kms-api-permissions-reference.md#kms-api-permissions-reference-table)中，在操作的 `Resources` 列中查找的 `KMS key` 的值。

例如，以下密钥策略语句使用 `kms:ViaService` 条件键以允许仅在请求来自于美国西部（俄勒冈）区域的 Amazon EC2 或 Amazon RDS 时代表 `ExampleRole` 将[客户托管密钥](concepts.md#customer-mgn-key)用于指定操作。

```
{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/ExampleRole"
  },
  "Action": [
    "kms:Encrypt",
    "kms:Decrypt",
    "kms:ReEncrypt*",
    "kms:GenerateDataKey*",
    "kms:CreateGrant",
    "kms:ListGrants",
    "kms:DescribeKey"
  ],
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "kms:ViaService": [
        "ec2.us-west-2.amazonaws.com",
        "rds.us-west-2.amazonaws.com"
      ]
    }
  }
}
```

您也可以使用 `kms:ViaService` 条件键以在请求来自特定服务时拒绝使用 KMS 密钥的权限。例如，密钥策略中的以下策略语句使用 `kms:ViaService` 条件键以防止在代表 `ExampleRole` 发出来自 Amazon Lambda 的请求时将客户托管密钥用于 `Encrypt` 操作。

```
{
  "Effect": "Deny",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/ExampleRole"
  },
  "Action": [
    "kms:Encrypt"    
  ],
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "kms:ViaService": [
          "lambda.us-west-2.amazonaws.com"
      ]
    }
  }
}
```

**重要**  
在使用 `kms:ViaService` 条件键时，服务代表 Amazon Web Services 账户中的委托人发出请求。这些委托人必须具有以下权限：  
使用 KMS 密钥的权限。委托人需要向集成服务授予这些权限，这样此服务才能代表委托人使用客户托管的密钥。有关更多信息，请参阅 [对 Amazon 服务使用 Amazon KMS 加密](service-integration.md)。
使用集成服务的权限。有关向用户提供与集成的 Amazon 服务的访问权限的详细信息 Amazon KMS，请参阅集成服务的文档。

所有 [Amazon 托管式密钥](concepts.md#aws-managed-key) 都使用其密钥策略文档中的 `kms:ViaService` 条件键。此条件允许 KMS 密钥仅用于来自创建 KMS 密钥的服务的请求。要查看的密钥策略 Amazon 托管式密钥，请使用[GetKeyPolicy](https://docs.amazonaws.cn/kms/latest/APIReference/API_GetKeyPolicy.html)操作。

`kms:ViaService` 条件键在 IAM 和密钥策略语句中有效。您指定的服务必须[与 Amazon KMS集成](https://www.amazonaws.cn/kms/features/#AWS_Service_Integration)并支持 `kms:ViaService` 条件键。

### 支持 `kms:ViaService` 条件键的服务


下表列出了 Amazon 与客户托管密钥集成 Amazon KMS 并支持在客户托管密钥中使用`kms:ViaService`条件密钥的服务。此表中的服务可能并非在所有地区都可用。在所有 Amazon 分区中使用 Amazon KMS ViaService 名称的`.amazonaws.com`后缀。

**注意**  
您可能需要水平或垂直滚动才能查看此表中的所有数据。


| 服务名称 | Amazon KMS ViaService 名字 | 
| --- | --- | 
| Amazon AI 操作 | aiops.AWS\$1region.amazonaws.com | 
| Amazon App Runner | apprunner.AWS\$1region.amazonaws.com | 
| Amazon AppFabric | appfabric.AWS\$1region.amazonaws.com | 
| Amazon AppFlow | appflow.AWS\$1region.amazonaws.com | 
| Amazon Application Migration Service | mgn.AWS\$1region.amazonaws.com | 
| Amazon Athena | athena.AWS\$1region.amazonaws.com | 
| Amazon Audit Manager | auditmanager.AWS\$1region.amazonaws.com | 
| Amazon Aurora | rds.AWS\$1region.amazonaws.com | 
| Amazon Backup | backup.AWS\$1region.amazonaws.com | 
| Amazon Backup 网关 | backup-gateway.AWS\$1region.amazonaws.com | 
| Amazon Bedrock Model Copy | bedrock.AWS\$1region.amazonaws.com | 
| Amazon Chime SDK | chimevoiceconnector.AWS\$1region.amazonaws.com | 
| Amazon Clean Rooms ML | cleanrooms-ml.AWS\$1region.amazonaws.com | 
| Amazon CodeArtifact | codeartifact.AWS\$1region.amazonaws.com | 
| Amazon CodeGuru Reviewer | codeguru-reviewer.AWS\$1region.amazonaws.com | 
| Amazon Comprehend | comprehend.AWS\$1region.amazonaws.com | 
| Amazon Connect | connect.AWS\$1region.amazonaws.com | 
| Amazon Connect Customer Profiles | profile.AWS\$1region.amazonaws.com | 
| Amazon Q in Connect | wisdom.AWS\$1region.amazonaws.com | 
| Amazon Database Migration Service (Amazon DMS) | dms.AWS\$1region.amazonaws.com | 
| Amazon DeepRacer | deepracer.AWS\$1region.amazonaws.com | 
| Amazon Directory Service | directoryservice.AWS\$1region.amazonaws.com | 
| Amazon DocumentDB | docdb-elastic.AWS\$1region.amazonaws.com | 
| Amazon DynamoDB | dynamodb.AWS\$1region.amazonaws.com | 
| Amazon EC2 Systems Manager (SSM) | ssm.AWS\$1region.amazonaws.com | 
| Amazon Elastic Block Store (Amazon EBS) | ec2.AWS\$1region.amazonaws.com（仅限 EBS） | 
| Amazon Elastic Container Registry (Amazon ECR) | ecr.AWS\$1region.amazonaws.com | 
| Amazon Elastic File System (Amazon EFS) | elasticfilesystem.AWS\$1region.amazonaws.com | 
| Amazon ElastiCache |  在条件键值中包含两个 ViaService 名称： [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/kms/latest/developerguide/conditions-kms.html)  | 
| AWS Elemental MediaTailor | mediatailor.AWS\$1region.amazonaws.com | 
| Amazon 实体分辨率 | entityresolution.AWS\$1region.amazonaws.com | 
| Amazon EventBridge | events.AWS\$1region.amazonaws.com | 
| Amazon FinSpace | finspace.AWS\$1region.amazonaws.com | 
| Amazon Forecast | forecast.AWS\$1region.amazonaws.com | 
| Amazon FSx | fsx.AWS\$1region.amazonaws.com | 
| Amazon Glue | glue.AWS\$1region.amazonaws.com | 
| Amazon Ground Station | groundstation.AWS\$1region.amazonaws.com | 
| Amazon GuardDuty | malware-protection.AWS\$1region.amazonaws.com | 
| Amazon HealthLake | healthlake.AWS\$1region.amazonaws.com | 
| Amazon IoT SiteWise | iotsitewise.AWS\$1region.amazonaws.com | 
| Amazon Kendra | kendra.AWS\$1region.amazonaws.com | 
| Amazon Keyspaces (for Apache Cassandra) | cassandra.AWS\$1region.amazonaws.com | 
| Amazon Kinesis | kinesis.AWS\$1region.amazonaws.com | 
| Amazon Data Firehose | firehose.AWS\$1region.amazonaws.com | 
| Amazon Kinesis Video Streams | kinesisvideo.AWS\$1region.amazonaws.com | 
| Amazon Lambda | lambda.AWS\$1region.amazonaws.com | 
| Amazon Lex | lex.AWS\$1region.amazonaws.com | 
| Amazon License Manager | license-manager.AWS\$1region.amazonaws.com | 
| Amazon Location Service | geo.AWS\$1region.amazonaws.com | 
| Amazon Lookout for Equipment | lookoutequipment.AWS\$1region.amazonaws.com | 
| Amazon Lookout for Metrics | lookoutmetrics.AWS\$1region.amazonaws.com | 
| Amazon Lookout for Vision | lookoutvision.AWS\$1region.amazonaws.com | 
| Amazon Macie | macie.AWS\$1region.amazonaws.com | 
| Amazon Mainframe Modernization | m2.AWS\$1region.amazonaws.com | 
| Amazon Mainframe Modernization 应用程序测试 | apptest.AWS\$1region.amazonaws.com | 
| Amazon Managed Blockchain | managedblockchain.AWS\$1region.amazonaws.com | 
| Amazon Managed Streaming for Apache Kafka (Amazon MSK) | kafka.AWS\$1region.amazonaws.com | 
| Amazon Managed Workflows for Apache Airflow (MWAA) | airflow.AWS\$1region.amazonaws.com | 
| Amazon MemoryDB | memorydb.AWS\$1region.amazonaws.com | 
| Amazon Monitron | monitron.AWS\$1region.amazonaws.com | 
| Amazon MQ | mq.AWS\$1region.amazonaws.com | 
| Amazon Neptune | rds.AWS\$1region.amazonaws.com | 
| Amazon Nimble Studio | nimble.AWS\$1region.amazonaws.com | 
| Amazon HealthOmics | omics.AWS\$1region.amazonaws.com | 
| 亚马逊 OpenSearch 服务 | es.AWS\$1region.amazonaws.com, aoss.AWS\$1region.amazonaws.com | 
| 亚马逊 OpenSearch 定制套餐 | custom-packages.AWS\$1region.amazonaws.com | 
| Amazon Proton | proton.AWS\$1region.amazonaws.com | 
| Amazon Quantum Ledger Database (Amazon QLDB) | qldb.AWS\$1region.amazonaws.com | 
| Amazon RDS 性能详情 | rds.AWS\$1region.amazonaws.com | 
| Amazon Redshift | redshift.AWS\$1region.amazonaws.com | 
| Amazon Redshift 查询编辑器 V2 | sqlworkbench.AWS\$1region.amazonaws.com | 
| Amazon Redshift Serverless | redshift-serverless.AWS\$1region.amazonaws.com | 
| Amazon Rekognition | rekognition.AWS\$1region.amazonaws.com | 
| Amazon Relational Database Service (Amazon RDS) | rds.AWS\$1region.amazonaws.com | 
| Amazon 复制的数据存储 | ards.AWS\$1region.amazonaws.com | 
| 亚马逊 SageMaker AI | sagemaker.AWS\$1region.amazonaws.com | 
| Amazon Secrets Manager | secretsmanager.AWS\$1region.amazonaws.com | 
| Amazon Security Lake | securitylake.AWS\$1region.amazonaws.com | 
| Amazon Simple Email Service (Amazon SES) | ses.AWS\$1region.amazonaws.com | 
| Amazon Simple Notification Service (Amazon SNS) | sns.AWS\$1region.amazonaws.com | 
| Amazon Simple Queue Service (Amazon SQS) | sqs.AWS\$1region.amazonaws.com | 
| Amazon Simple Storage Service（Amazon S3） | s3.AWS\$1region.amazonaws.com | 
| Amazon S3 表 | s3tables.AWS\$1region.amazonaws.com | 
| Amazon Snowball Edge | importexport.AWS\$1region.amazonaws.com | 
| Amazon Step Functions | states.AWS\$1region.amazonaws.com | 
| Amazon Storage Gateway | storagegateway.AWS\$1region.amazonaws.com | 
| Amazon Systems Manager Incident Manager | ssm-incidents.AWS\$1region.amazonaws.com | 
| Amazon Systems Manager Incident Manager 联系人 | ssm-contacts.AWS\$1region.amazonaws.com | 
| Amazon Timestream | timestream.AWS\$1region.amazonaws.com | 
| Amazon Translate | translate.AWS\$1region.amazonaws.com | 
| Amazon Verified Access | verified-access.AWS\$1region.amazonaws.com | 
| Amazon WorkMail | workmail.AWS\$1region.amazonaws.com | 
| Amazon WorkSpaces | workspaces.AWS\$1region.amazonaws.com | 
| Amazon WorkSpaces 瘦客户机 | thinclient.AWS\$1region.amazonaws.com | 
| Amazon WorkSpaces Web | workspaces-web.AWS\$1region.amazonaws.com | 
| Amazon X-Ray | xray.AWS\$1region.amazonaws.com | 

## kms: WrappingAlgorithm



| Amazon KMS 条件键 | 条件类型 | 值类型 | API 操作 | 策略类型 | 
| --- | --- | --- | --- | --- | 
|  `kms:WrappingAlgorithm`  |  字符串  | 单值 |  `GetParametersForImport`  |  密钥策略和 IAM policy  | 

此条件键根据请求中[WrappingAlgorithm](https://docs.amazonaws.cn/kms/latest/APIReference/API_GetParametersForImport.html#KMS-GetParametersForImport-request-WrappingAlgorithm)参数的值控制对[GetParametersForImport](https://docs.amazonaws.cn/kms/latest/APIReference/API_GetParametersForImport.html)操作的访问权限。您可以使用此条件要求委托人在导入过程中使用特定算法来加密密钥材料。当对所需公有密钥和导入令牌的请求指定不同的包装算法时，它们会失败。

以下示例密钥策略语句使用 `kms:WrappingAlgorithm` 条件键为示例用户提供调用 `GetParametersForImport` 操作的权限，但阻止他们使用 `RSAES_OAEP_SHA_1` 包装算法。当 `GetParametersForImport` 请求中的 `WrappingAlgorithm` 是 `RSAES_OAEP_SHA_1` 时，操作会失败。

```
{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/ExampleRole"
  },
  "Action": "kms:GetParametersForImport",
  "Resource": "*",
  "Condition": {
    "StringNotEquals": {
      "kms:WrappingAlgorithm": "RSAES_OAEP_SHA_1"
    }
  }
}
```

**另请参阅**
+ [kms: ExpirationModel](#conditions-kms-expiration-model)
+ [kms: ValidTo](#conditions-kms-valid-to)
+ [kms: WrappingKeySpec](#conditions-kms-wrapping-key-spec)

## kms: WrappingKeySpec



| Amazon KMS 条件键 | 条件类型 | 值类型 | API 操作 | 策略类型 | 
| --- | --- | --- | --- | --- | 
|  `kms:WrappingKeySpec`  |  字符串  | 单值 |  `GetParametersForImport`  |  密钥策略和 IAM policy  | 

此条件键根据请求中[WrappingKeySpec](https://docs.amazonaws.cn/kms/latest/APIReference/API_GetParametersForImport.html#KMS-GetParametersForImport-request-WrappingKeySpec)参数的值控制对[GetParametersForImport](https://docs.amazonaws.cn/kms/latest/APIReference/API_GetParametersForImport.html)操作的访问权限。您可以使用此条件，要求委托人在导入过程中使用特定的公有密钥类型。如果请求指定了不同密钥类型，它会失败。

由于 `WrappingKeySpec` 参数值的唯一有效值为 `RSA_2048`，阻止用户使用此值将有效阻止它们使用 `GetParametersForImport` 操作。

以下示例策略语句使用 `kms:WrappingAlgorithm` 条件键要求请求中的 `WrappingKeySpec` 为 `RSA_4096`。

```
{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/ExampleRole"
  },
  "Action": "kms:GetParametersForImport",
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "kms:WrappingKeySpec": "RSA_4096"
    }
  }
}
```

**另请参阅**
+ [kms: ExpirationModel](#conditions-kms-expiration-model)
+ [kms: ValidTo](#conditions-kms-valid-to)
+ [kms: WrappingAlgorithm](#conditions-kms-wrapping-algorithm)

# Amazon KMS 经过验证的平台的条件密钥


Amazon KMS 提供条件密钥以支持 Nitro Enclaves 和 [Amazon Nitro](https://docs.amazonaws.cn/enclaves/latest/user/) TPM 的加密认证。 Amazon Nitro Enclaves 是 Amazon EC2 的一项功能，它允许您创建称为[飞](https://docs.amazonaws.cn/enclaves/latest/user/nitro-enclave-concepts.html#term-enclave)地的隔离计算环境，以保护和处理高度敏感的数据。NitroTPM 将类似的认证功能扩展到 EC2 实例。

当您使用已签名的证明文档调用 [Decrypt [DeriveSharedSecret[GenerateDataKey[GenerateDataKeyPair](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKeyPair.html)](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKey.html)](https://docs.amazonaws.cn/kms/latest/APIReference/API_DeriveSharedSecret)](https://docs.amazonaws.cn/kms/latest/APIReference/API_Decrypt.html)、、、或 [GenerateRandom](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateRandom.html)API 操作时，这些操作会使用认证文档中的公钥对响应中的明文 APIs 进行加密，并返回密文而不是纯文本。此加密文字只能使用 Enclave 中的私有密钥进行解密。有关更多信息，请参阅 [中的加密认证支持 Amazon KMS](cryptographic-attestation.md)。

**注意**  
如果您在创建密钥时未提供密钥策略，请为您 Amazon 创建一个 Amazon KMS 密钥策略。此[默认密钥策略](key-policy-default.md)将为拥有 KMS 密钥的 Amazon Web Services 账户 授予对该密钥的完全访问权限，并允许该账户使用 IAM 策略来允许访问该密钥。该策略将允许所有操作，例如 [Decrypt](https://docs.amazonaws.cn/kms/latest/APIReference/API_Decrypt.html)。 Amazon 建议将 [最低权限许可](least-privilege.md) 的主体应用于您的 KMS 密钥策略。您也可以通过[将 KMS 密钥策略](key-policy-modifying.md)操作 `kms:*` 修改为 `[NotAction:](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_notaction.html)kms:Decrypt`，从而限制访问权限。

通过以下条件键，您可以根据签名证明文档的内容限制这些操作的权限。在允许操作之前，请将证明文档与这些 Amazon KMS 条件键中的值进行 Amazon KMS 比较。

# Nitro Enclaves 的条件键


以下条件键是特定于 Nitro Enclaves 认证：

## kms:RecipientAttestation: ImageSha 384



| Amazon KMS 条件密钥 | 条件类型 | 值类型 | API 操作 | 策略类型 | 
| --- | --- | --- | --- | --- | 
|  `kms:RecipientAttestation:ImageSha384`  |  字符串  | 单值 |  `Decrypt` `DeriveSharedSecret` `GenerateDataKey` `GenerateDataKeyPair` `GenerateRandom`  |  密钥策略和 IAM policy  | 

当请求中的已签名证明文档中的映像摘要与条件键中的值相匹配时，`kms:RecipientAttestation:ImageSha384` 条件键使用 KMS 密钥控制对 `Decrypt`、`DeriveSharedSecret`、`GenerateDataKey`、`GenerateDataKeyPair` 和 `GenerateRandom` 的访问。该`ImageSha384`值对应于证明文档 PCR0 中的值。仅当请求中的`Recipient`参数为 Amazon Nitro 飞地指定了已签名的认证文档时，此条件密钥才有效。

此值也包含在请求获得 Nitro 飞地[CloudTrail Amazon KMS 的事件](ct-nitro-enclave.md)中。

例如，以下密钥策略声明允许该`data-processing`角色使用 KMS 密钥进行[解密](https://docs.amazonaws.cn/kms/latest/APIReference/API_Decrypt.html)、、[DeriveSharedSecret[GenerateDataKey[GenerateDataKeyPair](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKeyPair.html)](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKey.html)](https://docs.amazonaws.cn/kms/latest/APIReference/API_DeriveSharedSecret)、和[GenerateRandom](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateRandom.html)操作。只有当请求中证明文档的图像摘要值 (PCR0) 与`kms:RecipientAttestation:ImageSha384`条件中的图像摘要值匹配时，条件键才允许进行操作。仅当请求中的`Recipient`参数为 Amazon Nitro 飞地指定了已签名的认证文档时，此条件密钥才有效。

如果请求中不包括来自 Amazon Nitro 飞地的有效证明文件，则会因为不满足此条件而拒绝许可。

```
{
  "Sid" : "Enable enclave data processing",
  "Effect" : "Allow",
  "Principal" : {
    "AWS" : "arn:aws:iam::111122223333:role/data-processing"
  },
  "Action": [
    "kms:Decrypt",
    "kms:DeriveSharedSecret",
    "kms:GenerateDataKey",
    "kms:GenerateDataKeyPair",
    "kms:GenerateRandom"
  ],
  "Resource" : "*",
  "Condition": {
    "StringEqualsIgnoreCase": {
      "kms:RecipientAttestation:ImageSha384": "9fedcba8abcdef7abcdef6abcdef5abcdef4abcdef3abcdef2abcdef1abcdef1abcdef0abcdef1abcdef2abcdef3abcdef4abcdef5abcdef6abcdef7abcdef99"
    }
  }
}
```

## kms:: PCR RecipientAttestation <PCR\$1ID>



| Amazon KMS 条件密钥 | 条件类型 | 值类型 | API 操作 | 策略类型 | 
| --- | --- | --- | --- | --- | 
|  `kms:RecipientAttestation:PCR<PCR_ID>`  |  字符串  | 单值 |  `Decrypt` `DeriveSharedSecret` `GenerateDataKey` `GenerateDataKeyPair` `GenerateRandom`  |  密钥策略和 IAM policy  | 

只有当平台配置从请求中的已签名证明文档中注册的 (PCRs) `GenerateRandom` 与`kms:RecipientAttestation:PCR<PCR_ID>`条件密钥中的匹配时，条件密钥才使用KMS密钥控制对、、、和 PCRs 的访问。`Decrypt` `DeriveSharedSecret` `GenerateDataKey` `GenerateDataKeyPair`仅当请求中的`Recipient`参数指定来自 Amazon Nitro 飞地的已签名认证文档时，此条件密钥才有效。

此值也包含在代表对 Nitro 飞地 Amazon KMS 的请求[CloudTrail的事件](ct-nitro-enclave.md)中。

要指定 PCR 值，请使用以下格式。将 PCR ID 连接到条件键名称。您可以指定标识[六个飞地指标](https://docs.amazonaws.cn/enclaves/latest/user/set-up-attestation.html#where)之一的 PCR ID，也可以指定您为特定使用案例定义的自定义 PCR ID。PCR 值必须是最多 96 个字节的小写十六进制字符串。

```
"kms:RecipientAttestation:PCRPCR_ID": "PCR_value"
```

例如，以下条件键为指定了一个特定的值 PCR1，该值对应于用于安全区和引导过程的内核哈希值。

```
kms:RecipientAttestation:PCR1: "abc1abcdef2abcdef3abcdef4abcdef5abcdef6abcdef7abcdef8abcdef9abcdef8abcdef7abcdef6abcdef5abcdef4abcdef3abcdef2abcdef1abcdef0abcde"
```

以下示例密钥政策语句允许 `data-processing` 角色将 KMS 密钥用于 [Decrypt](https://docs.amazonaws.cn/kms/latest/APIReference/API_Decrypt.html) 操作。

只有当请求中已签名的证明文档中的值与`kms:RecipientAttestation:PCR`条件中的 PCR1 `kms:RecipientAttestation:PCR1`值相匹配时，此语句中的条件键才允许该操作。使用 `StringEqualsIgnoreCase` 策略运算符来要求对 PCR 值进行不区分大小写的比较。

如果请求不包含证明文档，则权限将被拒绝，因为不满足此条件。

```
{
  "Sid" : "Enable enclave data processing",
  "Effect" : "Allow",
  "Principal" : {
    "AWS" : "arn:aws:iam::111122223333:role/data-processing"
  },
  "Action": "kms:Decrypt",
  "Resource" : "*",
  "Condition": {
    "StringEqualsIgnoreCase": {
      "kms:RecipientAttestation:PCR1": "abc1de4f2dcf774f6e3b679f62e5f120065b2e408dcea327bd1c9dddaea6664e7af7935581474844767453082c6f1586116376cede396a30a39a611b9aad7966c87"
    }
  }
}
```

# NitroTPM 的条件键


以下条件键是特定于 NitroTPM 认证：

## kms:: RecipientAttestation nitrotpmPCR <PCR\$1ID>



| Amazon KMS 条件密钥 | 条件类型 | 值类型 | API 操作 | 策略类型 | 
| --- | --- | --- | --- | --- | 
|  `kms:RecipientAttestation:NitroTPMPCR<PCR_ID>`  |  字符串  | 单值 |  `Decrypt` `DeriveSharedSecret` `GenerateDataKey` `GenerateDataKeyPair` `GenerateRandom`  |  密钥策略和 IAM policy  | 

只有当平台配置从请求中的已签名证明文档中注册的 (PCRs) `GenerateRandom` 与`kms:RecipientAttestation:NitroTPMPCR<PCR_ID>`条件密钥中的匹配时，条件密钥才使用KMS密钥控制对、、、和 PCRs 的访问。`Decrypt` `DeriveSharedSecret` `GenerateDataKey` `GenerateDataKeyPair`仅当请求中的 `Recipient` 参数指定来自 NitroTPM 的已签名认证文档时，该条件键才有效。

此值也包含在代表对 NitrotPM Amazon KMS 的请求[CloudTrail的事件](ct-nitro-tpm.md)中。

要指定 PCR 值，请使用以下格式。将 PCR ID 连接到条件键名称。PCR 值必须是最多 96 个字节的小写十六进制字符串。

```
"kms:RecipientAttestation:NitroTPMPCRPCR_ID": "PCR_value"
```

例如，以下条件键为指定了特定的值 PCR4：

```
kms:RecipientAttestation:NitroTPMPCR4: "abc1abcdef2abcdef3abcdef4abcdef5abcdef6abcdef7abcdef8abcdef9abcdef8abcdef7abcdef6abcdef5abcdef4abcdef3abcdef2abcdef1abcdef0abcde"
```

以下示例密钥政策语句允许 `data-processing` 角色将 KMS 密钥用于 [Decrypt](https://docs.amazonaws.cn/kms/latest/APIReference/API_Decrypt.html) 操作。

只有当请求中已签名的证明文档中的值与`kms:RecipientAttestation:NitroTPMPCR`条件中的 PCR4 `kms:RecipientAttestation:NitroTPMPCR4`值相匹配时，此语句中的条件键才允许该操作。使用 `StringEqualsIgnoreCase` 策略运算符来要求对 PCR 值进行不区分大小写的比较。

如果请求不包含证明文档，则权限将被拒绝，因为不满足此条件。

```
{
  "Sid" : "Enable NitroTPM data processing",
  "Effect" : "Allow",
  "Principal" : {
    "AWS" : "arn:aws:iam::111122223333:role/data-processing"
  },
  "Action": "kms:Decrypt",
  "Resource" : "*",
  "Condition": {
    "StringEqualsIgnoreCase": {
      "kms:RecipientAttestation:NitroTPMPCR4": "abc1de4f2dcf774f6e3b679f62e5f120065b2e408dcea327bd1c9dddaea6664e7af7935581474844767453082c6f1586116376cede396a30a39a611b9aad7966c87"
    }
  }
}
```

# 最低权限许可


由于您的 KMS 密钥可以保护敏感信息，因此我们建议遵循最低权限访问原则。在定义密钥政策时，请委派执行任务所需的最低权限。仅当您计划使用其他 IAM 策略进一步限制权限时，才允许对 KMS 密钥政策执行所有操作 (`kms:*`)。如果您计划使用 IAM 策略管理权限，请限制哪些人员能够创建 IAM 策略并将其附加到 IAM 主体，以及[监控策略更改](https://docs.amazonaws.cn/awscloudtrail/latest/userguide/cloudwatch-alarms-for-cloudtrail.html#cloudwatch-alarms-for-cloudtrail-iam-policy-changes)。

如果您允许在密钥政策和 IAM 策略中执行所有操作 (`kms:*`)，则主体同时拥有 KMS 密钥的管理和使用权限。建议仅将这些权限委托给特定主体，这是最佳安全实践。您可以通过在密钥政策中明确指明主体，或通过限制 IAM 策略附加到哪些主体来实现。您也可以使用[条件键](policy-conditions.md)来限制权限。例如，如果进行 API 调用的主体具有条件规则中指定的标签，则可以使用 [https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-principaltag](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-principaltag) 来允许所有操作。

要帮助了解中如何评估策略声明 Amazon，请参阅 *IAM 用户指南*中的[策略评估逻辑](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_evaluation-logic.html)。我们建议您在撰写策略前先阅读此主题，减少策略产生意外影响的可能，例如向本不应该拥有访问权限的主体提供访问权限。

**提示**  
在非生产环境中测试应用程序时，请使用 [IAM Access Analyzer](https://www.amazonaws.cn/iam/features/analyze-access/) 来帮助您将最低权限应用于 IAM 策略。

如果您使用 IAM 用户而不是 IAM 角色，我们强烈建议您启用 Amazon [多因素身份验证](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_credentials_mfa.html) (MFA)，以缓解长期证书的漏洞。您可使用 MFA 执行以下操作：
+ 要求用户在执行特权操作（例如安排密钥删除）前先使用 MFA 验证其凭证。
+ 将管理员账户密码和 MFA 设备的所有权分配给不同个人，进行授权拆分。

**了解详情**
+ [Amazon 工作职能的托管策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_job-functions.html)
+ [用于编写最低权限 IAM 策略的方法](https://www.amazonaws.cn//blogs/security/techniques-for-writing-least-privilege-iam-policies/)

## 实施最低权限


当您向 Amazon 服务授予使用 KMS 密钥的权限时，请确保该权限仅对服务必须代表您访问的资源有效。这种最低权限策略有助于防止在 Amazon 服务之间传递请求时未经授权使用 KMS 密钥。

要实施最低权限策略，我们建议使用 Amazon KMS 加密上下文条件密钥和全局来源 ARN 或源账户条件密钥。

### 使用加密上下文条件键


在使用 Amazon KMS 资源时，实现最低特权权限的最有效方法是在允许委托人调用 Amazon KMS 加密操作的策略中包含[kms:EncryptionContext:*context-key*](conditions-kms.md#conditions-kms-encryption-context)或[kms:EncryptionContextKeys](conditions-kms.md#conditions-kms-encryption-context-keys)条件密钥。这些条件键特别有效，因为它们将权限与在加密资源时绑定到密文的[加密上下文](encrypt_context.md)相关联。

[仅当策略语句中的操作为或采用`EncryptionContext`参数的 Amazon KMS 对称加密操作（例如[CreateGrant](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateGrant.html)或 Decrypt 之类[GenerateDataKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKey.html)的操作）时，才使用加密上下文条件密钥。](https://docs.amazonaws.cn/kms/latest/APIReference/API_Decrypt.html)（有关支持的操作列表，请参阅 [kms:EncryptionContext:*context-key*](conditions-kms.md#conditions-kms-encryption-context) 或 [kms:EncryptionContextKeys](conditions-kms.md#conditions-kms-encryption-context-keys)）。如果您使用这些条件键来允许其他操作（例如）[DescribeKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_DescribeKey.html)，则权限将被拒绝。

将值设置为服务在加密资源时使用的加密上下文。此信息通常可在服务文档的“安全性”章节中找到。例如，[Amazon Proton 的加密上下文标识 P](https://docs.amazonaws.cn/proton/latest/adminguide/data-protection.html#encryption-context) Amazon roton 资源及其关联的模板。[Amazon Secrets Manager 加密上下文](https://docs.amazonaws.cn/secretsmanager/latest/userguide/security-encryption.html#security-encryption-encryption-context)标识密钥及其版本。[Amazon Location 的加密上下文](https://docs.amazonaws.cn/location/latest/developerguide/encryption-at-rest.html#location-encryption-context)标识跟踪器或集合。

以下示例是密钥策略语句允许 Amazon Location Service 代表授权用户创建授权。[本政策声明通过使用 k [ms: ViaService、kms:](conditions-kms.md#conditions-kms-via-service) 和`kms:EncryptionContext:context-key`条件密钥将权限绑定到特定的跟踪器资源来限制权限。CallerAccount](conditions-kms.md#conditions-kms-caller-account)

```
{
  "Sid": "Allow Amazon Location to create grants on behalf of authorized users",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/LocationTeam"
  },
  "Action": "kms:CreateGrant",
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "kms:ViaService": "geo.us-west-2.amazonaws.com",
      "kms:CallerAccount": "111122223333",
      "kms:EncryptionContext:aws:geo:arn": "arn:aws:geo:us-west-2:111122223333:tracker/SAMPLE-Tracker"
    }
  }
}
```

### 使用 `aws:SourceArn` 或 `aws:SourceAccount` 条件键


密钥策略语句中的主体是 [Amazon 服务主体](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_principal.html#principal-services)时，除了 `kms:EncryptionContext:context-key` 条件键外，我们强烈建议您使用 [https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) 或 [https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) 全局条件键。只有当请求 Amazon KMS 来自其他 Amazon 服务时，ARN 和账户值才会包含在授权上下文中。这种条件的组合实施最低权限，避免了潜在的[混淆代理情况](https://docs.amazonaws.cn/IAM/latest/UserGuide/confused-deputy.html)。在密钥策略中，服务委托人通常不用作委托人，但某些 Amazon 服务（例如）需要 Amazon CloudTrail它。

要使用 `aws:SourceArn` 或 `aws:SourceAccount` 全局条件键，将值设置为正在加密的资源的 Amazon Resource Name (ARN) 或账户。例如，在提供 Amazon CloudTrail 权限加密跟踪记录的密钥策略语句中，将 `aws:SourceArn` 的值设置为跟踪记录的 ARN。请尽可能使用更具体的 `aws:SourceArn`。将值设置为 ARN 或带通配符的 ARN 模式。如果您不知道资源的 ARN，请改用 `aws:SourceAccount`。

**注意**  
如果资源 ARN 包含 Amazon KMS 密钥策略中不允许的字符，则不能在条件密钥的值中使用该资源 ARN。`aws:SourceArn`改为使用 `aws:SourceAccount` 条件键。有关密钥策略文档规则的详细信息，请参阅 [密钥策略格式](key-policy-overview.md#key-policy-format)。

在以下示例密钥策略中，获得权限的主体是 Amazon CloudTrail 服务主体 `cloudtrail.amazonaws.com`。为实施最低权限，本策略使用 `aws:SourceArn` 和 `kms:EncryptionContext:context-key` 条件键。该策略声明 CloudTrail 允许使用 KMS 密[钥生成用于加密跟踪的数据](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKey.html)密钥。`aws:SourceArn` 和 `kms:EncryptionContext:context-key` 条件会得到独立评估。使用 KMS 密钥进行指定操作的任何请求都必须满足这两个条件。

为了限制服务对示例账户 (111122223333) 和 `us-west-2` 区域中 `finance` 跟踪记录的权限，此策略语句将 `aws:SourceArn` 条件键设置为特定跟踪记录的 ARN。条件语句使用[ArnEquals](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_ARN)运算符来确保在匹配时独立评估 ARN 中的每个元素。此示例还使用 `kms:EncryptionContext:context-key` 条件键来限制对特定账户和区域中跟踪记录的权限。

在使用此密钥策略之前，请将示例账户 ID、区域和跟踪记录名称替换为您账户中的有效值。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowCloudTrailToEncryptLogs",
      "Effect": "Allow",
      "Principal": {
        "Service": "cloudtrail.amazonaws.com"
      },
      "Action": "kms:GenerateDataKey",
      "Resource": "*",
      "Condition": {
        "ArnEquals": {
          "aws:SourceArn": [
            "arn:aws:cloudtrail:us-west-2:111122223333:trail/finance"
          ]
        },
        "StringLike": {
          "kms:EncryptionContext:aws:cloudtrail:arn": [
            "arn:aws:cloudtrail:*:111122223333:trail/*"
          ]
        }
      }
    }
  ]
}
```

------

# ABAC for Amazon KMS
基于属性的访问权限控制（ABAC）

基于属性的访问控制 (ABAC) 是一种基于属性定义权限的授权策略。 Amazon KMS 支持 ABAC，允许您根据与 KMS 密钥关联的标签和别名来控制对客户托管密钥的访问。启用 ABAC 的标签和别名条件密钥 Amazon KMS 提供了一种强大而灵活的方式来授权委托人使用 KMS 密钥，而无需编辑策略或管理授权。但是，您应该小心使用这些功能，以免委托人无意中允许或拒绝访问。

如果您使用 ABAC，请注意管理标签和别名的权限现在是访问控制权限。在部署依赖于标签或别名的策略之前，请确保您知道所有 KMS 密钥上的现有标签和别名。添加、删除和更新别名，以及标记和取消标记密钥时，采取合理的预防措施。仅授予需要管理标签和别名权限的委托人该权限，并限制他们可以管理的标签和别名。

**注意**  
使用 ABAC 时 Amazon KMS，请谨慎行事，不要授予委托人管理标签和别名的权限。更改标签或别名可以允许或拒绝对 KMS 密钥的权限。不具有更改密钥策略或创建授权权限的密钥管理员可以控制对 KMS 密钥的访问，前提是他们有权管理标签或别名。  
标签和别名的更改最多可能需要 5 分钟的时间才能影响 KMS 密钥授权。最近的更改可能会在 API 操作中显示，然后才会影响授权。  
要根据 KMS 密钥别名控制对它的访问权限，必须使用条件键。您不能使用别名来表示策略语句的 `Resource` 元素中的 KMS 密钥元素。当别名出现在 `Resource` 元素时，策略语句将应用于别名，而不是关联的 KMS 密钥。

**了解详情**
+ 有关 Amazon KMS 支持 ABAC 的详细信息（包括示例），请参阅[使用别名控制对 KMS 密钥的访问](alias-authorization.md)和。[使用标签控制对 KMS 密钥的访问](tag-authorization.md)
+ 有关使用标签控制 Amazon 资源访问的更多一般信息，请参阅 [ABAC 有什么用 Amazon](https://docs.amazonaws.cn/IAM/latest/UserGuide/introduction_attribute-based-access-control.html)？ 以及[使用 *IAM 用户指南*中的资源标签控制对资源的访问](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_tags.html)权限。 Amazon 

## ABAC 条件键适用于 Amazon KMS


要根据 KMS 密钥的标签和别名授权访问 KMS 密钥，请在密钥政策或 IAM policy 中使用以下条件键。


| ABAC 条件键 | 说明 | 策略类型 | Amazon KMS 操作 | 
| --- | --- | --- | --- | 
| [aws：ResourceTag](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag) | KMS 密钥上的标签（键和值）与策略中的标签（键和值）或标签模式匹配 | 仅限 IAM policy | KMS 密钥资源操作 2 | 
| [aws:RequestTag/*tag*-key](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag) | 请求中的标签（键和值）与策略中的标签（键和值）或标签模式匹配 | 密钥政策和 IAM policy 1 | [TagResource](https://docs.amazonaws.cn/kms/latest/APIReference/API_TagResource.html), [UntagResource](https://docs.amazonaws.cn/kms/latest/APIReference/API_UntagResource.html) | 
| [aws：TagKeys](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys) | 请求中的标签键与策略中的标签键匹配 | 密钥政策和 IAM policy 1 | [TagResource](https://docs.amazonaws.cn/kms/latest/APIReference/API_TagResource.html), [UntagResource](https://docs.amazonaws.cn/kms/latest/APIReference/API_UntagResource.html) | 
| [kms: ResourceAliases](conditions-kms.md#conditions-kms-resource-aliases) | 与 KMS 密钥关联的别名与策略中的别名或别名模式匹配 | 仅限 IAM policy | KMS 密钥资源操作 2 | 
| [kms: RequestAlias](conditions-kms.md#conditions-kms-request-alias) | 表示请求中的 KMS 密钥的别名与策略中的别名或别名模式匹配。 | 密钥政策和 IAM policy 1 | [加密操作](kms-cryptography.md#cryptographic-operations)，，[DescribeKey[GetPublicKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_GetPublicKey.html)](https://docs.amazonaws.cn/kms/latest/APIReference/API_DescribeKey.html) | 

1 任何可在密钥政策中使用的条件键也可以在 IAM policy 中使用，但只有在[密钥政策允许它](key-policy-default.md#key-policy-default-allow-root-enable-iam)时。

2 *KMS 密钥资源操作*是特定 KMS 密钥授权的操作。若要标识 KMS 密钥资源操作，请在 [Amazon KMS 权限表](kms-api-permissions-reference.md#kms-api-permissions-reference-table)中，在操作的 `Resources` 列中查找的 KMS 密钥的值。

例如，您可以使用这些条件键创建以下策略。
+ 具有 `kms:ResourceAliases` 的 IAM policy，可授予将 KMS 密钥与特定别名或别名模式结合使用的权限。这与依赖标签的策略略有不同：尽管您可以在策略中使用别名模式，但每个别名在 Amazon Web Services 账户 和区域中都必须是唯一的。这允许您对一组选定的 KMS 密钥应用策略，而无需在策略声明中列出 KMS 密钥 ARNs 的密钥。要从集中添加或删除 KMS 密钥，请更改 KMS 密钥的别名。
+ 带有 `kms:RequestAlias` 的密钥策略，可允许委托人在 `Encrypt` 操作中使用 KMS 密钥，但前提是仅当 `Encrypt` 请求使用该别名标识 KMS 密钥时。
+ 带有 `aws:ResourceTag/tag-key` 的 IAM policy，可拒绝将 KMS 密钥与特定标签键和标签值结合使用的权限。这使您可以将策略应用于一组选定的 KMS 密钥，而无需在策略声明中列出 KMS 密钥的密钥。 ARNs 要在集中添加或删除 KMS 密钥，请标记或取消标记 KMS 密钥。
+ 带有 `aws:RequestTag/tag-key` 的 IAM policy，可允许委托人仅删除 `"Purpose"="Test"` KMS 密钥标签。
+ 带有 `aws:TagKeys` 的 IAM policy，可拒绝使用 `Restricted` 标签键标记或取消标记 KMS 密钥的权限。

ABAC 使访问管理具有灵活性和可扩展性。例如，您可以使用 `aws:ResourceTag/tag-key` 条件键创建 IAM policy，该策略允许委托人仅在 KMS 密钥具有 `Purpose=Test` 标签时将 KMS 密钥用于特定操作。该策略适用于 Amazon Web Services 账户的所有区域中的所有 KMS 密钥。

当附加到用户或角色时，以下 IAM policy 允许委托人将带有 `Purpose=Test` 标签的所有现有 KMS 密钥用于指定操作。要提供对新的或现有 KMS 密钥的访问权限，您不需要更改策略。只需将 `Purpose=Test` 标签附加到 KMS 密钥。同样，要从具有 `Purpose=Test` 标签的 KMS 密钥中删除此访问权限，请编辑或删除标签。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AliasBasedIAMPolicy",
      "Effect": "Allow",
      "Action": [
        "kms:Decrypt",
        "kms:Encrypt",
        "kms:GenerateDataKey*",
        "kms:DescribeKey"
      ],
      "Resource": "arn:aws:kms:*:111122223333:key/*",
      "Condition": {
        "StringEquals": {
          "aws:ResourceTag/Purpose": "Test"
        }
      }
    }
  ]
}
```

------

但是，如果您使用此功能，在管理标记和别名时要加小心。添加、更改或删除标签或别名可能会无意中允许或拒绝对 KMS 密钥的访问。不具有更改密钥策略或创建授权权限的密钥管理员可以控制对 KMS 密钥的访问，前提是他们有权管理标签和别名。为了减轻这种风险，请考虑[限制管理标签的权限](tag-permissions.md#tag-permissions-conditions)和[别名](alias-access.md#alias-access-limiting)。例如，您可能想要仅允许特色级委托人管理 `Purpose=Test` 标签。有关详细信息，请参阅 [使用别名控制对 KMS 密钥的访问](alias-authorization.md) 和 [使用标签控制对 KMS 密钥的访问](tag-authorization.md)。

## 标签还是别名？


Amazon KMS 支持带有标签和别名的 ABAC。这两种选项都提供了灵活、可扩展的访问控制策略，但它们彼此略有不同。

您可以根据自己的特定使用模式决定使用标签或 Amazon 使用别名。例如，如果您已经向大多数管理员授予了标记权限，则基于别名控制授权策略可能会更容易。或者，如果您接近[每个 KMS 密钥的别名数量](resource-limits.md#aliases-per-key)配额，您可能更喜欢基于标签的授权策略。

以下益处是大家都感兴趣的。

**基于标签的访问控制的益处**
+ 对不同类型的 Amazon 资源使用相同的授权机制。

  您可以使用相同的标签或标签键来控制对多种资源类型的访问，例如 Amazon Relational Database Service（Amazon RDS）集群、Amazon Elastic Block Store（Amazon EBS）卷和 KMS 密钥。此功能支持多种不同的授权模型，这些模型比传统的基于角色的访问控制更加灵活。
+ 授权访问一组 KMS 密钥。

  您可以使用标签来管理对同一 Amazon Web Services 账户 和区域中的一组 KMS 密钥的访问权限。将相同的标签或标签键分配给您选择的 KMS 密钥。然后创建一个基于标签或标签密钥的简单 easy-to-maintain策略声明。要在授权组中添加或删除 KMS 密钥，请添加或删除标签；您无需编辑策略。

**基于别名的访问控制的益处**
+ 根据别名授权对加密操作的访问。

  大多数基于请求的属性策略条件，包括 a [ws:RequestTag/*tag-key*](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag)，仅影响添加、编辑或删除属性的操作。但是 k [ms: RequestAlias](conditions-kms.md#conditions-kms-request-alias) 条件密钥根据用于在请求中识别 KMS 密钥的别名来控制对加密操作的访问。例如，您可以授予委托人在 `Encrypt` 操作中使用 KMS 密钥的权限，但只有当 `KeyId` 参数的值为 `alias/restricted-key-1` 时。要满足此条件，需要以下所有条件：
  + KMS 密钥必须与该别名相关联。
  + 请求必须使用别名来标识 KMS 密钥。
  + 委托人必须拥有使用受 `kms:RequestAlias` 条件约束的 KMS 密钥的权限。

  如果您的应用程序通常使用别名或别名来引用 KMS 密钥 ARNs ，则此功能特别有用。
+ 提供非常有限的权限。

  在 Amazon Web Services 账户 和区域中，别名必须是唯一的。因此，基于别名授予委托人访问 KMS 密钥的权限可能比基于标签授予他们访问权限更严格。与别名不同，标签可分配给同一账户和区域中的多个 KMS 密钥。如果选择，则可以使用别名模式（例如 `alias/test*`）为委托人授予对同一账户和区域中一组 KMS 密钥的访问权限。但是，允许或拒绝访问特定别名允许对 KMS 密钥进行非常严格的控制。

# 对 ABAC 进行故障排除 Amazon KMS


基于 KMS 密钥的标签和别名控制对 KMS 密钥的访问非常方便，且功能强大。但是，它容易出现一些您希望防止的可预测错误。

## 由于标签更改而更改访问权限


如果某个标签被删除或其值被更改，则仅能基于该标签访问 KMS 密钥的委托人将被拒绝访问 KMS 密钥。当拒绝策略语句中包含的标签添加到 KMS 密钥时，也会发生这种情况。向 KMS 密钥添加与策略相关的标签可以允许访问应被拒绝访问 KMS 密钥的委托人。

例如，假设委托人可以基于 `Project=Alpha` 标签访问 KMS 密钥，例如以下示例 IAM policy 语句提供的权限。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "IAMPolicyWithResourceTag",
      "Effect": "Allow",
      "Action": [
        "kms:GenerateDataKeyWithoutPlaintext",
        "kms:Decrypt"
      ],
      "Resource": "arn:aws:kms:ap-southeast-1:111122223333:key/*",
      "Condition": {
        "StringEquals": {
          "aws:ResourceTag/Project": "Alpha"
        }
      }
    }
  ]
}
```

------

如果该标签已从该 KMS 密钥中删除或标签值发生更改，则委托人不再具有将 KMS 密钥用于指定操作的权限。当委托人尝试在使用客户托管密钥的 Amazon 服务中读取或写入数据时，这一点可能会变得显而易见。要跟踪标签的更改，请查看您的 CloudTrail日志[TagResource](ct-tagresource.md)或[UntagResource 条目](ct-untagresource.md)。

要在不更新策略的情况下恢复访问，请更改 KMS 密钥上的标签。这一措施除了短时间在整个 Amazon KMS中生效之后，产生的影响极小。为了防止这样的错误，请仅向需要它的委托人授予标记和取消标记权限，并[将其标记权限限制](tag-permissions.md#tag-permissions-conditions)到他们需要管理的标签。更改标签之前，请搜索策略以检测依赖于标签的访问权限，并在具有该标签的所有区域中获取 KMS 密钥。您可以考虑在更改特定标签时创建 Amazon CloudWatch 警报。

## 由于别名更改而导致的访问权限更改


如果别名被删除或与其他 KMS 密钥关联，则仅能基于该别名访问 KMS 密钥的委托人将被拒绝访问 KMS 密钥。当拒绝策略语句中包含与 KMS 密钥关联的别名时，也会发生这种情况。向 KMS 密钥添加与策略相关的别名也可以允许访问应被拒绝访问 KMS 密钥的委托人。

例如，以下 IAM 策略声明使用 k [ms: ResourceAliases](conditions-kms.md#conditions-kms-resource-aliases) 条件密钥允许使用任意指定别名访问账户中不同区域的 KMS 密钥。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AliasBasedIAMPolicy",
      "Effect": "Allow",
      "Action": [
        "kms:List*",
        "kms:Describe*",
        "kms:Decrypt"
      ],
      "Resource": "arn:aws:kms:*:111122223333:key/*",
      "Condition": {
        "ForAnyValue:StringEquals": {
          "kms:ResourceAliases": [
            "alias/ProjectAlpha",
            "alias/ProjectAlpha_Test",
            "alias/ProjectAlpha_Dev"
          ]
        }
      }
    }
  ]
}
```

------

要跟踪别名更改，请查看 CloudTrail 日志中是否有[CreateAlias[UpdateAlias](ct-updatealias.md)](ct-createalias.md)、和[DeleteAlias](ct-deletealias.md)条目。

要在不更新策略的情况下恢复访问，请更改与 KMS 密钥关联的别名。由于每个别名只能与账户和区域中的一个 KMS 密钥相关联，因此管理别名比管理标签要困难一些。恢复一些委托人对一个 KMS 密钥的访问权限可能会拒绝相同或其他委托人对其他 KMS 密钥的访问。

为了防止出现此错误，请仅向需要它的委托人授予别名管理权限，并[将其别名管理权限限制](alias-access.md#alias-access-limiting)到他们需要管理的别名。在更新或删除别名之前，请搜索策略以检测依赖于别名的访问权限，并在与别名关联的所有区域中查找 KMS 密钥。

## 由于别名配额而拒绝访问


如果 KMS 密钥超过该账户和地区[每个 [KMS 密钥配额的默认别名，则获得 kms: ResourceAliases](conditions-kms.md#conditions-kms-resource-aliases) 条件授权使用 KMS 密钥](resource-limits.md#aliases-per-key)的用户将获得`AccessDenied`例外。

要恢复访问，请删除与 KMS 密钥关联的别名，使其符合配额。或者使用备用机制授予用户访问 KMS 密钥的权限。

## 延迟的授权更改


您对标签和别名的更改最多可能需要 5 分钟的时间才能影响 KMS 密钥授权。因此，标签或别名更改可能会在 API 操作影响授权之前反映在响应中。这种延迟可能比影响大多数 Amazon KMS 操作的短暂的最终一致性延迟要长。

例如，您可能拥有一个 IAM policy，允许某些委托人使用带有 `"Purpose"="Test"` 标签的任何 KMS 密钥。然后，您将 `"Purpose"="Test"` 标签添加到 KMS 密钥。尽管[TagResource](https://docs.amazonaws.cn/kms/latest/APIReference/API_TagResource.html)操作已完成且[ListResourceTags](https://docs.amazonaws.cn/kms/latest/APIReference/API_ListResourceTags.html)响应确认标签已分配给 KMS 密钥，但委托人可能在长达五分钟内无法访问 KMS 密钥。

为了防止出现错误，请将此预期延迟构建到您的代码中。

## 由于别名更新而失败的请求


当您更新别名时，您将现有别名与另一个 KMS 密钥关联。

[解密](https://docs.amazonaws.cn/kms/latest/APIReference/API_Decrypt.html)和指定别名或[别名](concepts.md#key-id-alias-name) [ARN](concepts.md#key-id-alias-ARN) 的[ReEncrypt](https://docs.amazonaws.cn/kms/latest/APIReference/API_ReEncrypt.html)请求可能会失败，因为该别名现在与未加密密文的 KMS 密钥相关联。这种情况通常会返回 `IncorrectKeyException` 或者 `NotFoundException`。或者如果请求中没有 `KeyId` 或 `DestinationKeyId` 参数，则操作可能会失败，并出现 `AccessDenied` 异常，因为调用方不再具有对加密密文的 KMS 密钥的访问权限。

您可以通过查看[CreateAlias[UpdateAlias](ct-updatealias.md)](ct-createalias.md)、和 CloudTrail 日志条目的[DeleteAlias](ct-deletealias.md)日志来跟踪更改。您还可以在[ListAliases](https://docs.amazonaws.cn/kms/latest/APIReference/API_ListAliases.html)响应中使用该`LastUpdatedDate`字段的值来检测更改。

例如，以下[ListAliases](https://docs.amazonaws.cn/kms/latest/APIReference/API_ListAliases.html)示例响应显示`kms:ResourceAliases`条件中的`ProjectAlpha_Test`别名已更新。因此，基于别名具有访问权限的委托人将失去对先前关联的 KMS 密钥的访问权限。相反，他们可以访问新关联的 KMS 密钥。

```
$ aws kms list-aliases --query 'Aliases[?starts_with(AliasName, `alias/ProjectAlpha`)]'

{
    "Aliases": [
        {
            "AliasName": "alias/ProjectAlpha_Test",
            "AliasArn": "arn:aws:kms:us-west-2:111122223333:alias/ProjectAlpha_Test",
            "TargetKeyId": "0987dcba-09fe-87dc-65ba-ab0987654321",
            "CreationDate": 1566518783.394,
            "LastUpdatedDate": 1605308931.903
        },
        {
            "AliasName": "alias/ProjectAlpha_Restricted",
            "AliasArn": "arn:aws:kms:us-west-2:111122223333:alias/ProjectAlpha_Restricted",
            "TargetKeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
            "CreationDate": 1553410800.010,
            "LastUpdatedDate": 1553410800.010
        }
    ]
}
```

这种变化的补救办法并不简单。您可以再次更新别名以将其与原始 KMS 密钥关联。但是，在执行操作之前，您需要考虑该更改对当前关联的 KMS 密钥的影响。如果委托人在加密操作中使用后一个 KMS 密钥，他们可能需要继续访问该密钥。在这种情况下，您可能需要更新策略以确保委托人有权使用这两个 KMS 密钥。

您可以防止出现这样的错误：在更新别名之前，搜索策略以检测依赖于别名的访问。然后，在与别名关联的所有区域中获取 KMS 密钥。请仅向需要它的委托人授予别名管理权限，并[将其别名管理权限限制](alias-access.md#alias-access-limiting)到他们需要管理的别名。

# RBAC 为 Amazon KMS
基于角色的访问控制 (RBAC)

基于角色的访问控制（RBAC）是一种授权策略，仅为用户提供履行其工作职责所需的权限，仅此而已。 Amazon KMS 支持 RBAC，允许您通过在[密钥政策](key-policies.md)中精细指定密钥用法权限来控制对密钥的访问。密钥政策指定授予密钥访问权限的资源、操作、效果、主体和可选条件。

要在中实现 RBAC Amazon KMS，我们建议将密钥用户和密钥管理员的权限分开。

------
#### [ Key users ]

以下密钥政策示例允许 `ExampleUserRole` IAM 角色使用 KMS 密钥。

```
{
            "Sid": "Allow use of the key",
            "Effect": "Allow",
            "Principal": {
                "Amazon": "arn:aws-cn: iam::111122223333:role/ExampleUserRole"
            },
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*",
                "kms:DescribeKey"
            ],
            "Resource": "*"
  }
```

 您的密钥用户需要的权限可能少于本示例中的用户。请仅分配用户需要的权限。使用以下问题帮助您确定并进一步优化权限。
+ 哪些 IAM 主体（角色或用户）需要访问密钥？
+ 每位主体需要使用密钥来执行哪些操作？ 例如，主体是否只需要加密和签名权限？
+ 用户是人类还是 Amazon 服务？ 如果是 Amazon 服务，则可以使用[条件密钥将密钥](conditions-kms.md#conditions-kms-via-service)的使用限制为特定 Amazon 服务。

------
#### [ Key administrators ]



以下密钥政策示例允许 `ExampleAdminRole` IAM 角色管理 KMS 密钥。

```
{
            "Sid": "Allow access for Key Administrators",
            "Effect": "Allow",
            "Principal": {
                "Amazon": "arn:aws-cn: 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": "*"
    }
```

 在本示例中，您的密钥管理员需要的权限可能少于管理员的权限。仅分配密钥管理员所需的权限。

------

仅向用户授予履行其角色所需的权限。用户的权限可能有所不同，具体取决于密钥是在测试环境中使用还是在生产环境中使用。如果您在某些非生产环境中使用限制较少的权限，请先实施流程来测试策略，然后再将其发布到生产环境中。

**了解详情**
+ [IAM 身份（用户、用户组和角色）](https://docs.amazonaws.cn/IAM/latest/UserGuide/id.html)
+ [访问控制的类型](https://docs.amazonaws.cn/prescriptive-guidance/latest/saas-multitenant-api-access-authorization/access-control-types.html)

# 允许其他账户中的用户使用 KMS 密钥
跨账户访问

您可以允许其他 Amazon Web Services 账户 用户或角色在您的账户中使用 KMS 密钥。跨账户访问需要在 KMS 密钥的密钥策略和外部用户账户的 IAM policy 中拥有权限。

跨账户权限仅对以下操作有效：
+ [加密操作](kms-cryptography.md#cryptographic-operations)
+ [CreateGrant](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateGrant.html)
+ [DescribeKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_DescribeKey.html)
+ [GetKeyRotationStatus](https://docs.amazonaws.cn/kms/latest/APIReference/API_GetKeyRotationStatus.html)
+ [GetPublicKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_GetPublicKey.html)
+ [ListGrants](https://docs.amazonaws.cn/kms/latest/APIReference/API_ListGrants.html)
+ [RetireGrant](https://docs.amazonaws.cn/kms/latest/APIReference/API_RetireGrant.html)
+ [RevokeGrant](https://docs.amazonaws.cn/kms/latest/APIReference/API_RevokeGrant.html)

如果您向另一个账户中的用户授予对其他操作的权限，则这些权限将不起作用。例如，如果您向其他账户中的委托人授予 IAM 策略中的 k [ms: ListKeys](https://docs.amazonaws.cn/kms/latest/APIReference/API_ListKeys.html) 权限，或者在[密钥策略中ScheduleKeyDeletion授予 KMS:](https://docs.amazonaws.cn/kms/latest/APIReference/API_ScheduleKeyDeletion.html) 密钥权限，则该用户尝试对您的资源调用这些操作仍会失败。

有关在不同账户中使用 KMS 密钥进行 Amazon KMS 操作的详细信息，请参阅[Amazon KMS 权限](kms-api-permissions-reference.md)和[在其他账户中使用 KMS 密钥](#cross-account-use)中的**跨账户使用**列。[Amazon Key Management Service API 参考](https://docs.amazonaws.cn/kms/latest/APIReference/)中每个 API 描述中还有一个**跨账户使用**部分。

**警告**  
请谨慎授予委托人使用 KMS 密钥的权限。只要有可能，请按照*最小特权*原则。仅针对用户所需的操作为他们授予对所需的 KMS 密钥的访问权。  
此外，请谨慎使用任何不熟悉的 KMS 密钥，尤其是其他账户中的 KMS 密钥。恶意用户可能会授予您使用其 KMS 密钥获取有关您或您账户的信息的权限。  
有关使用策略保护您账户中的资源的更多信息，请参阅 [IAM policy 的最佳实践](iam-policies-best-practices.md)。

要将使用 KMS 密钥的权限授予其他账户中的用户和角色，您必须使用两种不同类型的策略：
+ KMS 密钥的**密钥策略**必须向外部账户（或外部账户中的用户和角色）授予使用 KMS 密钥的权限。密钥策略在拥有 KMS 密钥的账户中。
+ 外部账户中的 **IAM policy** 必须将密钥策略权限委托给其用户和角色。这些策略在外部账户中设置，并向该账户中的用户和角色授予权限。

密钥策略决定谁*可以*访问 KMS 密钥。IAM policy 决定谁*确实*能够访问 KMS 密钥。单独的密钥策略和 IAM policy 都不足够，您必须更改此两者。

要编辑密钥策略，您可以使用中的[策略视图](key-policy-modifying.md#key-policy-modifying-how-to-console-policy-view) Amazon Web Services 管理控制台 或使用[CreateKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateKey.html)或[PutKeyPolicy](https://docs.amazonaws.cn/kms/latest/APIReference/API_PutKeyPolicy.html)操作。

有关编辑 IAM policy 时的帮助信息，请参阅。[将 IAM 策略与配合使用 Amazon KMS](iam-policies.md)

有关说明密钥策略和 IAM policy 如何协同工作以允许在其他账户中使用 KMS 密钥的示例，请参阅。[示例 2：用户扮演角色并有权在其他地方使用 KMS 密钥 Amazon Web Services 账户](policy-evaluation.md#example-cross-acct)

您可以在[Amazon CloudTrail 日志](logging-using-cloudtrail.md)中查看生成的对 KMS 密钥的跨账户 Amazon KMS 操作。在其他账户中使用 KMS 密钥的操作将记录在调用方的账户和 KMS 密钥所有者账户中。

**Topics**
+ [

## 步骤 1：在本地账户中添加密钥策略语句
](#cross-account-key-policy)
+ [

## 步骤 2：在外部账户中添加 IAM policy
](#cross-account-iam-policy)
+ [

## 允许将外部 KMS 密钥用于 Amazon Web Services 服务
](#cross-account-service)
+ [

## 在其他账户中使用 KMS 密钥
](#cross-account-use)

**注意**  
本主题中的示例展示了如何结合使用密钥策略和 IAM policy 来提供和限制对 KMS 密钥的访问。这些通用示例无意代表任何特定的 KMS 密钥 Amazon Web Services 服务 所需的权限。有关 Amazon Web Services 服务 所需权限的信息，请参阅服务文档中的加密主题。

## 步骤 1：在本地账户中添加密钥策略语句


KMS 密钥的密钥策略是谁可以访问 KMS 密钥以及他们可以执行哪些操作的主要决定因素。密钥策略始终在拥有 KMS 密钥的账户中。与 IAM policy 不同，密钥策略不指定资源。资源是指与密钥策略关联的 KMS 密钥。在提供跨账户权限时，KMS 密钥的密钥策略必须向外部账户（或外部账户中的用户和角色）授予使用 KMS 密钥的权限。

要向外部账户授予使用 KMS 密钥的权限，请向密钥策略添加一条语句用于指定此外部账户。在密钥策略的 `Principal` 元素中，输入外部账户的 Amazon Resource Name (ARN)。

当您在密钥策略中指定外部账户时，外部账户中的 IAM 管理员可以使用 IAM policy 来将这些权限委派给外部账户中的任何用户和角色。他们还可以决定用户和角色可以执行在密钥策略中指定的哪些操作。

只有在托管 KMS 密钥及其密钥策略的区域中启用了外部账户时，授予给外部账户及其委托人的权限才有效。有关默认情况下未启用的区域（“选择加入区域”）的信息，请参阅《Amazon Web Services 一般参考》** 中的 [Managing Amazon Web Services 区域](https://docs.amazonaws.cn/general/latest/gr/rande-manage.html)。

例如，假定您希望允许账户 `444455556666` 使用账户 `111122223333` 中的对称加密 KMS 密钥。为此，请将与以下示例中的策略语句类似的策略语句添加到账户 `111122223333` 中 KMS 密钥的密钥策略。此策略语句授权外部账户 `444455556666` 在加密操作中使用对称加密 KMS 密钥的 KMS 密钥。

**注意**  
以下示例演示了与其他账户共享 KMS 密钥的示例密钥策略。请将示例 `Sid`、`Principal` 和 `Action` 的值替换为 KMS 密钥预期用途的有效值。

```
{
    "Sid": "Allow an external account to use this KMS key",
    "Effect": "Allow",
    "Principal": {
        "AWS": [
            "arn:aws:iam::444455556666:root"
        ]
    },
    "Action": [
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:ReEncrypt*",
        "kms:GenerateDataKey*",
        "kms:DescribeKey"
    ],
    "Resource": "*"
}
```

您可以在密钥策略中指定特定的外部用户和角色，而不是向外部账户授予权限。但是，这些用户和角色无法使用该 KMS 密钥，直到外部账户中的 IAM 管理员将适当的 IAM policy 附加到其身份。IAM policy 可以向在密钥策略中指定的所有或部分外部用户和角色授予权限。并且，它们可以允许执行在密钥策略中指定的所有或部分操作。

在密钥策略中指定身份会限制外部账户中的 IAM 管理员可以提供的权限。但是，它使两个账户的策略管理变得更加复杂。例如，假定您需要添加用户或角色。您必须将该身份添加到拥有 KMS 密钥的账户中的密钥策略，并在此身份的账户中创建 IAM policy。

要在密钥策略中指定特定外部用户或角色，请在 `Principal` 元素中输入外部账户中的用户或角色的 Amazon Resource Name (ARN)。

例如，以下示例密钥策略语句允许账户 `444455556666` 中的 `ExampleRole` 使用账户 `111122223333` 中的 KMS 密钥。此密钥策略语句授权外部账户 `444455556666` 在加密操作中使用对称加密 KMS 密钥的 KMS 密钥。

**注意**  
以下示例演示了与其他账户共享 KMS 密钥的示例密钥策略。请将示例 `Sid`、`Principal` 和 `Action` 的值替换为 KMS 密钥预期用途的有效值。

```
{
    "Sid": "Allow an external account to use this KMS key",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::444455556666:role/ExampleRole"
    },
    "Action": [
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:ReEncrypt*",
        "kms:GenerateDataKey*",
        "kms:DescribeKey"
    ],
    "Resource": "*"
}
```

**注意**  
除非您使用[条件](policy-conditions.md)限制密钥政策，否则不要在允许权限的任何密钥政策语句将主体设置为星号（\$1）。星号赋予每个身份使用 KMS 密钥的 Amazon Web Services 账户 权限，除非其他策略声明明确拒绝。其他用户只要在自己的账户中拥有相应权限，就 Amazon Web Services 账户 可以使用您的 KMS 密钥。

您还需要确定您想要向外部账户授予哪些权限。例如，您可能希望授予用户解密但不加密的权限，或者查看 KMS 密钥但不使用 KMS 密钥的权限。有关针对 KMS 密钥的权限的列表，请参阅 [Amazon KMS 权限](kms-api-permissions-reference.md)。

**创建 KMS 密钥时设置密钥政策**  
使用该[CreateKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateKey.html)操作创建 KMS 密钥时，您可以使用其`Policy`参数来指定密钥策略，该策略向外部账户或外部用户和角色授予使用 KMS 密钥的权限。  
在中创建 KMS 密钥时 Amazon Web Services 管理控制台，还会创建其密钥策略。当您在**密钥管理员**和**密钥用户**部分中选择身份时， Amazon KMS 会将这些身份的策略语句添加到 KMS 密钥的密钥策略中。**密钥用户**部分还允许您将外部账户添加为密钥用户。  
当您输入外部账户的账户 ID 时， Amazon KMS 会在密钥策略中添加两条声明。此操作仅影响密钥策略。外部账户中的用户和角色无法使用该 KMS 密钥，直到您附加 IAM policy 以向他们授予部分或所有这些权限。  
第一个密钥策略语句向外部账户授予在加密操作中使用 KMS 密钥的权限。第二个密钥策略声明允许外部账户创建、查看和撤消对 KMS 密钥的授权，但前[提是请求来自与 Amazon KMS集成的Amazon 服务](https://www.amazonaws.cn/kms/features/#AWS_Service_Integration)。这些权限允许其他加密用户数据的 Amazon 服务使用 KMS 密钥。这些权限是为加密 Amazon 服务中用户数据的 KMS 密钥设计的

## 步骤 2：在外部账户中添加 IAM policy


拥有 KMS 密钥的账户中的密钥策略设置权限的有效范围。但是，在附加委派这些权限的 IAM policy 或使用授权来管理对 KMS 密钥的访问之前，外部账户中的用户和角色无法使用此 KMS 密钥。IAM policy 在外部账户中设置。

如果密钥策略向外部账户授予权限，则可以将 IAM policy 附加到账户中的任何用户或角色。但是，如果密钥策略向指定的用户或角色授予权限，则 IAM policy 只能将这些权限授予全部或部分指定用户和角色。如果 IAM policy 向其他外部用户或角色授予使用 KMS 密钥的权限，则它不起作用。

密钥策略还限制 IAM policy 中的操作。IAM policy 可以委派在密钥策略中指定的所有或部分操作。如果 IAM policy 列出未在密钥策略中指定的操作，则这些权限无效。

以下示例 IAM policy 允许委托人使用账户 `111122223333` 中的 KMS 密钥执行加密操作。要向账户 `444455556666` 中的用户和角色授予此权限，[请将策略附加到](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_managed-using.html#attach-managed-policy-console)账户 `444455556666` 中的用户或角色。

**注意**  
以下示例演示了与其他账户共享 KMS 密钥的示例 IAM policy。请将示例 `Sid`、`Resource` 和 `Action` 的值替换为 KMS 密钥预期用途的有效值。

```
{
    "Sid": "AllowUseOfKeyInAccount111122223333",
    "Effect": "Allow",
    "Action": [
      "kms:Encrypt",
      "kms:Decrypt",
      "kms:ReEncrypt*",
      "kms:GenerateDataKey*",
      "kms:DescribeKey"
    ],
    "Resource": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
}
```

请注意有关该策略的以下详细信息：
+ 与密钥策略不同，IAM policy 语句不包含 `Principal` 元素。在 IAM policy 中，委托人是附加了策略的身份。
+ IAM policy 中的 `Resource` 元素标识委托人可以使用的 KMS 密钥。要指定 KMS 密钥，请将其[密钥 ARN](concepts.md#key-id-alias-ARN) 添加到 `Resource` 元素中。
+ 您可以在 `Resource` 元素中指定多个 KMS 密钥。但是，如果您没有在 `Resource` 元素中指定特定的 KMS 密钥，您可能会无意中比预期授予针对更多 KMS 密钥的权限。
+ 要允许外部用户将 KMS 密钥和[与 Amazon KMS集成的Amazon 服务一起使用](https://www.amazonaws.cn/kms/features/#AWS_Service_Integration)，您可能需要向密钥策略或 IAM policy 添加权限。有关更多信息，请参阅 [允许将外部 KMS 密钥用于 Amazon Web Services 服务](#cross-account-service)。

有关使用 IAM policy 的更多信息，请参阅 [IAM 策略](iam-policies.md)。

## 允许将外部 KMS 密钥用于 Amazon Web Services 服务


您可以向不同账户中的用户授予将您的 KMS 密钥和与 Amazon KMS集成的服务一起使用的权限。例如，外部账户中的用户可以使用您的 KMS 密钥加密 Amazon S3 存储桶中的对象或加密存储在 Amazon Secrets Manager中的密钥。

密钥策略必须向外部用户或外部用户的账户授予使用 KMS 密钥的权限。此外，您需要将 IAM policy 附加到某个身份，以向用户授予使用 Amazon Web Services 服务的权限。该服务还可能要求用户在密钥策略或 IAM policy 中具有其他权限。有关客户托管密钥 Amazon Web Services 服务 所需的权限列表，请参阅该服务的用户指南或开发者指南中 “安全” 一章中的数据保护主题。

## 在其他账户中使用 KMS 密钥


如果您有权在其他地方使用 KMS 密钥 Amazon Web Services 账户，则可以在、 Amazon Web Services 管理控制台 Amazon SDKs Amazon CLI、和中使用 KMS 密钥 Amazon Tools for PowerShell。

要在 shell 命令或 API 请求中标识其他账户中的 KMS 密钥，请使用以下[密钥标识符](concepts.md#key-id)。
+ 对于[加密操作[DescribeKey[GetPublicKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_GetPublicKey.html)](https://docs.amazonaws.cn/kms/latest/APIReference/API_DescribeKey.html)](kms-cryptography.md#cryptographic-operations)、和，请使用 KMS [密钥的密钥 ARN](concepts.md#key-id-key-ARN) [或别名 ARN](concepts.md#key-id-alias-ARN)。
+ 对于[CreateGrant](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateGrant.html)、[GetKeyRotationStatus[ListGrants](https://docs.amazonaws.cn/kms/latest/APIReference/ListGrants.html)](https://docs.amazonaws.cn/kms/latest/APIReference/API_GetKeyRotationStatus.html)、和 [RevokeGrant](https://docs.amazonaws.cn/kms/latest/APIReference/RevokeGrant.html)，请使用 KMS 密钥的密钥 ARN。

如果您仅输入密钥 ID 或别名，则 Amazon 假定 KMS 密钥在您的账户中。

即使您有权使用 KMS 密钥， Amazon KMS 控制台也不会显示其他账户中的 KMS 密钥。此外，在其他 Amazon 服务的控制台中显示的 KMS 密钥的列表不包括其他账户中的 KMS 密钥。

要在 Amazon 服务控制台中使用其他账户指定 KMS 密钥，必须输入 KMS 密钥的密钥 ARN 或别名 ARN。所需的密钥标识符因服务而异，并且在服务控制台及其 API 操作之间可能会有所不同。有关详细信息，请参阅服务文档。

# 控制对多区域密钥的访问


您可以在合规性、灾难恢复和备份场景中使用多区域密钥，这些场景在使用单区域密钥的情况下更为复杂。但是，由于多区域密钥的安全属性与单区域密钥的安全属性明显不同，我们建议在授权创建、管理和使用多区域密钥时务必谨慎。

**注意**  
在 `Resource` 字段中包通配符的现有 IAM policy 语句现在同时应用于单区域密钥和多区域密钥。要将其限制为单区域 KMS 密钥或多区域密钥，请使用 k [ms: MultiRegion](conditions-kms.md#conditions-kms-multiregion) 条件密钥。

使用您的授权工具防止在单区域足够的任何情况下创建和使用多区域密钥。仅允许委托人将多区域密钥复制到需要他们的密钥 Amazon Web Services 区域 中。仅对需要多区域密钥的主体授予权限，并且仅对需要多区域密钥的任务授予权限。

您可以使用密钥策略、IAM 策略和授权，允许 IAM 委托人管理和使用您的多区域密钥。 Amazon Web Services 账户每个多区域密钥都是一个独立的资源，具有唯一的密钥 ARN 和密钥策略。您需要为每个密钥建立和维护密钥政策，并确保新的和现有的 IAM policy 实施您的授权策略。

要支持多区域密钥，请 Amazon KMS 使用 IAM 服务关联角色。这个角色为 Amazon KMS 授予同步[共享属性](multi-region-keys-overview.md#mrk-sync-properties)所需的权限。有关更多信息，请参阅 [授权同步多 Amazon KMS 区域密钥](multi-region-auth-slr.md)。

**Topics**
+ [

## 多区域密钥的授权基础知识
](#multi-region-auth-about)
+ [

## 授权多区域密钥管理员和用户
](#multi-region-auth-users)

## 多区域密钥的授权基础知识


为多区域密钥设计密钥政策和 IAM policy 时，请考虑以下原则。
+ **密钥策略** — 每个多区域密钥都是一个独立的 KMS 密钥资源，具有自己的[密钥策略](key-policies.md)。您可以将相同或不同的密钥策略应用于相关多区域密钥集中的每个密钥。密钥策略*不是*多区域密钥的[共享属性](multi-region-keys-overview.md#mrk-sync-properties)。 Amazon KMS 不会在相关的多区域密钥之间复制或同步密钥策略。

  在 Amazon KMS 控制台中创建副本密钥时，为了方便起见，控制台会显示主密钥的当前密钥策略。您可以使用此密钥策略、对其进行编辑或删除和替换。但是，即使您接受未更改的主密钥策略，也 Amazon KMS 不会同步这些策略。例如，如果您更改主密钥的密钥策略，则副本密钥的密钥策略将保持不变。
+ **默认密钥策略**-使用[CreateKey](https://docs.amazonaws.cn/IAM/latest/APIReference/API_CreateKey.html)和`ReplicateKey`操作创建多区域密钥时，除非您在请求中指定[密钥策略，否则将应用默认](key-policy-default.md)密钥策略。这与应用于单区域密钥的默认密钥策略相同。
+ **IAM policy** — 与所有 KMS 密钥一样，只要当[密钥政策允许](key-policy-default.md#key-policy-default-allow-root-enable-iam)时，您才可以使用 IAM policy 来控制对多区域密钥的访问。默认情况下，[IAM 策略](iam-policies.md)适用于所有 Amazon Web Services 区域 人。但是，您可以使用条件键（例如 a [ws: RequestedRegion](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requestedregion)）来限制对特定区域的权限。

  要创建主密钥和副本密钥，委托人必须对应用于创建密钥的区域的 IAM policy 具有 `kms:CreateKey` 权限。
+ **补助金** — Amazon KMS [补助金](grants.md)是区域性的。每个授权都允许对一个 KMS 密钥的权限。您可以使用授权来允许对多区域主密钥或副本密钥的权限。但是，您不能使用单个授权来允许对多个 KMS 密钥的权限，即使它们是相关的多区域密钥。
+ **密钥 ARN** — 每个多区域密钥都有一个[唯一的密钥 ARN](mrk-how-it-works.md)。相关的多区域密钥 ARNs 的密钥具有相同的分区、账户和密钥 ID，但区域不同。

  要将 IAM policy 语句应用于特定的多区域密钥，请使用其密钥 ARN 或包含该区域的密钥 ARN 模式。要将 IAM policy 语句应用于所有相关多区域密钥，请在 ARN 的区域元素中使用通配符 (\$1)，如下例所示。

  ```
  {
    "Effect": "Allow",  
    "Action": [
      "kms:Describe*",
      "kms:List*"
    ],
    "Resource": {
        "arn:aws:kms:*::111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab"
    }
  }
  ```

  要将策略声明应用于您的所有多区域密钥 Amazon Web Services 账户，您可以使用 k [ms: MultiRegion](conditions-kms.md#conditions-kms-multiregion) 策略条件或包含独特`mrk-`前缀的密钥 ID 模式。
+ **服务相关角色**-创建多区域主键的委托人必须拥有 iam: [权限](https://docs.amazonaws.cn/IAM/latest/APIReference/API_CreateServiceLinkedRole.html)。CreateServiceLinkedRole

  要同步相关多区域密钥的共享属性，请担任 I Amazon KMS AM [服务相关](multi-region-auth-slr.md)角色。 Amazon KMS 每当您创建多区域主键 Amazon Web Services 账户 时，都会在中创建服务相关角色。（如果角色存在， Amazon KMS 将重新创建它，这没有任何有害影响。） 该角色在所有区域中都有效。 Amazon KMS [要允许创建（或重新创建）服务相关角色，创建多区域主键的委托人必须拥有 iam: 权限。CreateServiceLinkedRole](https://docs.amazonaws.cn/IAM/latest/APIReference/API_CreateServiceLinkedRole.html)

## 授权多区域密钥管理员和用户


创建和管理多区域密钥的委托人需要在主区域和副本区域中具有以下权限：
+ `kms:CreateKey`
+ `kms:ReplicateKey`
+ `kms:UpdatePrimaryRegion`
+ `iam:CreateServiceLinkedRole`

### 创建主密钥


要[创建多区域主密钥](create-primary-keys.md)，委托人需要在主[密钥所在区域有效的 IAM 策略中的 kms: CreateKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateKey.html) [和 iam: CreateServiceLinkedRole](https://docs.amazonaws.cn/IAM/latest/APIReference/API_CreateServiceLinkedRole.html) 权限。具有这些权限的委托人可以创建单区域和多区域密钥，除非您限制其权限。

该`iam:CreateServiceLinkedRole`权限允许 Amazon KMS 创建[**AWSServiceRoleForKeyManagementServiceMultiRegionKeys**角色](multi-region-auth-slr.md)以同步相关多区域密钥的[共享属性](multi-region-keys-overview.md#mrk-sync-properties)。

例如，此 IAM 策略将允许主体创建多区域密钥，为这些密钥附加策略，以及为多区域密钥创建服务相关角色。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement":{
      "Action": [
        "kms:CreateKey",
        "iam:CreateServiceLinkedRole"
      ],
      "Effect":"Allow",
      "Resource":"*"
  }
}
```

------

要允许或拒绝创建多区域主密钥的权限，请使用 k [ms: MultiRegion](conditions-kms.md#conditions-kms-multiregion) 条件密钥。有效值为 `true`（多区域密钥）或 `false`（单区域密钥）。例如，以下 IAM policy 语句使用 `Deny` 操作与 `kms:MultiRegion` 条件键来防止委托人创建多区域密钥。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement":{
      "Action":"kms:CreateKey",
      "Effect":"Deny",
      "Resource":"*",
      "Condition": {
          "Bool": {
            "kms:MultiRegion": true
          }
      }
  }
}
```

------

### 复制密钥


要[创建多区域副本密钥](#mrk-auth-replicate)，委托人需要以下权限：
+  [km ReplicateKey s：](https://docs.amazonaws.cn/kms/latest/APIReference/API_ReplicateKey.html)主密钥的密钥策略中的权限。
+ [kms：](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateKey.html)在副本密钥区域有效的 IAM 策略中的CreateKey权限。

允许这些权限时请谨慎。它们允许委托人创建 KMS 密钥和授权其使用的密钥策略。`kms:ReplicateKey` 权限还授权跨 Amazon KMS内的区域边界传输密钥材料。

要限制可以复制多区域密钥的范围，请使用 k [ms: ReplicaRegion](conditions-kms.md#conditions-kms-replica-region) 条件密钥。 Amazon Web Services 区域 它只限制 `kms:ReplicateKey` 权限。否则，会没有效果。例如，以下密钥策略允许委托人复制该主密钥，但仅限在指定区域中进行。

```
{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/Administrator"
  },
  "Action": "kms:ReplicateKey",
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "kms:ReplicaRegion": [
         "us-east-1",
         "eu-west-3",
         "ap-southeast-2"
      ]
    }
  }
}
```

### 更新主区域


授权的委托人可以将副本密钥转换为主密钥，从而将以前的主密钥更改为副本密钥。该操作称为[更新主区域](multi-region-update.md)。要更新主区域，委托人需要两个区域的 [kms: UpdatePrimaryRegion](https://docs.amazonaws.cn/kms/latest/APIReference/API_UpdatePrimaryRegion.html) 权限。您可以在密钥政策或 IAM policy 中提供这些权限。
+ 主密钥上的 `kms:UpdatePrimaryRegion`。此权限必须在主密钥区域中有效。
+ 副本密钥上的 `kms:UpdatePrimaryRegion`。此权限必须在副本密钥区域中有效。

例如，以下密钥策略向可以担任管理员角色的用户授予更新 KMS 密钥的主区域的权限。此 KMS 密钥可以是此操作中的主密钥或副本密钥。

```
{
  "Effect": "Allow",
  "Resource": "*",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/Administrator"
  },
  "Action": "kms:UpdatePrimaryRegion"
}
```

要限制 Amazon Web Services 区域 可以托管主密钥的，请使用 k [ms: PrimaryRegion](conditions-kms.md#conditions-kms-primary-region) 条件密钥。例如，以下 IAM 政策声明允许委托人更新中多区域密钥的主区域 Amazon Web Services 账户，但前提是新的主区域是指定区域之一。

```
{
  "Effect": "Allow",  
  "Action": "kms:UpdatePrimaryRegion",
  "Resource": {
      "arn:aws:kms:*:111122223333:key/*"
  },
  "Condition": {
    "StringEquals": {
      "kms:PrimaryRegion": [ 
         "us-west-2",
         "sa-east-1",
         "ap-southeast-1"
      ]
    }
  }
}
```

### 使用和管理多区域密钥


默认情况下，有权在 Amazon Web Services 账户 和区域中使用和管理 KMS 密钥的委托人也有权使用和管理多区域密钥。但是，您可以使用 k [ms: MultiRegion](conditions-kms.md#conditions-kms-multiregion) 条件密钥来仅允许单区域密钥或仅允许多区域密钥。或者使用 k [ms: MultiRegionKeyType](conditions-kms.md#conditions-kms-multiregion-key-type) 条件密钥仅允许多区域主键或仅允许副本密钥。两个条件密钥都控制对[CreateKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateKey.html)操作和使用现有 KMS 密钥的任何操作（例如 Enc [rypt](https://docs.amazonaws.cn/kms/latest/APIReference/API_Encrypt.html) 或）的访问权限[EnableKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_EnableKey.html)。

以下示例 IAM policy 语句使用 `kms:MultiRegion` 条件键，以防委托人使用或管理任何多区域密钥。

```
{
  "Effect": "Deny",  
  "Action": "kms:*",
  "Resource": "*",
  "Condition": {
    "Bool": "kms:MultiRegion": true
  }
}
```

此示例 IAM policy 语句使用 `kms:MultiRegionKeyType` 条件，以允许委托人计划和取消删除密钥，但仅限于多区域副本密钥。

```
{
  "Effect": "Allow",  
  "Action": [
    "kms:ScheduleKeyDeletion",
    "kms:CancelKeyDeletion"
  ],
  "Resource": {
      "arn:aws:kms:us-west-2:111122223333:key/*"
  },
  "Condition": {
    "StringEquals": "kms:MultiRegionKeyType": "REPLICA"
  }
}
```

# 确定访问权限 Amazon KMS keys
确定访问权限

要确定当前谁或什么可以访问的全部范围 Amazon KMS key，您必须检查 KMS 密钥的密钥策略、适用于 KMS 密钥的所有[授权](grants.md)，以及可能的所有 Amazon Identity and Access Management (IAM) 策略。您可以执行该操作来确定 KMS 密钥的潜在使用范围或帮助您满足合规性或审计要求。以下主题有助于您生成当前有权访问 KMS 密钥的 Amazon 委托人（身份）的完整列表。

**Topics**
+ [

# 检查密钥策略
](determining-access-key-policy.md)
+ [

# 检查 IAM policy
](determining-access-iam-policies.md)
+ [

# 检查授予
](determining-access-grants.md)

# 检查密钥策略


[密钥策略](key-policies.md)是控制对 KMS 密钥访问的主要方法。每个 KMS 密钥都有且只有一个密钥策略。

如果密钥策略由[默认密钥策略](key-policy-default.md#key-policy-default-allow-root-enable-iam)组成或包含默认密钥策略，则密钥策略允许账户中的 IAM 管理员使用 IAM policy 控制对 KMS 密钥的访问。此外，如果密钥策略赋予[其他 Amazon Web Services 账户](key-policy-modifying-external-accounts.md) 使用 KMS 密钥的权限，则外部账户中的 IAM 管理员可以使用 IAM policy 委派这些权限。要确定可访问 KMS 密钥的委托人的完整列表，[请检查 IAM policy](determining-access-iam-policies.md)。

要查看 Amazon KMS [客户托管密钥或您账户[Amazon 托管式密钥](concepts.md#aws-managed-key)中的密钥](concepts.md#customer-mgn-key)政策，请在 Amazon KMS API 中使用 Amazon Web Services 管理控制台 或[GetKeyPolicy](https://docs.amazonaws.cn/kms/latest/APIReference/API_GetKeyPolicy.html)操作。要查看密钥策略，必须对 KMS 密钥具备 `kms:GetKeyPolicy` 权限。有关查看 KMS 密钥的密钥策略的说明，请参阅 [查看密钥政策](key-policy-viewing.md)。

检查密钥策略文档，并记下每个策略语句的 `Principal` 元素中指定的所有委托人。在`Allow`生效的策略声明中，IAM 用户、IAM 角色以及`Principal`元素 Amazon Web Services 账户 中的角色有权访问此 KMS 密钥。

**注意**  
除非您使用[条件](policy-conditions.md)限制密钥政策，否则不要在允许权限的任何密钥政策语句将主体设置为星号（\$1）。星号赋予每个身份使用 KMS 密钥的 Amazon Web Services 账户 权限，除非其他策略声明明确拒绝。其他用户只要在自己的账户中拥有相应权限，就 Amazon Web Services 账户 可以使用您的 KMS 密钥。

以下示例使用[默认密钥策略](key-policy-default.md)中的策略语句来演示如何执行该操作。

**Example 策略语句 1**  

```
{
  "Sid": "Enable IAM User Permissions",
  "Effect": "Allow",
  "Principal": {"AWS": "arn:aws:iam::111122223333:root"},
  "Action": "kms:*",
  "Resource": "*"
}
```
在保单声明1中，`arn:aws:iam::111122223333:root`是指 Amazon Web Services 账户 111122223333的[Amazon 账户本金](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_principal.html#principal-accounts)。（这不是账户的根用户。） 默认情况下，当您使用创建新的 KMS 密钥或以编程方式创建新的 KMS 密钥但不提供密钥策略时 Amazon Web Services 管理控制台，密钥策略文档中会包含类似这样的策略声明。  
包含允许访问[账户中的 IAM 策略的声明的 Amazon Web Services 账户 密钥策略文档，允许访问 KMS 密钥](key-policy-default.md#key-policy-default-allow-root-enable-iam)。这意味着，即使账户中的用户和角色未在密钥策略文档中显式列为主体，也可以访问 KMS 密钥。请[仔细检查所有 Amazon Web Services 账户 列为委托人的所有 IAM 策略](determining-access-iam-policies.md)，以确定它们是否允许访问此 KMS 密钥。

**Example 策略语句 2**  

```
{
  "Sid": "Allow access for Key Administrators",
  "Effect": "Allow",
  "Principal": {"AWS": "arn:aws:iam::111122223333:role/KMSKeyAdmins"},
  "Action": [
    "kms:Describe*",
    "kms:Put*",
    "kms:Create*",
    "kms:Update*",
    "kms:Enable*",
    "kms:Revoke*",
    "kms:List*",
    "kms:Disable*",
    "kms:Get*",
    "kms:Delete*",
    "kms:ScheduleKeyDeletion",
    "kms:CancelKeyDeletion"
  ],
  "Resource": "*"
}
```
在政策声明 2 中，`arn:aws:iam::111122223333:role/KMSKeyAdmins`提及 Amazon Web Services 账户 111122223333 中名为 KMSKey Admins 的 IAM 角色。被授权代入该角色的用户被允许执行策略语句中列出的操作，即用于管理 KMS 密钥的管理操作。

**Example 策略语句 3**  

```
{
  "Sid": "Allow use of the key",
  "Effect": "Allow",
  "Principal": {"AWS": "arn:aws:iam::111122223333:role/EncryptionApp"},
  "Action": [
    "kms:DescribeKey",
    "kms:GenerateDataKey*",
    "kms:Encrypt",
    "kms:ReEncrypt*",
    "kms:Decrypt"
  ],
  "Resource": "*"
}
```
在政策声明 3 中，`arn:aws:iam::111122223333:role/EncryptionApp`指的是在 Amazon Web Services 账户 111122223333 EncryptionApp 中命名的 IAM 角色。被授权代入此角色的主体被允许执行策略语句中列出的操作，这包括对称加密 KMS 密钥的 [加密操作](kms-cryptography.md#cryptographic-operations)。

**Example 策略语句 4**  

```
{
  "Sid": "Allow attachment of persistent resources",
  "Effect": "Allow",
  "Principal": {"AWS": "arn:aws:iam::111122223333:role/EncryptionApp"},
  "Action": [
    "kms:ListGrants",
    "kms:CreateGrant",
    "kms:RevokeGrant"
  ],
  "Resource": "*",
  "Condition": {"Bool": {"kms:GrantIsForAWSResource": true}}
}
```
在政策声明 4 中，`arn:aws:iam::111122223333:role/EncryptionApp`指的是在 Amazon Web Services 账户 111122223333 EncryptionApp 中命名的 IAM 角色。被授权代入此角色的主体被允许执行策略语句中列出的操作。向大多数[与 Amazon KMS集成的Amazon 服务](service-integration.md)（特别是使用[授权](grants.md)的服务）委托 KMS 密钥使用权限时，都将需要将这些操作以及**示例策略语句 3** 中允许的操作结合使用。`Condition`元素中的 [kms: GrantIsFor AWSResource](conditions-kms.md#conditions-kms-grant-is-for-aws-resource) 值可确保只有当委托是与授权集成 Amazon KMS 并使用授权进行授权的 Amazon 服务时，才允许委托。

要了解可以在密钥策略文档中指定委托人的所有不同方法，请参阅 *IAM 用户指南*中的[指定委托人](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements.html#Principal_specifying)。

要了解有关 Amazon KMS 密钥策略的更多信息，请参阅[中的关键政策 Amazon KMS](key-policies.md)。

# 检查 IAM policy


除密钥策略和授权外，您还可以使用 [IAM policy](iam-policies.md) 来允许对 KMS 密钥的访问。有关 IAM policy 和密钥策略如何协同工作的更多信息，请参阅 [Amazon KMS 权限疑难解答](policy-evaluation.md)。

要确定当前可通过 IAM policy 访问 KMS 密钥的委托人，可以使用基于浏览器的 [IAM policy simulator](https://policysim.aws.amazon.com/) 工具，也可以向 IAM API 发出请求。

**Contents**
+ [

## 使用 IAM policy simulator 检查 IAM policy
](#determining-access-iam-policy-simulator)
+ [

## 使用 IAM API 检查 IAM policy
](#determining-access-iam-api)

## 使用 IAM policy simulator 检查 IAM policy


IAM policy simulator 有助于您了解哪些委托人可以通过 IAM policy 访问 KMS 密钥。

**使用 IAM policy simulator 确定对 KMS 密钥的访问权限**

1. 登录 Amazon Web Services 管理控制台 并打开 IAM 策略模拟器，网址为[https://policysim.aws.amazon.com/](https://policysim.aws.amazon.com/)。

1. 在**用户、组和角色**窗格中，选择您要模拟其策略的用户、组或角色。

1. (可选) 清除您要从模拟中忽略的任何策略旁边的复选框。要模拟所有策略，则将所有策略保持选中状态。

1. 在**策略模拟器**窗格中，执行以下操作：

   1. 对于**选择服务**，请选择 **Key Management Service**。

   1. 要模拟特定 Amazon KMS 动作，**请在 “选择动作”** 中选择要模拟的动作。要模拟所有 Amazon KMS 动作，**请选择 “全选”**。

1. （可选）默认情况下，策略模拟器会模拟对所有 KMS 密钥的访问。要模拟对特定 KMS 密钥的访问，请选择 **Simulation Settings**（模拟设置），然后键入要模拟的 KMS 密钥的 Amazon Resource Name (ARN)。

1. 选择 **Run Simulation (运行模拟)**。

您可以在**结果**部分查看模拟的结果。对 Amazon Web Services 账户中的每个用户、组和角色重复第 2 至 6 步。

## 使用 IAM API 检查 IAM policy


您可以使用 IAM API 以编程方式检查 IAM policy。以下步骤提供了如何执行该操作的一般概述：

1. 对于密钥策略中 Amazon Web Services 账户 列为委托人的每个用户（即按以下格式指定的每个[Amazon 账户委托人](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_principal.html#principal-accounts)：`"Principal": {"AWS": "arn:aws:iam::111122223333:root"}`），使用 IAM API 中的[ListUsers](https://docs.amazonaws.cn/IAM/latest/APIReference/API_ListUsers.html)和[ListRoles](https://docs.amazonaws.cn/IAM/latest/APIReference/API_ListRoles.html)操作获取账户中的所有用户和角色。

1. 对于列表中的每个用户和角色，使用 IAM API 中的[SimulatePrincipalPolicy](https://docs.amazonaws.cn/IAM/latest/APIReference/API_SimulatePrincipalPolicy.html)操作，传入以下参数：
   + 对于 `PolicySourceArn`，指定列表中用户或角色的 Amazon Resource Name (ARN)。您只能为每个 `SimulatePrincipalPolicy` 请求指定一个 `PolicySourceArn`，因此必须多次调用此操作，针对列表中的每个用户和角色分别调用一次。
   + 在`ActionNames`列表中，指定要模拟的每 Amazon KMS 个 API 操作。要模拟所有 Amazon KMS API 操作，请使用`kms:*`。要测试各个 Amazon KMS API 操作，请在每个 API 操作之前加上 `kms:` “”，例如 “`kms:ListKeys`”。有关 Amazon KMS API 操作的完整列表，请参阅《Amazon Key Management Service API 参考》中的 [操作](https://docs.amazonaws.cn/kms/latest/APIReference/API_Operations.html)**。
   + （可选）要确定用户或角色是否有权访问特定 KMS 密钥，请使用`ResourceArns`参数指定 KMS 密钥的 Amazon 资源名称 (ARNs) 列表。要确定用户或角色是否有权访问任何 KMS 密钥，请忽略 `ResourceArns` 参数。

IAM 通过以下评估决策来响应每个 `SimulatePrincipalPolicy` 请求：`allowed`、`explicitDeny` 或 `implicitDeny`。对于包含评估决策的每个响应`allowed`，该响应都包含允许的特定 Amazon KMS API 操作的名称。它还包括评估中使用的 KMS 密钥的 ARN（如果有）。

# 检查授予


授权是用于指定权限的高级机制，您或与之集成的 Amazon 服务 Amazon KMS 可以使用这些权限来指定如何以及何时使用 KMS 密钥。授权将附加到 KMS 密钥，每个授权都包含一位委托人，此委托人可获得使用 KMS 密钥和所允许的操作列表的权限。授权是密钥策略的替代方案，对特定的使用案例很有用。有关更多信息，请参阅 [补助金 Amazon KMS](grants.md)。

要获取 KMS 密钥的授权列表，请使用 Amazon KMS [ListGrants](https://docs.amazonaws.cn/kms/latest/APIReference/API_ListGrants.html)操作。您可以检查 KMS 密钥的授权来确定当前有权通过这些授权使用 KMS 密钥的对象。例如，下面是某个授权的 JSON 表示形式，此授权使用 [ 中的 ](https://docs.amazonaws.cn/cli/latest/reference/kms/list-grants.html)list-grants Amazon CLI命令获取。

```
{"Grants": [{
  "Operations": ["Decrypt"],
  "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
  "Name": "0d8aa621-43ef-4657-b29c-3752c41dc132",
  "RetiringPrincipal": "arn:aws:iam::123456789012:root",
  "GranteePrincipal": "arn:aws:sts::111122223333:assumed-role/aws:ec2-infrastructure/i-5d476fab",
  "GrantId": "dc716f53c93acacf291b1540de3e5a232b76256c83b2ecb22cdefa26576a2d3e",
  "IssuingAccount": "arn:aws:iam::111122223333:root",
  "CreationDate": 1.444151834E9,
  "Constraints": {"EncryptionContextSubset": {"aws:ebs:id": "vol-5cccfb4e"}}
}]}
```

要了解有权使用 KMS 密钥的对象，可查找 `"GranteePrincipal"` 元素。在上述示例中，被授权委托人是与 EC2 实例 i-5d476fab 关联的假设用户角色。EC2 基础设施使用此角色将加密的 EBS 卷 vol-5cccfb4e 附加到此实例。在此情况下，EC2 基础设施角色有权使用 KMS 密钥，因为您之前创建了受此 KMS 密钥保护的加密的 EBS 卷。之后，您将此卷附加到了 EC2 实例。

下面是 JSON 表示形式的另一个授权示例，此授权使用 [ 中的 ](https://docs.amazonaws.cn/cli/latest/reference/kms/list-grants.html)list-grants Amazon CLI命令获取。在以下示例中，被授予者委托人是另一个 Amazon Web Services 账户。

```
{"Grants": [{
  "Operations": ["Encrypt"],
  "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
  "Name": "",
  "GranteePrincipal": "arn:aws:iam::444455556666:root",
  "GrantId": "f271e8328717f8bde5d03f4981f06a6b3fc18bcae2da12ac38bd9186e7925d11",
  "IssuingAccount": "arn:aws:iam::111122223333:root",
  "CreationDate": 1.444151269E9
}]}
```

# 加密上下文


**注意**  
您不能在使用[非对称 KMS 密钥](symmetric-asymmetric.md)或 [HMAC KMS 密钥](hmac.md)的加密操作中指定加密上下文。非对称算法和 MAC 算法不支持加密上下文。

所有使用[对称加密 KMS 密钥的 Amazon KMS 加密](symm-asymm-choose-key-spec.md#symmetric-cmks)[操作](kms-cryptography.md#cryptographic-operations)都接受*加密上下文*，这是一组可选的非秘密密钥-值对，可以包含有关数据的其他上下文信息。您可以在中的`Encrypt`操作中插入加密上下文 Amazon KMS ，以增强 Amazon KMS API 解密调用的授权和可审计性。 Amazon KMS 使用加密上下文作为额外的身份验证数据 (AAD) 来支持经过身份验证的加密。加密上下文以加密方式绑定到加密文字，以便需要使用相同的加密上下文解密数据。

加密上下文不是密钥，且没有加密。它以明文显示在 [Amazon CloudTrail 日志](logging-using-cloudtrail.md)中，以便您可以使用它来标识和分类加密操作。您的加密上下文不应包含敏感信息。我们建议您的加密上下文描述正在加密或解密的数据。例如，在加密文件时，您可以将文件路径的一部分用作加密上下文。

```
"encryptionContext": {
    "department": "10103.0"
}
```

例如，在加密使用[亚马逊弹性块存储 (Amazon](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/AmazonEBS.html) EBS) [CreateSnapshot](https://docs.amazonaws.cn/AWSEC2/latest/APIReference/API_CreateSnapshot.html)操作创建的卷和快照时，Amazon EBS 使用卷 ID 作为加密上下文值。

```
"encryptionContext": {
  "aws:ebs:id": "vol-abcde12345abc1234"
}
```

您还可以使用加密上下文来优化或限制对您账户 Amazon KMS keys 的访问权限。您可以使用加密上下文[作为授权中的约束](grants.md)，以及作为*[策略语句中的条件](policy-conditions.md)*。加密上下文密钥及其值可以是包含 `aws` 的任意字符串。这些值与 [Amazon 生成的标签](https://docs.amazonaws.cn/tag-editor/latest/userguide/best-practices-and-strats.html#tag-conventions)（例如 [aws:cloudformation:stack-name](https://docs.amazonaws.cn/AWSCloudFormation/latest/TemplateReference/aws-properties-resource-tags.html)）截然不同。有关更多信息，请参阅 [kms:EncryptionContext: *上下文*密钥](conditions-kms.md#conditions-kms-encryption-context)。

要了解如何使用加密上下文来保护加密数据的完整性，请参阅 Amazon 安全博客 EncryptionContext上的 [“如何通过使用 Amazon Key Management Service 来保护加密数据的完整性](https://www.amazonaws.cn/blogs/security/how-to-protect-the-integrity-of-your-encrypted-data-by-using-aws-key-management-service-and-encryptioncontext/)” 一文。

## 加密上下文规则


Amazon KMS 对加密上下文密钥和值强制执行以下规则。
+ 加密上下文对中的键和值必须是简单的文本字符串。如果您使用其他类型（例如整数或浮点），则 Amazon KMS 会将它解释为字符串。
+ 加密上下文中的密钥和值可以包括 Unicode 字符。如果加密上下文包含密钥策略或 IAM policy 中不允许的字符，则您将无法在策略条件密钥中指定加密上下文，例如 [`kms:EncryptionContext:context-key`](conditions-kms.md#conditions-kms-encryption-context) 和 [`kms:EncryptionContextKeys`](conditions-kms.md#conditions-kms-encryption-context-keys)。有关密钥策略文档规则的详细信息，请参阅 [密钥策略格式](key-policy-overview.md#key-policy-format)。有关 IAM policy 档规则的详细信息，请参阅*《IAM 用户指南》*中的 [IAM 名称要求](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_iam-quotas.html#reference_iam-quotas-names)。

## 策略中的加密上下文


加密上下文主要用于验证完整性和真实性。但是，您也可以使用加密上下文来控制对密钥策略和 IAM policy 中对称加密 Amazon KMS keys 的访问。

仅当请求包含特定的加密上下文密[钥](conditions-kms.md#conditions-kms-encryption-context)或密钥值对时，k [ms:: 和 kms: EncryptionContextKeys](conditions-kms.md#conditions-kms-encryption-context) 条件密钥才允许（或拒绝）权限。EncryptionContext

例如，以下密钥策略语句允许 `RoleForExampleApp` 角色在 `Decrypt` 操作中使用 KMS 密钥。它使用 `kms:EncryptionContext:context-key` 条件键以仅在请求中的加密上下文包含 `AppName:ExampleApp` 加密上下文对时允许此权限。

```
{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/RoleForExampleApp"
  },
  "Action": "kms:Decrypt",
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "kms:EncryptionContext:AppName": "ExampleApp"
    }
  }
}
```

有关这些加密上下文条件键的更多信息，请参阅 [的条件键 Amazon KMS](policy-conditions.md)。

## 授权中的加密上下文


在[创建授权](grants.md)时，可以包括为[授予权限设定条件的授予约束](https://docs.amazonaws.cn/kms/latest/APIReference/API_GrantConstraints.html)。 Amazon KMS 支持两个授予限制`EncryptionContextSubset`，`EncryptionContextEquals`和，这两个限制都涉及[加密操作请求中的加密上下文](#encrypt_context)。在使用这些授权约束时，授权中的权限仅在加密操作请求中的加密上下文满足授权约束的要求时有效。

例如，您可以向`EncryptionContextEquals`授权添加允许该[GenerateDataKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKey.html)操作的授予约束。使用此约束时，授权仅在请求中的加密上下文与授权约束中的加密上下文大小写完全匹配时，允许操作。

```
$ aws kms create-grant \
    --key-id 1234abcd-12ab-34cd-56ef-1234567890ab \
    --grantee-principal arn:aws:iam::111122223333:user/exampleUser \
    --retiring-principal arn:aws:iam::111122223333:role/adminRole \
    --operations GenerateDataKey \
    --constraints EncryptionContextEquals={Purpose=Test}
```

来自被授予者委托人的以下请求将满足 `EncryptionContextEquals` 约束。

```
$ aws kms generate-data-key \
    --key-id 1234abcd-12ab-34cd-56ef-1234567890ab \
    --key-spec AES_256 \
    --encryption-context Purpose=Test
```

有关授权约束的详细信息，请参阅 [使用授权约束](create-grant-overview.md#grant-constraints)。有关授权的详细信息，请参阅 [补助金 Amazon KMS](grants.md)。

## 记录加密上下文


Amazon KMS 用于 Amazon CloudTrail 记录加密上下文，以便您可以确定已访问了哪些 KMS 密钥和数据。日志条目会准确显示哪些 KMS 密钥被用来加密或解密了由日志条目中的加密上下文引用的特定数据。

**重要**  
由于加密上下文会被记录，它不得包含敏感信息。

## 存储加密上下文


为了简化在调用 [https://docs.amazonaws.cn/kms/latest/APIReference/API_Decrypt.html](https://docs.amazonaws.cn/kms/latest/APIReference/API_Decrypt.html) 或 [https://docs.amazonaws.cn/kms/latest/APIReference/API_ReEncrypt.html](https://docs.amazonaws.cn/kms/latest/APIReference/API_ReEncrypt.html) 操作时任何加密上下文的使用，可以将加密上下文与加密数据存储在一起。我们建议您仅存储足够的加密上下文，以帮助您在需要用于加密或解密时创建完整的加密上下文。

例如，如果加密上下文是文件的完全限定路径，仅将该路径部分与加密文件内容存储在一起。然后，当您需要完整的加密上下文时，可以从存储的片段重建它。如果有人擅自改动文件，例如重命名或将其移动到其他位置，加密上下文值更改，解密请求将失败。

# 测试您的权限


要使用 Amazon KMS，您必须拥有 Amazon 可用于对您的 API 请求进行身份验证的凭证。此凭证必须包括访问 KMS 密钥和别名的权限。权限由密钥政策、IAM policy、授权和跨账户存取控制决定。除了控制对 KMS 密钥的访问外，您还可以控制对 CloudHSM 和自定义密钥存储的访问权限。

您可以指定 `DryRun` API 参数来确认您具有使用 Amazon KMS 密钥的所需权限。您还可以使用`DryRun`来验证 Amazon KMS API 调用中的请求参数指定是否正确。

**Topics**
+ [

## DryRun 参数是什么？
](#what-is-dryrun)
+ [

## 使用 API DryRun 进行指定
](#dryrun-api)

## DryRun 参数是什么？
什么是 DryRun？

 `DryRun` 是一个可选的 API 参数，您可以指定该参数来验证 Amazon KMS API 调用是否成功。在实际调用 Amazon KMS之前，请使用 `DryRun` 测试您的 API 调用。您可以验证如下内容。
+ 您具有使用 Amazon KMS 密钥的所需权限。
+ 您已正确指定调用中的参数。

Amazon KMS 支持在某些 API 操作中使用该`DryRun`参数：
+ [CreateGrant](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateGrant.html)
+ [Decrypt](https://docs.amazonaws.cn/kms/latest/APIReference/API_Decrypt.html)
+ [DeriveSharedSecret](https://docs.amazonaws.cn/kms/latest/APIReference/API_DeriveSharedSecret.html)
+ [Encrypt](https://docs.amazonaws.cn/kms/latest/APIReference/API_Encrypt.html)
+ [GenerateDataKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKey.html)
+ [GenerateDataKeyPair](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKeyPair.html)
+ [GenerateDataKeyPairWithoutPlaintext](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKeyPairWithoutPlaintext.html)
+ [GenerateDataKeyWithoutPlaintext](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKeyWithoutPlaintext.html)
+ [GenerateMac](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateMac.html)
+ [ReEncrypt](https://docs.amazonaws.cn/kms/latest/APIReference/API_ReEncrypt.html)
+ [RetireGrant](https://docs.amazonaws.cn/kms/latest/APIReference/API_RetireGrant.html)
+ [RevokeGrant](https://docs.amazonaws.cn/kms/latest/APIReference/API_RevokeGrant.html)
+ [Sign](https://docs.amazonaws.cn/kms/latest/APIReference/API_Sign.html)
+ [Verify](https://docs.amazonaws.cn/kms/latest/APIReference/API_Verify.html)
+ [VerifyMac](https://docs.amazonaws.cn/kms/latest/APIReference/API_VerifyMac.html)

使用 `DryRun` 参数将产生费用，并将按标准 API 请求计费。有关 Amazon KMS 定价的更多信息，请参阅[Amazon Key Management Service 定价](https://www.amazonaws.cn/kms/pricing/)。

 使用 `DryRun` 参数的所有 API 请求都适用于 API 的请求限额，如果您超过 API 请求限额，则可能会导致节流异常。例如，无论使用 `DryRun` 还是不使用 `DryRun` 调用 [Decrypt](https://docs.amazonaws.cn/kms/latest/APIReference/API_Decrypt.html)，都将计入相同的加密操作限额。请参阅 [限制请求 Amazon KMS](throttling.md)，了解更多信息。

对 Amazon KMS API 操作的每一次调用都被捕获为事件并记录在 Amazon CloudTrail 日志中。任何指定`DryRun`参数的操作的输出都会出现在您的 CloudTrail 日志中。有关更多信息，请参阅 [使用记录 Amazon KMS API 调用 Amazon CloudTrail](logging-using-cloudtrail.md)。

## 使用 API DryRun 进行指定


要使用`DryRun`，请在支持该`—dry-run`参数的 Amazon CLI 命令和 Amazon KMS API 调用中指定该参数。当你这样做时， Amazon KMS 将验证你的呼叫是否会成功。 Amazon KMS 使用的呼叫`DryRun`将始终失败并返回一条消息，其中包含有关呼叫失败原因的信息。消息可能包括以下例外情况：
+ `DryRunOperationException` ‐ 如果 `DryRun` 未指定，则请求会成功。
+ `ValidationException` ‐ 请求因指定错误的 API 参数而失败。
+ `AccessDeniedException` ‐ 您无权在 KMS 资源上执行指定的 API 操作。

例如，以下命令使用该[CreateGrant](https://docs.amazonaws.cn/kms/latest/APIReference/API_CreateGrant.html)操作并创建授权，允许有权担任该`keyUserRole`角色的用户[对指定的对称 KMS 密钥调用 Decry](symm-asymm-choose-key-spec.md#symmetric-cmks) [pt](https://docs.amazonaws.cn/kms/latest/APIReference/API_Decrypt.html) 操作。`DryRun` 参数已指定。

```
$  aws kms create-grant \
    --key-id 1234abcd-12ab-34cd-56ef-1234567890ab \
    --grantee-principal arn:aws:iam::111122223333:role/keyUserRole \
    --operations Decrypt \
    --dry-run
```

# Amazon KMS 权限疑难解答
<a name="security_iam_troubleshoot"></a>

在授权 KMS 密钥的访问权限时，需要 Amazon KMS 评估以下内容：
+ 附加到 KMS 密钥的[密钥策略](determining-access-key-policy.md)。密钥策略始终在拥有 KMS 密钥的 Amazon Web Services 账户 和区域中定义。
+ 附加到发出请求的用户或角色的所有 [IAM policy](determining-access-iam-policies.md)。管理委托人对 KMS 密钥的使用的 IAM policy 始终在委托人的 Amazon Web Services 账户中定义。
+ 应用于 KMS 密钥的所有[授权](determining-access-grants.md)。
+ 可能应用于请求以使用 KMS 密钥的其他类型的策略，例如 [Amazon Organizations 服务控制策略](https://docs.amazonaws.cn/organizations/latest/userguide/orgs_manage_policies_type-auth.html#orgs_manage_policies_scp)和 [VPC 终端节点策略](https://docs.amazonaws.cn/vpc/latest/privatelink/interface-endpoints.html#edit-vpc-endpoint-policy)。这些策略是可选的，并且在默认情况下允许执行所有操作，但您可以使用它们限制授予委托人的权限。

Amazon KMS 共同评估这些策略机制，以确定是允许还是拒绝对 KMS 密钥的访问。为此，请 Amazon KMS 使用类似于以下流程图中描述的过程。以下流程图提供策略评估流程的可视化表示。

![\[描述策略评估流程的流程图\]](http://docs.amazonaws.cn/kms/latest/developerguide/images/updated-kms-authz-diagram.png)


此流程图分为两个部分。这两个部分按顺序显示，但通常会同时对它们进行评估。
+ *使用授权*根据其密钥政策、IAM policy、授权和其他适用的策略来确定是否允许您使用 KMS 密钥。
+ *密钥信任*确定您是否应信任允许您使用的 KMS 密钥。一般而言，您信任自己的资源 Amazon Web Services 账户。但是， Amazon Web Services 账户 如果您的账户中的授权或 IAM 策略允许您使用 KMS 密钥，您也可以放心在其他方式中使用 KMS 密钥。

您可以使用此流程图了解为什么允许或拒绝向发起人授予使用 KMS 密钥的权限。您还可以使用它评估您的策略和授权。例如，此流程图显示某个调用方可能被显式 `DENY` 语句拒绝访问，或者由于在密钥政策、IAM policy 或授权中没有显式 `ALLOW` 语句而被拒绝访问。

流程图可以解释一些常见的许可方案。

**Topics**
+ [

## 示例 1：用户被拒绝访问其中的 KMS 密钥 Amazon Web Services 账户
](#example-no-iam)
+ [

## 示例 2：用户扮演角色并有权在其他地方使用 KMS 密钥 Amazon Web Services 账户
](#example-cross-acct)

## 示例 1：用户被拒绝访问其中的 KMS 密钥 Amazon Web Services 账户


Alice 是 11112 Amazon Web Services 账户 2223333 中的 IAM 用户。她被拒绝访问同一 Amazon Web Services 账户中的 KMS 密钥。为什么 Alice 无法使用 KMS 密钥？

在这种情况下，Alice 被拒绝访问该 KMS 密钥，因为没有密钥政策、IAM policy 或为她授予所需权限的授权。KMS 密钥的密钥策略允许使用 IAM 策略 Amazon Web Services 账户 来控制对 KMS 密钥的访问，但是没有 IAM 策略授予 Alice 使用 KMS 密钥的权限。

![\[描述策略评估流程的流程图\]](http://docs.amazonaws.cn/kms/latest/developerguide/images/kms-auth-flow-Alice.png)


考虑用于此示例的相关策略。
+ Alice 想要使用的 KMS 密钥具有[默认密钥策略](key-policy-default.md)。此政策[允许拥有 KMS 密钥的 Amazon Web Services 账户](key-policy-default.md#key-policy-default-allow-root-enable-iam) 使用 IAM policy 控制对 KMS 密钥的访问。此密钥政策满足流程图中的*密钥政策是否允许调用方账户使用 IAM policy 来控制对密钥的访问？*条件。

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

****  

  ```
  {
    "Version":"2012-10-17",		 	 	 
    "Id" : "key-test-1",
    "Statement" : [ {
      "Sid" : "DelegateToIAMPolicies",
      "Effect" : "Allow",
      "Principal" : {
        "AWS" : "arn:aws:iam::111122223333:root"
      },
      "Action" : "kms:*",
      "Resource" : "*"
    } ]
  }
  ```

------
+ 但是，没有任何密钥政策、IAM policy 或授权向 Alice 授予 KMS 密钥使用权限。因此，Alice 被拒绝使用 KMS 密钥的权限。

## 示例 2：用户扮演角色并有权在其他地方使用 KMS 密钥 Amazon Web Services 账户


Bob 是账户 1 (111122223333) 中的一个用户。他可以在[加密操作](kms-cryptography.md#cryptographic-operations)中使用账户 2 (444455556666) 中的 KMS 密钥。如何才能实现？

**提示**  
在评估跨账户权限时，请记住，密钥策略在 KMS 密钥的账户中指定。IAM policy 在调用方账户中指定，即使调用方使用的是不同的账户。有关提供对 KMS 密钥的跨账户访问的详细信息，请参阅 [允许其他账户中的用户使用 KMS 密钥](key-policy-modifying-external-accounts.md)。
+ 账户 2 中 KMS 密钥的密钥政策允许账户 2 使用 IAM policy 来控制对 KMS 密钥的访问。
+ 账户 2 中 KMS 密钥的密钥策略允许账户 1 在加密操作中使用 KMS 密钥。但是，账户 1 必须使用 IAM policy 授予其委托人对 KMS 密钥的访问权限。
+ 账户 1 中的 IAM policy 允许 `Engineering` 角色将账户 2 中的 KMS 密钥用于加密操作。
+ Bob 是账户 1 中的用户，有权限代入 `Engineering` 角色。
+ Bob 可以信任此 KMS 密钥，因为即使它不在他的账户中，他账户中的一个 IAM policy 也会向他授予使用此 KMS 密钥的显式权限。

![\[描述策略评估流程的流程图\]](http://docs.amazonaws.cn/kms/latest/developerguide/images/kms-auth-flow-Bob.png)


考虑一下 Bob（账户 1 中的用户）使用账户 2 中 KMS 密钥的策略。
+ KMS 密钥的密钥政策允许账户 2（444455556666，拥有 KMS 密钥的账户）使用 IAM policy 来控制对 KMS 密钥的访问。此密钥策略还允许账户 1 (111122223333) 在加密操作中使用 KMS 密钥（在策略语句的 `Action` 元素中指定）。但是，账户 1 中的任何人都无法使用账户 2 中的 KMS 密钥，直到账户 1 定义授权委托人访问 KMS 密钥的 IAM policy。

  在流程图中，账户 2 中的此密钥政策满足*密钥政策是否允许调用方账户使用 IAM policy 来控制对密钥的访问？*条件。

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

****  

  ```
  {
      "Id": "key-policy-acct-2",
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Sid": "PermissionUseIAMpolicies",
              "Effect": "Allow",
              "Principal": {
                  "AWS": "arn:aws:iam::444455556666:root"
              },
              "Action": "kms:*",
              "Resource": "*"
          },
          {
              "Sid": "AllowAccount1UseThisKMSKeys",
              "Effect": "Allow",
              "Principal": {
                  "AWS": "arn:aws:iam::111122223333:root"
              },
              "Action": [
                  "kms:Encrypt",
                  "kms:Decrypt",
                  "kms:ReEncryptFrom",
                  "kms:ReEncryptTo",
                  "kms:GenerateDataKey",
                  "kms:GenerateDataKeyWithoutPlaintext",
                  "kms:DescribeKey"
              ],
              "Resource": "*"
          }
      ]
  }
  ```

------
+ 调用方 Amazon Web Services 账户 （账户 1，111122223333）中的 IAM 策略授予委托人使用账户 2（444455556666）中的 KMS 密钥执行加密操作的权限。`Action` 元素向该委托人委派的权限与账户 2 中的密钥策略向账户 1 授予的权限相同。要将这些权限授予账户 1 中的 `Engineering` 角色，[将此内联策略嵌入](https://docs.amazonaws.cn/IAM/latest/APIReference/API_PutRolePolicy.html)到 `Engineering` 角色中。

  仅当账户 2 中的 KMS 密钥的密钥政策向账户 1 授予使用此 KMS 密钥的权限时，类似于此策略的跨账户 IAM policy 才有效。此外，账户 1 只能向其委托人授予执行此密钥策略已授予该账户的操作的权限。

  在流程图中，这满足 *IAM policy 是否允许调用方执行此操作？*条件。

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

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Action": [
                  "kms:Encrypt",
                  "kms:Decrypt",
                  "kms:ReEncryptFrom",
                  "kms:ReEncryptTo",
                  "kms:GenerateDataKey",
                  "kms:GenerateDataKeyWithoutPlaintext",
                  "kms:DescribeKey"
              ],
              "Resource": [
              "arn:aws:kms:us-west-2:444455556666:key/1234abcd-12ab-34cd-56ef-1234567890ab"
              ]
          }
      ]
  }
  ```

------
+ 最后一个必需元素是账户 1 中 `Engineering` 角色的定义。此角色中的 `AssumeRolePolicyDocument` 允许 Bob 代入 `Engineering` 角色。

  ```
  {
      "Role": {
          "Arn": "arn:aws:iam::111122223333:role/Engineering",
          "CreateDate": "2019-05-16T00:09:25Z",
          "AssumeRolePolicyDocument": {
              "Version": "2012-10-17",		 	 	 
              "Statement": {
                  "Principal": {
                      "AWS": "arn:aws:iam::111122223333:user/bob"
                  },
                  "Effect": "Allow",
                  "Action": "sts:AssumeRole"
              }
          },
          "Path": "/",
          "RoleName": "Engineering",
          "RoleId": "AROA4KJY2TU23Y7NK62MV"
      }
  }
  ```

# Amazon KMS 访问控制词汇表
术语表

以下主题描述了 Amazon KMS 访问控制中的重要术语和概念。

## 身份验证


*身份验证*是验证您的身份的过程。要向发送请求 Amazon KMS，您必须 Amazon 使用您的 Amazon 凭据登录。

## Authorization


*授权*提供发送创建、管理或使用 Amazon KMS 资源的请求的权限。例如，您必须获得授权才能在加密操作中使用 KMS 密钥。

要控制对 Amazon KMS 资源的访问权限，请使用[密钥策略](key-policies.md)、[IAM 策略](iam-policies.md)和[授权](grants.md)。每个 KMS 密钥都必须有一个密钥政策。如果密钥策略允许，您还可以使用 IAM policy 和授权来允许相关主体访问 KMS 密钥。要优化授权，您可以使用 [条件键](policy-conditions.md)，以仅在请求或资源满足您指定的条件时才允许或拒绝访问。您还可以向您信任的 [其他 Amazon Web Services 账户](key-policy-modifying-external-accounts.md) 中的主体授予访问权限。

## 使用身份进行身份验证


身份验证是您 Amazon 使用身份凭证登录的方式。您必须以 IAM 用户身份进行身份验证 Amazon Web Services 账户根用户，或者通过担任 IAM 角色进行身份验证。

对于编程访问， Amazon 提供 SDK 和 CLI 来对请求进行加密签名。有关更多信息，请参阅*《IAM 用户指南》*中的[适用于 API 请求的Amazon 签名版本 4](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_sigv.html)。

### Amazon Web Services 账户 root 用户


 创建时 Amazon Web Services 账户，首先会有一个名为 Amazon Web Services 账户 *root 用户的*登录身份，该身份可以完全访问所有资源 Amazon Web Services 服务 和资源。我们强烈建议不要使用根用户进行日常任务。有关需要根用户凭证的任务，请参阅《IAM 用户指南》**中的[需要根用户凭证的任务](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)。

### 联合身份


作为最佳实践，要求人类用户使用与身份提供商的联合身份验证才能 Amazon Web Services 服务 使用临时证书进行访问。

*联合身份是指*来自您的企业目录、Web 身份提供商的用户 Amazon Directory Service ，或者 Amazon Web Services 服务 使用来自身份源的凭据进行访问的用户。联合身份代入可提供临时凭证的角色。

### IAM 用户和群组


*[IAM 用户](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_users.html)*是对某个人员或应用程序具有特定权限的一个身份。建议使用临时凭证，而非具有长期凭证的 IAM 用户。有关更多信息，请参阅 *IAM 用户指南*[中的要求人类用户使用身份提供商的联合身份验证才能 Amazon 使用临时证书进行访问](https://docs.amazonaws.cn/IAM/latest/UserGuide/best-practices.html#bp-users-federation-idp)。

[https://docs.amazonaws.cn/IAM/latest/UserGuide/id_groups.html](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_groups.html)指定一组 IAM 用户，便于更轻松地对大量用户进行权限管理。有关更多信息，请参阅*《IAM 用户指南》*中的 [IAM 用户使用案例](https://docs.amazonaws.cn/IAM/latest/UserGuide/gs-identities-iam-users.html)。

### IAM 角色


*[IAM 角色](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles.html)*是具有特定权限的身份，可提供临时凭证。您可以通过[从用户切换到 IAM 角色（控制台）](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_use_switch-role-console.html)或调用 Amazon CLI 或 Amazon API 操作来代入角色。有关更多信息，请参阅《IAM 用户指南》**中的[担任角色的方法](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_manage-assume.html)。

IAM 角色对于联合用户访问、临时 IAM 用户权限、跨账户访问、跨服务访问以及在 Amazon EC2 上运行的应用程序非常有用。有关更多信息，请参阅《IAM 用户指南》**中的 [IAM 中的跨账户资源访问](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html)。

## 使用策略管理访问


您可以 Amazon 通过创建策略并将其附加到 Amazon 身份或资源来控制中的访问权限。策略定义了与身份或资源关联时的权限。 Amazon 在委托人提出请求时评估这些政策。大多数策略都以 JSON 文档的 Amazon 形式存储在中。有关 JSON 策略文档的更多信息，请参阅*《IAM 用户指南》*中的 [JSON 策略概述](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies.html#access_policies-json)。

管理员使用策略，通过定义哪个**主体**可以在什么**条件**下对哪些**资源**执行哪些**操作**来指定谁有权访问什么。

默认情况下，用户和角色没有权限。IAM 管理员创建 IAM 策略并将其添加到角色中，然后用户可以担任这些角色。IAM 策略定义权限，与执行操作所用的方法无关。

### 基于身份的策略


基于身份的策略是您附加到身份（用户、组或角色）的 JSON 权限策略文档。这些策略控制身份可以执行什么操作、对哪些资源执行以及在什么条件下执行。要了解如何创建基于身份的策略，请参阅《IAM 用户指南》**中的[使用客户管理型策略定义自定义 IAM 权限](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_create.html)。

基于身份的策略可以是*内联策略*（直接嵌入到单个身份中）或*托管策略*（附加到多个身份的独立策略）。要了解如何在托管策略和内联策略之间进行选择，请参阅*《IAM 用户指南》*中的[在托管策略与内联策略之间进行选择](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies-choosing-managed-or-inline.html)。

### 基于资源的策略


 Amazon KMS [密钥策略](key-policies.md)是一种基于资源的策略，用于控制对 KMS 密钥的访问。每个 KMS 密钥都必须有一个密钥政策。您可以使用其他授权机制来允许对 KMS 密钥的访问，但仅在密钥策略允许时才可以这样操作。（您可以使用 IAM policy *拒绝*对 KMS 密钥的访问，即使密钥策略未显式允许。）

基于资源的策略是附加到资源（如 KMS 密钥）的 JSON 策略文档，用于控制对该特定资源的访问。基于资源的策略定义了指定的主体可以对该资源执行的操作以及执行操作的条件。您无需在基于资源的策略中指定资源，但必须指定委托人，例如账户、用户、角色、联合用户或 Amazon Web Services 服务。基于资源的策略是位于管理该资源的服务中的内联策略。您不能在基于资源的策略中使用 Amazon IAM 中的[`AWSKeyManagementServicePowerUser`托管策略](security-iam-awsmanpol.md#security-iam-awsmanpol-AWSKeyManagementServicePowerUser)，例如托管策略。

### 其他策略类型


Amazon 支持其他策略类型，这些策略类型可以设置更常见的策略类型授予的最大权限：
+ **权限边界** – 设置基于身份的策略可以授予 IAM 实体的最大权限。有关更多信息，请参阅《 IAM 用户指南》**中的 [IAM 实体的权限边界](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_boundaries.html)。
+ **服务控制策略 (SCPs)**-在中指定组织或组织单位的最大权限 Amazon Organizations。有关更多信息，请参阅《Amazon Organizations 用户指南》**中的[服务控制策略](https://docs.amazonaws.cn/organizations/latest/userguide/orgs_manage_policies_scps.html)。
+ **资源控制策略 (RCPs)**-设置账户中资源的最大可用权限。有关更多信息，请参阅《*Amazon Organizations 用户指南》*中的[资源控制策略 (RCPs)](https://docs.amazonaws.cn/organizations/latest/userguide/orgs_manage_policies_rcps.html)。
+ **会话策略** – 在为角色或联合用户创建临时会话时，作为参数传递的高级策略。有关更多信息，请参阅《IAM 用户指南》**中的[会话策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies.html#policies_session)。

### 多个策略类型


当多个类型的策略应用于一个请求时，生成的权限更加复杂和难以理解。要了解在涉及多种策略类型时如何 Amazon 确定是否允许请求，请参阅 *IAM 用户指南*中的[策略评估逻辑](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_evaluation-logic.html)。

## Amazon KMS 资源


在中 Amazon KMS，主要资源是 Amazon KMS key。 Amazon KMS 还支持[别名](kms-alias.md)，这是一种为 KMS 密钥提供友好名称的独立资源。某些 Amazon KMS 操作允许您使用别名来标识 KMS 密钥。

KMS 密钥或别名的每个实例均具有标准格式的唯一 [Amazon Resource Name](https://docs.amazonaws.cn/general/latest/gr/aws-arns-and-namespaces.html#arns-syntax) (ARN)。在 Amazon KMS 资源中， Amazon 服务名称为`kms`。
+ **Amazon KMS key**

  ARN 格式：

  `arn:Amazon partition name:Amazon service name:Amazon Web Services 区域:Amazon Web Services 账户 ID:key/key ID`

  示例 ARN:

  `arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab`
+ **别名**

  ARN 格式：

  `arn:Amazon partition name:Amazon service name:Amazon Web Services 区域:Amazon Web Services 账户 ID:alias/alias name`

  示例 ARN:

  `arn:aws:kms:us-west-2:111122223333:alias/example-alias`

Amazon KMS 提供了一组 API 操作来使用您的 Amazon KMS 资源。有关在 Amazon Web Services 管理控制台 和 Amazon KMS API 操作中识别 KMS 密钥的更多信息，请参阅[密钥标识符 (KeyId)](concepts.md#key-id)。有关 Amazon KMS 操作列表，请参阅 [Amazon Key Management Service API 参考](https://docs.amazonaws.cn/kms/latest/APIReference/)。