

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

# Amazon KMS 条件键
<a name="conditions-kms"></a>

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
<a name="conditions-kms-bypass-policy-lockout-safety-check"></a>


| 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
<a name="conditions-kms-caller-account"></a>


| 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 （已弃用）
<a name="conditions-kms-key-spec-replaced"></a>

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

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

## kms:CustomerMasterKeyUsage （已弃用）
<a name="conditions-kms-key-usage-replaced"></a>

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

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

## kms: DataKeyPairSpec
<a name="conditions-kms-data-key-spec"></a>


| 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
<a name="conditions-kms-encryption-algorithm"></a>


| 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: *上下文*密钥
<a name="conditions-kms-encryption-context"></a>


| 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"
    }
  }
}
```

### 使用多个加密上下文对
<a name="conditions-kms-encryption-context-many"></a>

您可以要求或禁止多个加密上下文对。您还可以要求几个加密上下文对之一。有关用于解释这些条件的逻辑的详细信息，请参阅 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"
      ] 
    }
  }
}
```

### 加密上下文条件区分大小写
<a name="conditions-kms-encryption-context-case"></a>

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

但是，在策略条件中，条件键不区分大小写。条件值是否区分大小写由您使用的[策略条件运算符](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"
    }
  }
}
```

### 在加密上下文条件中使用变量
<a name="conditions-kms-encryption-context-variables"></a>

加密上下文对中的键和值必须是简单的文本字符串。它们不能是整数或对象，也不能是任何未完全解析的类型。如果您使用其他类型，例如整数或浮点数，则将其 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
<a name="conditions-kms-encryption-context-keys"></a>


| 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
<a name="conditions-kms-expiration-model"></a>


| 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
<a name="conditions-kms-grant-constraint-type"></a>


| 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
<a name="conditions-kms-grant-is-for-aws-resource"></a>


| 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
<a name="conditions-kms-grant-operations"></a>


| 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
<a name="conditions-kms-grantee-principal"></a>


| 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
<a name="conditions-kms-key-agreement-algorithm"></a>


| 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
<a name="conditions-kms-key-origin"></a>


| 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
<a name="conditions-kms-key-spec"></a>


| 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
<a name="conditions-kms-key-usage"></a>


| 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
<a name="conditions-kms-mac-algorithm"></a>


| 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
<a name="conditions-kms-message-type"></a>


| 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
<a name="conditions-kms-multiregion"></a>


| 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
<a name="conditions-kms-multiregion-key-type"></a>


| 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
<a name="conditions-kms-primary-region"></a>


| 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
<a name="conditions-kms-reencrypt-on-same-key"></a>


| 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
<a name="conditions-kms-request-alias"></a>


| 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
<a name="conditions-kms-resource-aliases"></a>


| 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
<a name="conditions-kms-replica-region"></a>


| 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
<a name="conditions-kms-retiring-principal"></a>


| 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
<a name="conditions-kms-rotation-period-in-days"></a>


| 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
<a name="conditions-kms-schedule-key-deletion-pending-window-in-days"></a>


| 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
<a name="conditions-kms-signing-algorithm"></a>


| 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
<a name="conditions-kms-valid-to"></a>


| 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
<a name="conditions-kms-via-service"></a>


| 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` 条件键的服务
<a name="viaService_table"></a>

下表列出了 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
<a name="conditions-kms-wrapping-algorithm"></a>


| 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
<a name="conditions-kms-wrapping-key-spec"></a>


| 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)