CloudTrailとCloudWatch Logsの連携によるログのアラーム設定

CloudTrailの中身を直ぐに確認したい

CloudTrailは、AWSのAPI操作に対する監査機能です。AWSの各種サービスは全てAPIを使って利用します。このAPI利用履歴について全て保管し、監査をすることで、誰がいつ何処から何をしたのか確認することができます。エンタープライズ用途では待ち望まれた機能ですが、ひとつ難点がありました。ログの管理や閲覧の機能を持っていないことです。今回の新機能追加によって、CloudTrailに保管されたタイミングでSNSの通知が飛び、CloudWatch Logsに保管することで、ログの文字列に対する、フィルターやアラームを設定できるようになりました。日時バッチなどでチェックするのではなく、ログが発生したタイミングで確認ができるのが特徴です。今回ははじめからやってみましょう。

S3にログ用のバケットを作成

S3のメニューから新規にバケットを作成します。aws-cloudtrail-log-satoshiというユニークな名前で作成しました。

screenshot_2014-11-10_15_09_31

次にログを書き込めるようにバケットポリシーを作成します。バケットからプロパティ設定のパーミッションを選択して、CloudTrailから書き込めるようにします。

screenshot 2014-11-11 1.46.27

こちらがバケットポリシーのサンプルです。

{
	"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トピックは名前を指定すれば自動生成されます。

screenshot 2014-11-10 15.09.31

CloudWatch LogsでLogグループの作成

Logグループを作成します。この中にLogストリームという形でCloudTrailのログが入ってきます。

screenshot 2014-11-10 15.35.20

CloudTrailでCloudWatch Logsの設定

このメニューが新機能の部分ですね。

screenshot 2014-11-10 20.14.49

新規にIAMロールの設定をしています。これで、CloudTrailのログをCloudWatchログに書き込む権限を得ることができます。

screenshot 2014-11-10 20.12.31

無事に設定が終わりますと、Logストリームが作成されていることが確認できます。

screenshot_2014-11-10_20_17_26

CloudWatchにログが入っているか確認

CloudWatch Logsにログが入っている確認をします。問題なさそうですね。

screenshot_2014-11-11_0_16_19

CloudWatch Logsにフィルターを設定

CloudWatch Logsは、フィルターを掛けることができます。例えば、

{ $.eventName = "DescribeTrails" }

フィルターした結果が出力されているか見てみましょう。

screenshot_2014-11-11_2_41_02

問題なさそうなのでそのまま登録とします。

screenshot 2014-11-11 2.41.40

CloudWatchアラームの設定

フィルター結果に対して条件式を指定してアラーム設定をします。

screenshot_2014-11-11_2_42_50

設定後の表示です。

screenshot 2014-11-11 2.42.00

あとはアラーム検知からSNS経由でメールを飛ばしたり、キューに入れたり、HTTPコールしたりと、システム連携をご自由に行ってください。

まとめ

CloudTrailによって発生したログをCloudWatch Logsに流し、フィルターで条件を絞った上で、アラームの設定をして発報するところまでの一連の流れを確認することができました。CloudTrailで作成されるJSONをどのようにフィルターするかが肝になりそうですね。

参考資料

Sending CloudTrail Events to CloudWatch Logs

Filter and Pattern Syntax