

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

# 使用 在 CloudWatch Logs 中加密日誌資料 AWS Key Management Service
<a name="encrypt-log-data-kms"></a>

在 CloudWatch Logs 中，日誌群組資料一律會加密。根據預設，CloudWatch Logs 會使用伺服器端加密搭配 256 位元進階加密標準 Galois/計數器模式 (AES-GCM) 來加密靜態日誌資料。您也可以使用 AWS Key Management Service 進行此加密。如果您這麼做，則會使用 AWS KMS 金鑰完成加密。 AWS KMS 使用 在日誌群組層級啟用加密，方法是在您建立日誌群組時或在日誌群組存在之後，將 KMS 金鑰與日誌群組建立關聯。

**重要**  
CloudWatch Logs 現在支援加密內容，用 `kms:EncryptionContext:aws:logs:arn` 做為金鑰，而日誌群組的 ARN 做為該金鑰的值。如果您有日誌群組已使用 KMS 加密，並希望能限制金鑰與單一帳戶和日誌群組搭配使用，您應該在 IAM 政策中指派包含條件的新 KMS 金鑰。如需詳細資訊，請參閱[AWS KMS 金鑰和加密內容](#encrypt-log-data-kms-policy)。

**重要**  
CloudWatch Logs 現在支援`kms:ViaService`允許日誌代表您進行 AWS KMS 呼叫。您應該將此新增至在金鑰政策或 IAM 中呼叫 CloudWatch Logs 的角色。如需詳細資訊，請參閱 [kms:ViaService](https://docs.aws.amazon.com/kms/latest/developerguide/conditions-kms.html#conditions-kms-via-service)。

建立 KMS 金鑰與日誌群組的關聯後，針對該日誌群組新擷取的所有資料，就會使用此金鑰加密。此資料在整個保留期間都以加密的格式儲存。每當請求此資料時，CloudWatch Logs 會解密此資料。每當有人請求取得加密的資料時，CloudWatch Logs 必須擁有 KMS 金鑰許可。

如果您之後取消 KMS 金鑰與日誌群組的關聯，CloudWatch Logs 會使用 CloudWatch Logs 預設的加密方法來加密新擷取的資料。先前使用 KMS 金鑰加密的所有擷取資料仍會使用 KMS 金鑰加密。由於 CloudWatch Logs 仍可繼續參照該金鑰，因此依然可在 KMS 金鑰解除關聯後傳回那些資料。但若稍後將金鑰停用，則 CloudWatch Logs 將無法讀取使用該金鑰加密的日誌。

**重要**  
CloudWatch Logs 僅支援對稱 KMS 金鑰。請勿使用非對稱金鑰來加密日誌群組中的資料。如需詳細資訊，請參閱[使用對稱和非對稱金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html)。

## 限制
<a name="encryption-limits"></a>
+ 若要執行下列步驟，您必須擁有下列許可：`kms:CreateKey`、`kms:GetKeyPolicy` 和 `kms:PutKeyPolicy`。
+ 在您建立或取消金鑰與日誌群組的關聯後，操作將在 5 分鐘內生效。
+ 如果您撤銷 CloudWatch Logs 對已關聯金鑰的存取權，或刪除所關聯的 KMS 金鑰，您將無法再擷取 CloudWatch Logs 中的加密資料。
+ 您無法使用 CloudWatch 主控台將 KMS 金鑰與現有日誌群組建立關聯。

## 步驟 1：建立 AWS KMS 金鑰
<a name="create-cmk"></a>

若要建立 KMS 金鑰，請使用以下 [create-key](https://docs.aws.amazon.com/cli/latest/reference/kms/create-key.html) 命令：

```
aws kms create-key
```

輸出包含金鑰 ID 和金鑰的 Amazon Resource Name (ARN)。下列為範例輸出：

```
{
    "KeyMetadata": {
        "Origin": "AWS_KMS",
        "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
        "Description": "",
        "KeyManager": "CUSTOMER",
        "Enabled": true,
        "CustomerMasterKeySpec": "SYMMETRIC_DEFAULT",
        "KeyUsage": "ENCRYPT_DECRYPT",
        "KeyState": "Enabled",
        "CreationDate": 1478910250.94,
        "Arn": "arn:aws:kms:us-west-2:123456789012:key/6f815f63-e628-448c-8251-e40cb0d29f59",
        "AWSAccountId": "123456789012",
        "EncryptionAlgorithms": [
            "SYMMETRIC_DEFAULT"
        ]
    }
}
```

## 步驟 2：設定 KMS 金鑰許可
<a name="cmk-permissions-lg"></a>

根據預設，所有 AWS KMS 金鑰都是私有的。只有資源擁有者可以使用它來加密和解密資料。然而，資源擁有者可以授與其他使用者和資源存取 KMS 金鑰的許可。在此步驟中，您會授予 CloudWatch Logs 服務主體和呼叫者角色使用金鑰的許可。此服務主體必須位於存放 KMS 金鑰的相同 AWS 區域中。

根據最佳實務，建議您將 KMS 金鑰的使用限制為您指定的 AWS 帳戶或日誌群組。

首先，使用以下 [get-key-policy](https://docs.aws.amazon.com/cli/latest/reference/kms/get-key-policy.html) 命令，將 KMS 金鑰的預設政策儲存為 `policy.json`：

```
aws kms get-key-policy --key-id key-id --policy-name default --output text > ./policy.json
```

在文字編輯器中開啟 `policy.json` 檔案，並從下列其中一個陳述式中加入區段 (以粗體顯示)。使用逗號從新陳述式中分隔現有陳述式。這些陳述式使用`Condition`區段來增強 AWS KMS 金鑰的安全性。如需詳細資訊，請參閱[AWS KMS 金鑰和加密內容](#encrypt-log-data-kms-policy)。

此範例中的 `Condition` 區段會將金鑰限制為單一日誌群組 ARN。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "key-default-1",
    "Statement": [
        {
            "Sid": "Enable IAM User Permissions",
            "Effect": "Allow",
            "Principal": {
            "AWS": "arn:aws:iam::123456789012:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "logs.us-east-1.amazonaws.com"
            },
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*",
                "kms:Describe*"
            ],
            "Resource": "*",
            "Condition": {
                "ArnEquals": {
                "kms:EncryptionContext:aws:logs:arn": "arn:aws:logs:us-east-1:111122223333:log-group:log-group-name"
                }
            }
        }
    ]
}
```

------

本範例中的 `Condition` 區段將 AWS KMS 金鑰限用於指定的帳戶，但可用於任何日誌群組。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "key-default-1",
    "Statement": [
        {
            "Sid": "Enable IAM User Permissions",
            "Effect": "Allow",
            "Principal": {
            "AWS": "arn:aws:iam::123456789012:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Principal": {
            "Service": "logs.us-east-1.amazonaws.com"
            },
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*",
                "kms:Describe*"
            ],
            "Resource": "*",
            "Condition": {
                "ArnLike": {
                "kms:EncryptionContext:aws:logs:arn": "arn:aws:logs:us-east-1:123456789012:*"
                }
            }
        }
    ]
}
```

------

接著，將許可新增至將呼叫 CloudWatch Logs 的角色。您可以將其他陳述式新增至 AWS KMS 金鑰政策，或透過角色本身的 IAM 來執行此操作。CloudWatch Logs 會使用 代表客戶`kms:ViaService`呼叫 AWS KMS 。如需詳細資訊，請參閱 [kms:ViaService](https://docs.aws.amazon.com/kms/latest/developerguide/conditions-kms.html#conditions-kms-via-service)。

若要在 AWS KMS 金鑰政策中新增許可，請將下列其他陳述式新增至您的金鑰政策。如果您使用此方法作為最佳實務，請將政策範圍限定為將與 AWS KMS 加密日誌群組互動的角色。

```
{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::account_id:role/role_name"
  },
  "Action": [
    "kms:Encrypt",
    "kms:ReEncrypt*",
    "kms:Decrypt",
    "kms:GenerateDataKey*",
    "kms:Describe*"
  ],
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "kms:ViaService": [
        "logs.region.amazonaws.com"
      ]
    }
  }
}
```

或者，如果您想要在 IAM 中管理角色許可，您可以透過下列政策新增同等許可。這可以新增到現有的角色政策，或做為額外的個別政策連接到角色。如果您使用此方法作為最佳實務，請將政策範圍限定為僅用於日誌加密的 AWS KMS 金鑰。如需詳細資訊，請參閱[編輯 IAM 政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-edit.html)。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kms:Encrypt",
                "kms:ReEncrypt*",
                "kms:Decrypt",
                "kms:GenerateDataKey*",
                "kms:Describe*"
            ],
            "Condition": {
                "StringEquals": {
                    "kms:ViaService": [
                        "logs.us-east-1.amazonaws.com"
                    ]
                }
            },
            "Resource": "arn:aws:kms:us-east-1:444455556666:key/key_id"
        }
    ]
}
```

------

最後，使用下列 [put-key-policy](https://docs.aws.amazon.com/cli/latest/reference/kms/put-key-policy.html) 命令新增更新的政策：

```
aws kms put-key-policy --key-id key-id --policy-name default --policy file://policy.json
```

## 步驟 3：為 KMS 金鑰與日誌群組建立關聯
<a name="associate-cmk"></a>

您可以在建立日誌群組時或建立完成後，為 KMS 金鑰與日誌群組建立關聯。

如果要確認日誌群組是否已經有相關聯的 KMS 金鑰，請使用以下 [describe-log-groups](https://docs.aws.amazon.com/cli/latest/reference/logs/describe-log-groups.html) 命令：

```
aws logs describe-log-groups --log-group-name-prefix "log-group-name-prefix"
```

如果輸出包含 `kmsKeyId` 欄位，則日誌群組會與該欄位值所顯示的索引鍵相關聯。

**若要在建立日誌群組時與 KMS 金鑰建立關聯**  
使用 [create-log-group](https://docs.aws.amazon.com/cli/latest/reference/logs/create-log-group.html) 命令，如下所示：

```
aws logs create-log-group --log-group-name my-log-group --kms-key-id "key-arn"
```

**若要為 KMS 金鑰與現有的日誌群組建立關聯**  
使用 [associate-kms-key](https://docs.aws.amazon.com/cli/latest/reference/logs/associate-kms-key.html) 命令，如下所示：

```
aws logs associate-kms-key --log-group-name my-log-group --kms-key-id "key-arn"
```

## 步驟 4：取消金鑰與日誌群組的關聯
<a name="disassociate-cmk"></a>

若要取消 KMS 金鑰與日誌群組的關聯，請使用以下 [disassociate-kms-key](https://docs.aws.amazon.com/cli/latest/reference/logs/disassociate-kms-key.html) 命令：

```
aws logs disassociate-kms-key --log-group-name my-log-group
```

## AWS KMS 金鑰和加密內容
<a name="encrypt-log-data-kms-policy"></a>

為了增強 AWS Key Management Service 金鑰和加密日誌群組的安全性，CloudWatch Logs 現在會將日誌群組 ARNs 做為用於加密日誌資料*之加密內容*的一部分。加密內容是一組做為額外驗證資料的索引鍵/值組。加密內容可讓您使用 IAM 政策條件，依 AWS 帳戶和日誌群組限制對 AWS KMS 金鑰的存取。如需詳細資訊，請參閱[加密內容](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context)和 [IAM JSON 政策元素：Condition](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)。

建議您針對每個加密的日誌群組使用不同的 KMS 金鑰。

如果您有先前加密的日誌群組，但現在希望將日誌群組變更為使用只適用於該日誌群組的新 KMS 金鑰，請依照下列步驟執行。

**透過政策將金鑰設為特定日誌群組專用，將加密日誌群組轉換為使用 KMS 金鑰**

1. 請輸入下列指令，以尋找日誌群組目前金鑰的 ARN：

   ```
   aws logs describe-log-groups
   ```

   輸出包括這一行。記下 ARN。步驟 7 中會用到。

   ```
   ...
   "kmsKeyId": "arn:aws:kms:us-west-2:123456789012:key/01234567-89ab-cdef-0123-456789abcdef"
   ...
   ```

1. 輸入以下命令來建立新的 KMS 金鑰：

   ```
   aws kms create-key
   ```

1. 輸入下列命令，將新金鑰的政策儲存至 `policy.json` 檔案：

   ```
   aws kms get-key-policy --key-id new-key-id --policy-name default --output text > ./policy.json
   ```

1. 使用文字編輯器來開啟 `policy.json`，並將 `Condition` 運算式新增至政策：

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Id": "key-default-1",
       "Statement": [
           {
               "Sid": "Enable IAM User Permissions",
               "Effect": "Allow",
               "Principal": {
                   "AWS": "arn:aws:iam::111122223333:root"
               },
               "Action": "kms:*",
               "Resource": "*"
           },
           {
               "Effect": "Allow",
               "Principal": {
               "Service": "logs.us-east-1.amazonaws.com"
               },
               "Action": [
                   "kms:Encrypt",
                   "kms:Decrypt",
                   "kms:ReEncrypt*",
                   "kms:GenerateDataKey*",
                   "kms:Describe*"
               ],
               "Resource": "*",
               "Condition": {
                   "ArnLike": {
                   "kms:EncryptionContext:aws:logs:arn": "arn:aws:logs:us-east-1:111122223333:log-group:LOG-GROUP-NAME"
                   }
               }
           }
       ]
   }
   ```

------

1. 輸入下列命令，將更新的政策新增至新的 KMS 金鑰：

   ```
   aws kms put-key-policy --key-id new-key-ARN --policy-name default --policy file://policy.json
   ```

1. 輸入下列命令，將政策與日誌群組建立關聯：

   ```
   aws logs associate-kms-key --log-group-name my-log-group --kms-key-id new-key-ARN
   ```

   CloudWatch Logs 現在會使用新金鑰來加密所有新資料。

1. 接下來，撤銷舊金鑰的所有權限，除了 `Decrypt` 以外。首先，輸入下列命令以擷取舊政策：

   ```
   aws kms get-key-policy --key-id old-key-ARN --policy-name default --output text > ./policy.json
   ```

1. 使用文字編輯器來開啟 `policy.json`，並移除 `Action` 清單中的所有值，除了 `kms:Decrypt` 以外

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Id": "key-default-1",
       "Statement": [
           {
               "Sid": "Enable IAM User Permissions",
               "Effect": "Allow",
               "Principal": {
                   "AWS": "arn:aws:iam::111122223333:root"
               },
               "Action": "kms:*",
               "Resource": "*"
           },
           {
               "Effect": "Allow",
               "Principal": {
                   "Service": "logs.region.amazonaws.com"
               },
               "Action": [
                   "kms:Decrypt"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

------

1. 輸入下列命令，將更新的政策新增至舊金鑰：

   ```
   aws kms put-key-policy --key-id old-key-ARN --policy-name default --policy file://policy.json
   ```