スキップしてコンテンツを表示

AWS WAF で設定を行い、一般的な攻撃からリソースを保護する方法を教えてください。

所要時間4分
0

一般的な攻撃から保護するために、リソースに AWS WAF を使用したいです。

簡単な説明

リソースに AWS WAF を使用して一般的な攻撃から保護するには、次の 1 つまたは複数の手順を実行します。

  • AWS WAF Classic から AWS WAF に移行します。
  • リソースを AWS WAF のウェブアクセスコントロールリスト (ウェブ ACL) に関連付けます。
  • 受信したリクエストを確認してルールを最適化します。
  • AWS マネージドルールを使用して一般的な攻撃対策を改善します。
  • 正当なリクエスト率を使用して AWS WAF のベースラインを設定します。
  • Security Automations for AWS WAF を使用して一般的な攻撃を防ぎます。
  • SQL インジェクションとクロスサイトスクリプティング (XSS) 攻撃に対するルールステートメントを使用します。
  • Amazon CloudFront からのアクセスを制限します。
  • 分散型サービス拒否 (DDoS) 攻撃から保護します。

解決策

**注:**AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。

AWS WAF Classic から AWS WAF に移行する

AWS WAF Classic を使用している場合は、AWS WAF への移行をおすすめします。詳細については、「AWS WAF に移行すべき理由を教えてください」を参照してください。

リソースをウェブ ACL に関連付ける

まず、AWS WAF でウェブ ACL を作成します。次に、AWS WAF が受信リクエストを監視できるようにするために、リソースをそのウェブ ACL に関連付けます。リソースを AWS WAF と直接統合できない場合は、次の代替方法を確認してください。詳細については、「AWS WAF で保護できるリソース」を参照してください。

AWS WAF と統合できるリソース

AWS WAF と統合できるリソースについては、次のいずれかの方法でリソースを統合してください。

AWS WAF と統合できないリソース

AWS WAF と直接統合できないリソースについては、次のいずれかの方法でリソースを統合してください。

受信したリクエストを確認してルールを最適化する

リソースを保護するには、Application Load Balancer や CloudFront アクセスログなどのアプリケーションログを参考に、一般的なリクエストパターンを判断してください。

注: AWS WAF ログを参照して HTTP リクエストログを保存、クエリ、分析することをおすすめします。

一般的なリクエストパターンを判断した後、ログを Amazon Simple Storage Service (Amazon S3) または Amazon CloudWatch に保存します。ログをクエリしてパターンを特定するには、Amazon Athena または CloudWatch Logs Insights を使用します。

最後に、受信リクエストを検証する AWS WAF ルールを Count モードで作成し、そのルールを Block に設定します。

  1. example.com のホストヘッダーに NOT ルールステートメントを作成します。
    注: example.com を実際のホストヘッダーに置き換えてください。
  2. [アクション]Block に設定します。AWS WAF は、指定したホストヘッダーがないリクエストをブロックします。

注: このルールは、AWS が提供する完全修飾ドメイン名 (FQDN) へのリクエストもブロックします。

発生する可能性のある一般的なリクエストパターン例を次に示します。

存在しない 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

AWS WAF ログで各 URI へのリクエストをカウントする CloudWatch クエリの例を次に示します。

fields httpRequest.uri
| stats count(*) as requestCount by httpRequest.uri
| sort requestCount 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

AWS WAF ログで複数ホストヘッダー値を含むリクエストをカウントする CloudWatch クエリの例を次に示します。

fields @timestamp, @message
| parse @message '{"name":"Host","value":"*"}' as host
| stats count(*) as requestCount by host
| sort requestCount desc

AWS マネージドルールを使用して一般的な攻撃から保護する

AWS マネージドルールを使用するには、対策する一般的なリクエストパターンと攻撃を特定してください。次に、適切な AWS マネージドルールのルールグループを追加します。特化されたタスクへの対策には、次のルールグループを使用できます (追加料金が発生します)。

Count モードで、適切なルールグループをウェブ ACL に追加します。次に、AWS WAF ログと CloudWatch メトリクスを確認して、マネージドルールが正当なトラフィックと一致しているかどうかを判断します。ルールが正当なトラフィックと一致しない場合は、ルールグループで [Count モードを有効化] を無効化してトラフィックをブロックしてください。AWS マネージドルールグループ内の特定のルールを無効にするには、そのルールで [ルールアクションのオーバーライド] を選択します。

注: 環境に正当なリクエストが行われても、AWS マネージドルールが起動する可能性があります。詳細については、「AWS WAF で AWS マネージドルールの動作をカスタマイズする方法」を参照してください。

正当なリクエスト率を使用して AWS WAF のベースラインを設定する

大量攻撃を防ぐには、トラフィックを分析して、正当なクライアント IP アドレスからのリクエスト数を判別してください。トラフィックの分析には、AWS ログに対して CloudWatch Logs InsightsAthena queries、または Amazon Quick Sight を使用してください。分析の情報を使用して AWS WAF のベースラインを作成します。次に、レートベースのルールステートメントを構成し、リクエストのしきい値を設定します。

AWS WAF ログで、特定期間内に単一の IP アドレスから行われたリクエスト数をカウントする Athena クエリの例を次に示します。

SELECT  "httprequest"."clientip", "count"(*) "count", "httprequest"."country"
  FROM waf_logs
 WHERE httprequest.clientip LIKE '10.0.0.0' 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"

注: 10.0.0.0 を使用する IP アドレスに、2020-11-16 09:00:00 および 2020-11-16 10:00:00 を指定する期間に置き換えてください。

AWS WAF ログで、単一の IP アドレスから行われたリクエスト数をカウントする CloudWatch Insights クエリの例を次に示します。

fields httpRequest.clientIp, httpRequest.country
| stats count(*) as requestCount by httpRequest.clientIp, httpRequest.country
| filter httpRequest.clientIp = "10.0.0.0"

注: 10.0.0.0 を使用する IP アドレスに置き換えてください。

AWS WAF ログで、特定期間内に複数の IP アドレスから行われた全てのリクエスト数をカウントする Athena クエリの例を次に示します。

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

注: 2020-11-16 09:00:00 および 2020-11-16 10:00:00 を指定する期間に置き換えてください。

AWS WAF ログで、特定期間内に複数の IP アドレスから行われたリクエスト数をカウントする CloudWatch Insights クエリの例を次に示します。

fields httpRequest.clientIp, httpRequest.country
| stats count(*) as requestCount by httpRequest.clientIp, httpRequest.country
| sort requestCount desc

Security Automations for AWS WAF を使用して一般的な攻撃に対策する

Security Automations for AWS WAF を使用すると一般的な攻撃への対策をさらに強化できます。

注: この解決策では、他の AWS サービスを使用するため、コストが発生する場合があります。

SQL インジェクションと XSS 攻撃に対するルールステートメントを使用する

SQL インジェクションや XSS 攻撃からアプリケーションを保護するには、SQL インジェクションXSS に対する、組み込みの攻撃対策ルールステートメントを使用してください。攻撃は、HTTP ヘッダー、クエリ文字列、URI など、HTTP リクエストの複数部分に対して行われる可能性があります。AWS WAF ルールで設定を行い、HTTP リクエストの複数部分を攻撃対策ルールステートメントと照合します。

注: 環境に正当なリクエストが行われても、攻撃対策ルールステートメントが起動する可能性があります。詳細については、「AWS マネージドルールに起因する誤検知を識別する方法を教えてください」を参照してください。

CloudFront からのアクセスを制限する

CloudFront の IP アドレスに基づいてアクセスを制限することができます。次に、CloudFront にオリジンリクエスト用のカスタムヘッダーを追加します。オリジンでは、カスタムヘッダーと値が存在する場合にのみアクセスを許可します。オリジンが Application Load Balancer または API Gateway の場合は、そのオリジンで AWS WAF を使用します。こうすることで、カスタムヘッダーと値を含むリクエストが許可されます。

DDoS 攻撃から保護する

DDoS 攻撃からの保護については、「DDoS 耐性に関する AWS のベストプラクティス」および「AWS Shield の機能」を参照してください。

関連情報

責任分担モデル

AWS WAF での誤検出に対処する

コメントはありません

関連するコンテンツ