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 を使用します。
図示してみました。
次のようなプロセスとなります。
- Amazon CloudWatch Eventsは、スケジュールに従ってLambda functionを実行する。
- サードパーティの作成したreputation listをダウンロードし、Lambda functionによって処理される。
- ブラックリストを作成するために、Lambda funtionはAWS WAF IPセットをreputation listに書かれた最新のIPアドレス(及びIPレンジ)にアップデートする。
- 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をクリック
アタッチするために、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がサポートされているリージョンそれぞれで動作できます。
- Dublin: CloudFormation template | Lambda function
- Frankfurt: CloudFormation template | Lambda function
- Northern Virginia: CloudFormation template | Lambda function
- Oregon: CloudFormation template | Lambda function
- Tokyo: CloudFormation template | Lambda function
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 の翻訳です。翻訳は、荒木が担当しました。
コメント