

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

# 使用 加密 CloudWatch Logs 中的查詢資料表 AWS Key Management Service
<a name="encrypt-lookup-tables-kms"></a>

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

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

將 KMS 金鑰與查詢資料表建立關聯後，所有存放在查詢資料表中的資料都會使用此金鑰加密。每當請求此資料時，CloudWatch Logs 會解密此資料。每當有人請求取得加密的資料時，CloudWatch Logs 必須擁有 KMS 金鑰許可。

如果您稍後取消 KMS 金鑰與查詢資料表的關聯，CloudWatch Logs 會使用 CloudWatch Logs 預設加密方法加密資料。不過，如果金鑰在您取消關聯之前已停用或刪除，則 CloudWatch Logs 無法讀取使用該金鑰加密的資料。

如需 CloudWatch Logs 如何使用 AWS KMS 加密日誌資料的一般資訊，請參閱 [使用 在 CloudWatch Logs 中加密日誌資料 AWS Key Management Service](encrypt-log-data-kms.md)。

## CloudWatch Logs 如何使用 AWS KMS 查詢資料表
<a name="encrypt-lookup-tables-how-it-works"></a>

CloudWatch Logs 使用 AWS KMS 信封加密來保護查詢資料表資料。當您將 KMS 金鑰與查詢資料表建立關聯時，CloudWatch Logs 會將`GenerateDataKey`請求傳送至 AWS KMS。 AWS KMS 會產生唯一的資料加密金鑰 (DEK)，並同時傳回純文字複本和 DEK 的加密複本。CloudWatch Logs 使用純文字 DEK 來加密查詢資料表資料，然後將加密的 DEK 與加密的資料一起存放。不會儲存純文字 DEK，並在使用後從記憶體中捨棄。

當 CloudWatch Logs 需要讀取查詢資料表資料時，它會 AWS KMS 使用加密的 DEK 向 傳送`Decrypt`請求。 會 AWS KMS 解密 DEK，並將純文字 DEK 傳回 CloudWatch Logs，然後使用它來解密查詢資料表資料。

CloudWatch Logs 在向 提出請求時使用下列加密內容 AWS KMS：

```
{
    "aws:logs:arn": "arn:aws:logs:region:account-id:lookup-table:lookup-table-name"
}
```

您可以在 IAM 政策和 AWS KMS 金鑰政策中使用此加密內容來控制對 KMS 金鑰的存取。如需詳細資訊，請參閱[AWS KMS 金鑰和加密內容](encrypt-log-data-kms.md#encrypt-log-data-kms-policy)。

## 所需的 許可
<a name="encrypt-lookup-tables-permissions"></a>

若要搭配查詢資料表使用 AWS KMS 加密，IAM 主體必須具有 KMS 金鑰的下列 AWS KMS 許可：
+ `kms:Decrypt`
+ `kms:GenerateDataKey`

在以 KMS 金鑰加密的查詢資料表`GetLookupTable`上呼叫 時，需要 `kms:Decrypt`許可，以便 CloudWatch Logs 可以代表您解密資料。`StartQuery` 使用加密查詢表上使用 `lookup`命令的查詢呼叫 時，金鑰 （用於加密查詢表的 KMS 金鑰） 也需要 `kms:Decrypt` 許可。呼叫 `CreateLookupTable`或使用 `UpdateLookupTable` KMS 金鑰時需要 `kms:GenerateDataKey`許可，以便 CloudWatch Logs 可以產生資料加密金鑰來加密查詢資料表資料。

此外，CloudWatch Logs 服務必須具有使用 KMS 金鑰的許可。您可以將政策陳述式新增至 KMS 金鑰政策來授予這些許可，如下節所述。

## 步驟 1：建立 AWS KMS 金鑰
<a name="encrypt-lookup-tables-create-key"></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"
        ]
    }
}
```

記錄金鑰 ARN。您需要在下列步驟中使用它。

## 步驟 2：設定 KMS 金鑰許可
<a name="encrypt-lookup-tables-key-policy"></a>

根據預設，所有 AWS KMS 金鑰都是私有的。只有資源擁有者可以使用它來加密和解密資料。您必須授予 CloudWatch Logs 服務主體使用金鑰的許可，並授予呼叫角色使用金鑰的許可。

首先，使用以下 [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` 檔案，並新增下列陳述式，以授予 CloudWatch Logs 服務主體使用金鑰的許可。此範例使用符合加密內容的`Condition`區段，將金鑰限制為特定的查詢資料表。

```
{
    "Effect": "Allow",
    "Principal": {
        "Service": "logs.region.amazonaws.com"
    },
    "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey"
    ],
    "Resource": "*",
    "Condition": {
        "StringEquals": {
            "kms:EncryptionContext:aws:logs:arn": "arn:aws:logs:region:account-id:lookup-table:lookup-table-name",
            "aws:SourceAccount": "account-id",
            "aws:SourceArn": "arn:aws:logs:region:account-id:lookup-table:lookup-table-name"
        }
    }
}
```

接著，將許可新增至將呼叫 CloudWatch Logs `CreateLookupTable`或 `UpdateLookupTable` APIs的角色。CloudWatch Logs 會使用 代表客戶`kms:ViaService`呼叫 AWS KMS 。如需詳細資訊，請參閱 [kms:ViaService](https://docs.aws.amazon.com/kms/latest/developerguide/conditions-kms.html#conditions-kms-via-service)。

```
{
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::account-id:role/role-name"
    },
    "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey"
    ],
    "Resource": "*",
    "Condition": {
        "StringEquals": {
            "kms:ViaService": [
                "logs.region.amazonaws.com"
            ]
        }
    }
}
```

最後，使用下列 [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="encrypt-lookup-tables-associate"></a>

當您使用 `CreateLookupTable` API 建立 KMS 金鑰與查詢資料表建立關聯，或使用 `UpdateLookupTable` API 更新現有的查詢資料表。這兩個 APIs都是 AWSLogsConfigService 的一部分。

**建立 KMS 金鑰時將其與查詢資料表建立關聯**  
使用 `CreateLookupTable` API，並使用 KMS 金鑰的 ARN 指定 `kmsKeyArn` 參數：

```
aws logs create-lookup-table \
    --lookup-table-name my-lookup-table \
    --kms-key-arn "arn:aws:kms:region:account-id:key/key-id"
```

**將 KMS 金鑰與現有查詢資料表建立關聯**  
使用 `UpdateLookupTable` API，並使用 KMS 金鑰的 ARN 指定 `kmsKeyArn` 參數：

```
aws logs update-lookup-table \
    --lookup-table-name my-lookup-table \
    --kms-key-arn "arn:aws:kms:region:account-id:key/key-id"
```

## 考量事項
<a name="encrypt-lookup-tables-considerations"></a>
+ 將 KMS 金鑰與查詢資料表建立關聯或取消關聯後，操作最多可能需要五分鐘才會生效。
+ 如果您撤銷 CloudWatch Logs 對相關聯金鑰的存取權或刪除關聯的 KMS 金鑰，則無法再擷取 CloudWatch Logs 中的加密查詢資料表資料。
+ 若要執行本主題中的步驟，您必須具有下列許可：`kms:CreateKey`、`kms:PutKeyPolicy`、 `kms:GetKeyPolicy`和適當的 CloudWatch Logs 許可，才能呼叫 `CreateLookupTable`或 `UpdateLookupTable`。