

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# を使用して CloudWatch Logs のログデータを暗号化する AWS Key Management Service
<a name="encrypt-log-data-kms"></a>

ロググループのデータは常に CloudWatch Logs で暗号化されます。デフォルトでは、CloudWatch Logs は 256 ビットの Advanced Encryption Standard Galois/Counter Mode (AES-GCM) によるサーバー側の暗号化を使用して、保管中のログデータを暗号化します。別の方法として、この暗号化には AWS Key Management Service を使用できます。その場合、暗号化は AWS KMS キーを使用して行われます。を使用した暗号化 AWS KMS は、ロググループの作成時または作成後に、KMS キーをロググループに関連付けることで、ロググループレベルで有効になります。

**重要**  
CloudWatch Logs は、`kms:EncryptionContext:aws:logs:arn` をキーとして使用し、ロググループの ARN をそのキーの値として使用して、暗号化コンテキストをサポートするようになりました。KMS キーで暗号化したロググループがあり、そのキーが 1 つのアカウントとロググループで使用されるように制限する場合は、新しい KMS キーを割り当て、そのための条件を IAM ポリシーに含める必要があります。詳細については、「[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 はそのキーで暗号化されたログを読み取ることができなくなります。

**重要**  
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 リソースネーム (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 キーはプライベートです。リソースの所有者のみがその CMK を使用してデータを暗号化および復号できます。ただし、リソース所有者は、他のユーザーとリソースに 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` セクションでは、キーを 1 つのロググループ 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}}:*"
                }
            }
        }
    ]
}
```

------

## ステップ 3: 呼び出し元の IAM プリンシパルにアクセス許可を設定する
<a name="cmk-permissions-caller"></a>

CloudWatch Logs APIs を呼び出す IAM プリンシパル (ユーザーまたはロール) にアクセス許可を追加します。必要なアクセス許可は、プリンシパルが実行する必要があるオペレーションによって異なります。これらのアクセス許可は、 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)」を参照してください。

### KMS キーをロググループに関連付けるためのアクセス許可
<a name="cmk-permissions-association"></a>

`kmsKeyId` パラメータ`CreateLogGroup`を使用して を呼び出すか、 を呼び出す IAM プリンシパルには`AssociateKmsKey`、指定された KMS キーに対する`kms:DescribeKey`アクセス許可が必要です。呼び出し元にこのアクセス許可がない場合、API コールは で失敗します`AccessDeniedException`。

次のキーポリシーステートメントの例では、KMS キーをロググループに関連付けるために必要な最小限のアクセス許可を付与します。

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

### 暗号化されたログデータの読み取りと書き込みのためのアクセス許可
<a name="cmk-permissions-readwrite"></a>

IAM プリンシパルが暗号化されたログデータを読み書きする必要がある場合 (カスタマーマネージド KMS キーで暗号化されたロググループ`StartQuery`で `PutLogEvents``GetLogEvents`、`FilterLogEvents`、、 を呼び出す場合など）、プリンシパルには追加の 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"
      ]
    }
  }
}
```

ベストプラクティスとして、 AWS KMS 暗号化されたロググループとやり取りするロールのみにポリシーの範囲を設定します。

または、キーの関連付けと 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
```

## ステップ 4: 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}}"
```

## ステップ 5: ロググループからキーの関連付けを解除する
<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 KMS AWS キーへのアクセスを制限できます。詳細については、[暗号化コンテキスト](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context)および [IAM JSON ポリシー要素: 条件](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
   ```