CloudTrailとCloudWatch Logsの連携によるログのアラーム設定
CloudTrailの中身を直ぐに確認したい
CloudTrailは、AWSのAPI操作に対する監査機能です。AWSの各種サービスは全てAPIを使って利用します。このAPI利用履歴について全て保管し、監査をすることで、誰がいつ何処から何をしたのか確認することができます。エンタープライズ用途では待ち望まれた機能ですが、ひとつ難点がありました。ログの管理や閲覧の機能を持っていないことです。今回の新機能追加によって、CloudTrailに保管されたタイミングでSNSの通知が飛び、CloudWatch Logsに保管することで、ログの文字列に対する、フィルターやアラームを設定できるようになりました。日時バッチなどでチェックするのではなく、ログが発生したタイミングで確認ができるのが特徴です。今回ははじめからやってみましょう。
S3にログ用のバケットを作成
S3のメニューから新規にバケットを作成します。aws-cloudtrail-log-satoshiというユニークな名前で作成しました。
次にログを書き込めるようにバケットポリシーを作成します。バケットからプロパティ設定のパーミッションを選択して、CloudTrailから書き込めるようにします。
こちらがバケットポリシーのサンプルです。
{ "Version": "2008-10-17", "Statement": [ { "Sid": "AWSCloudTrailAclCheck20131101", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::08644115XXXX:root", "arn:aws:iam::11328560XXXX:root" ] }, "Action": "s3:GetBucketAcl", "Resource": "arn:aws:s3:::aws-cloudtrail-log-satoshi" }, { "Sid": "AWSCloudTrailWrite20131101", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::08644115XXXX:root", "arn:aws:iam::11328560XXXX:root" ] }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::aws-cloudtrail-log-satoshi/AWSLogs/XXXXXXXXXXXX/*", "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control" } } } ] }
CloudTrailでS3バケットを指定
CloudTrailにログが保存されるS3バケットを指定します。通知連携用のSNSトピックは名前を指定すれば自動生成されます。
CloudWatch LogsでLogグループの作成
Logグループを作成します。この中にLogストリームという形でCloudTrailのログが入ってきます。
CloudTrailでCloudWatch Logsの設定
このメニューが新機能の部分ですね。
新規にIAMロールの設定をしています。これで、CloudTrailのログをCloudWatchログに書き込む権限を得ることができます。
無事に設定が終わりますと、Logストリームが作成されていることが確認できます。
CloudWatchにログが入っているか確認
CloudWatch Logsにログが入っている確認をします。問題なさそうですね。
CloudWatch Logsにフィルターを設定
CloudWatch Logsは、フィルターを掛けることができます。例えば、
{ $.eventName = "DescribeTrails" }
フィルターした結果が出力されているか見てみましょう。
問題なさそうなのでそのまま登録とします。
CloudWatchアラームの設定
フィルター結果に対して条件式を指定してアラーム設定をします。
設定後の表示です。
あとはアラーム検知からSNS経由でメールを飛ばしたり、キューに入れたり、HTTPコールしたりと、システム連携をご自由に行ってください。
まとめ
CloudTrailによって発生したログをCloudWatch Logsに流し、フィルターで条件を絞った上で、アラームの設定をして発報するところまでの一連の流れを確認することができました。CloudTrailで作成されるJSONをどのようにフィルターするかが肝になりそうですね。