AWS Key Management Service を使用して CloudWatch Logs のログデータを暗号化する - Amazon CloudWatch ログ

AWS Key Management Service を使用して CloudWatch Logs のログデータを暗号化する

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

重要

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

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

ロググループから CMK の関連付けを解除すると、CloudWatch Logs は、CloudWatch Logs デフォルトの暗号化方法を使用して、新しく取り込んだデータを暗号化します。以前に取り込まれたデータのうち CMK で暗号化されたものは、すべて CMK で暗号化されたままになります。

重要

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": { "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: 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 セクションを使用して AWS KMS キーのセキュリティを強化します。詳細については、AWS 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 セクションは AWS 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

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

AWS Key Management Service キーと暗号化されたロググループのセキュリティを強化するために、CloudWatch Logs は、ロググループ ARN をログデータの暗号化に使用される暗号化コンテキストの一部とするようになりました。暗号化コンテキストは、追加の認証済みデータとして使用されるキーと値のペアのセットです。暗号化コンテキストは、IAM ポリシー条件を使用して AWS アカウントとロググループによる 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