

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

# 的身分和存取管理最佳實務 AWS KMS
<a name="access"></a>

若要使用 AWS Key Management Service (AWS KMS)，您必須擁有 AWS 可用於驗證和授權請求的登入資料。除非明確提供該許可且從未拒絕，否則任何 AWS 委託人都沒有任何 KMS 金鑰的許可。沒有使用或管理 KMS 金鑰的隱含或自動許可。本節中的主題定義安全最佳實務，協助您判斷應使用哪些 AWS KMS 存取控制控制來保護基礎設施。

**Topics**
+ [AWS KMS 金鑰政策和 IAM 政策](#access-policies)
+ [的最低權限許可 AWS KMS](#access-least-privilege)
+ [的角色型存取控制 AWS KMS](#access-rbac)
+ [的屬性型存取控制 AWS KMS](#access-abac)
+ [的加密內容 AWS KMS](#access-encryption-context)
+ [故障診斷 AWS KMS 許可](#access-troubleshooting)

## AWS KMS 金鑰政策和 IAM 政策
<a name="access-policies"></a>

管理 AWS KMS 資源存取權的主要方法是使用 *政策*。政策是描述哪些主體可以存取哪些資源的文件。連接到 AWS Identity and Access Management (IAM) 身分 （使用者、使用者群組或角色） 的政策稱為以[身分為基礎的政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_id-based)。連接到資源的 IAM 政策稱為以[資源為基礎的政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_resource-based)。KMS 金鑰的資源 AWS KMS 政策稱為[金鑰政策](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)。除了 IAM 政策和 AWS KMS 金鑰政策之外， AWS KMS 還支援[授予](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html)。授予提供靈活且強大的方法來委派許可。您可以使用授予，對 AWS 帳戶 或其他 中的 IAM 主體發出有時間限制的 KMS 金鑰存取 AWS 帳戶。

所有 KMS 金鑰都擁有金鑰政策。如果您沒有提供，請為您 AWS KMS 建立一個。 AWS KMS 使用[的預設金鑰政策](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-default.html)會因您使用 AWS KMS 主控台或使用 AWS KMS API 建立金鑰而有所不同。我們建議您編輯預設金鑰政策，以符合組織對[最低權限許可](#access-least-privilege)的要求。這也應該符合您搭配金鑰政策使用 IAM 政策的策略。如需搭配 使用 IAM 政策的更多建議 AWS KMS，請參閱 AWS KMS 文件中的 [IAM 政策最佳實務](https://docs.aws.amazon.com/kms/latest/developerguide/iam-policies-best-practices.html)。

您可以使用金鑰政策，將 IAM 主體的授權委派給身分型政策。您也可以使用金鑰政策搭配身分型政策來精簡授權。在任何一種情況下，金鑰政策和身分型政策都會決定存取，以及限制存取的任何其他適用政策，例如[服務控制政策 (SCPs)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html)、[資源控制政策 RCPs)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_rcps.html) 或[許可界限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html)。如果委託人位於與 KMS 金鑰不同的帳戶中，基本上，僅支援密碼編譯和授予動作。如需此跨帳戶案例的詳細資訊，請參閱 文件中的 AWS KMS [允許其他帳戶中的使用者使用 KMS 金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying-external-accounts.html)。

您必須使用 IAM 身分型政策搭配金鑰政策來控制對 KMS 金鑰的存取。授予也可以與這些政策結合使用，以控制對 KMS 金鑰的存取。若要使用身分型政策來控制對 KMS 金鑰的存取，金鑰政策必須允許帳戶使用身分型政策。您可以指定[啟用 IAM 政策的金鑰政策陳述](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-default.html#key-policy-default-allow-root-enable-iam)式，也可以在金鑰政策中明確[指定允許的主體](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html#Principal_specifying)。

撰寫政策時，請確保您有強大的控制，限制誰可以執行下列動作：
+ **更新、建立和刪除 IAM 政策和 KMS 金鑰政策**
+ **從使用者、角色和群組連接和分離身分型政策**
+ **從 KMS AWS KMS 金鑰連接和分離金鑰政策**
+ **為您的 KMS 金鑰建立授予** – 無論您只使用金鑰政策控制對 KMS 金鑰的存取，還是將金鑰政策與 IAM 政策結合，都應該限制修改政策的能力。實作核准程序，以變更任何現有的政策。核准程序有助於防止下列情況：
  + **意外遺失 IAM 主體許可** – 可以進行變更，以防止 IAM 主體能夠管理金鑰或在密碼編譯操作中使用金鑰。在極端情況下，可以從所有使用者撤銷金鑰管理許可。如果發生這種情況，您需要聯絡 [AWS 支援](https://aws.amazon.com/contact-us/) 以重新取得 金鑰的存取權。
  + **未經核准的 KMS 金鑰政策變更** – 如果未經授權的使用者取得金鑰政策的存取權，他們可以修改它，以將許可委派給非預期的 AWS 帳戶 或 委託人。
  + **未經核准的 IAM 政策變更** – 如果未經授權的使用者取得一組具有管理群組成員資格許可的登入資料，他們可以提升自己的許可，並變更您的 IAM 政策、金鑰政策、KMS 金鑰組態或其他 AWS 資源組態。

仔細檢閱與指定為 KMS 金鑰管理員的 IAM 主體相關聯的 IAM 角色和使用者。這有助於防止未經授權的刪除或變更。如果您需要變更有權存取 KMS 金鑰的主體，請確認新的管理員主體已新增至所有必要的金鑰政策。先測試其許可，再刪除先前的管理委託人。我們強烈建議遵循所有 [IAM 安全最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)，並使用暫時登入資料而非長期登入資料。

如果您在建立政策時不知道委託人的名稱，或者需要存取的委託人經常變更，建議您透過授予發出有時間限制的存取。[承授者主體](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#terms-grantee-principal)可以位於與 KMS 金鑰相同的帳戶中，也可以位於不同的帳戶中。如果委託人和 KMS 金鑰位於不同的帳戶中，則除了授予之外，您還必須指定身分型政策。授予需要額外的管理，因為您必須呼叫 API 來建立授予，並在不再需要授予時淘汰或撤銷授予。

除非在金鑰政策、IAM 政策或授予中明確允許且未明確拒絕 KMS 金鑰，否則任何 AWS 委託人，包括帳戶根使用者或金鑰建立者，都沒有任何許可。延伸時，您應該考慮如果使用者取得使用 KMS 金鑰的意外存取權，會發生什麼情況，以及影響會是什麼。若要降低此類風險，請考慮下列事項：
+ 您可以為不同類別的資料維護不同的 KMS 金鑰。這可協助您分隔金鑰，並維護更簡潔的金鑰政策，其中包含專門以主體存取該資料類別為目標的政策陳述式。這也表示，如果意外存取相關的 IAM 登入資料，則與該存取關聯的身分只能存取 IAM 政策中指定的金鑰，而且只有在金鑰政策允許存取該主體時。
+ 您可以評估具有金鑰意外存取的使用者是否可以存取資料。例如，使用 Amazon Simple Storage Service (Amazon S3)，使用者也必須具有適當的許可才能存取 Amazon S3 中的加密物件。或者，如果使用者對具有磁碟區以 KMS 金鑰加密的 Amazon EC2 執行個體具有意外存取 （使用 RDP 或 SSH)，則使用者可以使用作業系統工具來存取資料。

**注意**  
AWS 服務 使用 的 AWS KMS 不會向使用者公開加密文字 （最新的加密分析方法需要存取加密文字）。此外，加密文字不適用於 AWS 資料中心外部的實體檢查，因為所有儲存媒體在除役時都會根據 NIST SP800-88 要求實際銷毀。

## 的最低權限許可 AWS KMS
<a name="access-least-privilege"></a>

由於 KMS 金鑰會保護敏感資訊，因此建議您遵循最低權限存取的原則。當您定義金鑰政策時，委派執行任務所需的最低許可。只有在您計劃使用其他身分型政策進一步限制許可時，才允許 KMS 金鑰政策上的所有動作 (`kms:*`)。如果您計劃使用身分型政策管理許可，請限制誰能夠建立 IAM 政策並將其連接到 IAM 主體，並[監控政策變更](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudwatch-alarms-for-cloudtrail.html#cloudwatch-alarms-for-cloudtrail-iam-policy-changes)。

如果您同時允許金鑰政策和身分型政策中的所有動作 (`kms:*`)，委託人會同時擁有 KMS 金鑰的管理和使用許可。作為安全最佳實務，我們建議僅將這些許可委派給特定的委託人。考慮如何將許可指派給將管理金鑰的委託人，以及將使用您的金鑰的委託人。您可以透過在金鑰政策中明確命名主體，或限制連接身分型政策的主體來執行此操作。您也可以使用[條件金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html)來限制許可。例如，如果發出 API 呼叫的委託人具有條件規則中指定的標籤，您可以使用 [aws：PrincipalTag](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-principaltag) 來允許所有動作。

如需了解政策陳述式如何評估的說明 AWS，請參閱 IAM 文件中的[政策評估邏輯](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html)。我們建議您在撰寫政策之前檢閱此主題，以協助降低政策產生意外效果的機會，例如提供存取權給不應存取的主體。

**提示**  
在非生產環境中測試應用程式時，請使用 [AWS Identity and Access Management Access Analyzer (IAM Access Analyzer)](https://docs.aws.amazon.com/IAM/latest/UserGuide/what-is-access-analyzer.html) 協助您在 IAM 政策中套用最低權限許可。

如果您使用 IAM 使用者而非 IAM 角色，強烈建議使用[AWS 多重要素驗證 (MFA)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa.html) 來緩解長期憑證的漏洞。您可以使用 MFA 執行下列操作：
+ 要求使用者在執行特殊權限動作之前，使用 MFA 驗證其憑證，例如排程金鑰刪除。
+ 管理員帳戶密碼和 MFA 裝置在個人之間分割擁有權，以實作分割授權。

如需可協助您設定最低權限許可的範例政策，請參閱 AWS KMS 文件中的 [IAM 政策範例](https://docs.aws.amazon.com/kms/latest/developerguide/customer-managed-policies.html)。

## 的角色型存取控制 AWS KMS
<a name="access-rbac"></a>

角色型存取控制 (RBAC) 是一種授權策略，僅提供使用者執行其任務所需的許可，不會再提供其他許可。這是一種方法，可協助您實作最低權限原則。

AWS KMS 支援 RBAC。它可讓您透過在金鑰[政策中指定精細許可來控制對金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)的存取。金鑰政策會指定資源、動作、效果、主體和選用條件，以授予金鑰的存取權。若要在 中實作 RBAC AWS KMS，我們建議區隔金鑰使用者和金鑰管理員的許可。

對於金鑰使用者，請僅指派使用者所需的許可。使用下列問題來協助您進一步精簡許可：
+ 哪些 IAM 主體需要存取金鑰？
+ 每個委託人需要使用 金鑰執行哪些動作？ 例如，委託人只需要 `Encrypt`和 `Sign`許可嗎？
+ 委託人需要存取哪些資源？
+ 實體是人類還是 AWS 服務？ 如果是服務，您可以使用 [kms:ViaService](https://docs.aws.amazon.com/kms/latest/developerguide/conditions-kms.html#conditions-kms-via-service) 條件金鑰，將金鑰用量限制在特定服務。

對於金鑰管理員，請僅指派管理員所需的許可。例如，管理員的許可可能會因金鑰是否用於測試或生產環境而有所不同。如果您在特定非生產環境中使用較不嚴格的許可，請在政策發佈至生產環境之前實作程序來測試政策。

如需可協助您為金鑰使用者和管理員設定角色型存取控制的範例政策，請參閱 [RBAC for AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/rbac.html)。

## 的屬性型存取控制 AWS KMS
<a name="access-abac"></a>

[屬性型存取控制 (ABAC)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_attribute-based-access-control.html) 是一種授權策略，可根據屬性定義許可。如同 RBAC，這是一種可協助您實作最低權限原則的方法。

AWS KMS 支援 ABAC，可讓您根據與目標資源相關聯的標籤定義許可，例如 KMS 金鑰，以及與發出 API 呼叫的委託人相關聯的標籤。在 中 AWS KMS，您可以使用標籤和別名來控制對客戶受管金鑰的存取。例如，您可以定義使用標籤條件索引鍵的 IAM 政策，在委託人的標籤符合與 KMS 索引鍵相關聯的標籤時允許操作。如需教學課程，請參閱 文件中[根據標籤定義存取 AWS 資源的許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_attribute-based-access-control.html)。 AWS KMS 

最佳實務是使用 ABAC 策略來簡化 IAM 政策管理。有了 ABAC，管理員可以使用標籤來允許存取新資源，而不是更新現有的政策。ABAC 需要的政策較少，因為您不必為不同的任務職能建立不同的政策。如需詳細資訊，請參閱 IAM 文件中的 [ABAC 與傳統 RBAC 模型的比較](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_attribute-based-access-control.html#introduction_attribute-based-access-control_compare-rbac)。

將最低權限許可的最佳實務套用至 ABAC 模型。只為 IAM 主體提供執行其任務所需的許可。仔細控制標記 APIs存取，以允許使用者修改角色和資源上的標籤。如果您使用金鑰別名條件索引鍵在 中支援 ABAC AWS KMS，請確保您也有強大的控制項來限制誰可以建立金鑰和修改別名。

您也可以使用標籤將特定金鑰連結至商業類別，並確認指定動作正在使用正確的金鑰。例如，您可以使用 AWS CloudTrail 日誌來驗證用於執行特定 AWS KMS 動作的 金鑰是否與正在使用的資源屬於相同的業務類別。

**警告**  
請勿在標籤金鑰或標籤值包含機密或敏感資訊。標籤不會加密。許多 都可以存取它們 AWS 服務，包括帳單。

在存取控制實作 ABAC 方法之前，請考慮您使用的其他 服務是否支援此方法。如需判斷哪些服務支援 ABAC 的說明，請參閱 [AWS 服務 IAM 文件中的 與 IAM 搭配使用](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)。

如需實作 ABAC for 的詳細資訊， AWS KMS 以及可協助您設定政策的條件金鑰，請參閱 [ABAC for AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/abac.html)。

## 的加密內容 AWS KMS
<a name="access-encryption-context"></a>

所有具有對稱加密 KMS 金鑰 AWS KMS 的密碼編譯操作都接受[加密內容](https://docs.aws.amazon.com/kms/latest/developerguide/encrypt_context.html)。*加密內容*是一組選用的非私密金鑰/值對，可包含有關資料的其他內容資訊。最佳實務是，您可以在 中的`Encrypt`操作中插入加密內容 AWS KMS ，以增強解密 API 呼叫的授權和可稽核性 AWS KMS。 AWS KMS 會使用加密內容做為額外的驗證資料 (AAD)，以支援[已驗證的加密](https://docs.aws.amazon.com/kms/latest/developerguide/kms-cryptography.html#symmetric-key-0ps)。加密內容以密碼編譯方式繫結至加密文字，因此需要相同的加密內容才能解密資料。

加密內容不是秘密，也不被加密。它在 AWS CloudTrail 日誌中以純文字顯示，因此您可以使用它來識別和分類您的密碼編譯操作。由於加密內容不是秘密，因此您應該僅允許授權的主體存取您的 CloudTrail 日誌資料。

您也可以使用 [kms:EncryptionContext：context-key](https://docs.aws.amazon.com/kms/latest/developerguide/conditions-kms.html#conditions-kms-encryption-context) 和 [kms:EncryptionContextKeys ](https://docs.aws.amazon.com/kms/latest/developerguide/conditions-kms.html#conditions-kms-encryption-context-keys)條件金鑰，根據加密內容控制對對稱加密 KMS 金鑰的存取。您也可以使用這些條件金鑰，要求加密內容用於密碼編譯操作。對於這些條件金鑰，請檢閱有關使用或`ForAnyValue``ForAllValues`設定運算子的指引，以確保您的政策反映您的預期許可。

## 故障診斷 AWS KMS 許可
<a name="access-troubleshooting"></a>

當您撰寫 KMS 金鑰的存取控制政策時，請考慮 IAM 政策和金鑰政策如何一起運作。委託人的有效許可是所有有效政策授予 （且未明確拒絕） 的許可。在帳戶中，KMS 金鑰的許可可能會受到 IAM 身分型政策、金鑰政策、許可界限、服務控制政策或工作階段政策的影響。例如，如果您同時使用身分型和金鑰政策來控制對 KMS 金鑰的存取，則會評估與委託人和資源相關的所有政策，以判斷委託人執行指定動作的授權。如需詳細資訊，請參閱 IAM 文件中的[政策評估邏輯](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html)。

如需故障診斷金鑰存取的詳細資訊和流程圖，請參閱 AWS KMS 文件中的[故障診斷金鑰存取](https://docs.aws.amazon.com/kms/latest/developerguide/policy-evaluation.html)。

**對存取遭拒錯誤訊息進行故障診斷**

1. 確認 IAM 身分型政策和 KMS 金鑰政策允許存取。

1. 確認 IAM 中的[許可界限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html)未限制存取。

1. 確認 中的[服務控制政策 (SCP)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html) 或[資源控制政策 (RCP)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_rcps.html) AWS Organizations 未限制存取。

1. 如果您使用的是 VPC 端點，請確認[端點政策](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-access.html)正確無誤。

1. 在身分型政策和金鑰政策中，移除限制存取金鑰的任何條件或資源參考。移除這些限制之後，請確認委託人可以成功呼叫先前失敗的 API。如果成功，請一次重新套用一個條件和資源參考，並在每個條件和資源之後驗證委託人仍然具有存取權。這可協助您識別造成錯誤的 條件或資源參考。

如需詳細資訊，請參閱 [IAM 文件中的對存取遭拒錯誤訊息進行故障診斷](https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_access-denied.html)。