

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

# 确定访问权限 AWS KMS keys
<a name="determining-access"></a>

要确定当前谁或什么可以访问的全部范围 AWS KMS key，您必须检查 KMS 密钥的密钥策略、适用于 KMS 密钥的所有[授权](grants.md)，以及可能的所有 AWS Identity and Access Management (IAM) 策略。您可以执行该操作来确定 KMS 密钥的潜在使用范围或帮助您满足合规性或审计要求。以下主题有助于您生成当前有权访问 KMS 密钥的 AWS 委托人（身份）的完整列表。

**Topics**
+ [

# 检查密钥策略
](determining-access-key-policy.md)
+ [

# 检查 IAM policy
](determining-access-iam-policies.md)
+ [

# 检查授予
](determining-access-grants.md)

# 检查密钥策略
<a name="determining-access-key-policy"></a>

[密钥策略](key-policies.md)是控制对 KMS 密钥访问的主要方法。每个 KMS 密钥都有且只有一个密钥策略。

如果密钥策略由[默认密钥策略](key-policy-default.md#key-policy-default-allow-root-enable-iam)组成或包含默认密钥策略，则密钥策略允许账户中的 IAM 管理员使用 IAM policy 控制对 KMS 密钥的访问。此外，如果密钥策略赋予[其他 AWS 账户](key-policy-modifying-external-accounts.md) 使用 KMS 密钥的权限，则外部账户中的 IAM 管理员可以使用 IAM policy 委派这些权限。要确定可访问 KMS 密钥的委托人的完整列表，[请检查 IAM policy](determining-access-iam-policies.md)。

要查看 AWS KMS [客户托管密钥或您账户[AWS 托管式密钥](concepts.md#aws-managed-key)中的密钥](concepts.md#customer-mgn-key)政策，请在 AWS KMS API 中使用 AWS 管理控制台 或[GetKeyPolicy](https://docs.aws.amazon.com/kms/latest/APIReference/API_GetKeyPolicy.html)操作。要查看密钥策略，必须对 KMS 密钥具备 `kms:GetKeyPolicy` 权限。有关查看 KMS 密钥的密钥策略的说明，请参阅 [查看密钥政策](key-policy-viewing.md)。

检查密钥策略文档，并记下每个策略语句的 `Principal` 元素中指定的所有委托人。在`Allow`生效的策略声明中，IAM 用户、IAM 角色以及`Principal`元素 AWS 账户 中的角色有权访问此 KMS 密钥。

**注意**  
除非您使用[条件](policy-conditions.md)限制密钥政策，否则不要在允许权限的任何密钥政策语句将主体设置为星号（\$1）。星号赋予每个身份使用 KMS 密钥的 AWS 账户 权限，除非其他策略声明明确拒绝。其他用户只要在自己的账户中拥有相应权限，就 AWS 账户 可以使用您的 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`是指 AWS 账户 111122223333的[AWS 账户本金](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html#principal-accounts)。（这不是账户的根用户。） 默认情况下，当您使用创建新的 KMS 密钥或以编程方式创建新的 KMS 密钥但不提供密钥策略时 AWS 管理控制台，密钥策略文档中会包含类似这样的策略声明。  
包含允许访问[账户中的 IAM 策略的声明的 AWS 账户 密钥策略文档，允许访问 KMS 密钥](key-policy-default.md#key-policy-default-allow-root-enable-iam)。这意味着，即使账户中的用户和角色未在密钥策略文档中显式列为主体，也可以访问 KMS 密钥。请[仔细检查所有 AWS 账户 列为委托人的所有 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`提及 AWS 账户 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`指的是在 AWS 账户 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`指的是在 AWS 账户 111122223333 EncryptionApp 中命名的 IAM 角色。被授权代入此角色的主体被允许执行策略语句中列出的操作。向大多数[与 AWS KMS集成的AWS 服务](service-integration.md)（特别是使用[授权](grants.md)的服务）委托 KMS 密钥使用权限时，都将需要将这些操作以及**示例策略语句 3** 中允许的操作结合使用。`Condition`元素中的 [kms: GrantIsFor AWSResource](conditions-kms.md#conditions-kms-grant-is-for-aws-resource) 值可确保只有当委托是与授权集成 AWS KMS 并使用授权进行授权的 AWS 服务时，才允许委托。

要了解可以在密钥策略文档中指定委托人的所有不同方法，请参阅 *IAM 用户指南*中的[指定委托人](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html#Principal_specifying)。

要了解有关 AWS KMS 密钥策略的更多信息，请参阅[中的关键政策 AWS KMS](key-policies.md)。

# 检查 IAM policy
<a name="determining-access-iam-policies"></a>

除密钥策略和授权外，您还可以使用 [IAM policy](iam-policies.md) 来允许对 KMS 密钥的访问。有关 IAM policy 和密钥策略如何协同工作的更多信息，请参阅 [AWS 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
<a name="determining-access-iam-policy-simulator"></a>

IAM policy simulator 有助于您了解哪些委托人可以通过 IAM policy 访问 KMS 密钥。

**使用 IAM policy simulator 确定对 KMS 密钥的访问权限**

1. 登录 AWS 管理控制台 并打开 IAM 策略模拟器，网址为[https://policysim.aws.amazon.com/](https://policysim.aws.amazon.com/)。

1. 在**用户、组和角色**窗格中，选择您要模拟其策略的用户、组或角色。

1. (可选) 清除您要从模拟中忽略的任何策略旁边的复选框。要模拟所有策略，则将所有策略保持选中状态。

1. 在**策略模拟器**窗格中，执行以下操作：

   1. 对于**选择服务**，请选择 **Key Management Service**。

   1. 要模拟特定 AWS KMS 动作，**请在 “选择动作”** 中选择要模拟的动作。要模拟所有 AWS KMS 动作，**请选择 “全选”**。

1. （可选）默认情况下，策略模拟器会模拟对所有 KMS 密钥的访问。要模拟对特定 KMS 密钥的访问，请选择 **Simulation Settings**（模拟设置），然后键入要模拟的 KMS 密钥的 Amazon Resource Name (ARN)。

1. 选择 **Run Simulation (运行模拟)**。

您可以在**结果**部分查看模拟的结果。对 AWS 账户中的每个用户、组和角色重复第 2 至 6 步。

## 使用 IAM API 检查 IAM policy
<a name="determining-access-iam-api"></a>

您可以使用 IAM API 以编程方式检查 IAM policy。以下步骤提供了如何执行该操作的一般概述：

1. 对于密钥策略中 AWS 账户 列为委托人的每个用户（即按以下格式指定的每个[AWS 账户委托人](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html#principal-accounts)：`"Principal": {"AWS": "arn:aws:iam::111122223333:root"}`），使用 IAM API 中的[ListUsers](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListUsers.html)和[ListRoles](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListRoles.html)操作获取账户中的所有用户和角色。

1. 对于列表中的每个用户和角色，使用 IAM API 中的[SimulatePrincipalPolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_SimulatePrincipalPolicy.html)操作，传入以下参数：
   + 对于 `PolicySourceArn`，指定列表中用户或角色的 Amazon Resource Name (ARN)。您只能为每个 `SimulatePrincipalPolicy` 请求指定一个 `PolicySourceArn`，因此必须多次调用此操作，针对列表中的每个用户和角色分别调用一次。
   + 在`ActionNames`列表中，指定要模拟的每 AWS KMS 个 API 操作。要模拟所有 AWS KMS API 操作，请使用`kms:*`。要测试各个 AWS KMS API 操作，请在每个 API 操作之前加上 `kms:` “”，例如 “`kms:ListKeys`”。有关 AWS KMS API 操作的完整列表，请参阅《AWS Key Management Service API 参考》中的 [操作](https://docs.aws.amazon.com/kms/latest/APIReference/API_Operations.html)**。
   + （可选）要确定用户或角色是否有权访问特定 KMS 密钥，请使用`ResourceArns`参数指定 KMS 密钥的 Amazon 资源名称 (ARNs) 列表。要确定用户或角色是否有权访问任何 KMS 密钥，请忽略 `ResourceArns` 参数。

IAM 通过以下评估决策来响应每个 `SimulatePrincipalPolicy` 请求：`allowed`、`explicitDeny` 或 `implicitDeny`。对于包含评估决策的每个响应`allowed`，该响应都包含允许的特定 AWS KMS API 操作的名称。它还包括评估中使用的 KMS 密钥的 ARN（如果有）。

# 检查授予
<a name="determining-access-grants"></a>

授权是用于指定权限的高级机制，您或与之集成的 AWS 服务 AWS KMS 可以使用这些权限来指定如何以及何时使用 KMS 密钥。授权将附加到 KMS 密钥，每个授权都包含一位委托人，此委托人可获得使用 KMS 密钥和所允许的操作列表的权限。授权是密钥策略的替代方案，对特定的使用案例很有用。有关更多信息，请参阅 [补助金 AWS KMS](grants.md)。

要获取 KMS 密钥的授权列表，请使用 AWS KMS [ListGrants](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListGrants.html)操作。您可以检查 KMS 密钥的授权来确定当前有权通过这些授权使用 KMS 密钥的对象。例如，下面是某个授权的 JSON 表示形式，此授权使用 [ 中的 ](https://docs.aws.amazon.com/cli/latest/reference/kms/list-grants.html)list-grants AWS 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.aws.amazon.com/cli/latest/reference/kms/list-grants.html)list-grants AWS CLI命令获取。在以下示例中，被授予者委托人是另一个 AWS 账户。

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