AWSLabsのスクリプトを見てみよう〜WAFログ解析編

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、臼田です。

皆さんLambdaしてますか?

今日は、AWSが提供しているスクリプトが置いてあるAWS LabsからAWS WAFセキュリティオートメーションで利用されているログ解析のスクリプトを見てみたいと思います。

オートメーションのスクリプト

ドキュメント内にCloudFormationのファイルがあり、これを利用してオートメーションをデプロイすることが可能ですが、そのスクリプトのソースはこちらにあります。

ログ解析についてはこちらになります。

このスクリプトは、AWS WAFが設定されているCloudFront・ALBのログをS3から取得し、パースたり、リクエストが過剰なIPからのリクエストをブロックしたりする仕組みがあります。

WAFのスクリプトを記述する際に利用できそうなコードをピックアップします。

boto3クライアントの宣言

global waf
if environ['LOG_TYPE'] == 'alb':
 session = boto3.session.Session(region_name=environ['REGION'])
 waf = session.client('waf-regional')
else:
 waf = boto3.client('waf')

AWS WAFをboto3で利用する際には、CloudFrontに適用しているかALBに適用しているかでクライアントが変わります。

どちらも許容するスクリプトにする際には環境変数等でどちらか指定し、ALBであればリージョンも取得して指定すれば良さそうです。

CloudFront・ALBログのパース

# CloudFront Access Logs
# http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html#BasicDistributionFileFormat
LINE_FORMAT_CLOUD_FRONT = {
 'delimiter': '\t',
 'date': 0,
 'time' : 1,
 'source_ip' : 4,
 'code' : 8
}
# ALB Access Logs
# http://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-access-logs.html
LINE_FORMAT_ALB = {
 'delimiter': ' ',
 'timestamp': 1,
 'source_ip' : 3,
 'code' : 8
}

WAFに必要な要素だけ抜粋していますが、フォーマットのdictを作成してパースに利用するとやりやすそうです。

CloudFrontとALBでフォーマットが違いますが、これを利用して差異を吸収できますね。

一定時間でIPブロックを解除する

def merge_current_blocked_requesters(key_name, outstanding_requesters):

長くなるので関数名だけ貼っておきます。

随時攻撃をブロックし、しばらくリクエストが来なくなったらリストから外すように動いています。

まとめ

AWSが公開しているスクリプトだけあって、すごく参考になる記述がいっぱいあるかと思います。

ぜひAWS Labsのいろんなスクリプトを見てみて下さい。