AWS KMS を使用した CloudWatch Logs でのログデータの暗号化 - Amazon CloudWatch Logs

AWS KMS を使用した CloudWatch Logs でのログデータの暗号化

ロググループのデータは常に CloudWatch Logs で暗号化されます。この暗号化には、オプションで AWS AWS Key Management Service を使用できます。その場合、暗号化は AWS KMS (AWS KMS) カスタマーマスターキー (CMK) を使用して行われます。AWS KMS を使用する暗号化は、ロググループを作成するときか、ロググループが存在しているときに、CMK とロググループを関連付けることにより、ロググループレベルで有効になります。

重要

CloudWatch Logs は、kms:EncryptionContext:aws:logs:arn をキーとして使用し、ロググループの ARN をそのキーの値として使用して、暗号化コンテキストをサポートするようになりました。CMK ですでに暗号化したロググループがあり、その CMK が 1 つのアカウントとロググループで使用されるように制限する場合は、新しい CMK を割り当て、そのための条件を IAM ポリシーに含める必要があります。詳細については、「KMS キーと暗号化コンテキスト」を参照してください。

CMK をロググループと関連付けると、ロググループの新たに取り込まれたすべてのデータが CMK を使用して暗号化されます。このデータは、保持期間を通じて暗号化形式で保存されます。CloudWatch Logs は、リクエストがあればいつでもこのデータを復号します。暗号化されたデータがリクエストされた場合は必ず、CloudWatch Logs に CMK のアクセス権限が必要です。

ロググループから CMK の関連付けを解除すると、CloudWatch Logs はロググループの新たに取り込まれたデータの暗号化を停止します。それまで取り込まれたすべてのデータは暗号化されたままです。

重要

CloudWatch Logs は対称 CMK のみをサポートしています。非対称 CMK を使用してロググループのデータを暗号化しないでください。詳細については、「対称キーと非対称キーの使用」を参照してください。

制限

  • 以下の手順を実行するには、kms:CreateKeykms:GetKeyPolicy、および kms:PutKeyPolicy アクセス許可が必要です。

  • CMK とロググループを関連付けまたは関連付け解除すると、オペレーションが有効になるまで最大 5 分かかることがあります。

  • 関連付けられた CMK への CloudWatch Logs のアクセスを取り消したり、関連付けられた CMK を削除した場合、CloudWatch Logs 内の暗号化されたデータを取得できなくなります。

  • CloudWatch コンソールを使用して CMK をロググループと関連付けることはできません。

ステップ 1: AWS KMS CMK を作成する

AWS KMS CMK を作成するには、次の create-key コマンドを使用します。

aws kms create-key

出力には、CMK のキー ID とAmazon リソースネーム (ARN) が含まれます。出力例を次に示します。

{ "KeyMetadata": { "KeyId": "6f815f63-e628-448c-8251-e40cb0d29f59", "Description": "", "Enabled": true, "KeyUsage": "ENCRYPT_DECRYPT", "KeyState": "Enabled", "CreationDate": 1478910250.94, "Arn": "arn:aws:kms:us-west-2:123456789012:key/6f815f63-e628-448c-8251-e40cb0d29f59", "AWSAccountId": "123456789012" } }

ステップ 2: CMK でアクセス権限を設定する

デフォルトでは、すべての AWS KMS CMK はプライベートです。リソースの所有者のみがその CMK を使用してデータを暗号化および復号できます。ただし、リソース所有者は、他のユーザーとリソースに CMK へのアクセス権限を付与することができます。このステップでは、CloudWatch サービスプリンシパルに、CMK を使用するアクセス権限を付与します。このサービスプリンシパルは、CMK が保存されているのと同じ AWS リージョンにあることが必要です。

ベストプラクティスとして、指定した AWS アカウントまたはロググループのみにキーの使用を制限することをお勧めします。

まず、get-key-policy コマンドを使用して、CMK のデフォルトポリシーを policy.json として保存します。

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

テキストエディタで policy.json ファイルを開き、以下のいずれかのステートメントから太字のセクションを追加します。既存のステートメントと新しいステートメントをカンマで区切ります。これらのステートメントでは、Condition セクションを使用して KMS キーのセキュリティを強化しています。詳細については、「KMS キーと暗号化コンテキスト」を参照してください。

この例の Condition セクションでは、キーを 1 つのロググループ ARN に制限しています。

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

この例の Condition セクションでは、KMS の使用を、指定したアカウントに制限していますが、いずれのロググループにも制限していません。

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

最後に、次の put-key-policy コマンドを使用して更新されたポリシーを追加します。

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

ステップ 3: ログ グループと CMK を関連付ける

CMK とロググループは、ロググループの作成時または作成後に関連付けることができます。

ロググループに CMK がすでに関連付けられているかどうかを確認するには、次の describe-log-groups コマンドを使用します。

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

出力に kmsKeyId フィールドが含まれている場合、ロググループはそのフィールドの値に対して表示されるキーに関連付けられます。

ロググループの作成時に CMK をロググループに関連付けるには

次のように、create-log-group コマンドを使用します。

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

CMK を既存のロググループに関連付けるには

次のように、associate-kms-key コマンドを使用します。

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

ステップ 4: ロググループを CMK の関連付けから解除する

ロググループに関連付けられた CMK の関連付けを解除するには、次の disassociate-kms-key コマンドを使用します。

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

KMS キーと暗号化コンテキスト

KMS キーと暗号化されたロググループのセキュリティを強化するために、CloudWatch Logs では、ログデータの暗号化に使用される暗号化コンテキストに、ロググループ ARN が含まれるようになりました。暗号化コンテキストは、追加の認証済みデータとして使用されるキーと値のペアのセットです。暗号化コンテキストにより、IAM ポリシー条件を使用して AWS アカウントおよびロググループごとに KMS キーへのアクセスを制限できます。詳細については、「暗号化コンテキスト」および「IAM JSON ポリシー要素: 条件」を参照してください。

暗号化されたロググループごとに異なる CMK キーを使用することをお勧めします。

前に暗号化したロググループがあり、そのロググループを変更して、そのグループでのみ機能する新しい CMK の使用をそのグループのみに制限する場合は、以下の手順に従います。

暗号化されたロググループを変更して、CMK の使用をそのグループのみに制限するには

  1. 以下のコマンドを入力して、ロググループの現在の CMK の ARN を見つけます。

    aws logs describe-log-groups

    出力には以下の行が含まれます。ARN を書きとめておきます。ステップ 7 で使用する必要があります。

    ... "kmsKeyId": "arn:aws:kms:us-west-2:123456789012:key/01234567-89ab-cdef-0123-456789abcdef" ...
  2. 以下のコマンドを入力して、新しい CMK を作成します。

    aws kms create-key
  3. 以下のコマンドを入力して、新しいキーのポリシーを policy.json ファイルに保存します。

    aws kms get-key-policy --key-id new-key-id --policy-name default --output text > ./policy.json
  4. テキストエディタを使用して policy.json を開き、Condition 式をポリシーに追加します。

    { "Version": "2012-10-17", "Id": "key-default-1", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::ACCOUNT-ID:root" }, "Action": "kms:*", "Resource": "*" }, { "Effect": "Allow", "Principal": { "Service": "logs.region.amazonaws.com" }, "Action": [ "kms:Encrypt*", "kms:Decrypt*", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:Describe*" ], "Resource": "*", "Condition": { "ArnLike": { "kms:EncryptionContext:aws:logs:arn": "arn:aws:logs:REGION:ACCOUNT-ID:log- group:LOG-GROUP-NAME" } } } ] }
  5. 以下のコマンドを入力して、更新されたポリシーを新しい CMK に追加します。

    aws kms put-key-policy --key-id new-key-ARN --policy-name default --policy file://policy.json
  6. 以下のコマンドを入力して、そのポリシーをロググループに関連付けます。

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

    CloudWatch Logs で、すべての新しいデータが新しい CMK を使用して暗号化されるようになりました。

  7. 次に、Decrypt を除くすべてのアクセス許可を古い CMK から取り消します。まず、以下のコマンドを入力して古いポリシーを取得します。

    aws kms get-key-policy --key-id old-key-ARN --policy-name default --output text > ./policy.json
  8. テキストエディタを使用して policy.json を開き、Action リストから kms:Decrypt* を除くすべての値を削除します。

    { "Version": "2012-10-17", "Id": "key-default-1", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::REGION:root" }, "Action": "kms:*", "Resource": "*" }, { "Effect": "Allow", "Principal": { "Service": "logs.region.amazonaws.com" }, "Action": [ "kms:Decrypt*" ], "Resource": "*" } ] }
  9. 以下のコマンドを入力して、更新されたポリシーを古い CMK に追加します。

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