

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

# 在 中授予 AWS KMS
<a name="grants"></a>

*授權*是一個政策工具，允許 [AWS 主體](https://docs.aws.amazon.com/IAM/latest/UserGuide/intro-structure.html#intro-structure-principal)使用密碼編譯操作中的 KMS 金鑰。它也可以讓其檢視 KMS 金鑰 (`DescribeKey`)，並建立和管理授予。當授權存取 KMS 金鑰時，會考慮與[金鑰政策](key-policies.md)和 [IAM 政策](iam-policies.md)一起授予。授予通常用於臨時許可，因為您可以建立授予、使用其許可並刪除授予，而無需變更金鑰政策或 IAM 政策。

與 整合的 AWS 服務通常會使用授權 AWS KMS 來加密靜態資料。服務會代表帳戶中的使用者建立授予、使用其許可，並在其任務完成後立即淘汰授予。如需 AWS 服務使用授權方式的詳細資訊，請參閱服務使用者指南或開發人員指南中的*靜態加密*主題。

授予是非常靈活和有用的存取控制機制。當您建立 KMS 金鑰的授予時，只要授予中的所有指定條件都滿足，授予就會允許承授者主體呼叫 KMS 金鑰上指定的授予操作。
+ 每個授予只允許存取一個 KMS 金鑰。您可以在不同的 AWS 帳戶中為 KMS 金鑰建立授予。
+ 授予可以允許存取 KMS 金鑰，但不能拒絕存取。
+ 每個授予都有一個[承授者主體](#terms-grantee-principal)。承授者主體可以在 AWS 帳戶 與 KMS 金鑰相同的 或不同帳戶中代表一或多個身分。
+ 授予只能允許[授予操作](#terms-grant-operations)。授予操作必須由授予中的 KMS 金鑰支援。若您指定不支援的操作，則 [CreateGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html) 請求會失敗，`ValidationError` 為例外狀況。
+ 承授者主體可以在不指定授予的情況下使用授予給予的許可，就如同許可來自金鑰政策或 IAM 政策一樣。不過，由於 AWS KMS API 遵循[最終一致性](#terms-eventual-consistency)模型，當您建立、淘汰或撤銷授予時，在變更全面可用之前，可能會有短暫的延遲 AWS KMS。若要立即使用授予中的許可，請[使用授予字符](using-grant-token.md)。
+ 授權主體可以刪除授予 (對其進行[淘汰](#terms-retire-grant)或[撤銷](#terms-revoke-grant)）。刪除授予會消除授予允許的所有許可。您不需要弄清楚要新增或移除哪些政策，即可復原授予。
+ AWS KMS 會限制每個 KMS 金鑰的授予數量。如需詳細資訊，請參閱[每個 KMS 金鑰的授予：50,000](resource-limits.md#grants-per-key)。

建立授予和給予他人建立授予的許可時，請小心謹慎。建立授予的許可具有安全影響，就像允許 [kms:PutKeyPolicy](https://docs.aws.amazon.com/kms/latest/APIReference/API_PutKeyPolicy.html) 許可來設定政策。
+ 具有為 KMS 金鑰 (`kms:CreateGrant`) 建立授予許可的使用者可以使用授予來允許使用者和角色使用 KMS 金鑰，包括 AWS 服務。委託人可以是您自己的身分 AWS 帳戶 ，也可以是不同帳戶或組織中的身分。
+ 授予只能允許操作的子集 AWS KMS 。您可以使用授予來允許主體檢視 KMS 金鑰、在密碼編譯操作中使用 KMS 金鑰，以及建立和淘汰授予。如需詳細資訊，請參閱[授予操作](#terms-grant-operations)。您也可以使用[授予限制條件](create-grant-overview.md#grant-constraints)來限制授予對稱加密金鑰中的許可。
+ 主體可以從金鑰政策或 IAM 政策取得建立授予的許可。針對 KMS 金鑰的任何[授與操作](#terms-grant-operations)，透過政策取得 `kms:CreateGrant` 許可的主體均可建立授與。這些主體不需擁有他們對金鑰授與的許可。當允許政策中的 `kms:CreateGrant` 許可時，您可以使用[政策條件](grant-authorization.md)來限制此許可。
+ 主體也可以從授予取得建立授予的許可。這些委託人只能委派其獲授予的許可，即使他們擁有政策的其他許可。如需詳細資訊，請參閱[授與 CreateGrant 許可](create-grant-overview.md#grant-creategrant)。

## 授予概念
<a name="grant-concepts"></a>

若要有效地使用授予，您需要了解 AWS KMS 使用的條款和概念。

**授予限制條件**  <a name="terms-grant-constraint"></a>
限制授予中許可的條件。目前， AWS KMS 支援根據密碼編譯操作請求中的[加密內容](encrypt_context.md)來授予限制。如需詳細資訊，請參閱[使用授予限制條件](create-grant-overview.md#grant-constraints)。

**授予 ID**  <a name="terms-grant-id"></a>
用於 KMS 金鑰的授予唯一識別符。您可以使用授予 ID，與[金鑰識別符](concepts.md#key-id)一起，以識別 [RetireGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_RetireGrant.html) 或 [RevokeGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_RevokeGrant.html) 請求。

**授予操作**  <a name="terms-grant-operations"></a>
您可以在授予中允許 AWS KMS 的操作。如果您指定其他操作，則 [CreateGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html) 請求會失敗，`ValidationError` 為例外狀況。這些也是接受[授予字符](#grant_token)的操作。如需有關這些許可的詳細資訊，請參閱 [AWS KMS 許可](kms-api-permissions-reference.md)。  
這些授予操作實際上代表使用操作的許可。因此，對於 `ReEncrypt` 操作，您可以指定 `ReEncryptFrom`、`ReEncryptTo`，或兩者的 `ReEncrypt*`。  
授予操作包括：  
+ 密碼編譯操作
  + [解密](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)
  + [DeriveSharedSecret](https://docs.aws.amazon.com/kms/latest/APIReference/API_DeriveSharedSecret.html)
  + [加密](https://docs.aws.amazon.com/kms/latest/APIReference/API_Encrypt.html)
  + [GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)
  + [GenerateDataKeyPair](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKeyPair.html)
  + [GenerateDataKeyPairWithoutPlaintext](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKeyPairWithoutPlaintext.html)
  + [GenerateDataKeyWithoutPlaintext](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKeyWithoutPlaintext.html)
  + [GenerateMac](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateMac.html)
  + [ReEncryptFrom](https://docs.aws.amazon.com/kms/latest/APIReference/API_ReEncrypt.html)
  + [ReEncryptTo](https://docs.aws.amazon.com/kms/latest/APIReference/API_ReEncrypt.html)
  + [符號](https://docs.aws.amazon.com/kms/latest/APIReference/API_Sign.html)
  + [確認](https://docs.aws.amazon.com/kms/latest/APIReference/API_Verify.html)
  + [VerifyMac](https://docs.aws.amazon.com/kms/latest/APIReference/API_VerifyMac.html)
+ 其他操作
  + [CreateGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html)
  + [DescribeKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html)
  + [GetPublicKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GetPublicKey.html)
  + [RetireGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_RetireGrant.html)
您允許的授予作業必須由授予中的 KMS 金鑰支援。若您指定不支援的操作，則 [CreateGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html) 請求會失敗，`ValidationError` 為例外狀況。例如，對稱加密 KMS 金鑰的授予不允許 [Sign](https://docs.aws.amazon.com/kms/latest/APIReference/API_Sign.html)、[Verify](https://docs.aws.amazon.com/kms/latest/APIReference/API_Verify.html)、[https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateMac.html](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateMac.html) 或 [https://docs.aws.amazon.com/kms/latest/APIReference/API_VerifyMac.html](https://docs.aws.amazon.com/kms/latest/APIReference/API_VerifyMac.html) 操作。非對稱 KMS 金鑰的授予不允許任何產生資料金鑰或資料金鑰對的操作。

**授予字符**  <a name="grant_token"></a>
 AWS KMS API 遵循[最終一致性](#terms-eventual-consistency)模型。當您建立授權時，在該變更適用於整個 AWS KMS之前，可能會有短暫延遲。變更傳播到整個系統通常需要不到幾秒鐘的時間，但在某些情況下可能需要幾分鐘。如果您在整個系統中完全傳播授權之前嘗試使用授權，則可能會收到拒絕存取錯誤。授予字符可讓您參考授予並立即使用授予許可。  
*授予字符*是唯一的，非秘密的，可變長度的，base64 編碼的字串，代表授予。您可以使用授予字符來識別任何[授予操作](#terms-grant-operations)中的授予。但是，由於字符值是雜湊摘要，因此它不會顯示有關授予的任何詳細資訊。  
授權字符設計為只能在整個 AWS KMS中完全傳播授權之後才能使用。在此之後，[承授者主體](#terms-grantee-principal)可以使用授予中的許可，而不提供授予字符或任何其他授予的證據。您可以隨時使用授予字符，但一旦授予最終一致， AWS KMS 會使用授予來確定許可，而不是授予字符。  
例如，下列命令會呼叫 [GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) 操作。它使用授予字符來表示授予呼叫者 (承授者主體) 許可來呼叫指定 KMS 金鑰上的 `GenerateDataKey`。  

```
$ aws kms generate-data-key \
        --key-id 1234abcd-12ab-34cd-56ef-1234567890ab \
        --key-spec AES_256 \
        --grant-token $token
```
您也可以使用授予字符來識別管理授予之操作中的授予。例如，[淘汰主體](#terms-retiring-principal)可以在 [RetireGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_RetireGrant.html) 操作的呼叫中使用授予字符。  

```
$ aws kms retire-grant \
        --grant-token $token
```
`CreateGrant` 是傳回授予字符的唯一操作。您無法從任何其他 AWS KMS 操作或從 CreateGrant 操作的 [CloudTrail 日誌事件](ct-creategrant.md)取得授予字符。[ListGrants](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListGrants.html) 和 [ListRetirableGrants](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListRetirableGrants.html) 操作會傳回[授予 ID](#terms-grant-id)，但不是授予字符。  
如需詳細資訊，請參閱[使用授予字符](using-grant-token.md)。

**承授者主體**  <a name="terms-grantee-principal"></a>
取得授予中所指定許可的身分。每個授予都有一個承授者主體，但承授者主體可以代表多個身分。  
承授者委託人可以是任何 AWS 委託人，包括 AWS 帳戶 （根）、[IAM 使用者](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html)、[IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)、[聯合角色或使用者](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers.html)，或擔任角色的使用者。承授者主體可以在與 KMS 金鑰相同的帳戶中，也可以在不同的帳戶中。不過，承授者主體不能是[服務主體](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html#principal-services)、[IAM 群組](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html)，或 [AWS 組織](https://docs.aws.amazon.com/organizations/latest/userguide/)。  
IAM 最佳實務不建議使用具有長期憑證的 IAM 使用者。盡可能使用提供臨時憑證的 IAM 角色。如需詳細資訊，請參閱《IAM 使用者指南》**中的 [IAM 中的安全性最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

**淘汰授予**  <a name="terms-retire-grant"></a>
終止授予。當您完成使用許可時，就會淘汰授予。  
撤銷和淘汰授予都會刪除授予。但是，由授予中指定的主體完成淘汰動作。撤銷通常是由金鑰管理員完成。如需詳細資訊，請參閱[淘汰和撤銷授予](grant-delete.md)。

**淘汰主體**  <a name="terms-retiring-principal"></a>
可以[淘汰授予](#terms-retire-grant)的主體。您可以在授予中指定淘汰的主體，但不是必需的。淘汰委託人可以是任何 AWS 委託人，包括 AWS 帳戶 IAM 使用者、IAM 角色、聯合身分使用者和擔任的角色使用者。淘汰的主體可以在與 KMS 金鑰相同的帳戶中，也可以在不同的帳戶中。  
IAM 最佳實務不建議使用具有長期憑證的 IAM 使用者。盡可能使用提供臨時憑證的 IAM 角色。如需詳細資訊，請參閱《IAM 使用者指南》**中的 [IAM 中的安全性最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。
除了授予中指定的淘汰委託人之外，授予也可以由建立授予 AWS 帳戶 的 淘汰。[承授者主體](#terms-grantee-principal)可以淘汰授予 (如果授予允許 `RetireGrant` 操作)。此外， AWS 帳戶 或 是淘汰主體 AWS 帳戶 的 可以將淘汰授予的許可委派給相同 中的 IAM 主體 AWS 帳戶。如需詳細資訊，請參閱[淘汰和撤銷授予](grant-delete.md)。

**撤銷 (授予)**  <a name="terms-revoke-grant"></a>
終止授予。您撤銷授予，以主動拒絕授予允許的許可。  
撤銷和淘汰授予都會刪除授予。但是，由授予中指定的主體完成淘汰動作。撤銷通常是由金鑰管理員完成。如需詳細資訊，請參閱[淘汰和撤銷授予](grant-delete.md)。

**最終一致性 (用於授予)**  <a name="terms-eventual-consistency"></a>
 AWS KMS API 遵循[最終一致性](https://en.wikipedia.org/wiki/Eventual_consistency)模型。當您建立、淘汰或撤銷授權時，在該變更適用於整個 AWS KMS之前，可能會有短暫延遲。變更傳播到整個系統通常需要不到幾秒鐘的時間，但在某些情況下可能需要幾分鐘。  
如果遇到非預期的錯誤，您可能會發現這個短暫的延遲。例如，如果您在完全知道授予之前嘗試管理新的授予或使用新授予中的許可 AWS KMS，您可能會收到存取遭拒錯誤。如果您淘汰或撤銷授予，承授者主體可能仍然可以在短期內使用其許可，直到授予完全刪除為止。典型的策略是重試請求，而 AWS SDKs 包含自動退避和重試邏輯。  
AWS KMS 具有可減輕此短暫延遲的功能。  
+ 若要立即使用新授予中的許可，請使用[授予字符](using-grant-token.md)。您可以使用授予字符來引用任何[授予操作](#terms-grant-operations)中的授予。如需說明，請參閱[使用授予字符](using-grant-token.md)。
+ [CreateGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html) 操作具有 `Name` 參數，可防止重試操作建立重複授予。
授予許可會取代授予的有效性，直到服務中的所有端點都更新為新的授予狀態為止。在大多數情況下，最終一致性將在五分鐘內達成。
如需詳細資訊，請參閱《[AWS KMS 最終一致性](accessing-kms.md#programming-eventual-consistency)》。

# AWS KMS 授予的最佳實務
<a name="grant-best-practices"></a>

AWS KMS 在建立、使用和管理授予時， 建議下列最佳實務。
+ 將授予中的許可限制為承授者主體需要的許可。使用[最低權限存取](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)的原則。
+ 使用特定承授者主體 (例如 IAM 角色)，並讓承授者主體僅使用其所需 API 操作的許可。
+ 使用加密內容[授予限制條件](grants.md#terms-grant-constraint)，以確保呼叫者使用 KMS 金鑰來達到預期目的。如需如何在請求中使用加密內容來保護資料的詳細資訊，請參閱 *AWS 安全部落格*中的[如何使用 AWS Key Management Service 和 EncryptionContext 來保護加密資料的完整性](https://aws.amazon.com/blogs/security/how-to-protect-the-integrity-of-your-encrypted-data-by-using-aws-key-management-service-and-encryptioncontext/)。
**提示**  
盡可能使用 [EncryptionContextEqual](create-grant-overview.md#grant-constraints) 授予限制條件。[EncryptionContextSubset](create-grant-overview.md#grant-constraints) 授予限制條件更難以正確使用。如果您需要使用，請仔細閱讀文件並測試授予限制條件，以確保其按預期工作。
+ 刪除重複的授予。重複授予具有相同的金鑰 ARN、API 動作、承授者主體、加密內容和名稱。如果您淘汰或撤銷原始授予但保留重複項目，則剩餘的重複授予會構成非預期的權限升級。為了避免在重試 `CreateGrant` 請求時重複授予，請使用 [`Name` 參數](create-grant-overview.md#grant-create)。若要偵測重複授予，請使用 [ListGrants](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListGrants.html) 操作。如果意外建立了重複授予，請儘快淘汰或撤銷該授予。
**注意**  
[AWS 受管金鑰](concepts.md#aws-managed-key)授予可能看起來像重複項，但具有不同的承授者主體。  
`GranteePrincipal` 回應中的 `ListGrants` 欄位通常包含授與的承授者主體。不過，當授予中的承授者委託人是 AWS 服務時， `GranteePrincipal` 欄位會包含[服務委託](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html#principal-services)人，這可能代表數個不同的承授者委託人。
+ 請記住，授予不會自動過期。不再需要許可時，即刻[淘汰或撤銷授予](grant-delete.md)。未刪除的授予可能會對加密資源造成安全風險。

# 控制對授予的存取
<a name="grant-authorization"></a>

您可以控制對在金鑰政策、IAM 政策和授予中建立和管理授予之操作的存取。從授予取得 `CreateGrant` 許可的主體具有[更有限的授予許可](create-grant-overview.md#grant-creategrant)。


| API 操作 | 金鑰政策或 IAM 政策 | 授權 | 
| --- | --- | --- | 
| CreateGrant | ✓ | ✓ | 
| ListGrants | ✓ | - | 
| ListRetirableGrants | ✓ | - | 
| 淘汰授予 | (有限。請參閱 [淘汰和撤銷授予](grant-delete.md)) | ✓ | 
| RevokeGrant | ✓ | - | 

當您使用金鑰政策或 IAM 政策來控制對建立和管理授予之操作的存取時，您可以使用下列一或多個政策條件來限制許可。 AWS KMS 支援下列所有授予相關條件金鑰。如需詳細資訊和範例，請參閱 [AWS KMS 條件索引鍵](conditions-kms.md)。

[kms:GrantConstraintType](conditions-kms.md#conditions-kms-grant-constraint-type)  
僅當授予包含指定的[授予限制條件](create-grant-overview.md#grant-constraints)時，才允許主體建立授予。

[kms:GrantIsForAWSResource](conditions-kms.md#conditions-kms-grant-is-for-aws-resource)  
`RevokeGrant` 只有在[與 整合 AWS 的服務 AWS KMS](https://aws.amazon.com/kms/features/#AWS_Service_Integration)代表委託人傳送請求時`CreateGrant`，允許委託人呼叫 `ListGrants`、 或 。

[kms:GrantOperations](conditions-kms.md#conditions-kms-grant-operations)  
允許主體建立授予，但將授予限制為指定的操作。

[kms:GranteePrincipal](conditions-kms.md#conditions-kms-grantee-principal)  
允許主體僅針對指定的[承授者主體](grants.md#terms-grantee-principal)建立授予。

[kms:RetiringPrincipal](conditions-kms.md#conditions-kms-retiring-principal)  
僅當授予指定特定的[淘汰主體](grants.md#terms-retiring-principal)時，才允許主體建立授予。

# 建立授予
<a name="create-grant-overview"></a>

建立授予之前，請先了解自訂授予的選項。您可以使用*授予限制條件*以限制授予中的許可。此外，了解授予 `CreateGrant` 許可。從授予取得建立授予之許可的主體，在其可以建立的授予中受到限制。

**Topics**
+ [建立授與](#grant-create)
+ [授與 CreateGrant 許可](#grant-creategrant)

## 建立授與
<a name="grant-create"></a>

若要建立授予，請呼叫 [CreateGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html) 操作。指定 KMS 金鑰、[承授者主體](grants.md#terms-grantee-principal)和允許的[授予操作](grants.md#terms-grant-operations)清單。您也可以指定選用的[淘汰主體](grants.md#terms-retiring-principal)。若要自訂授與，請使用選用 `Constraints` 參數來定義[授與限制](https://docs.aws.amazon.com/kms/latest/APIReference/API_GrantConstraints.html)。

當您建立、淘汰或撤銷授予時，可能會有短暫的延遲 (通常不到五分鐘)，然後才會在整個 AWS KMS中可用。如需詳細資訊，請參閱[最終一致性模式 (授權)](grants.md#terms-eventual-consistency)。

例如，下列 `CreateGrant` 命令會建立授予，以允許被授權擔任 `keyUserRole` 角色的使用者對指定的[對稱 KMS 金鑰](symm-asymm-choose-key-spec.md#symmetric-cmks)呼叫 [Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) 操作。授權會使用 `RetiringPrincipal` 參數指定可淘汰授權的主體。同時也包含授權限制條件，僅當請求中的[加密內容](encrypt_context.md)包含 `"Department": "IT"` 時，才允許許可。

```
$  aws kms create-grant \
    --key-id 1234abcd-12ab-34cd-56ef-1234567890ab \
    --grantee-principal arn:aws:iam::111122223333:role/keyUserRole \
    --operations Decrypt \
    --retiring-principal arn:aws:iam::111122223333:role/adminRole \
    --constraints EncryptionContextSubset={Department=IT}
```

如果您的程式碼重試 `CreateGrant` 操作，或使用[自動重試請求的AWS 開發套件](https://docs.aws.amazon.com/general/latest/gr/api-retries.html)，則請使用選用[名稱](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html#KMS-CreateGrant-request-Name)參數，以防止建立重複授予。如果 AWS KMS 取得與現有授予具有相同屬性的授予`CreateGrant`請求，包括名稱，它會將請求識別為重試，並且不會建立新的授予。您無法使用 `Name` 值以識別任何 AWS KMS 操作中的授予。

**重要**  
請勿在授權名稱包含機密或敏感資訊。其可能在 CloudTrail 日誌與其他輸出中以純文字顯示。

```
$ aws kms create-grant \
    --name IT-1234abcd-keyUserRole-decrypt \
    --key-id 1234abcd-12ab-34cd-56ef-1234567890ab \
    --grantee-principal arn:aws:iam::111122223333:role/keyUserRole \
    --operations Decrypt \
    --retiring-principal arn:aws:iam::111122223333:role/adminRole \
    --constraints EncryptionContextSubset={Department=IT}
```

如需示範如何以多種程式設計語言建立授予的程式碼範例，請參閱 [`CreateGrant` 搭配 AWS SDK 或 CLI 使用](example_kms_CreateGrant_section.md)。

### 使用授予限制條件
<a name="grant-constraints"></a>

[授予限制條件](https://docs.aws.amazon.com/kms/latest/APIReference/API_GrantConstraints.html)會在為承授者主體提供授予的許可上設定條件。授予限制條件會取代[金鑰政策](key-policies.md)或 [IAM 政策](iam-policies.md)中的[條件索引鍵](policy-conditions.md)。每個授予限制條件值最多可以包含 8 個加密內容對。每個授予限制條件中的加密內容值不能超過 384 個字元。

**重要**  
請勿在此欄位包含機密或敏感資訊。此欄位可能在 CloudTrail 日誌與其他輸出中以純文字顯示。

AWS KMS 支援兩個授予限制， `EncryptionContextEquals`和 `EncryptionContextSubset`，這兩者在密碼編譯操作的請求中建立[加密內容](encrypt_context.md)的要求。

加密內容授予限制條件是設計用於與擁有加密內容參數的[授予操作](grants.md#terms-grant-operations)搭配使用。
+ 加密內容限制條件僅在對稱加密 KMS 金鑰的授予中有效。其他 KMS 金鑰的密碼編譯操作不支援加密內容。
+ 加密內容限制條件會忽略 `DescribeKey` 和 `RetireGrant` 操作。`DescribeKey` 和 `RetireGrant` 沒有加密內容參數，但您可以將這些操作包含在具有加密內容限制條件的授予中。
+ 您可以在 `CreateGrant` 操作的授予中使用加密內容限制條件。加密內容限制條件要求使用 `CreateGrant` 許可建立的任何授予具有同樣嚴格或更嚴格的加密內容限制條件。

AWS KMS 支援下列加密內容授予限制。

**EncryptionContextEquals**  
使用 `EncryptionContextEquals`，以指定允許請求的確切加密內容。  
`EncryptionContextEquals` 需要請求中的加密內容對完全符合 (包括大小寫) 授予限制條件中的加密內容。此對組可以任何順序顯示，但每個對組中的金鑰和值不能改變。  
例如，如果 `EncryptionContextEquals` 授予限制條件需要 `"Department": "IT"` 加密內容對，則僅當請求中的加密內容正好是 `"Department": "IT"` 時，授予才會允許指定類型的請求。

**EncryptionContextSubset**  
使用 `EncryptionContextSubset` 來要求請求包含特定的加密內容對。  
`EncryptionContextSubset` 需要請求包含授予限制條件中的所有加密內容對 (完全符合，包括大小寫)，但請求也可以有其他加密內容對。此對組可以任何順序顯示，但每個對組中的金鑰和值不能改變。  
例如，如果 `EncryptionContextSubset` 授予限制條件需要 `Department=IT` 加密內容對，則當請求中的加密內容為 `"Department": "IT"` 時，或包含 `"Department": "IT"` 與其他加密內容對 (例如 `"Department": "IT","Purpose": "Test"`) 時，授予才會允許指定類型的請求。

若要指定對稱加密 KMS 金鑰授予中的加密內容限制條件，請使用 [CreateGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html) 操作中的 `Constraints` 參數。此命令建立的授予會給予被授權擔任 `keyUserRole` 角色的使用者呼叫 [Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) 操作的許可。但是，僅當 `Decrypt` 請求中的加密內容為 `"Department": "IT"` 加密內容對時，該許可才會生效。

```
$ aws kms create-grant \
    --key-id 1234abcd-12ab-34cd-56ef-1234567890ab \
    --grantee-principal arn:aws:iam::111122223333:role/keyUserRole \
    --operations Decrypt \
    --retiring-principal arn:aws:iam::111122223333:role/adminRole \
    --constraints EncryptionContextEquals={Department=IT}
```

產生的授與看起來如下。請注意，授予給 `keyUserRole` 角色的許可只有在 `Decrypt` 請求使用授予限制條件中指定的相同加密內容對時才有效。如要尋找 KMS 金鑰的授予，請使用 [ListGrants](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListGrants.html) 操作。

```
$ aws kms list-grants --key-id 1234abcd-12ab-34cd-56ef-1234567890ab
{
    "Grants": [
        {
            "Name": "",
            "IssuingAccount": "arn:aws:iam::111122223333:root",
            "GrantId": "abcde1237f76e4ba7987489ac329fbfba6ad343d6f7075dbd1ef191f0120514a",
            "Operations": [
                "Decrypt"
            ],
            "GranteePrincipal": "arn:aws:iam::111122223333:role/keyUserRole",
            "Constraints": {
                "EncryptionContextEquals": {
                    "Department": "IT"
                }
            },
            "CreationDate": 1568565290.0,
            "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
            "RetiringPrincipal": "arn:aws:iam::111122223333:role/adminRole"
        }
    ]
}
```

為了滿足 `EncryptionContextEquals` 授予限制條件，`Decrypt` 操作請求中的加密內容必須是 `"Department": "IT"` 對。來自承授者主體的類似下列請求應當滿足 `EncryptionContextEquals` 授予限制條件。

```
$ aws kms decrypt \
    --key-id arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab\
    --ciphertext-blob fileb://encrypted_msg \
    --encryption-context Department=IT
```

當授予限制條件為 `EncryptionContextSubset`，請求中的加密內容對必須包含授予限制條件中的加密內容對，但請求也可以包含其他加密內容對。下列授予限制條件需要請求中的其中一個加密內容對為 `"Deparment": "IT"`。

```
"Constraints": {
   "EncryptionContextSubset": {
       "Department": "IT"
   }
}
```

來自承授者主體的類似下列請求應當同時滿足此範例中的 `EncryptionContextEqual` 和 `EncryptionContextSubset` 授予限制條件。

```
$ aws kms decrypt \
    --key-id arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab \
    --ciphertext-blob fileb://encrypted_msg \
    --encryption-context Department=IT
```

然而，來自承授者主體的類似下列請求應當滿足 `EncryptionContextSubset` 授予限制條件，但它無法滿足 `EncryptionContextEquals` 授予限制條件。

```
$ aws kms decrypt \
    --key-id arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab \
    --ciphertext-blob fileb://encrypted_msg \
    --encryption-context Department=IT,Purpose=Test
```

AWS 服務通常會在授予中使用加密內容限制，授予他們在您的 中使用 KMS 金鑰的許可 AWS 帳戶。例如，Amazon DynamoDB 使用類似下列授予來取得在您帳戶中為 DynamoDB 使用 [AWS 受管金鑰](concepts.md#aws-managed-key) 的許可。此 `EncryptionContextSubset` 授與中的授與限制只有在請求中的加密內容包含 `"subscriberID": "111122223333"` 和 `"tableName": "Services"` 對時，才會讓授與中的許可生效。此授予限制條件表示授予允許 DynamoDB 僅針對您 AWS 帳戶中的特定資料表使用指定的 KMS 金鑰。

若要取得此輸出，請在您帳戶中 AWS 受管金鑰 適用於 DynamoDB 的 上執行 [ListGrants](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListGrants.html) 操作。

```
$ aws kms list-grants --key-id 0987dcba-09fe-87dc-65ba-ab0987654321

{
    "Grants": [
        {
            "Operations": [
                "Decrypt",
                "Encrypt",
                "GenerateDataKey",
                "ReEncryptFrom",
                "ReEncryptTo",
                "RetireGrant",
                "DescribeKey"
            ],
            "IssuingAccount": "arn:aws:iam::111122223333:root",
            "Constraints": {
                "EncryptionContextSubset": {
                    "aws:dynamodb:tableName": "Services",
                    "aws:dynamodb:subscriberId": "111122223333"
                }
            },
            "CreationDate": 1518567315.0,
            "KeyId": "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321",
            "GranteePrincipal": "dynamodb.us-west-2.amazonaws.com",
            "RetiringPrincipal": "dynamodb.us-west-2.amazonaws.com",
            "Name": "8276b9a6-6cf0-46f1-b2f0-7993a7f8c89a",
            "GrantId": "1667b97d27cf748cf05b487217dd4179526c949d14fb3903858e25193253fe59"
        }
    ]
}
```

## 授與 CreateGrant 許可
<a name="grant-creategrant"></a>

授予可以包含呼叫 `CreateGrant` 操作的許可。但是，當[承授者主體](grants.md#terms-grantee-principal)從授予 (而非政策) 取得呼叫 `CreateGrant` 的許可時，該許可會受到限制。
+ 承授者主體只能建立允許父項授予中部分或全部操作的授予。
+ 其所建立授予中的[授予限制條件](#grant-constraints)必須至少與父項授予一樣嚴格。

這些限制不適用於從政策取得 `CreateGrant` 許可的主體，雖然其許可可以受到[政策條件](grant-authorization.md)限制。

例如，假設有一個授與允許承授者主體呼叫 `GenerateDataKey`、`Decrypt` 和 `CreateGrant` 操作。我們稱之為授予，允許 `CreateGrant` 許可*父項授予*。

```
# The original grant in a ListGrants response.
{
    "Grants": [
        {
            "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
            "CreationDate": 1572216195.0,
            "GrantId": "abcde1237f76e4ba7987489ac329fbfba6ad343d6f7075dbd1ef191f0120514a",
            "Operations": [
                "GenerateDataKey",
                "Decrypt",
                "CreateGrant
            ]
            "RetiringPrincipal": "arn:aws:iam::111122223333:role/adminRole",
            "Name": "",
            "IssuingAccount": "arn:aws:iam::111122223333:root",
            "GranteePrincipal": "arn:aws:iam::111122223333:role/keyUserRole",
            "Constraints": {
                "EncryptionContextSubset": {
                    "Department": "IT"
                }
            },
        }
    ]
}
```

承授者主體 exampleUser 可以使用此許可來建立授予，其中包含原始授予中指定的任何操作子集，例如 `CreateGrant` 和 `Decrypt`。*子項授予*不能包含其他操作，例如 `ScheduleKeyDeletion` 或 `ReEncrypt`。

此外，子項授予中的[授予限制條件](https://docs.aws.amazon.com/kms/latest/APIReference/API_GrantConstraints.html)必須與父項授予中的限制程度相等嚴格或比之更嚴格。例如，子授與可以新增對組到父授與的 `EncryptionContextSubset` 限制，但不能將其移除。子授與可將 `EncryptionContextSubset` 限制變更為 `EncryptionContextEquals` 限制，但不能反向。

IAM 最佳實務不建議使用具有長期憑證的 IAM 使用者。盡可能使用提供臨時憑證的 IAM 角色。如需詳細資訊，請參閱《IAM 使用者指南》**中的 [IAM 中的安全性最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

例如，承授者主體可以使用其從父項授予中取得的 `CreateGrant` 許可，建立以下子項授予。子項授予的操作是父項授予操作的子集，授予限制條件更嚴格。

```
# The child grant in a ListGrants response.
{
    "Grants": [
        {
            "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
            "CreationDate": 1572249600.0,
            "GrantId": "fedcba9999c1e2e9876abcde6e9d6c9b6a1987650000abcee009abcdef40183f",
            "Operations": [
                "CreateGrant"
                "Decrypt"
            ]
            "RetiringPrincipal": "arn:aws:iam::111122223333:user/exampleUser",
            "Name": "",
            "IssuingAccount": "arn:aws:iam::111122223333:root",
            "GranteePrincipal": "arn:aws:iam::111122223333:user/anotherUser",
            "Constraints": {
                "EncryptionContextEquals": {
                    "Department": "IT"
                }
            },
        }
    ]
}
```

子項授予的承授者主體 `anotherUser`，可以使用其 `CreateGrant` 許可建立授予。然而，`anotherUser` 建立的授予必須在其父項授予或子集中包含操作，並且授予限制條件必須相同或更嚴格。

# 檢視授予
<a name="grant-view"></a>

若要檢視授權，請使用 [ListGrants](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListGrants.html) 操作。您必須指定授予套用的 KMS 金鑰。您也可以透過授予 ID 或承授者主體篩選授予清單。如需更多範例，請參閱[`ListGrants` 搭配 AWS SDK 或 CLI 使用](example_kms_ListGrants_section.md)。

若要檢視具有特定[淘汰委託](grants.md#terms-retiring-principal)人之 AWS 帳戶 和 區域中的所有授予，請使用 [ListRetirableGrants](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListRetirableGrants.html)。回應包括每項授予的詳細資訊。

**注意**  
`GranteePrincipal` 回應中的 `ListGrants` 欄位通常包含授與的承授者主體。不過，當授予中的承授者委託人是 AWS 服務時， `GranteePrincipal` 欄位會包含[服務委託](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html#principal-services)人，這可能代表數個不同的承授者委託人。

例如，下列命令會列出 KMS 金鑰的所有授予。

```
$  aws kms list-grants --key-id 1234abcd-12ab-34cd-56ef-1234567890ab
{
    "Grants": [
        {
            "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
            "CreationDate": 1572216195.0,
            "GrantId": "abcde1237f76e4ba7987489ac329fbfba6ad343d6f7075dbd1ef191f0120514a",
            "Constraints": {
                "EncryptionContextSubset": {
                    "Department": "IT"
                }
            },
            "RetiringPrincipal": "arn:aws:iam::111122223333:role/adminRole",
            "Name": "",
            "IssuingAccount": "arn:aws:iam::111122223333:root",
            "GranteePrincipal": "arn:aws:iam::111122223333:user/exampleUser",
            "Operations": [
                "Decrypt"
            ]
        }
    ]
}
```

# 使用授予字符
<a name="using-grant-token"></a>

 AWS KMS API 遵循[最終一致性](grants.md#terms-eventual-consistency)模型。當建立授予時，授予可能無法立即生效。在該變更適用於整個 AWS KMS之前，可能會有短暫延遲。變更傳播到整個系統通常需要不到幾秒鐘的時間，但在某些情況下可能需要幾分鐘。一旦授權完全人傳播至整個系統，承授者主體即可使用授權的許可，而不需指定授權字符或授權的任何證據。不過，如果授予是如此新，但尚未讓所有 知道 AWS KMS，則請求可能會失敗並顯示`AccessDeniedException`錯誤。

若要立即使用新授予中的許可，請使用授予的[授予字符](grants.md#grant_token)。儲存 [CreateGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html) 操作傳回的授予字符。然後在 AWS KMS 操作的請求中提交授予字符。您可以提交授予字符到任何 AWS KMS [授予操作](grants.md#terms-grant-operations)，也可以在相同的請求中提交多個授予字符。



以下範例使用 `CreateGrant` 操作來建立允許 [GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) 和 [Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) 操作的授予。它會儲存 `CreateGrant` 在 `token` 變數中傳回的授予字符。然後，在呼叫 `GenerateDataKey` 操作時，它會使用 `token` 變數中的授予字符。

```
# Create a grant; save the grant token 
$ token=$(aws kms create-grant \
    --key-id 1234abcd-12ab-34cd-56ef-1234567890ab \
    --grantee-principal arn:aws:iam::111122223333:user/appUser \
    --retiring-principal arn:aws:iam::111122223333:user/acctAdmin \
    --operations GenerateDataKey Decrypt \
    --query GrantToken \
    --output text)

# Use the grant token in a request
$ aws kms generate-data-key \
    --key-id 1234abcd-12ab-34cd-56ef-1234567890ab \
    –-key-spec AES_256 \
    --grant-tokens $token
```

具有 許可的委託人也可以使用授予權杖淘汰新的授予，即使整個授予都可用 AWS KMS。(`RevokeGrant` 操作不接受授予字符。) 如需詳細資訊，請參閱[淘汰和撤銷授予](grant-delete.md)。

```
# Retire the grant
$ aws kms retire-grant --grant-token $token
```

# 淘汰和撤銷授予
<a name="grant-delete"></a>

若要刪除授予，請淘汰或撤銷授予。

[RetireGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_RetireGrant.html) 和 [RevokeGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_RevokeGrant.html) 操作相互之間非常相似。這兩項操作都會刪除授予，這會消除授予允許的許可。這些操作之間的主要區別在於它們是如何取得授權的。

**RevokeGrant**  
與大多數 AWS KMS 操作一樣，`RevokeGrant`操作的存取是透過[金鑰政策和](key-policies.md) [IAM 政策](iam-policies.md)來控制。[RevokeGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_RevokeGrant.html) API 可以由任何具有 `kms:RevokeGrant` 許可的主體呼叫。此許可會納入提供給金鑰管理員的標準許可中。一般而言，管理員會撤銷授予，以拒絕授予允許的許可。

**RetireGrant**  
授予決定誰可以將其淘汰。此設計可讓您控制授予的生命週期，而不需變更金鑰政策或 IAM 政策。一般而言，當您使用其許可完成時，就會淘汰授予。  
可以透過授予中指定的選用[淘汰主體](grants.md#terms-retiring-principal)淘汰授予。[承授者主體](grants.md#terms-grantee-principal)亦可他淘汰授予，但前提是其也是淘汰主體或包含 `RetireGrant` 操作的授予。作為備份，建立授予 AWS 帳戶 的 可以淘汰授予。  
有可以在 IAM 政策中使用的 `kms:RetireGrant` 許可，但其公用程式有限。在授予中指定的主體可以淘汰授予，無需 `kms:RetireGrant` 許可。單獨的 `kms:RetireGrant` 許可不允許主體淘汰授予。`kms:RetireGrant` 許可在[金鑰政策](key-policies.md)或[資源控制政策](resource-control-policies.md)中無效。  
+ 若要拒絕淘汰授予的許可，您可以在 IAM 政策中使用具有 `kms:RetireGrant`許可`Deny`的動作。
+  AWS 帳戶 擁有 KMS 金鑰的 可以將`kms:RetireGrant`許可委派給帳戶中的 IAM 主體。
+ 如果淘汰委託人不同 AWS 帳戶，其他帳戶中的管理員可以使用 `kms:RetireGrant`將淘汰授予的許可委派給該帳戶中的 IAM 委託人。

 AWS KMS API 遵循[最終一致性](grants.md#terms-eventual-consistency)模型。當您建立、淘汰或撤銷授權時，在該變更適用於整個 AWS KMS之前，可能會有短暫延遲。變更傳播到整個系統通常需要不到幾秒鐘的時間，但在某些情況下可能需要幾分鐘。如果您需要立即刪除新的授予，在全部可用之前 AWS KMS，[請使用授予字符](using-grant-token.md)來淘汰授予。您無法使用授予字符來撤銷授予。