この記事はNTTコムウェア Advent Calendar 2021 7日目の記事です!
こんにちは。
NTTコムウェアで歌って踊れるエンジニアを目指すhirousiです。
はじめに
Webサービスを公開する際に、セキュリティ対策として、とりあえずCloudFrontやAPI-GatewayにAWS WAFをアタッチする方が多いかと思います。中でもAWSの管理ルールとして提供されているAWSManagedRulesCommonRuleSetについて、どんな事をしてくれているのかを紐解いてみようと思います。
本記事の想定読者は下記の通りです
- 本当に守られているのか不安(テストしたい)な方
- どんな攻撃から守られているのか知りたいな方
- Webサービスにセキュリティ対策を実施したい方
そもそもAWS WAFって何よ?
いわずとしれたクラウドサービスAWS(Amazon Web Service)が提供する、WAF(Web Application Firewall)サービスです。
AWSの提供する管理ルールや、サードパーティの提供するルール、自身でのカスタマイズを組み合わせ、外部の脅威から自身のWebAPを守るために利用されます。
中でもAWSManagedRulesCommonRuleSetは、Webアプリケーションのセキュリティを守る非営利団体OWASP(Open Web Application Security Project)がWebセキュリティとして警戒をしなければいけないとして挙げている様々な項目への対応を謳っており、利用している方も多いかと思います。
コアルールセット (CRS)
VendorName AWS, 名前: AWSManagedRulesCommonRuleSet, WCU: 700
コアルールセット (CRS) ルールグループには、ウェブアプリケーションに一般的に適用可能なルールが含まれています。これにより、OWASP の出版物に記載されている高リスクの脆弱性や一般的な脆弱性など、さまざまな脆弱性の悪用に対する保護が提供されます。Owasp Top 10。すべての AWS WAF ユースケースでこのルールグループを使用することを検討してください。
出典:AWS管理ルールルールグループリスト
じゃあWAFって具体的に何をしてくれるの?
というのが本記事の内容となります。
どんなリクエストからWebAPを守ってくれているのかを、実際のリクエスト例と紐づけて紹介します。
注意事項
- 本内容については、不正アクセスを助長するものではございません。
- 本ページの内容については、悪用を禁止致します。
- あくまで自身のサイトのテスト目的での利用に限ります。
- 悪用した場合、不正アクセス禁止法等で訴えられる可能性がございます。
このページの見方(凡例)
ルール名
AWSドキュメント上で示される説明内容
解説をここに記載
curlでの実際のリクエスト例(ドメインはサンプル)
- [類似するルール名1]
- [類似するルール名2]
NoUserAgent_HEADER
HTTP User-Agent ヘッダーのないリクエストをブロックします。
通常、ブラウザやツール(Curl等)でアクセスすると、何からアクセスしたかを示すUser-Agent情報が
サーバへ送付されるのですが、このUser-Agentが無いリクエストを検知します。
※User-Agentが無い=ブラウザ等では無いので、悪意があるリクエストである可能性がある、ということでしょうか。
curl https://example.com -H "User-Agent: "
UserAgent_BadBots_HEADER
リクエストに、不正なボットであることを示す一般的な User-Agent ヘッダー値がないかを検査します。パターンの例には、nessus、nmap などがあります。
ボット管理については、AWS WAFボット制御ルールグループ。
nessusやnmap等の、ポートスキャンや脆弱性スキャンに用いるツールに用いられているUser-Agentからのリクエストを検知します。
curl https://example.com -H "User-Agent: Mozilla/5.0 (compatible; Nmap Scripting Engine; http://nmap.org/book/nse.html)
SizeRestrictions_QUERYSTRING
URI クエリ文字列の長さが最大 2,048 バイトであることを確認します。
クエリ文字列(サーバへ送信する情報の中で、URLに含まれるもの)が一定サイズを超える場合にリクエストを検知します。
サービスの仕様に依っては、検知をブロック、正常にリクエストを受けられない問題が発生する可能性があります。
curl https://example.com?123457890…(2048バイト以上)
- SizeRestrictions_Cookie_HEADER
- SizeRestrictions_BODY
- SizeRestrictions_URIPATH
GenericLFI_QUERYARGUMENTS
クエリ引数に、ローカルファイルインクルージョン (LFI) を悪用する形跡がないかを検査します。例には、../../ などの手法を使用したパストラバーサルの試行があります。
LFI(サーバ内のローカル上のファイルを読み込んでしまう脆弱性)に対する攻撃を検知します。
下記のリクエストは、パストラバーサルの脆弱性を利用して、/etc/passwd
を参照しようとする例です。
基本的にIPA刊行の安全なウェブサイトの作り方等に準拠して開発をしていれば、アプリケーション側で対策されていますが、万が一対策漏れしたアプリがリリースされていても、WAFで検知してくれます(過信は禁物)。
curl https://example.com/script.php?page=../../../../../../etc/passwd
- GenericLFI_URIPATH
- GenericLFI_BODY
RestrictedExtensions_URIPATH
リクエストの URI パスに、クライアントが読み取りや実行を禁止されているシステムファイルの拡張子が含まれていないかを検査します。パターンの例には、.log や .ini などの拡張子があります。
設定ファイル等を直接参照するようなリクエストを検知します。
アクセス権限が適切に設定されていないWebサーバ等で、設定ファイルが公開されてしまっている例などにも、本ルールを適用していれば検知されます(過信は禁物)
curl https://example.com/test.ini
- RestrictedExtensions_QUERYARGUMENTS
GenericRFI_QUERYARGUMENTS
すべてのクエリパラメータの値を検査し、ウェブアプリケーションの RFI (リモートファイルインクルージョン) を悪用しようとするリクエストをブロックします。パターンの例には、:// などがあります。
RFI(リモート上のファイルを参照できてしまう脆弱性)に対する攻撃を検知します。
例えばDMZに配置されたWebサーバに、ユーザの指定するファイルを参照するスクリプトが配置してあり、リモート上のファイルを指定できるような作りになっている場合、内部セグメントのファイルを読み取れる可能性がありますが、こういった脆弱性を突く攻撃を検知してくれます(過信は禁物)。
curl https://example.com/display.php?FORMAT=http://192.168.11.1/test.txt
- GenericRFI_BODY
- GenericRFI_URIPATH
CrossSiteScripting_QUERYARGUMENTS
の組み込み XSS 検出ルールを使用して、クエリ引数の値を検査し、一般的なクロスサイトスクリプティング (XSS) パターンをブロックします。AWS WAF。パターンの例には、 などのスクリプトあります。
言わずと知れたクロスサイトスクリプティングを検知してくれます。
例えば掲示板サイトに攻撃サイトへ自動遷移するjavascriptタグを埋め込む等の攻撃を検知します。
curl "https://example.com?script=<script>alert("hello")</script>"
- CrossSiteScripting_COOKIE
- CrossSiteScripting_BODY
- CrossSiteScripting_URIPATH
EC2MetaDataSSRF_QUERYARGUMENTS
リクエストクエリ引数から Amazon EC2 メタデータを盗み出す試みがないかを検査します。
EC2のメタデータを参照するようなリクエストを検知します。
curl https://example.com?site=http://169.254.169.254/latest/meta-data/
- EC2MetaDataSSRF_BODY
- EC2MetaDataSSRF_COOKIE
- EC2MetaDataSSRF_URIPATH
参考資料:
https://owasp.org/www-project-top-ten/
https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/aws-managed-rule-groups-list.html
https://www.ipa.go.jp/security/vuln/websecurity.html