

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

# 故障診斷 AWS KMS 許可
<a name="policy-evaluation"></a><a name="security_iam_troubleshoot"></a>

授權存取 KMS 金鑰時， 會 AWS KMS 評估下列項目：
+ 連接到 KMS 金鑰的[金鑰政策](determining-access-key-policy.md)。金鑰政策一律在擁有 KMS 金鑰的 AWS 帳戶 和 區域中定義。
+ 連接到提出請求的使用者或角色的所有 [IAM 政策](determining-access-iam-policies.md)。管理主體使用 KMS 金鑰的 IAM 政策一律在主體的 AWS 帳戶中定義。
+ 適用於 KMS 金鑰的所有[授予](determining-access-grants.md)。
+ 其他可能套用至使用 KMS 金鑰之請求的政策類型，例如 [AWS Organizations 服務控制政策](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_type-auth.html#orgs_manage_policies_scp)和 [VPC 端點政策](https://docs.aws.amazon.com/vpc/latest/privatelink/interface-endpoints.html#edit-vpc-endpoint-policy)。這些政策是選用的，依預設允許所有動作，但您可以使用其來限制許可，否則會將許可授予主體。

AWS KMS 會一起評估這些政策機制，以判斷是否允許或拒絕存取 KMS 金鑰。若要這樣做， AWS KMS 會使用類似下列流程圖中描述的程序。以下流程圖提供政策評估程序的視覺化呈現。

![\[描述政策評估程序的流程圖\]](http://docs.aws.amazon.com/zh_tw/kms/latest/developerguide/images/updated-kms-authz-diagram.png)


此流程圖分為兩個部分。這兩個部分應有其先後順序，但評估通常會同時進行。
+ *使用授權*可根據其金鑰政策、IAM 政策、授予和其他適用政策決定是否允許您使用 KMS 金鑰。
+ *金鑰信任*會決定您是否應信任您被允許使用的 KMS 金鑰。一般而言，您會信任 中的資源 AWS 帳戶。但是， AWS 帳戶 如果您帳戶中的授予或 IAM 政策允許您使用 KMS 金鑰，您也可以放心在不同的 中使用 KMS 金鑰。

您可以使用此流程圖來探索呼叫者被允許或拒絕使用 KMS 金鑰許可的原因。您也可以使用它來評估政策和授予。例如，流程圖會顯示呼叫者的存取被拒絕可能是由於明確 `DENY` 陳述式或金鑰政策、IAM 政策或授予中缺少明確 `ALLOW` 陳述式。

流程圖可以說明一些常見許可案例。

**Topics**
+ [範例 1：拒絕使用者存取其 中的 KMS 金鑰 AWS 帳戶](#example-no-iam)
+ [範例 2：使用者擔任的角色具有在不同 中使用 KMS 金鑰的許可 AWS 帳戶](#example-cross-acct)

## 範例 1：拒絕使用者存取其 中的 KMS 金鑰 AWS 帳戶
<a name="example-no-iam"></a>

Alice 是 111122223333 AWS 帳戶中的 IAM 使用者。她被拒絕存取同一個 AWS 帳戶中的 KMS 金鑰。為什麼 Alice 無法使用 KMS 金鑰？

在此案例中，Alice 對 KMS 金鑰的存取遭拒，因為沒有賦予她必要許可的金鑰政策、IAM 政策或授予。KMS 金鑰的金鑰政策允許 AWS 帳戶 使用 IAM 政策來控制對 KMS 金鑰的存取，但沒有 IAM 政策會授予 Alice 使用 KMS 金鑰的許可。

![\[描述政策評估程序的流程圖\]](http://docs.aws.amazon.com/zh_tw/kms/latest/developerguide/images/kms-auth-flow-Alice.png)


請考量此範例的相關政策。
+ Alice 想要使用的 KMS 金鑰具有[預設金鑰政策](key-policy-default.md)。本政策[允許擁有 KMS 金鑰的 AWS 帳戶](key-policy-default.md#key-policy-default-allow-root-enable-iam)，以使用 IAM 政策控制對 KMS 金鑰的存取。此金鑰政策符合流程圖中的*金鑰政策是否允許呼叫者帳戶使用 IAM 政策來控制對金鑰的存取？*條件。

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

****  

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

------
+ 不過，沒有可賦予 Alice 使用 KMS 金鑰之許可的金鑰政策、IAM 政策或授予。因此，Alice 使用 KMS 金鑰的許可遭拒。

## 範例 2：使用者擔任的角色具有在不同 中使用 KMS 金鑰的許可 AWS 帳戶
<a name="example-cross-acct"></a>

Bob 是帳戶 1 (111122223333) 的使用者。他獲准在[密碼編譯操作](kms-cryptography.md#cryptographic-operations)中使用帳戶 2 (444455556666) 中的 KMS 金鑰。如何實現？

**提示**  
評估跨帳戶許可時，請記住，金鑰政策已於 KMS 金鑰的帳戶中指定。在呼叫者帳戶中指定 IAM 政策，即使呼叫者位於不同帳戶中。如需提供跨帳戶存取 KMS 金鑰的詳細資訊，請參閱 [允許其他帳戶中的使用者使用 KMS 金鑰](key-policy-modifying-external-accounts.md)。
+ 帳戶 2 中 KMS 金鑰的金鑰政策允許帳戶 2 使用 IAM 政策來控制對 KMS 金鑰的存取。
+ 帳戶 2 中 KMS 金鑰的金鑰政策允許帳戶 1 在密碼編譯操作中使用 KMS 金鑰。不過，帳戶 1 必須使用 IAM 政策賦予其主體存取 KMS 金鑰的權限。
+ 帳戶 1 中的 IAM 政策允許 `Engineering` 角色使用帳戶 2 的 KMS 金鑰進行密碼編譯操作。
+ Bob (帳戶 1 的使用者) 具有採用 `Engineering` 角色的許可。
+ Bob 可以信任此 KMS 金鑰，因為即使它不在他的帳戶中，他帳戶中的 IAM 政策可為他提供此 KMS 金鑰的明確使用許可。

![\[描述政策評估程序的流程圖\]](http://docs.aws.amazon.com/zh_tw/kms/latest/developerguide/images/kms-auth-flow-Bob.png)


讓我們看看可讓 Bob (帳戶 1 的使用者) 使用帳戶 2 中 KMS 金鑰的政策。
+ KMS 金鑰的金鑰政策允許帳戶 2 (444455556666，擁有 KMS 金鑰的帳戶) 使用 IAM 政策來控制對 KMS 金鑰的存取。此金鑰政策也允許帳戶 1 (111122223333) 在密碼編譯操作中使用 KMS 金鑰 (在政策陳述式的 `Action` 元素中指定)。不過，在帳戶 1 定義可賦予主體存取 KMS 金鑰的 IAM 政策前，帳戶 1 中沒有人可以使用帳戶 2 的 KMS 金鑰。

  在流程圖中，帳戶 2 的此金鑰政策符合金鑰政策*是否允許呼叫者帳戶使用 IAM 政策來控制對金鑰的存取？*條件。

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

****  

  ```
  {
      "Id": "key-policy-acct-2",
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Sid": "PermissionUseIAMpolicies",
              "Effect": "Allow",
              "Principal": {
                  "AWS": "arn:aws:iam::444455556666:root"
              },
              "Action": "kms:*",
              "Resource": "*"
          },
          {
              "Sid": "AllowAccount1UseThisKMSKeys",
              "Effect": "Allow",
              "Principal": {
                  "AWS": "arn:aws:iam::111122223333:root"
              },
              "Action": [
                  "kms:Encrypt",
                  "kms:Decrypt",
                  "kms:ReEncryptFrom",
                  "kms:ReEncryptTo",
                  "kms:GenerateDataKey",
                  "kms:GenerateDataKeyWithoutPlaintext",
                  "kms:DescribeKey"
              ],
              "Resource": "*"
          }
      ]
  }
  ```

------
+ 發起人 AWS 帳戶 （帳戶 1，111122223333) 中的 IAM 政策授予委託人使用帳戶 2 ((444455556666) 中的 KMS 金鑰執行密碼編譯操作的許可。`Action` 元素為主體指派了與帳戶 2 中金鑰政策提供給帳戶 1 相同的許可。若要將這些許可提供給帳戶 1 中的 `Engineering` 角色，[此內嵌政策會內嵌於](https://docs.aws.amazon.com/IAM/latest/APIReference/API_PutRolePolicy.html) `Engineering` 角色。

  只有在帳戶 2 中 KMS 金鑰的金鑰政策賦予帳戶 1 使用 KMS 金鑰的許可時，這類的跨帳戶 IAM 政策才有效。此外，帳戶 1 賦予其主體執行動作的許可僅限金鑰政策賦予該帳戶的許可。

  在流程圖中，這可符合 *IAM 政策是否允許呼叫者執行此動作？*條件。

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

****  

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

------
+ 最後一個必要元素是帳戶 1 中 `Engineering` 角色的定義。該角色的 `AssumeRolePolicyDocument` 可讓 Bob採用 `Engineering` 角色。

  ```
  {
      "Role": {
          "Arn": "arn:aws:iam::111122223333:role/Engineering",
          "CreateDate": "2019-05-16T00:09:25Z",
          "AssumeRolePolicyDocument": {
              "Version": "2012-10-17",		 	 	 
              "Statement": {
                  "Principal": {
                      "AWS": "arn:aws:iam::111122223333:user/bob"
                  },
                  "Effect": "Allow",
                  "Action": "sts:AssumeRole"
              }
          },
          "Path": "/",
          "RoleName": "Engineering",
          "RoleId": "AROA4KJY2TU23Y7NK62MV"
      }
  }
  ```