« 【.NET Developer Blog】ASP.NET Core の探索 パート2: 継続的デリバリ | メイン | AWS WAF, Amazon CloudFrontでリファラチェックして直リンクを弾く方法 »

IP Address Reputationリストを自動更新でAWS WAF IP Blacklistsとして使う方法

AWS WAF (a web application firewall)を使えば、スパマーやマルウェアの配布元、あるいはボットネットなどの悪い振る舞いをする(bad actor)発信元として知られ、リスト化されているIPアドレス(風評リスト、reputation list)からのWebアプリへの攻撃を防ぐことができます。これらのIPアドレスは発覚から逃れるために頻繁に変更されます。本記事では、AWS WAF Ruleとreputation listの同期方法を紹介します。

いくつかの団体が、bad actorに使われているIPアドレスがリストされたreputation listをとりまとめています。彼らの目的は、合法的な団体が特定のIPアドレスからの攻撃から、Webアプリを守る助けとなることです。それらはプレーンテキストでダウンロード可能です。例えば次のようなものが知られています。

  • Spamhaus's
    • Don’t Route Or Peer (DROP) List
    • Extended Drop (EDROP) List
  • Proofpoint’s
  • Tor project’s
    • Tor exit node list (Tor はウェブリクエストの匿名化をするものですが、ウェブサイトの攻撃やプローブに悪用されることもあります。それらTorのために使われているIPアドレスを列記しています)

Solution overview

今回はAWS Lambda を使って AWS WAF Rules と入手可能なreputation listを同期させます。LambdaはテキストベースのIP reputation listをパースし、それらのアドレスをブラックリストとしてブロックするようにAWS WAF IP セットを作ります。Amazon CloudWatch Events は定常的にLambda functionを実行します。また、それらを簡単にデプロイするために AWS CloudFormation を使用します。

図示してみました。

次のようなプロセスとなります。

  1. Amazon CloudWatch Eventsは、スケジュールに従ってLambda functionを実行する。
  2. サードパーティの作成したreputation listをダウンロードし、Lambda functionによって処理される。
  3. ブラックリストを作成するために、Lambda funtionはAWS WAF IPセットをreputation listに書かれた最新のIPアドレス(及びIPレンジ)にアップデートする。
  4. AWS WAFはブラックリスト内のIPアドレスからのリクエストを拒否する。

先に挙げたreputation listに加えて他のリストや、さらに別の団体が管理するリストを追加したいかもしれません。この記事のLambda functionは複数のリストをダウンロードし、AWS WAFをアップデートできるようにNode.jsのJavaScriptで書かれています。

また、1行毎に単一もしくはレンジで指定したIPアドレスがプレーンテキストで書かれているリストを想定しています。a.b.c.d や a.b.c.d/n (CIDR: Classless Inter Domain Routing)形式で書かれた行を正規表現で処理し、さらに重複するIPアドレスレンジはマージする機能を備えています。例えば、192.0.2.0/24 と 192.0.2.64/28 がリストにある場合、後者は前者に含まれているので、後者はマージされます。

AWS WAFはweb access control list (web ACL) をCloudFrontのディストリビューションに適用します。一つのweb ACLは10までのルールを適用できます。それぞれのルールは論理的にANDが取られて、Allow, Deny, Countいずれかがリクエストに対して適用されます。ひとつのIPセットには1,000のIPアドレスまたはCIDRを記述できます。従って、一つのAWS WAF web ACLで最大10,000のレンジをブロック可能です。

AWS WAFはIPアドレスもしくはa.b.c.d/n形式のCIDRレンジに対応しています。ただし、nは8,16,24,32のいずれかです。reputation listによってはこれ以外のレンジを含みます。そのような場合、Lambda functionは小さな複数レンジに分割します。例えば、192.0.2.0/31が含まれていた時、AWS WAFは /31をサポートしないので、192.0.2.0/32 および 192.0.2.1/32 に変換します。

AWS CloudFormationを使ったデプロイ

Lambda functionがどのようにreputation listを処理するのかわかった所で、AWS WAF web ACL, ルール、IPセット、Lamba function、CloudWatch Events RuleさらにそのためのリソースをつくるためにCloudFormationをどのように使うのかを見ていくことにしましょう。サンプルのCloudFormationテンプレートでは2つのAWS WAF ルールおよび2つのIPセットを定義しています。もっと大きなブラックリストをサポートするために、ルールやIPセットの数を増やすように修正することも可能です。テンプレートでは、他にも1時間毎にLambda functionを実行するためのCloudWatch Events Ruleを定義しています。もちろん頻度を別の値に変更できますが、リストオーナーに迷惑をかけないようにしましょう。

まず最初に、CloudFormation consoleにすすみます。Create Stackをクリックして、この記事の最後にあるURLを入力します。

Next を押して、Stack Nameを入力します。

テンプレートでは、パラメータとして ReputationLists を定義しています。デフォルトでは、Spamhouse DROP, Tor exit node list,Emerging Threats IP listを使うためのJSONパラメータ値が入力されています。 

[
     { "url": "https://www.spamhaus.org/drop/drop.txt" },
     { "url": "https://check.torproject.org/exit-addresses","prefix":"ExitAddress "},
     { "url": "https://rules.emergingthreats.net/fwrules/emerging-Block-IPs.txt" }
]

Next をクリックし、さらに再度 Next をクリックします。次のページではLambda functionがIM roleを使ってスタックを作るため AWS CloudFormationがIAM resourcesを作ることを確認する画面がでます。

CloudFormationスタックが作られた後、Resource tabをクリックします。

次に、Lambda funtionのPhysical IDをメモしておきます。この例では、WAFReputationLists-LambdaFunction-PM6D5GNW6EDDとなっていますが、人によって違います。このPysical IDは後ほどLambdaのコンソールで使います。

CloudWatchをつかったモニタ

つづいて、Lambda console に向かいましょう。CloudFormationによって作られたLambda functionの名前をさがします。Monitoringタブをクリックすると、毎時実行されるfunctionをモニタできます。最初の実行から1時間ほど確認には時間がかかります。

Monitoring タブでCloudWatchのView Logsをクリックします。するとCloudWatchコンソールから、CloudWatch Logを使って作られたログを見ることができます。

AWS WAF web ACLをCloudFront distributionにひも付ける

自分のweb ACLで定義されたブラックリストを自分のWebアプリを守るために使うには、そのweb ACLをCloudFront distributionにひも付け、webサイト配信をCloudFront CDNを使って行います。

CloudFront console を開き、Distributionをクリックします。ここでは、CloudFront distribution’s IDをさらにクリックします。

Editをクリック

Screenshot showing the Edit button

アタッチするために、web ACLを選びます(前もってweb ACLはつくってあるものを選んでいます)。そしてページを進めてYes, Editをクリックし変更を保存します。

web ACLのCloudFront distributionへのひも付けが完了しました。これで、Webアプリがブラックリストで守られます。

まとめ

この記事では、悪さをする輩の使うIPアドレスをAWS WAFをつかってブロックする方法を紹介しました。複数のサードパーティによるIP reputation listからIPアドレスもしくはIPレンジをインポートし、Lambda funtionによってAWS WAFが使えるようなフォーマットに変換し、重複は排除し、それをCloudWatch Eventsを使ってスケジュール動作させました。これ以降はCloudFrontによって配信されるウェブアプリのリクエストのうち、ブラックリストに記載されたIPアドレスからのものは排除されます。

CloudFormationテンプレートおよびLambda functionはLambdaがサポートされているリージョンそれぞれで動作できます。

WAF関連のコードやサンプルは、GitHub aws-waf-sample repository でもご覧いただけます。

この記事のソリューション、実装等にコメントがありましたら、 AWS WAF forum で(必要に応じて新スレッドを作って)お願いします。

本記事は https://blogs.aws.amazon.com/security/post/Tx8GZBDD7HJ6BS/How-to-Import-IP-Address-Reputation-Lists-to-Automatically-Update-AWS-WAF-IP-Bla の翻訳です。翻訳は、荒木が担当しました。

コメント

Twitter, Facebook

このブログの最新情報はTwitterFacebookでもお知らせしています。お気軽にフォローください。

2018年4 月

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30