AWS AthenaでWAFで検知したDoS攻撃の内容を調査する


目的

AWS WAFで設定した、DoS攻撃検知用のルールが稼働していると思われるログがあったので、DoS攻撃の詳細内容を調査した時の方法をまとめておくものです。

前提となる環境

以下のサービスが有効になっている環境での調査方法となります。
※ この環境ではWAF自体のロギングを有効としていないため、ALBのログを調査します。

AWS WAF

  • AWS WAFにて、ACL(アクセスコントロールリスト)として5分辺りのリクエスト件数を低閾値としたrate limit baseのルール設定が可能です。該当の環境では2000件を設定しており、これを越した時をDoS攻撃とみなしています。

AWS ALB

  • 有効にしたWAFはALBに割り当てます。
  • Athenaで検索するために、ALBのログをs3に保管しておく必要があります。

なお、対象となるs3のオブジェクトを特定することが出来れば、Athenaを利用しなくてもs3単体でクエリを実行することも可能です。

AWS Glue

  • AWS Athenaは AWS Glueのデータカタログを使用してS3に格納されたデータに接続し、テーブルや列名などのメタデータを格納できます。そのため、あらかじめAWS GlueにALBのログを保管したs3を指定してのデータベースを作成しておく必要があります。

AWS Athena

  • 上記3サービスの準備が出来ればAthenaを使った分析が可能になります。

調査

CloudWatch

WAFのメトリクスを指定します。
DoS攻撃検知用のルールに合致している日時を確認します。

AWS Athena

最初にクエリを実行するためのデータソースを指定します。
Glueで定義したALBのデータベースが選択できるので、対象のデータベースを選択するとALBのログを保管したs3テーブルが表示されます。

DoS攻撃検知用のルールが稼働していた日時をfrom~toで指定し、結果を保存するためのs3を指定してクエリを実行します。
クエリの内容は今回は以下のような内容です。

SELECT *
FROM alb_web_logs
WHERE parse_datetime(time,'yyyy-MM-dd''T''HH:mm:ss.SSSSSS''Z') 
     BETWEEN parse_datetime('2020-xx-xx-x:00:00','yyyy-MM-dd-HH:mm:ss') 
     AND parse_datetime('2020-yy-yy-y:00:00','yyyy-MM-dd-HH:mm:ss')
ORDER BY received_bytes DESC

クエリが成功すると、実行結果は管理画面でも表示されます。
結果はcsvでも出力可能です。

今回ALBログの項目で注目するのはactions_executed項目です。
値がwaf,forwardであればALBでリクエストをターゲットに転送したという内容となりますが、
WAFのDoS攻撃検知用のルールに合致してリクエストを拒否する必要があると判別した場合、以下のようにwafという値になります。

wafとなった該当ログのうち、主に以下の項目を確認して攻撃内容を把握します。

項目名 確認内容
elb 対象となったALB
request_url 対象となったURL
client_ip アクセス元のIPアドレス
client_port 利用ポート

全項目の内容は以下の通りです。
【公式ドキュメント】Application Load Balancer のアクセスログ

結果

ALBログからWAFの検知した時の状況を確認することが出来ました。
対応としてはAWS WAFでActionをCountに設定しておくと検知した内容をログとして残しておくだけですが、Blockに設定しておくと、 HTTPステータス403(Forbidden)を返します。

Blockにする場合、rate limit baseのルールが正当なアクセスをblockすることのないように閾値を調整する必要があります。

参考

Application Load Balancer のアクセスログから WAF による遮断を確認する方法