淡々と備忘録を綴る

IT周りの行き詰まったところやメモを備忘録として記録します

AWS WAFとAthenaを使って、リアルタイム攻撃ログ観測のためのやられサイトを作ってみた。

はじめに

直近でAWSのSpeciality資格を取得し、AWSを触ってみたくなったので、WEBページに対する攻撃ログを収集するやられサイトを簡単に構築してみることにしました。
筆者は業務でセキュリティに関わっており、世の中に飛び交っている攻撃ログを観測しておきたいと常々感じていたので、手元環境で持っておこうと思った次第です。
これにより、Log4jのときのような脆弱性が出てきたときに、生の攻撃ログを観測しながら対策に繋げたり、定常的に行われている攻撃の種類を推測することを目的としています。
(あと、最近業務周りでAWS WAFの話題が出ることが多かったので実際に触ってみたかったという理由もあります。)  

使用したリソースの説明

今回のやられサイトの構築には、AWSの以下の4つの主要リソースを活用しました。それぞれについて簡単に説明します。

  • S3
    Amazon Simple Storage Service(S3)は、ウェブからのアクセスを想定したオブジェクトストレージサービスです。おとりサイトは簡単な静的サイトなので、HTMLファイルのホスティングに使用しました。 また、アクセスログもここに保存し、後述のAthenaでクエリを発行できるようにしておきます。
  • CloudFront
    Amazon CloudFrontは、Amazonコンテンツ配信ネットワークCDN)サービスです。CloudFrontはAWS WAFのデプロイ先になるため、WAFの前提条件として利用しています。
  • AWS WAF
    AWS WAF(Web Application Firewall)は、サイトを不正アクセスから守るためのウェブアプリケーションファイアウォールです。
    特定のトラフィックパターンをブロックしたり、特定のIPアドレスからのリクエストを制御したりします。
    今回のケースでは、AWS WAFはやられサイトに対する不正なアクセスや攻撃の詳細を収集するために使用しています。
    また、AWS WAF自体の挙動を実機で確認することも目的の一つです。
  • Athena
    Amazon Athenaは、クエリサービスで、AWS S3に保存されたデータに対してSQLクエリを実行できます。
    サーバーの設定や管理は不要で、手元にある攻撃ログやIoCデータに対して直接クエリを投げることができます。
    これにより、収集したIoCデータの分析や検索が迅速かつ容易に行えます。

やられサイトの構成

今回構築するやられサイトのアーキテクチャ図は以下の通りです。
awsアーキテクチャ図 また、今回このサイトはCDNにCloudFrontにデプロイされているので、cloudfront.netドメインとしたURLを持っています。(単一のグローバルIPではありません。)
攻撃者がこのサイトに気づいてくれるように、Pastebinを使用しました。

Pastebinとは

Pastebinとは、ユーザーがテキストデータを投稿し、それを公開できるウェブサービスの一つです。
正規の利活用としては主にプログラマーコードスニペットを共有するために使用されますが、その手軽さから様々な情報の共有に広く利用されています。
また、悪意のある攻撃者がファイルレスマルウェアなどのC2サーバーとして利用していることでも非常に有名です。

この特性を利用し、やられサイトのURLをPastebinに投稿し、攻撃者がそのURLを見つけてアクセスしてくることを期待しています。
これは一種のハニーポット戦略で、攻撃者を誘引し、その行動を観察することを目的としています。

ロギングの設定

今回はAWS WAFのログを主に収集対象にします。ロギングの対象自体はAllow/Denyに関わらず行い、分析の際に任意でフィルタをかけることにしました。
レピュテーションサービスのクローラなどの情報も取れたら面白いかなと思ったからです。 使用するWebACLのルールは以下とします。

  • AWS-AWSManagedRulesAmazonIpReputationList  
  • AWS-AWSManagedRulesCommonRuleSet
  • AWS-AWSManagedRulesKnownBadInputsRuleSet
  • AWS-AWSManagedRulesBotControlRuleSet

今回はログの保存先をS3にしているので、CloudWatch Log Insightsを使用できませんでした。こちらについてはまたどこかで試してみたいと思います。

ログの分析について

今回の第一目的は攻撃通信のログを観測することなので、あまり条件を絞りきらずにログを整形するだけのクエリを用意しました。
特徴のある攻撃通信が流行ったときは適宜絞り込みをかけていくことを想定しています。
ただ、自分がAthena/SQLをあまり触ったことがないので、ちょっと概念の把握に手間取りました。以下に備忘録として残しておきます。

DB、テーブルの作成

AthenaでS3に保存されているデータを分析するためには、Athena上にRDSとして持ってくる必要があります。
そのために、以下の手順でクエリを発行しました。

  • DBの作成
CREATE DATABASE test;
  • テーブルの作成
CREATE EXTERNAL TABLE `waflogs`(
  `timestamp` bigint,
  `formatversion` int,
  `webaclid` string,
  `terminatingruleid` string,
  `terminatingruletype` string,
  `action` string,
  `terminatingRuleMatchDetails` array < struct <
    conditionType: string,
    location: string,
    matchedData: array < string >
    > >,
  `httpsourcename` string,
  `httpsourceid` string,
  `ruleGroupList` array < struct <
                    ruleGroupId: string,
                    terminatingRule: struct < ruleId: string, action: string >,
                    nonTerminatingMatchingRules: array < struct < action: string, ruleId: string > >,
                    excludedRules: array < struct < exclusionType: string, ruleId: string > 
   > >,
  `ratebasedrulelist` array<
                      struct<
                        ratebasedruleid:string,
                        limitkey:string,
                        maxrateallowed:int
                            >
                           >,
  `nonterminatingmatchingrules` array<
                                struct<
                                  ruleid:string,
                                  action:string
                                      >
                                     >,
  `httprequest` struct<
                      clientip:string,
                      country:string,
                      headers:array<
                              struct<
                                name:string,
                                value:string
                                    >
                                   >,
                      uri:string,
                      args:string,
                      httpversion:string,
                      httpmethod:string,
                      requestid:string
                      > 
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://<バケットID>/AWSLogs/'

サーチクエリの発行

Athenaには、任意のクエリを保存してあとからコールできる機能がありました。(便利!)
ただし、一度保存したクエリは編集できず、一度消して再度登録する必要があるみたいです。(不便!)
普段みるクエリと、何かあったとき用にWHERE句で条件指定できる準備だけ整えているクエリを用意しておきました。

  • 普段みるクエリ
SELECT from_unixtime(timestamp/1000, 'Asia/Tokyo') AS JST,
       httpsourcename,
       action,
       httpsourceid,
       httprequest.clientip,
       httprequest.country,
       httprequest.uri,
       httprequest.args,
       httprequest.httpmethod,
       httprequest.headers

FROM
       "waflogs"
ORDER by JST desc
;
  • 特定の痕跡を探すクエリ
SELECT from_unixtime(timestamp/1000, 'Asia/Tokyo') AS JST,
       httpsourcename,
       httpsourceid,
       httprequest.clientip,
       httprequest.country,
       httprequest.uri,
       httprequest.args,
       httprequest.httpmethod,
       httprequest.headers,
       header,
       header.value
FROM
       "waflogs",
       UNNEST(httprequest.headers) t(header)
WHERE
       header.value like '%<hoge>%'
;

また、Athenaでのクエリは以下のサイトを参考にしました。
https://dev.classmethod.jp/articles/waf-query-pattern-in-athena/
https://dev.classmethod.jp/articles/analyzing-waflogs-with-athena/
https://runble1.com/aws-waf-athena-array-struct-json/#toc14

まとめと今後の展望

以上が今回のやられサイト構築の概要となります。
AWSを使用することで短期間でやられサイトを構築し、実際の攻撃ログを収集することができました。
今後の展望としては、以下の実装を考えています。

  • アーキテクチャを変更して、グローバルIPを持たせてIPでのクロールの対象に入れる。
  • Athenaでログ状況のサマリを出力し、Lamda経由でDiscordBOTと連携する

以上。