AWS WAFフルログでRedactedを使ってセンシティブ情報を記録しないようにしてみた

こんにちは、臼田です。

皆さん、WAF使ってますか?

先日フルログを取得できるようになったAWS WAFですが、その際にRedacted機能も追加されたのでこれを紹介したいと思います。

フルログ自体については下記をご参照ください。

AWS WAFのログをFirehoseでS3に出力しブロックログをS3Selectで確認してみた

AWS WAFのフルログをAthenaで分析できるようにしてみた

Redactedとは

AWS WAFのフルログにおけるRedactedは、ログの中から特定の項目だけ記録しないようにする設定です。

用途としては、個人情報などのセンシティブな情報をログに残したくない場合などに使います。現状ではbodyデータを記録しないため、これに当たる項目は少ないですが、例ではCookieなどが上げられています。

詳細はこちらをご参照ください。

やってみた

まずは現状の確認です。すでにログ取得の設定がされている想定です。取得の設定は先述のブログをご確認ください。

現状記録されているのは下記のようなログです。わかりやすく改行してありますが、通常は1ログ1行です。

{
	"timestamp": 1540834731799,
	"formatVersion": 1,
	"webaclId": "ffffffff-6db4-4f4a-b808-2102f61fffff",
	"terminatingRuleId": "Default_Action",
	"terminatingRuleType": "REGULAR",
	"action": "ALLOW",
	"httpSourceName": "ALB",
	"httpSourceId": "999999999999/vul-alb/1145141919ffff",
	"ruleGroupList": [],
	"rateBasedRuleList": [],
	"nonTerminatingMatchingRules": [],
	"httpRequest": {
		"clientIp": "xxx.xxx.xxx.xxx",
		"country": "JP",
		"headers": [
			{
				"name": "Host",
				"value": "samplealb.ap-northeast-1.elb.amazonaws.com"
			},
			{
				"name": "Upgrade-Insecure-Requests",
				"value": "1"
			},
			{
				"name": "User-Agent",
				"value": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"
			},
			{
				"name": "Accept",
				"value": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"
			},
			{
				"name": "Accept-Encoding",
				"value": "gzip, deflate"
			},
			{
				"name": "Accept-Language",
				"value": "ja,en-US;q=0.9,en;q=0.8"
			},
			{
				"name": "Cookie",
				"value": "wordpress_test_cookie=WP+Cookie+check"
			}
		],
		"uri": "/wordpress/wp-login.php",
		"args": "",
		"httpVersion": "HTTP/1.1",
		"httpMethod": "GET",
		"requestId": null
	}
}

はい、Cookieが記録されています。今回は例に挙げられているようにCookieを除外してみたいと思います。

まずWAFの設定画面からLogging -> Editで編集画面に移動します。

Redacted fieldsにて除外する項目を選択します。項目としてはHeader, HTTP method, Query string, URIが選べ、Headerのみ具体的な項目を設定できます。

今回はHeaderを選択し、Cookieを入力します。プルダウンで項目が出ていますが、ここにないHeaderを直接記述することも可能です。入力したらAddを押します。

フィールドが追加されていることを確認してCreateを押します。これで完了です。

再度出力されたログを確認してみます。

{
	"timestamp": 1540836032287,
	"formatVersion": 1,
	"webaclId": "ffffffff-6db4-4f4a-b808-2102f61fffff",
	"terminatingRuleId": "Default_Action",
	"terminatingRuleType": "REGULAR",
	"action": "ALLOW",
	"httpSourceName": "ALB",
	"httpSourceId": "999999999999/vul-alb/1145141919ffff",
	"ruleGroupList": [],
	"rateBasedRuleList": [],
	"nonTerminatingMatchingRules": [],
	"httpRequest": {
		"clientIp": "xxx.xxx.xxx.xxx",
		"country": "JP",
		"headers": [
			{
				"name": "Host",
				"value": "samplealb.ap-northeast-1.elb.amazonaws.com"
			},
			{
				"name": "Pragma",
				"value": "no-cache"
			},
			{
				"name": "Cache-Control",
				"value": "no-cache"
			},
			{
				"name": "Upgrade-Insecure-Requests",
				"value": "1"
			},
			{
				"name": "User-Agent",
				"value": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"
			},
			{
				"name": "Accept",
				"value": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"
			},
			{
				"name": "Accept-Encoding",
				"value": "gzip, deflate"
			},
			{
				"name": "Accept-Language",
				"value": "ja,en-US;q=0.9,en;q=0.8"
			},
			{
				"name": "Cookie",
				"value": "REDACTED"
			}
		],
		"uri": "/wordpress/wp-login.php",
		"args": "",
		"httpVersion": "HTTP/1.1",
		"httpMethod": "GET",
		"requestId": null
	}
}

Cookieの項目がRedactedになり記録されていません。(あくまで項目としては残っています。)

まとめ

もしWAFでログを取得する際に、ログを残しては行けない項目が弊害になる場合には、Redactedを利用しましょう。

これは今後bodyが取得できるようになった際にはより必要となる機能なので、覚えておきたいですね。