

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

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

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

如果您同時允許金鑰政策和 IAM 政策中的所有動作 (`kms:*`)，委託人會同時擁有 KMS 金鑰的管理和使用許可。作為安全最佳實務，我們建議僅將這些許可委派給特定委託人。您可以透過在金鑰政策中明確命名主體，或限制 IAM 政策連接的主體來執行此操作。您也可以使用[條件金鑰](policy-conditions.md)來限制許可。例如，如果發出 API 呼叫的委託人具有條件規則中指定的標籤，您可以使用 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-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)。我們建議您在撰寫政策之前檢閱此主題，以減少政策產生意外效果的機會，例如提供存取權給不應存取的主體。

**提示**  
在非生產環境中測試應用程式時，請使用 [IAM Access Analyzer](https://aws.amazon.com/iam/features/analyze-access/) 協助您將最低權限套用至 IAM 政策。

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

**進一步了解**
+ [AWS 任務函數的 受管政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_job-functions.html)
+ [用於寫入最低權限 IAM 政策的技巧](https://aws.amazon.com//blogs/security/techniques-for-writing-least-privilege-iam-policies/)

## 實作最低權限的許可
<a name="key-policy-least-privilege"></a>

當您授予 AWS 服務使用 KMS 金鑰的許可時，請確定該許可僅適用於服務必須代表您存取的資源。此最低權限策略有助於防止 AWS 在服務之間傳遞請求時，未經授權使用 KMS 金鑰。

若要實作最低權限策略，建議您使用 AWS KMS 加密內容條件金鑰和全域來源 ARN 或來源帳戶條件金鑰。

### 使用加密內容條件金鑰
<a name="least-privilege-encryption-context"></a>

在使用 AWS KMS 資源時實作最低權限許可的最有效方法是在政策中包含 [kms:EncryptionContext:*context-key*](conditions-kms.md#conditions-kms-encryption-context)或 [kms:EncryptionContextKeys](conditions-kms.md#conditions-kms-encryption-context-keys)條件金鑰，允許主體呼叫 AWS KMS 密碼編譯操作。這些條件金鑰特別有效，因為它們會將許可與在資源加密時繫結至加密文字的[加密內容](encrypt_context.md)建立關聯。

只有在政策陳述式中的動作為 [CreateGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html) AWS KMS 或採用 `EncryptionContext` 參數的對稱密碼編譯操作，例如 [GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) 或 [Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) 等操作時，才能使用加密內容條件金鑰。(如需受支援操作的清單，請參閱 [kms:EncryptionContext:*context-key*](conditions-kms.md#conditions-kms-encryption-context) 或 [kms:EncryptionContextKeys](conditions-kms.md#conditions-kms-encryption-context-keys)。) 如果您使用這些條件金鑰來允許其他操作，例如 [DescribeKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html)，則許可會遭到拒絕。

將值設定為服務在加密資源時使用的加密內容。此資訊通常可在服務文件的「安全」一章中取得。例如，[AWS Proton 的加密內容](https://docs.aws.amazon.com/proton/latest/adminguide/data-protection.html#encryption-context)會識別 AWS Proton 資源及其相關聯的範本。[AWS Secrets Manager 加密內容](https://docs.aws.amazon.com/secretsmanager/latest/userguide/security-encryption.html#security-encryption-encryption-context)會識別秘密及其版本。[Amazon Location 的加密內容](https://docs.aws.amazon.com/location/latest/developerguide/encryption-at-rest.html#location-encryption-context)會識別追蹤器或收集。

下列範例金鑰政策陳述式允許 Amazon Location Service 代表授權使用者建立授予。此原則陳述式會藉由使用 [kms:ViaService](conditions-kms.md#conditions-kms-via-service)、[kms:CallerAccount](conditions-kms.md#conditions-kms-caller-account) 和 `kms:EncryptionContext:context-key` 條件金鑰，將許可綁定至特定追蹤器資源來限制許可。

```
{
  "Sid": "Allow Amazon Location to create grants on behalf of authorized users",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/LocationTeam"
  },
  "Action": "kms:CreateGrant",
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "kms:ViaService": "geo.us-west-2.amazonaws.com",
      "kms:CallerAccount": "111122223333",
      "kms:EncryptionContext:aws:geo:arn": "arn:aws:geo:us-west-2:111122223333:tracker/SAMPLE-Tracker"
    }
  }
}
```

### 使用 `aws:SourceArn` 或 `aws:SourceAccount` 條件金鑰
<a name="least-privilege-source-arn"></a>

當主要政策陳述式中的主體是 [AWS 服務主體時](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html#principal-services)，強烈建議您除了 `kms:EncryptionContext:context-key` 條件金鑰之外，再使用 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) 或 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) 全域條件金鑰。只有在 AWS KMS 請求來自其他服務時，授權內容才會包含 ARN 和帳戶值 AWS 。這個條件組合會實作最低權限許可，並避免潛在的[混淆代理人案例](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)。服務主體通常不會用作金鑰政策中的主體，但某些 AWS 服務需要它 AWS CloudTrail，例如 。

若要使用 `aws:SourceArn` 或 `aws:SourceAccount` 全域條件金鑰，請將值設定為要加密之資源的 Amazon Resource Name (ARN) 或帳戶。例如，在給予 AWS CloudTrail 許可以加密追蹤的金鑰政策陳述式中，將 `aws:SourceArn` 的值設定為追蹤的 ARN。盡可能使用 `aws:SourceArn`，這更為具體。將值設定為 ARN 或具有萬用字元的 ARN 模式。如果您不知道資源的 ARN，請改為使用 `aws:SourceAccount`。

**注意**  
如果資源 ARN 包含 AWS KMS 金鑰政策中不允許的字元，則無法在`aws:SourceArn`條件金鑰的值中使用該資源 ARN。請改用 `aws:SourceAccount` 條件金鑰。如需有關金鑰政策文件規則的詳細資訊，請參閱[金鑰政策格式](key-policy-overview.md#key-policy-format)。

在下列範例金鑰政策中，取得許可的主體是 AWS CloudTrail 服務主體 `cloudtrail.amazonaws.com`。為了實作最低權限，此政策會使用 `aws:SourceArn` 和 `kms:EncryptionContext:context-key` 條件金鑰。政策陳述式允許 CloudTrail 使用 KMS 金鑰[產生資料金鑰](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)，它可用來加密追蹤。獨立評估 `aws:SourceArn` 和 `kms:EncryptionContext:context-key` 條件。針對指定操作使用 KMS 金鑰的任何請求都必須滿足這兩個條件。

若要將服務的許可限制為範例帳戶 (111122223333) 和 `us-west-2` 區域中的 `finance` 追蹤，此政策陳述式會將 `aws:SourceArn` 條件金鑰設定為特定追蹤的 ARN。條件陳述式使用 [ArnEquals](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_ARN) 運算子來確保在比對時獨立評估 ARN 中的每個元素。此範例也會使用 `kms:EncryptionContext:context-key` 條件金鑰來限制特定帳戶和區域中追蹤的許可。

在使用此金鑰政策之前，請將範例帳戶 ID、區域和追蹤名稱取代為您帳戶的有效值。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowCloudTrailToEncryptLogs",
      "Effect": "Allow",
      "Principal": {
        "Service": "cloudtrail.amazonaws.com"
      },
      "Action": "kms:GenerateDataKey",
      "Resource": "*",
      "Condition": {
        "ArnEquals": {
          "aws:SourceArn": [
            "arn:aws:cloudtrail:us-west-2:111122223333:trail/finance"
          ]
        },
        "StringLike": {
          "kms:EncryptionContext:aws:cloudtrail:arn": [
            "arn:aws:cloudtrail:*:111122223333:trail/*"
          ]
        }
      }
    }
  ]
}
```

------