Amazon EC2でWAF(Web Application Firewall)を設定する – ModSecurity –

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Amazon EC2のセキュリティについて

Amazon EC2には、DDoS攻撃の検出と防御、セキュリティグループの設定による接続元やポート・プロトコルの制御、アクセスキーの設定とセキュアシェルによる不正アクセスからの防御、ネットワーク分離による制御等を行っています。しかし、レイヤー7のWebアプリケーションにおいて、正しい方法でアクセスされた場合であっても、パラメータの指定の仕方によって様々な攻撃方法が存在します。これらは、アプリケーション開発者の実装の不備やSQL/HTML/JavaScript/OSコマンド等を用いて攻撃されるため、知らぬ間に個人情報を盗まれてしまう可能性があり危険です。そこで今回は、Webアプリケーションを脅威から守るWAFについてご紹介します。

WAF(Web Application Firewall)

WAFとは、Webアプリケーションの脆弱性に対応するための仕組みです。SQLインジェクション、クロスサイトスクリプティング、コマンドインジェクションなど、近年の情報漏洩事件は、ネットワークレベルの高度な侵入よりも、Webアプリケーション開発時のマズい実装や知識不足による脆弱性を攻撃されており、個人が入力した情報やデータベース情報を取得して悪用するケースが増えていると思います。そこで、今回はEC2インスタンスにWAFを導入し、アプリケーション層での攻撃から守ってみたいと思います。

OWASP

Open Web Application Security Project(OWASP)は、アプリケーション・ソフトウェアのセキュリティを向上させるに焦点を当てた非営利の世界的な団体です。彼らのミッションは、セキュリティを可視化し、人や組織がアプリケーションのセキュリティリスクについての情報に基づいた意思決定を行うことができるようにすることです。毎年、アプリケーションのセキュリティリスクTOP10を公開していて、どういった攻撃によるセキュリティリスクに気をつけるべきが知ることができます。

2010年版 OWASP Top 10 アプリケーションのセキュリティリスク

OWASP Top Ten Projectで公開されている文章の日本語訳から以下に転載します。

A1 – インジェクション攻撃

インジェクション攻撃(SQL, OS, LDAP等)は、信頼されていないデータをコマンド又はクエリの一部としてインタプリタに送る際に発現します。攻撃者の悪意あるデータは、インタプリタが意図しないコマンドを実行したり、権限のないデータにアクセスするようにだますことができます。

SQLインジェクションは最も危険な攻撃です。

A2 – クロスサイトスクリプティング(XSS)

XSSの脆弱性は、信頼されていないデータを受け取り、適切な検証およびエスケープをせずにWebブラウザに送信された際に発生します。 XSSにより攻撃者は、被害者のブラウザでスクリプトを実行し、ユーザセッションのハイジャック、Webサイトの汚損、悪意あるサイトへとユーザをリダイレクトさせることができます。

Scriptタグを埋め込んでユーザ情報を取得してます。

A3 – 不完全な認証とセッション管理

認証とセッション管理に関連するアプリケーションの機能は、しばしば不適切な実装がなされています。実装が不適切な場合には、攻撃者はパスワード、各種鍵、セッショントークンを悪用したり、他のユーザのID推測につながる実装の不備の悪用などを行う事が出来ます。

A4 – 安全でないオブジェクトの直接参照

オブジェクトの直接参照は、開発者がファイル、ディレクトリ、またはデータベースキーなど、内部実装のオブジェクトへの参照を公開している場合に発生します。アクセス制御チェックやその他の保護がなければ、攻撃者はこれら参照をそうさすることでアクセス承認されていないデータへとアクセスすることが可能となります。

A5 – クロスサイトリクエストフォージェリ(CSRF)

CSRF攻撃は、ログオンしている犠牲者のブラウザから偽造されたHTTPリクエストを脆弱性のあるWebアプリケーションに強制的に送信させます。そのリクエストには、被害者のセッションクッキーおよびその他自動的に書き込まれる認証情報が含まれています。これにより攻撃者は、脆弱性のあるアプリケーションが犠牲者ユーザからの正当なリクエストと認識させるリクエストを犠牲者のブラウザから強制的に生成することが出来ます。

ぼくはまちちゃんで一躍有名になりましたね。

A6 – セキュリティの不適切な設定

適切なセキュリティにはセキュアな設定が定義され、それをアプリケーション、フレームワーク、アプリケーションサーバ、Webサーバ、データベースサーバ、プラットフォームに反映させる必要があります。多くのアプリケーションはセキュアな設定で出荷されていないため、これら全ての設定について同様に定義・実装・維持されなければなりません。全てのソフトウェアとアプリケーションによって利用される全てのコードライブライラリを最新に保たねばなりません。

管理画面に誰でもアクセスできるような設定はマズいですよね。

A7 – 安全でない暗号化によるデータ保存

多くのWebアプリケーションは、適切な暗号やハッシュを実装して、機密データ(クレジットカード、SSN、認証情報)を適切に保護するようにはなっていません。攻撃者は機密データの保存方式に関わる脆弱性を利用して、データを搾取したり改ざんすることで、ID窃盗やクレジットカード詐欺等の犯罪を行います。

A8 - URLアクセス制御の不備

多くのWebアプリケーションは、保護されたリンクやボタンをレンダリングする前に、URLのアクセス権を確認しています。しかし、これらのページがアクセスされる度に、アプリケーションは同様のアクセス制御チェックを実行する必要があり、この実行がなされないと、攻撃者はURLを偽造することで、本来は直接アクセスされることのない隠されたページへとアクセスすることが可能となります。

A9 - 不十分なトランスポート層の保護

アプリケーションは弱い暗号化アルゴリズムを用いたり、期限切れや不正な証明書を用いている事があります。このようなケースでは適切な認証が確保されず、暗号化、機密性のあるネットワークトラフィックの秘匿性及び保全性・完全性も保証されません。

A10 – 検証されていないリダイレクトとフォーワード

Webアプリケーションは頻繁にユーザを他のページやウェブサイトにリダイレクト・フォーワードしており、その目的のページの決定には信頼出来ないデータを用いています。適切な検証がなされない場合、攻撃者は被害者をフィッシングやマルウェアのサイトへとリダイレクトさせたり、あるいはフォワード(転送)させる事で認証されていないページへとアクセスすることが可能となります。

ModSecurity

ModSecurityは、オープンソース(Apacheライセンス)で開発が進められているWAFです。無料版のコアルールと商用版のコマーシャルルールがあります。無料版でもSQLインジェクションやクロスサイトスクリプティング等の基本的な攻撃に対して十分にブロックすることができます。Apacheモジュールとして動作します。早速インストールしてみましょう。

$ sudo yum install httpd -y
$ sudo yum install mod_security -y
$ sudo service httpd start

SQLインジェクションをブロックする

簡単なWebページを用意して攻撃らしきものを仕掛けてみて、ブロックされたか確認してみましょう。

<html>
<form>
 <input type="text" name="val">
 <input type="submit">
</form>
</html>

このフォームに以下のようにSQL文を入れてみます。

すると、画面遷移するはずですがエラーが表示されました。ModSecurityが働いていますね。

ログにはSQLインジェクションをブロックしたことが書かれています。

--eb84370c-H--
Message: Pattern match "\binsert\b\W*?\binto\b" at ARGS:val. [file "/etc/httpd/modsecurity.d/base_rules/modsecurity_crs_41_sql_injection_attacks.conf"] [line "260"] [id "959015"] [rev "2.0.5"] [msg "SQL Injection Attack"] [data "insert into"] [severity "CRITICAL"] [tag "WEB_ATTACK/SQL_INJECTION"] [tag "WASCTC/WASC-19"] [tag "OWASP_TOP_10/A1"] [tag "OWASP_AppSensor/CIE1"] [tag "PCI/6.5.2"]
Message: Access denied with code 403 (phase 2). [file "/etc/httpd/modsecurity.d/base_rules/modsecurity_crs_49_enforcement.conf"] [line "25"] [msg "Anomaly Score Exceeded (score 20): SQL Injection Attack"]
Action: Intercepted (phase 2)
Stopwatch: 1331923408495676 3461 (439 2522 -)
Producer: ModSecurity for Apache/2.5.12 (http://www.modsecurity.org/); core ruleset/2.0.5.
Server: Apache/2.2.22 (Amazon)

--eb84370c-Z--

クロスサイトスクリテプティングをブロックする

同じフォームにスクリプトタグを入れてみます。

しっかりとブロックしていますね。

--eb84370c-H--
Message: Pattern match "(?:\<\w*:?\s(?:[^\>]*)t(?!rong))|(?:\<scri)|(<\w+:\w+)" at ARGS:val. [file "/etc/httpd/modsecurity.d/base_rules/modsecurity_crs_41_phpids_filters.conf"] [line "1"] [id "900033"] [msg "Detects obfuscated script tags and XML wrapped HTML"] [data "<scri"] [severity "CRITICAL"] [tag "WEB_ATTACK/XSS"]
Message: Pattern match "(?:\<[\/]?(?:[i]?frame|applet|isindex|marquee|keygen|script|audio|video|input|button|textarea|style|base|body|meta|link|object|embed|param|plaintext|xm\w+|image|im(?:g|port)))" at ARGS:val. [file "/etc/httpd/modsecurity.d/base_rules/modsecurity_crs_41_phpids_filters.conf"] [line "306"] [id "900038"] [msg "Detects possibly malicious html elements including some attributes"] [data "<script"] [severity "CRITICAL"] [tag "WEB_ATTACK/XSS"] [tag "WEB_ATTACK/CSRF"] [tag "WEB_ATTACK/ID"] [tag "WEB_ATTACK/RFE"] [tag "WEB_ATTACK/LFI"]
Message: Pattern match "\< ?script\b" at ARGS:val. [file "/etc/httpd/modsecurity.d/base_rules/modsecurity_crs_41_xss_attacks.conf"] [line "195"] [id "958051"] [rev "2.0.5"] [msg "Cross-site Scripting (XSS) Attack"] [data "<script"] [severity "CRITICAL"] [tag "WEB_ATTACK/XSS"] [tag "WASCTC/WASC-8"] [tag "WASCTC/WASC-22"] [tag "OWASP_TOP_10/A2"] [tag "OWASP_AppSensor/IE1"] [tag "PCI/6.5.1"]
Message: Pattern match "<(a|abbr|acronym|address|applet|area|audioscope|b|base|basefront|bdo|bgsound|big|blackface|blink|blockquote|body|bq|br|button|caption|center|cite|code|col|colgroup|comment|dd|del|dfn|dir|div|dl|dt|em|embed|fieldset|fn|font|form|frame|frameset|h1|head|h ..." at ARGS:val. [file "/etc/httpd/modsecurity.d/base_rules/modsecurity_crs_41_xss_attacks.conf"] [line "555"] [id "973300"] [rev "2.0.5"] [msg "Possible XSS Attack Detected - HTML Tag Handler"] [data "<script>"]
Message: Pattern match "(?i:<script.*?>)" at ARGS:val. [file "/etc/httpd/modsecurity.d/base_rules/modsecurity_crs_41_xss_attacks.conf"] [line "756"] [id "973331"] [rev "2.0.5"] [msg "IE XSS Filters - Attack Detected"] [data "<script>"]
Message: Access denied with code 403 (phase 2). [file "/etc/httpd/modsecurity.d/base_rules/modsecurity_crs_49_enforcement.conf"] [line "25"] [msg "Anomaly Score Exceeded (score 68): IE XSS Filters - Attack Detected"]
Action: Intercepted (phase 2)
Stopwatch: 1331923951551083 3174 (418 2377 -)
Producer: ModSecurity for Apache/2.5.12 (http://www.modsecurity.org/); core ruleset/2.0.5.
Server: Apache/2.2.22 (Amazon)

--eb84370c-Z--

ディレクトリトラバーサルをブロックする

同じフォームにシステム関連のディレクトリ名を入れてみます。

しっかりとブロックしてくれました。アプリケーション開発側としては、ブロックされすぎて困ると思うはずですが、WAF側からすれば紛らわしい名前を設定しているほうがおかしいと言いたそうですね。

--991e1b14-H--
Message: Pattern match "\/etc\/" at ARGS:val. [file "/etc/httpd/modsecurity.d/base_rules/modsecurity_crs_40_generic_attacks.conf"] [line "220"] [id "958700"] [rev "2.0.5"] [msg "Remote File Access Attempt"] [data "/etc/"] [severity "CRITICAL"] [tag "WEB_ATTACK/FILE_INJECTION"] [tag "WASCTC/WASC-33"] [tag "OWASP_TOP_10/A4"] [tag "PCI/6.5.4"]
Message: Pattern match "(?:%c0%ae\/)|(?:(?:\/|\\)(home|conf|usr|etc|proc|opt|s?bin|local|dev|tmp|kern|[br]oot|sys|system|windows|winnt|program|%[a-z_-]{3,}%)(?:\/|\\))|(?:(?:\/|\\)inetpub|localstart\.asp|boot\.ini)" at ARGS:val. [file "/etc/httpd/modsecurity.d/base_rules/modsecurity_crs_41_phpids_filters.conf"] [line "86"] [id "900011"] [msg "Detects specific directory and path traversal"] [data "/etc/"] [severity "CRITICAL"] [tag "WEB_ATTACK/DT"] [tag "WEB_ATTACK/ID"] [tag "WEB_ATTACK/LFI"]
Message: Access denied with code 403 (phase 2). [file "/etc/httpd/modsecurity.d/base_rules/modsecurity_crs_49_enforcement.conf"] [line "25"] [msg "Anomaly Score Exceeded (score 25): 900011-Detects specific directory and path traversal"]
Action: Intercepted (phase 2)
Stopwatch: 1331924078330325 3095 (431 2275 -)
Producer: ModSecurity for Apache/2.5.12 (http://www.modsecurity.org/); core ruleset/2.0.5.
Server: Apache/2.2.22 (Amazon)

--991e1b14-Z--

まとめ

今回は、WAFの基本的な考え方や脅威の特徴を学びました。また、オープンソースのWAF実装である、ModSecurityを例に実際の攻撃と防御について試してみました。実際のWebアプリケーションで利用するためには、ルールを緩くしたり、商用ルールを導入したりとカスタマイズが入ると思いますが、OWASPが情報提供している上位の脅威を守るだけでも大きな効果があると思います。WAFをマスターしてアプリケーションレベルのセキュリティコンサルタントになろう!

参考資料

ModSecurity

OWASP