CloudWatchロググループをKMSで暗号化
CloudWatchロググループのコンソール画面から既存のロググループを暗号化する設定は出来ません(コンソール画面から新規でログループを作るときは出来ます)。ですが、既存ロググループの暗号化はAWS CLIなら出来ます。手順は以下の通りです。ポリシーは、IAMではなくKMSのキーポリシーに設定します。
- AWS CLIを使えるようにする(この記事では、AWS CLIの設定は説明しません)
- AWS KMSカスタマー管理型のキー(CMK)を作る
- CMKのキーポリシーでアクセス権限を設定
- aws cliコマンドでKMSのキーをロググループに関連付ける
カスタマー管理型のキー削除は、KMSのコンソールで出来ますが、7日~30日かかります。「カスタマー管理型のキー」のエイリアス名称が重複可能かどうか実験してないですが、キー作成を間違えたら同じエイリアス名称ですぐに作り直しはできないと考えて命名したほうがいい。
また、キー削除までの猶予期間であれば、キーの削除ができます。各種暗号化をおこなったけど、ユーザーの追加や削除が起こりうる場合、KMS管理鍵専用の半永久的に存在するユーザーなども作っておくといいと思います。
キーのステータスが無効になっていると、使えにないので注意してください。
AWS KMSカスタマー管理型のキー(CMK)を作る
AWS CLIの設定方法はググっていただき、以下の手順でカスタマー管理型のキー(CMK)を作成。『aws kms create-key』コマンドだと、複数のキーを識別しにくいのでコンソールで既存キー達を見ながら操作することをお勧めします。
- KMSヘ
- 「カスタマー管理型のキー」ヘ
- 「キーの作成」ヲクリック
- キーのタイプは「対称」
- 「詳細オプション」の「キーマテリアルオリジン」は「KMS」
- 次へ
- エイリアスを入力 EX)CloudWatchLogs
- 説明を入力 EX)CloudWatchLogs
- タグを入力(無しでもOK)
- 次へ
- キー管理者を選択(adminstratorユーザーを選ぶと良さそう)
- キーユーザーの使用アクセス許可を定義(CloudWatchロググループを見る人を選ぶ)
- キーポリシーのjsonの内容を確認し、「完了」をクリック
キー管理者 と キーユーザー は CloudWatchlogs KMS管理者 や CloudWatchlogs KMSキーユーザー のIAMグループを作り、まとめて指定するということは2020/10/23時点では出来ません。個々のIAMユーザーとIAMロールが選択肢で表示されます。この件は、AWSのKMSへのアクセスをIAMグループ単位で管理する (KMSキーポリシーでIAMグループが指定できないよ問題)にて対応可能です。
上記がすべて終わったら、「キーローテーション」もわすれずに設定しておきましょう。
CMKのキーポリシーでアクセス権限を設定
以下のAWS CLIコマンドを任意のディレクトリ(フォルダ)に移動してから実行します。cloudwatchlogs-cmk-key-policy.jsonを任意のディレクトリ(フォルダ)にダウンロードします。
aws kms get-key-policy --key-id キーID --policy-name default --output text > ./cloudwatchlogs-cmk-key-policy.json
任意のデイレクトリ(フォルダ)のcloudwatchlogs-cmk-key-policy.jsonを開き中身を確認します。
以下のポリシーを参考に、cloudwatchlogs-cmk-key-policy.jsonを編集します。概ね以下の内容を模倣して作成してみてください。ポイントは、キーユーザーの節でPrincipalにServiceで東京リージョンのlogsが入っている点です。これがないと、CloudWatchLogsのCMKによる暗号化は出来ないです。
{
"Version": "2012-10-17",
"Id": "clouwatch-logs-kms-policy",
"Statement": [
{
"Sid": "Enable IAM User Permissions",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::AWSアカウントID:root"
},
"Action": "kms:*",
"Resource": "*"
},
{
"Sid": "Allow access for Key Administrators",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::AWSアカウントID:user/cloudwatch-logs-kms-admin"
},
"Action": [
"kms:Create*",
"kms:Describe*",
"kms:Enable*",
"kms:List*",
"kms:Put*",
"kms:Update*",
"kms:Revoke*",
"kms:Disable*",
"kms:Get*",
"kms:Delete*",
"kms:TagResource",
"kms:UntagResource",
"kms:ScheduleKeyDeletion",
"kms:CancelKeyDeletion"
],
"Resource": "*"
},
{
"Sid": "Allow use of the key",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::AWSアカウントID:user/cloudwatch-logs-kms-user"
],
"Service": "logs.ap-northeast-1.amazonaws.com"
},
"Action": [
"kms:Encrypt",
"kms:Decrypt",
"kms:ReEncrypt*",
"kms:GenerateDataKey*",
"kms:DescribeKey"
],
"Resource": "*"
},
{
"Sid": "Allow attachment of persistent resources",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::AWSアカウントID:user/cloudwatch-logs-kms-user"
]
},
"Action": [
"kms:CreateGrant",
"kms:ListGrants",
"kms:RevokeGrant"
],
"Resource": "*",
"Condition": {
"Bool": {
"kms:GrantIsForAWSResource": "true"
}
}
}
]
}
cloudwatchlogs-cmk-key-policy.jsonを編集した場合、以下のコマンドで更新後のポリシーを追加します。パスに気を付けてください。この操作まではコンソールでも出来ます。
aws kms put-key-policy --key-id キーID --policy-name default --policy file://cloudwatchlogs-cmk-key-policy.json
aws cliコマンドでCMKを既存ロググループに関連付け
以下のAWS CLIコマンドで既存のロググループにCMKを関連付け、この操作はAWS CLIのみです。コンソールでは既存のロググループにCMKを関連付け出来ません。コマンド実行後、「ロググループの詳細」で「KMSキーID」にCMKのARNが表示されていればOKです。
aws logs associate-kms-key --log-group-name ロググループ名 --kms-key-id "キーarn"
ロググループとCMKの関連付け解除。この操作はAWS CLIのみです。コンソールでは出来ません。
aws logs disassociate-kms-key --log-group-name ロググループ名
CloudWatch LogsコンソールでKMSで暗号化された新規「ロググループを作成」する
CloudWatch→ロググループ→「ロググループを作成」をクリック→任意の「ロググループ名」を入力→「保持期間の設定」を選ぶ→そして、「KMSキー ID - オプション」を入力→「作成」をクリック、で暗号化されたCloudWatchロググループが出来ますが、画像のように暗号化の際に入力窓のラベルに「KMS キー ID – オプション」と記載されていて「キーarn」と書かれてないので、普通にKMSカスタマー管理型のキーのキー IDをコピペで貼り付けるとエラーになります。これ、AWS CLIで暗号化をやってないと、おそらく暗号化できないエラーの原因がわからない人も存在していると思います。つまり、CloudWatchLogsのロググループが非暗号化のまま運用してる可能性です。RDSのgeneralはSQLクエリログで顧客情報バリバリとかありますので暗号化必須です。
既存ロググループとCMKの関連付けコマンドでエラー
An error occurred (AccessDeniedException) when calling the AssociateKmsKey operation: The specified KMS key does not exist or is not allowed to be used with LogGroup 'arn:aws:logs:リージョン:アカウントID:log-group:ロググループ名'
『AssociateKmsKey操作の呼び出し時にエラーが発生しました(AccessDeniedException)。指定された KMS キーが存在しないか、LogGroup での使用が許可されていません。』とのことです。CMKのポリシーのjsonのキーユーザーの節でPrincipalにServiceで東京リージョンの(CloudWatch)logsが入っていないと、ロググループでCMKを使うことが出来ないといわれてしまいます。
git bashでAWS CLIを実行するとvalidation error
AWS CLIをgit bashで使うと以下のgit bash特有のエラーが出ます、aws log get-log-events –log-group-name problemの様にmount修正も可能ですが、Power ShellでAWS CLIコマンド実行したほうが解決策としては早いと思います。
An error occurred (InvalidParameterException) when calling the GetLogEvents operation: 1 validation error detected: Value 'C:/Program Files/Git/aws/ロググループ名' at 'logGroupName' failed to satisfy constraint: Member must satisfy regular expression pattern: [.-_/#A-Za-z0-9]+`