一般的な攻撃からリソースを保護するために、AWS WAF をどのように設定するとよいですか?
最終更新日: 2020 年 11 月 27 日
一般的な攻撃からリソースを保護するために、AWS WAF をどのように設定するとよいですか?
解決方法
AWS WAF Classic から AWS WAF に移行する (該当する場合)
AWS WAF Classic を利用している場合は、AWS WAF に移行することをお勧めします。この移行を行うには、自動移行ツールを活用できます。 詳細については、 AWS WAF に移行する理由を参照してください。
アプリケーションに対して侵入テストを実行して、脆弱性を特定する
すべてのアプリケーションは、独自のタイプのリクエストを受け取ります。そのため、アプリケーションを保護するファイアウォールルールをカスタマイズする必要があります。
アプリケーションに対して侵入テストを実行して、その特定の脆弱性を理解します。詳細については、以下をご覧ください
- 侵入テストに関する AWS カスタマーサポートポリシー
- AWS Marketplace の侵入テストプロバイダー
受信リクエストを確認してカスタムルールを最適化する
アプリケーションを保護するカスタムルールを作成する前に、環境内の受信リクエストを確認してください。
まず、以下を使用してログを生成します。
- AWS WAF
- Amazon CloudFront
- Application Load Balancer
- Amazon API Gateway
次に、これらのログを Amazon Simple Storage Service (Amazon S3) に保存します。最後に、Amazon Athena を利用してログをクエリし、パターンを特定します。例えば、次のようなパターンが表示されることがあります。
- 存在しない URI に対するお使いの環境へのリクエスト
- このパターンを認識するには、サポートされているすべての URI を知っている必要があります
- 各 URI のリクエストをカウントするために AWS WAF ログで実行された Athena クエリの例:
SELECT count("httprequest"."uri") as URIcount, "httprequest"."uri"
FROM waf_logs
GROUP BY "httprequest"."uri"
ORDER BY URIcount DESC
- お使いのウェブサーバーでサポートされていない HTTP ホストヘッダーを含むリクエスト (または、ウェブサイトのドメイン名の代わりに IP アドレスを含むリクエスト)
- 異なるホストヘッダー値を持つリクエストをカウントするために、AWS WAF ログで実行された Athena クエリの例:
SELECT header.value as HostHeader, count(header) as count
FROM waf_logs, UNNEST(httprequest.headers) AS x(header)
WHERE "header"."name" = 'Host'
GROUP BY header
ORDER BY count DESC
パターンを識別した後、COUNT モードで AWS WAF ルールを作成し、それらのリクエストに一致するようにルールが設定されていることを確認できます。次に、ルールを BLOCK モードに移動します。
例えば、アプリケーションがホストヘッダー「www.example.com」のみをサポートしている場合:
- 値が「www.example.com」のホストヘッダーで一致しないものを作成する
- アクションを BLOCK に設定する
ホストヘッダーが「www.example.com」ではない環境へのリクエストはすべてブロックされます。
注: このルールは、AWS が指定する完全修飾ドメイン名 (FQDN) へのリクエストもブロックします。
AWS マネージドルールを使用して一般的な攻撃から保護する
AWS マネージドルールを使用して、ほとんどのアプリケーションに適用される一般的な攻撃 (次のようなリクエストを含む) を防止します。
- ユーザーエージェントを含まない
- ボットリクエストを表す
- HTTP ホストヘッダーとして「localhost」を使用する
- PROPFIND HTTP メソッドを使用する
これらのベースラインルールグループを、COUNT モードでウェブアクセスコントロールリスト (ウェブ ACL) に含めます。必ずルールグループで [Enable Count mode] を選択してください。次に、AWS WAF ログと CloudWatch メトリクスを確認して、マネージドルールが正当なトラフィックと一致しているかどうかを判断します。一致していない場合は、[Enable Count mode] を無効にして、ルールグループを BLOCK に移動します。AWS マネージドルールグループの特定のルールを無効にするには、そのルールに対して [Override rules action] を選択します。
注: AWS マネージドルールは、お使いの環境への正当なリクエストによってトリガーされる場合があります。詳細については、AWS マネージドルールが原因で発生する誤検知を検出してセーフリストに追加する方法を教えてくださいを参照してください。
重要: AWS マネージドルールは、一般的なウェブの脅威からお客様を保護するように設計されています。ドキュメントに従って使用すると、AWS マネージドルールのルールグループは、アプリケーションに別のセキュリティレイヤーを追加します。ただし、AWS マネージドルールのルールグループは、選択した AWS リソースによって決定されるセキュリティ上の責任を肩代わりするものではありません。AWS のリソースが適切に保護されていることを確認するには、 責任共有モデルを参照してください。
正当なリクエストのレートを使用して AWS WAF をベースライン化する
AWS WAF ログで Amazon Athena または Amazon Quicksight を使用して、正当なクライアント IP アドレスによって行われたリクエストの数を特定するために、トラフィックの分析を実行します。この分析から取得した情報を使用して、AWS WAF を正規のクライアントによって行われたリクエストのレートに合わせてベースライン化します。次に、AWS WAF レートベースのルールを設定する際にしきい値を設定します。
AWS WAF ログで実行された Athena クエリのサンプルは、指定された時間枠 (2020 年 11月 16日 午前 9 時~10 時) 内の単一の IP アドレス (x.x.x.x) からのリクエスト数をカウントします。
SELECT "httprequest"."clientip", "count"(*) "count", "httprequest"."country"
FROM waf_logs
WHERE httprequest.clientip LIKE 'x.x.x.x' and date_format(from_unixtime("timestamp"/1000), '%Y-%m-%d %h:%i:%s') between '2020-11-16 09:00:00' and '2020-11-16 10:00:00'
GROUP BY "httprequest"."clientip", "httprequest"."country"
AWS WAF ログで実行された Athena クエリのサンプルは、同じ時間枠内のすべての IP アドレスからのリクエスト数をカウントします。
SELECT "httprequest"."clientip", "count"(*) "count", "httprequest"."country"
FROM waf_logs
WHERE date_format(from_unixtime("timestamp"/1000), '%Y-%m-%d %h:%i:%s') between '2020-11-16 09:00:00' and '2020-11-16 10:00:00'
GROUP BY "httprequest"."clientip", "httprequest"."country"
ORDER BY "count" DESC
AWS WAF セキュリティオートメーションのテンプレートを使用して一般的な攻撃を防ぐ
AWS WAF セキュリティオートメーションのテンプレートを使用して、一般的な攻撃の保護を強化します。例えば、次の項目に対する保護を有効にできます。
- スキャナーとプローブ
- 悪質なボット
- 不正な IP アドレス
注: このソリューションでは、コストが発生する他の AWS のサービスを利用しています。
SQL インジェクションとクロスサイトスクリプティングからの保護
SQL インジェクションとクロスサイトスクリプティング (XSS) 攻撃からアプリケーションを保護するには、組み込みの SQL インジェクションエンジンとクロスサイトスクリプティングエンジンを使用します。攻撃は、HTTP ヘッダー、クエリ文字列や URI などの HTTP リクエストのさまざまな部分に対して行われることに注意してください。組み込みの緩和エンジンに対して HTTP リクエストのさまざまな部分を検査するには、AWS WAF ルールを設定します。
注: 緩和エンジンのルールは、お使いの環境へ正当なリクエストが行われることでトリガーされる可能性があります。詳細については、AWS マネージドルールが原因で発生する誤検知を検出してセーフリストに追加する方法を教えてくださいを参照してください。
CloudFront からのアクセスを制限する (CloudFront で AWS WAF を利用している場合)
- CloudFront IP アドレスに基づいてアクセスを制限します 。
- オリジンリクエストに CloudFront のカスタムヘッダーを追加します。オリジンで、カスタムヘッダーと値が存在する場合にのみアクセスを付与します。オリジンが Application Load Balancer または API Gateway の場合は、オリジンで AWS WAF を使用して、カスタムヘッダーと値を含むリクエストを許可します。
DDoS 攻撃からの保護
分散型サービス拒否 (DDoS) 攻撃からの保護の詳細については、DDoS の回復力に関する AWS ベストプラクティスと AWS Shield 機能を参照してください。