こんにちは。
AWS WAF により Block されたリクエストの一覧を月一でリスト化する必要がございました。
最初は API を叩いて Sample request を取得し、その後にログ解析を行おうと思ったのですが、どうも、この API には 5000req/3h の制限があるようで断念…。
調べてみると Kinesis Firehose を経由して S3 に JSON 形式で WAF のログを出力できるようです。
ついては出力された S3 のログを引っ張って jq でリスト化すればいいや、となりました。
シェルスクリプト
cron で月末にスクリプトが実行されるよう設定しておけば、あとは放置で OK ですね。
#!/bin/bash WORK_DIR="" THIS_YEAR=`date "+%Y"` THIS_MONTH=`date "+%m"` S3_BUCKET="" PROFILE="" OUTPUTDIR="" OUTPUT=${OUTPUTDIR}block_requests-`date +'%FT%R'`.csv # 作業ディレクトリの作成 mkdir -p ${WORK_DIR}/${THIS_YEAR}/${THIS_MONTH} # S3 からログのダウンロード aws s3 cp s3://${S3_BUCKET}/${THIS_YEAR}/${THIS_MONTH}/ ${WORK_DIR}/${THIS_YEAR}/${THIS_MONTH} --recursive --profile=${PROFILE} # csv のフィールド名を出力 echo "Request.ClientIP,TerminatingRuleId,Request.Country,Request.URI,Request.httpVersion,Request.Method,Other" >> ${OUTPUT} # ログの一覧を取得 SERCH_FILES=`find ${WORK_DIR}/${THIS_YEAR}/${THIS_MONTH} -type f -name aws-waf-logs*` for SERCH_FILE in ${SERCH_FILES} do # json -> csv の変換 / パース / 出力 cat ${SERCH_FILE} | jq -r ' select( .action == "BLOCK") | [.httpRequest.clientIp, .terminatingRuleId, .httpRequest.country, .httpRequest.uri, .httpRequest.httpVersion, .httpRequest.httpMethod, "#HeadersName", .httpRequest.headers[].name, "#HeadersValue",.httpRequest.headers[].value, "#RuleGroup", .ruleGroupList[].ruleGroupId, "#RuleMatch", .ruleGroupList[].terminatingRule.ruleId, "#RuleAction", .ruleGroupList[].terminatingRule.action] |@csv' \ >> ${OUTPUT} done
jq って便利ですね。