

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

# 建立金鑰政策
<a name="key-policy-overview"></a>

您可以在 AWS KMS 主控台或使用 AWS KMS API 操作建立和管理金鑰政策，例如 [CreateKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html)、[ReplicateKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_ReplicateKey.html) 和 [PutKeyPolicy](https://docs.aws.amazon.com/kms/latest/APIReference/API_PutKeyPolicy.html)。

當您在 AWS KMS 主控台中建立 KMS 金鑰時，主控台會逐步解說根據[主控台的預設金鑰政策建立金鑰政策](key-policy-default.md)的步驟。使用 `CreateKey` 或 `ReplicateKey` API 時，若不指定金鑰政策，這些 API 便會[為以程式設計方式建立之金鑰，套用預設金鑰政策](key-policy-default.md)。當您採用 `PutKeyPolicy` API 時，必須指定金鑰政策。

每個政策文件可以擁有一個或多個政策陳述式。以下範例顯示具有一個政策陳述式的有效金鑰政策文件。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "DescribePolicyStatement",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:user/Alice"
      },
      "Action": "kms:DescribeKey",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "kms:KeySpec": "SYMMETRIC_DEFAULT"
        }
      }
    }
  ]
}
```

------

**Topics**
+ [金鑰政策格式](#key-policy-format)
+ [金鑰政策中的元素](#key-policy-elements)
+ [範例金鑰政策](#key-policy-example)

## 金鑰政策格式
<a name="key-policy-format"></a>

金鑰政策文件必須符合以下規則：
+ 最大為 32 KB (32,768 個位元組)
+ 金鑰政策陳述式中的 `Sid` 元素可包含空格。(IAM 政策文件的 `Sid` 元素中禁止使用空格。)

金鑰政策文件僅可包含以下字元：
+ 可印出的 ASCII 字元
+ 基本拉丁字母和拉丁字母補充-1 字元集中的可印出字元
+ Tab (`\u0009`)、換行字元 (`\u000A`) 和歸位字元 (`\u000D`) 特殊字元

## 金鑰政策中的元素
<a name="key-policy-elements"></a>

金鑰政策文件必須擁有下列元素︰

**版本**  
指定金鑰政策文件版本。將版本設定為 `2012-10-17` (最新版本)。

**陳述式**  
包含政策陳述式。金鑰政策文件必須至少包含一個陳述式。  
每個金鑰政策陳述式最多可包含六個元素。需要 `Effect`、`Principal`、`Action` 和 `Resource` 元素。    
**Sid **  
(選用) 陳述式識別符 (`Sid`) 為可用來描述陳述式的任意字串。金鑰政策中的 `Sid` 可包含空格。(不得在 IAM 政策 `Sid` 元素中包含空格。)  
**Effect**  
(必要) 決定是允許還是拒絕政策陳述式中的許可。有效值為 `Allow` 或 `Deny`。如果您未明確允許存取 KMS 金鑰，將會隱含拒絕存取。您也可以明確拒絕存取 KMS 金鑰。您可以這樣做以確保使用者無法存取 CMK，即使其他政策允許存取。  
**Principal**  
(必要) [主體](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html#Principal_specifying)是取得政策陳述式中指定許可的身分。您可以在金鑰政策中將 AWS 帳戶 IAM 使用者、IAM 角色和部分 AWS 服務指定為主體。IAM [使用者群組](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html)在任何政策類型中都不是有效的主體。  
星號值，例如 `"AWS": "*"` 代表所有帳戶的所有 AWS 身份。  
除非採用[條件](policy-conditions.md)來限制金鑰政策，否則請勿在任何允許許可的金鑰政策陳述式將主體設為星號 (\$1)。除非另一個政策陳述式明確拒絕 KMS 金鑰，否則星號會提供每個 AWS 帳戶 許可中的每個身分。其他 中的使用者只要在自己的帳戶中擁有對應的許可， AWS 帳戶 就可以使用您的 KMS 金鑰。
IAM 最佳實務不建議使用具有長期憑證的 IAM 使用者。盡可能使用提供臨時憑證的 IAM 角色。如需詳細資訊，請參閱《IAM 使用者指南》**中的 [IAM 中的安全性最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。
若金鑰政策陳述式中的主體是以 `arn:aws:iam::111122223333:root"` 表達的 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html#principal-accounts](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html#principal-accounts)，則政策陳述式不會向任何 IAM 主體授予許可。而是提供使用 IAM 政策的 AWS 帳戶 許可，以委派金鑰政策中指定的許可。(雖然帳戶識別符中使用了「根」，但採用 `arn:aws:iam::111122223333:root"` 格式的主體*不*代表[AWS 帳戶根使用者](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html)。然而，帳戶主體代表帳戶及其管理員，包括帳戶根用戶。)  
當委託人是另一個 AWS 帳戶 或其委託人時，只有在 區域中使用 KMS 金鑰和金鑰政策啟用帳戶時，許可才有效。如需相關資訊了解哪些區域預設為未啟用 (「選擇加入區域」)，請參閱*《AWS 一般參考》* [的管理 AWS 區域](https://docs.aws.amazon.com/general/latest/gr/rande-manage.html)。  
若要允許不同的 AWS 帳戶 或其委託人使用 KMS 金鑰，您必須在金鑰政策和另一個帳戶中的 IAM 政策中提供許可。如需詳細資訊，請參閱[允許其他帳戶中的使用者使用 KMS 金鑰](key-policy-modifying-external-accounts.md)。  
**Action**  
(必要) 指定要允許或拒絕的 API 操作。例如， `kms:Encrypt`動作對應至 AWS KMS [Encrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Encrypt.html) 操作。您可以在政策陳述式中列出多個動作。如需詳細資訊，請參閱[許可參考](kms-api-permissions-reference.md)。  
如果必要的 `Action` 元素在金鑰政策陳述式中遺失，則政策陳述式沒有任何效果。沒有 `Action`元素的金鑰政策陳述式不適用於任何 KMS 金鑰。  
當金鑰政策陳述式缺少其`Action`元素時， AWS KMS 主控台會正確報告錯誤，但 [CreateKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html) 和 [PutKeyPolicy](https://docs.aws.amazon.com/kms/latest/APIReference/API_PutKeyPolicy.html) APIs會成功，即使政策陳述式無效。  
**資源**  
(必要) 在金鑰政策中，Resource 元素的值是 `"*"`，表示「此 KMS 金鑰」。星號 (`"*"`) 會識別金鑰政策所連接的 KMS 金鑰。  
如果必要的 `Resource` 元素在金鑰政策陳述式中遺失，則政策陳述式沒有任何效果。沒有 `Resource` 元素的金鑰政策不適用於任何 KMS 金鑰。  
當金鑰政策陳述式缺少其`Resource`元素時， AWS KMS 主控台會正確報告錯誤，但 [CreateKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html) 和 [PutKeyPolicy](https://docs.aws.amazon.com/kms/latest/APIReference/API_PutKeyPolicy.html) APIs會成功，即使政策陳述式無效。  
**條件**  
(選用) 條件則會指定金鑰政策生效必須符合的需求。使用 條件時， AWS 可以評估 API 請求的內容，以判斷政策陳述式是否適用。  
若要指定條件，您可以使用預先定義的*條件索引鍵*。 AWS KMS 支援[AWS 全域條件索引](conditions-aws.md)鍵和[AWS KMS 條件索引鍵](conditions-kms.md)。為了支援屬性型存取控制 (ABAC)， AWS KMS 提供條件金鑰，以根據標籤和別名控制對 KMS 金鑰的存取。如需詳細資訊，請參閱[適用於 的 ABAC AWS KMS](abac.md)。  
條件的格式為：  

```
"Condition": {"condition operator": {"condition key": "condition value"}}
```
例如：  

```
"Condition": {"StringEquals": {"kms:CallerAccount": "111122223333"}}
```

如需 AWS 政策語法的詳細資訊，請參閱《[AWS IAM 使用者指南》中的 IAM 政策參考](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies.html)。 **

## 範例金鑰政策
<a name="key-policy-example"></a>

下列範例顯示對稱加密 KMS 金鑰的完整金鑰政策。在閱讀本章中的關鍵政策概念時，您可以將其用作參考。此金鑰政策將先前[預設金鑰政策](key-policy-default.md)一節的範例政策陳述式結合至單一金鑰政策，來完成以下任務：
+ 允許範例 AWS 帳戶 111122223333 完整存取 KMS 金鑰。它允許帳戶及其管理員 (包括帳戶根使用者 (緊急情況)) 在帳戶中使用 IAM 政策，以允許對 KMS 金鑰的存取。
+ 允許 `ExampleAdminRole` IAM 角色管理 KMS 金鑰。
+ 允許 `ExampleUserRole` IAM 角色使用 KMS 金鑰。

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

****  

```
{
    "Id": "key-consolepolicy",
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "EnableIAMUserPermissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Sid": "AllowKeyAdministratorsAccess",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:role/ExampleAdminRole"
            },
            "Action": [
                "kms:Create*",
                "kms:Describe*",
                "kms:Enable*",
                "kms:List*",
                "kms:Put*",
                "kms:Update*",
                "kms:Revoke*",
                "kms:Disable*",
                "kms:Get*",
                "kms:Delete*",
                "kms:TagResource",
                "kms:UntagResource",
                "kms:ScheduleKeyDeletion",
                "kms:CancelKeyDeletion",
                "kms:RotateKeyOnDemand"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AllowKeyUse",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:role/ExampleUserRole"
            },
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*",
                "kms:DescribeKey"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AllowAttachmentPersistentResources",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:role/ExampleUserRole"
            },
            "Action": [
                "kms:CreateGrant",
                "kms:ListGrants",
                "kms:RevokeGrant"
            ],
            "Resource": "*",
            "Condition": {
                "Bool": {
                    "kms:GrantIsForAWSResource": "true"
                }
            }
        }
    ]
}
```

------