

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 判斷對 的存取 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 政策](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 政策控制 KMS 金鑰的存取。此外，如果金鑰政策授權[另一個 AWS 帳戶](key-policy-modifying-external-accounts.md) 使用 KMS 金鑰，則外部帳戶的 IAM 管理員可以使用 IAM 政策委派這些許可。請[檢查 IAM 政策](determining-access-iam-policies.md)，以判斷可存取 KMS 金鑰之主體的完整清單。

若要檢視 AWS KMS [客戶受管金鑰](concepts.md#customer-mgn-key)或[AWS 受管金鑰](concepts.md#aws-managed-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`效果的政策陳述 AWS 帳戶 式中，IAM 使用者、IAM 角色和 `Principal`元素中的 可以存取此 KMS 金鑰。

**注意**  
除非採用[條件](policy-conditions.md)來限制金鑰政策，否則請勿在任何允許許可的金鑰政策陳述式將主體設為星號 (\$1)。除非另一個政策陳述式明確拒絕，否則星號會提供每個 AWS 帳戶 許可中的每個身分使用 KMS 金鑰。其他 中的使用者只要在自己的帳戶中擁有對應的許可， 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 管理主控台，金鑰政策文件中會包含像這樣的政策陳述式。  
金鑰政策文件具有允許存取 的陳述式， AWS 帳戶 可讓[帳戶中的 IAM 政策允許存取 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`是指名為 KMSKeyAdmins in AWS 帳戶 111122223333 的 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`是指名為 EncryptionApp in AWS 帳戶 111122223333 的 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`是指名為 EncryptionApp in AWS 帳戶 111122223333 的 IAM 角色。被授權擔任此角色的主體能夠執行政策陳述式中所列的動作。當這些動作結合**範例政策陳述式 3** 中允許的動作時，是委派 KMS 金鑰的使用給大部分[與 AWS KMS整合的AWS 服務](service-integration.md) (尤其是使用[授予](grants.md)的服務) 的必要動作。`Condition` 元素中的 [kms:GrantIsForAWSResource](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)》中的 *Specifying a Principal* (指定主體)。

若要進一步了解 AWS KMS 金鑰政策，請參閱 [中的金鑰政策 AWS KMS](key-policies.md)。

# 檢查 IAM 政策
<a name="determining-access-iam-policies"></a>

除了金鑰政策和授予之外，您也可以使用 [IAM 政策](iam-policies.md)，以允許存取 KMS 金鑰。如需金鑰政策與 IAM 政策如何同時運作的相關資訊，請參閱 [故障診斷 AWS KMS 許可](policy-evaluation.md)。

若要判斷哪些主體目前可透過 IAM 政策存取 KMS 金鑰，您可以使用以瀏覽器為基礎的 [IAM 政策模擬器](https://policysim.aws.amazon.com/)工具，或者可以提出請求至 IAM API。

**Contents**
+ [使用 IAM 政策模擬器來檢查 IAM 政策](#determining-access-iam-policy-simulator)
+ [使用 IAM API 檢查 IAM 政策](#determining-access-iam-api)

## 使用 IAM 政策模擬器來檢查 IAM 政策
<a name="determining-access-iam-policy-simulator"></a>

IAM 政策模擬器可協助您了解哪些原則有權限透過 IAM 政策來存取 KMS 金鑰。

**若要使用 IAM 政策模擬器來以判斷是否可存取 KMS 金鑰**

1. 登入 ， AWS 管理主控台 然後在 開啟 IAM 政策模擬器[https://policysim.aws.amazon.com/](https://policysim.aws.amazon.com/)。

1. 在**使用者、群組和角色**窗格，選擇您想要模擬所屬政策的使用者、群組或角色。

1. (選用) 清除任何您想要從模擬中刪除的政策旁的核取方塊。若要模擬所有政策，請保持勾選所有政策。

1. 在 **Policy Simulator** (政策模擬器) 窗格中，執行下列動作：

   1. 在 **Select service (選取服務)** 中，選擇 **Key Management Service (金鑰管理服務)**。

   1. 若要模擬特定 AWS KMS 動作，請在**選取動作**中選擇要模擬的動作。若要模擬所有 AWS KMS 動作，請選擇**全選**。

1. (選用) 政策模擬器根據預設將模擬所有對 KMS 金鑰的存取。若要模擬存取特定 KMS 金鑰，請選擇 **Simulation Settings (模擬設定)**，接著輸入要模擬之 KMS 金鑰的 Amazon Resource Name (ARN)。

1. 選擇 **Run Simulation (執行模擬)**。

您可在 **Results** (結果) 部分查看模擬結果。對於 AWS 帳戶中的每個 IAM 使用者、群組和角色，請重複步驟 2 到步驟 6。

## 使用 IAM API 檢查 IAM 政策
<a name="determining-access-iam-api"></a>

您可以使用 IAM API 來以程式設計方式檢查 IAM 政策。以下步驟提供執行此操作方法的一般概述：

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 Resource Name (ARN) 清單。若要判斷使用者或角色是否可以存取任何 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 金鑰的存取權。例如，以下是從 AWS CLI中 [list-grants](https://docs.aws.amazon.com/cli/latest/reference/kms/list-grants.html) 命令取得的 JSON 授予表示。

```
{"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 執行個體。

以下是從 AWS CLI中 [list-grants](https://docs.aws.amazon.com/cli/latest/reference/kms/list-grants.html) 命令取得的另一個範例 JSON 授予表示。在下列範例中，承授者委託人是另一個 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
}]}
```