AWS WAF を使って XSS をブロックしてみた

どーも、ブラックコーヒーダイエットをはじめたヨシダです。
ちなみにブラックは苦手です。

AWS WAF を使ってXSSをブロックしてみたかったので、実際にやってみた内容をメモがてら記載していきます。
ご参考になれば嬉しいです!

AWS WAFとは?

AWS WAF は、アプリケーションの可用性に対する影響、セキュリティの侵害、過剰なリソース消費を生じる可能性がある一般的なウェブエクスプロイトからウェブアプリケーションを保護するために役立つウェブアプリケーションファイアウォールです。AWS WAF では、カスタマイズ可能なウェブセキュリティルールを定義することによって、ウェブアプリケーションに対するどのトラフィックを許可またはブロックするかを制御できます。AWS WAF は、SQL インジェクションまたはクロスサイトスクリプティングなどの一般的な攻撃パターンをブロックするカスタムルール、および特定のアプリケーションのために設計されたルールを作成するために使用できます。

構成

AWS WAF を設置できる場所は決まっており、2019年1月現在ではCDNとロードバランサー(ALB)とAPI Gatewayのみとなっています。
今回、僕が用意した環境は「https://waf.yoshidamasaaki.com/XSS/」にアクセスすると、XSSが発生する掲示板を表示させるようにしました。
※対象サイトはセキュリティグループでIP制限をかけているので、表示されません。

名前と内容を書き込んで「送信」をクリックすると、書き込んだ内容が表示される仕様です。

ここの内容にスクリプトコードである

を書き込むと実際にXSSが発生します。

XSSの対策についてはこちらの
【PHP】htmlspecialchars関数でエスケープ処理をしてください【XSSの防止】
をご覧ください。

 

この環境を構築するのに使用したAWSのサービスは以下の3つです。

①Route53
ドメイン「waf.yoshidamasaaki.com」のAレコードを②のロードバランサーに設定。

②Application Load Balancer
WAFを設置するためにロードバランサーを使用しました。
ターゲットに③のインスタンスを登録。
セキュリティグループにてHTTPとHTTPSを自社IPのみ接続可能にしました。(脆弱性のあるサイトを公開しないため)

③EC2インスタンス
Amazon Linux 2 を使用して、LAMP ウェブサーバーをインストールしました。
構築手順は以下のサイトが参考になります。
参考サイト:https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-lamp-amazon-linux-2.html
セキュリティグループでは、HTTPとHTTPSを②のロードバランサーからのみ許可し、SSHを自社IPのみ許可しました。

LAMP構築完了後、脆弱性のある掲示板のファイルを/var/www/html/xss配下に設置して完了です。

WAFの設置

XSSをブロックするルールをWAFに設定し、実際にロードバランサーに設置していきます。

独自でブロックするXSSのルールを作成すると大変なので、AWSが用意してくれているテンプレートを使用します。
以下のページからOWASP TOP10をベースにしたテンプレートをダウンロードできます。
URL:https://s3.us-east-2.amazonaws.com/awswaf-owasp/owasp_10_base.yml

次にCloudFormationにてスタックを作成します。
サービスの「CloudFormation」から「スタックの作成」ボタンをクリックします。
テンプレートの選択では、「テンプレートをAmazon S3にアップロード」にチェックをつけ、さきほどダウンロードした owasp_10_base.ymlファイルを選択します。

作成完了後「AWS WAF」の「Web ACLs」に今回テンプレートで作成した「generic-owasp-acl」が表示されていることを確認できます。

こちらのテンプレートの中には、画像のように10個のルールが入っています。

今回はXSSのみブロックしたいので、「generic-owasp-acl」から「Edit web ACL」をクリックして、「generic-mitigate-xss」のみ適用させました。

最後に「Add association」から設置するALBを追加すれば完了です。

検証

ちゃんとXSSをブロックしてくれるか確認します。
まずは普通にコメントしてみます。

送信をクリックしてみますと問題なく書き込めました。

次にXSSが発生するようにスクリプトコード

を書き込んでみます。

すると下の画像のように403ページが表示されて、WAFでしっかりとブロックされました!

AWS WAFの「Sampled requests」から確認してみても、しっかりブロックされてるのが確認できます。

最後に

今回はXSSのみをブロックしましたが、他にもDOS対策やSQLインジェクションなどなど設定は細かく設定できます。
もし、AWSにてWAFの設置を考えておられましたら、お気軽にレオンテクノロジーへご相談ください!
ありがとうございました。

レオンテクノロジーは現在、一緒に働く仲間を募集しております!
興味がある方はこちらから!

セキュリティに関するご相談はこちらから!

こんな記事も読まれています