Amazon Web Services ブログ

AWS WAFのAWS マネージドルールの動作をカスタマイズする方法

AWS WAF の AWS マネージドルールは、AWS が作成したルール群として提供され、お客様が独自のルールを作成することなく、一般的なアプリケーションの脆弱性やその他のシステムへの不要なアクセスからお客様のアプリケーションを保護するために使用することが可能です。AWS 脅威リサーチチームは、お客様のアプリケーションを保護するために、刻々と変化する脅威の状況に対応するためにAWS マネージドルールを更新しています。

最近では、AWS WAF はルールのカスタマイズを中心とした 4 つの新機能を発表しました。

  • バージョン管理 – マネージドルールグループの特定のバージョンを選択することができます。バージョン管理は、以前にテストしたバージョンに戻るために使用することができます。
  • ラベル – ルールが一致したときに Web リクエストに追加することができるメタデータ。ラベルは、動作やマネージドルールのデフォルトのアクションを変更するために使用できます。
  • スコープダウンステートメント – ルールグループが評価するリクエストのスコープを絞るために使用します。
  • カスタム応答 – ルールが接続リクエストをブロックしたときに、AWS WAF からクライアントにカスタム HTTP レスポンスを返送します。

このブログでは、4 つのユースケースを通して、これらの機能を使用してマネージドルールをカスタマイズすることでセキュリティ・ポスチャーを向上させる方法を紹介します。

ケース 1:バージョンを指定して、マネージドルールグループの自動更新を制御する

デフォルトでは、マネージドルールグループは、アップデートが利用可能になると自動的に更新されます。これにより、最新のマネージドルールが利用可能になると同時に最新の保護が行われることが保証されます。バージョン管理機能を使用すると、特定のバージョンを維持するように選択できます。つまり、明示的に新しいバージョンに移行するまで更新されません。これにより、新しいバージョンをテストし、準備ができたら Web ACL に昇格させ、必要なら以前にテストしたバージョンに戻すことができます。

注意:できるだけ最新のバージョンに近いものを使用することをお勧めします。

マネージドルールグループのバージョンを選択するために

  1. AWS WAF コンソールからマネージドルールグループを追加した Web ACL に移動します。
  2. バージョンを設定したいマネージドルールグループを選択し、Edit を選択します。
  3. Version 選択ドロップダウンで、使用するバージョンを選択します。バージョンの有効期限が切れるか、別のバージョンを選択するまで、このバージョンを使用することになります(バージョンの有効期限を管理する方法については、この記事の後半で説明します)。注:アップデートを自動的に受信したい場合は、バージョンとして Default を選択します。
  4. Save Rule を選択して、設定を保存します。

    図 1:マネージドルールの Version のドロップダウンを示すコンソールのスクリーンショット

通知の設定

Amazon Simple Notification Service (Amazon SNS)を利用して、マネージドルールグループの更新通知を受けることができます。マネージドルールグループの ARN を使用して SNS トピックを購読することができます。マネージドルールの更新のためのすべての SNS 通知は、同じメッセージ形式を使用し、プログラム的にこれらの更新を取得することができます。SNS 通知のメッセージ形式の詳細については、「管理対象ルールグループに対する新しいバージョンと更新の通知の取得」を参照してください。

Amazon SNSを介した新しいルールの更新に関する電子メール通知をセットアップするには

  1. AWS WAF コンソールで、マネージドルールグループを追加した Web ACL に移動します。
  2. 通知を受け取りたいマネージドルールグループを選択し、Edit を選択します。
  3. Core rule set ページで、Amazon SNS トピックの ARN のリンクを選択し、Amazon SNS コンソールに移動します。ステップ4で使用するためにトピック ARN をメモしておきます。
    ※トピックは バージニア北部 (us-east1) に作成されます。

    図 2: SNS トピック ARN をハイライトしたコンソール画面

  4. リージョンを バージニア北部 (us-east1) に変更してください。
     サブスクリプションの作成ページで、以下の情報を入力します。
     トピック ARN : 手順 3 で入力した SNS のトピック ARN を入力
     プロトコル : E メールを選択
     エンドポイント : 通知を送信する E メールアドレスを入力

    図 3 SNS サブスクリプションの作成をするコンソールのスクリーンショット

  5. サブスクリプションの作成を選択します。
  6. Amazon SNS から届く確認メールを確認。メールに記載されている confirm subscription リンクを選択し、サブスクリプションを完了させてください。

CloudWatchのアラームを利用したバージョン期限切れアラートの設定

マネージドルールグループの特定のバージョンを長期間使用していると、重要な更新を見落とす恐れがあります。古いバージョンを長期間使用しないようにするには、バージョンの有効期限が近づいたときに警告を発するように設定する必要があります。バージョンの有効期限が切れると、マネージドルールグループは自動的にデフォルトのバージョンに切り替わります。バージョンが期限切れになりそうな時に通知されるようにするには、DaysToExpiryに基づいて Amazon CloudWatch アラームを使用してアラートを設定します。以下の手順で、使用しているルールセットの特定のバージョンの有効期限が切れる 60 日前に通知を設定することができます。

CloudWatch アラームを設定
この設定によりルールセットの特定のバージョンが期限切れになる60日前に通知されます。

  1. リージョンを バージニア北部 (us-east1) に変更してください。
  2. CloudWatchのコンソールに移動します。
  3. 左側のナビゲーションペインからすべてのメトリクスを選択し、Brows タブで N.Vrigina が選択されていることを確認し、ネームスペースの一覧からWAFV2を選択します。
  4. ManagedRuleGroup 、Region 、Vendor 、Version を選択します。
  5. 有効期限を監視するマネージドルールグループを選択します。この例では、AWSManagedRulesCommonRuleSet とVersion_1.0 を使用しています。

    図 4:CloudWatch グラフ化したメトリクスタブのコンソールのスクリーンショット

  6. グラフ化したメトリクスを選択し、アクションの右下にあるベルのアラームアイコンを選択します。このアイコンを選択すると、CloudWatch のアラームコンソールに移動します。
  7. CloudWatch のアラームを以下の内容で設定し、次へを選択します。
     統計 : 最小を選択
     期間 : 5分を選択
     しきい値の種類 : 静的を選択
     演算子 : 以下 (<=しきい値)を選択
     しきい値 : 60を入力
     アラームを実行するデータポイント : 低い方の値を1、高い方の値を1として入力
     欠落データの処理 : 欠損データを適正(しきい値に超えていない)として処理を選択
  8. 設定したアラームがアラーム状態になったときに起動させたいSNSトピック (前のステップで作成したトピックのARN) をトピック ARN の使用で指定し、次へを選択します。
  9. アラーム名とアラームの説明を入力します。次へを選択して設定をプレビューし、アラームの作成を選択してCloudWatch アラーム作成を完了します。

     その他のヒント

  • 使用しているマネージドルールグループのバージョンが期限切れの場合、AWS WAF は有効なバージョンを選択するまで、Web ACL の設定変更をしません。できるだけ早く最新バージョンに移行することで、最新の脅威をカバーすることができます。
  • DaysToExpiry メトリックは、Web ACL を流れるトラフィックがある場合のみ受け取ることができます。
  • Web ACL でマネージドルールグループの 2 つの異なるバージョンを使用することができます。これは、2つの異なるバージョンを同時にテストして、導入後のトラフィックへの影響を確認する場合に便利です。たとえば、1つのバージョンをカウントモード、もう1つをブロックモードにします。
    注意:このワークフローは JSON ルールエディタと API でサポートされていますが、コンソールではサポートされていません。

ケース 2:ラベルを使用して、マネージドルールグループ内のルールによる誤検出を緩和する

ラベルは、ルールに関連するアクションに関係なく、マッチングするWebリクエストにルールが追加することができるメタデータです。AWS マネージドルール の最新バージョンでは、ラベルをサポートしています。リクエストにマッチするラベルを持つカスタムルールを作成することで、マネージドルールグループ内のルールの動作やデフォルトアクションを変更することができます。

たとえば、マネージドルールグループで誤検出を引き起こすルールがある場合、マネージドルールをカウントにオーバーライドし、次のようなロジックを持つカスタムルールを記述することで、誤検出を緩和することができます。

 IF (Statement 1) AND NOT (Statement 2) THEN Block
 Statement 1 は、誤検出の原因となるルールから生成されたラベルにマッチします。
 Statement 2 には、ルールが誤検出を引き起こすために評価させたくない場合の例外条件が含まれています。

マネージドルールグループのルール GenericRFI_QUERYARGUMENTS によって、アプリケーションへのリダイレクト要求がブロックされるシナリオを考えてみましょう。このルールは、すべてのクエリパラメータの値を評価し、URL の途中に埋め込まれた :// など、Web アプリケーションのリモートファイルインクルージョン (RFI) を悪用しようとするリクエストをブロックします。クエリ引数スコープに存在する文字 :// のためにブロックされる可能性のある正当なリダイレクト要求の例は、次のようになります。

 https://ourdomain.com/sso/complete?scope=email profile

 https://www.redirect-domain.com/auth/email https://www.redirect-domain.com/auth/profile

類似の正当なリクエストがブロックされるのを防ぐために、ラベルに基づいてマッチングするカスタムルールを記述することができます。

ステップ 1:特定のマネージドルールグループをカウントモードに設定する

まず、特定のマネージドルールをカウントモードに設定し、一致するリクエストにラベルが追加されるようにします。次に、マネージドルールの優先度をカスタムルールの優先度より高く設定する必要があります。

特定のマネージドルールグループをカウントモードに設定するには

  1. AWS WAF コンソールで、Web ACL に移動し、Rules タブを選択します。Add Rule を選択し、Add managed rule groupsを選択します。
  2. AWS managed rule groups を選択します。
  3. Free rule groups で Core rule set を探し、Add to web ACL を選択して Web ACL に追加します。
    Edit を選択します。
  4. ルールのリストから、ルールの横にある Count トグルを選択して、偽陽性を生成するルールを Count アクションに設定します。この例では、ルール GenericRFI_QUERYARGUMENTS のアクションを Count に変更します。これにより、一致するすべての要求が優先順位の高い順に後続の WAF ルールに送信され、一致する要求があるたびにawswaf:managed:aws:commonruleset:GenericRFI_QueryArguments というラベルが追加されるようになります。
  5. Save rule を選択します。
  6. Add rules をもう一度選択して、次のウィンドウに移動し、ルールの優先順位を設定します。マネージドルールは、次のステップで作成するカスタムルールよりも高い優先度を設定する必要があります。
  7. Save を選択して、設定を保存します。

ステップ 2:Web ACLにマネージドルールより低い優先度のカスタムルールを追加する

Web ACL にカスタムルールを作成し、ラベルが存在し誤検出の原因となるルールに例外条件がない場合にリクエストをブロックするようにします。このカスタムルールの優先度は、マネージドルールよりも低く設定する必要があります。

マネージドルールよりも低い優先度でカスタムルールを追加するには

  1. AWS WAF コンソールで、Web ACL に移動し、Rules タブを選択します。Add Rule を選択し、Add my own rules and rule groups を選択します。
  2. Rule type に Rule builder を選択します。
  3. Name を入力し、Type として Regular rule を選択します。
  4. If a request ドロップダウンを使用して、matches all the statements (AND) を選択します。
  5. Statement 1 では、リクエストに探しているラベルがあるかどうかを確認します。この例では、次のような内容で構成されています。
     Inspect : Has a label を選択
     Labels : Label を選択
     Match key : awswaf:managed:aws:commonruleset:GenericRFI_QueryArguments を選択
  6. それ以降のステートメントは、リクエストがステートメントの基準に合致せず、正当なリクエストとして扱われるように、すべて否定する必要があります。この例では、NOT Statement 2 を設定し、リクエストのクエリ文字列にhttps://www.redirect-domain.com/ が含まれているかどうかをチェックします。
     有効にする : Negate statement results を選択
     Inspect : All query parameters を選択
     Match type : Contains string を選択
     String to match : https://www.redirect-domain.com/ を入力
     Text transformation : None を選択
  7. Action で Block を選択し、Add rule を選択します。
  8. Set rule Priority ウィンドウで、カスタムルールのルール優先度を AWS Managed Rules ルールよりも低く設定します。
  9. Saveを選択します。

ケース 3:スコープダウンステートメントを使用して、マネージルールグループに一致するトラフィックの範囲を限定する

どのルールグループにもスコープダウンステートメントを追加して、ルールグループが評価する要求の範囲を限定することができます。これによって、ルールグループに評価させたいリクエストをフィルターにかけたり、基準を満たさないリクエストをフィルターにかけたりすることができます。

AmazonIPReputationList に対して評価されたくない、信頼されたIPアドレスのリストがある場合を考えてみましょう。スコープダウンステートメントを使用して、評価対象からトラフィックを除外することで、これらの信頼された IP アドレスをブロックすることを避けることができます。

ステップ 1:許可されたIPのリストを含むIPセットを作成する

最初のステップは、許可された IP のリストを含む IP セットを作成することです。IP セットは、特定の AWS リージョンに対して作成することもできますし、Web ACL が Amazon CloudFront ディストリビューションに関連する場合は、グローバルにすることもできます。

IP セットを作成するには

  1. AWS WAF コンソールで、IP sets を選択し、Create IP set を選択します。
  2. IP set name には、Allowed-IPsと入力します。IP addresses に許可するIPを入力します。完了したら Create IP set を選択します。

    図 5:IP セットを作成するコンソールのスクリーンショット

ステップ 2:マネージドルールグループにスコープダウンステートメントを追加する

IP セットを作成したら、マネージドルールグループにスコープダウンステートメントを追加して、IP セット内の IP から発生するトラフィックがマネージドルールグループ内のルールに対して評価されないようにすることができます。

スコープダウンステートメントを追加するには

  1. AWS WAF コンソールで、Web ACL に移動し、Rules タブを選択します。Add Rule を選択し、Add managed rule groupsを選択します。
  2. AWS managed rule groups を選択します。
  3. Free rule groups で Amazon IP reputation list を探し、Add to web ACL を選択して Web ACL に追加します。
  4. Edit を選択します。
  5. Enable scope-down statement を選択します。

    図 6:スコープダウンステートメントを有効にしたコンソールのスクリーンショット

  6. 先に作成した許可 IP リストから発信されない要求のみがこのルールグループで評価されるように、条件を追加します。
    If a request ドロップダウンを使用して、doesn’t match the statements (NOT) を選択します。
     Inspect : Originates from an IP address in を選択
     IP set : Allowed-IPs を選択
     IP address to use as the originating address : Source IP address を選択

    図 7:スコープダウンステートメントを設定するコンソールのスクリーンショット

  7. Save rule を選択します。
  8. Add rules を選択します。
  9. Save を選択します。

ケース 4:カスタム応答を使用して、マネージドルールグループのデフォルトのブロックアクションを変更する

AWS WAF は、受信したリクエストをブロックすると、レスポンスコード 403(forbidden)を返送します。カスタム応答機能を使用すると、ルールでアクセスがブロックされたときに、代わりにカスタム HTTP レスポンスをクライアントに送り返すことができます。カスタム応答を使用すると、ステータスコード、レスポンスヘッダ、およびレスポンスボディをカスタマイズすることができます。

例えば、VPN 経由でアプリケーションに接続する可能性のあるクライアントに対して、応答を返したいとします。この場合、エラーコード 400 (Bad Request) と静的なボディメッセージ (“Please don’t try to connect over a VPN”) を送信して、この動作が推奨されないことをユーザーに伝えるためにカスタム応答を使用したいと思います。これを行うには、AWS マネージドマネージドルールグループ AWSManagedRulesAnonymousIpList を使用し、awswaf:managed:aws:anonymous-IP-list:AnonymousIPList ラベルを使用してカスタムルールをセットアップします。

ステップ 1:カスタムレスポンスボディの作成

カスタム応答を作成する最初のステップは、カスタムレスポンスボディを作成することです。これは、カスタム応答が送信されるときに表示されるメッセージです。

カスタムレスポンスボディを作成するには

  1. AWS WAF コンソールで、Web ACL に移動し、Custom response bodies タブを選択します。
  2. Create custom response body を選択します。
  3. Response body object name にこのレスポンスの名前を入力します。(例:Custom-body-IP-list)
  4. レスポンスボディの Content type で Plain text を選択します。
  5. Response body に、クライアントに送り返すレスポンスを入力します。(例:Please don’t try to connect over a VPN)
  6. Save を選択します。

    図 8:AWS WAFコンソールでのカスタムレスポンスボディ作成のスクリーンショット

ステップ 2:管理ルールグループのアクションをオーバーライドする

カスタム応答を送信するために使用するルールは、カウントモードである必要があります。これにより、一致するすべての要求が優先順で後続の WAF ルールに送信されるようになります。次の例では、マネージドルールグループ AWSManagedRulesAnonymousIpList のルール AnonymousIPList がカウントモードに設定されています。マネージドルールグループのアクションをオーバーライドする方法の詳細については、「ルールグループまたはそのルールのアクションの上書き」を参照してください。

図 9:AWS マネージドルールのルールを上書きするコンソールスクリーンショット

ステップ3: リクエストをブロックし、カスタム応答をクライアントに送り返すルールを作成する

このステップでは、AWS WAFのラベル機能を使用することになります。上記のケース 2 で説明したように、マネージドルールが生成したラベルにマッチするカスタムルールを作成する必要があります。この場合、カスタムルールはカスタム応答を送信するように設定する必要があります。

カスタムルールを作成するには

  1. AWS WAF コンソールで、Web ACL に移動し、Rules タブを選択します。Add Rule を選択し、Add my own rules and rule groups を選択します。
  2. Rule type に Rule builder を選択します。
  3. Name を入力し、Type として Regular rule を選択します。
  4. If a request ドロップダウンを使用して、matches all the statements を選択します。
  5. Statement 1 では、リクエストに探しているラベルがあるかどうかを確認します。この例では、次のような内容で構成されています。
    Inspect : Has a label を選択
    Labels : Label を選択
    Match key : awswaf:managed:aws:anonymous-ip-list:AnonymousIPList を選択
  6. Action で Block を選択します。
  7. Custom response セクションを展開し、Enable を選択します。
  8. Response code の下に、クライアントに送り返すカスタム HTTP ステータスコードを入力します。(例:400)
  9. (オプション) カスタムレスポンスヘッダーを追加したい場合は、Response headers セクションを使用します。
  10. Choose how you would like to specify the response body – optional で、ステップ 1 で作成したカスタムレスポンスボディを選択します。
  11. (オプション) ログのアクティビティを追跡するために追加のラベルを生成したい場合は、Add label を使用できます。
  12. Add rule を選択します。
  13. Set rule Priority ウィンドウで、カスタムルールのルール優先度を AWS Managed Rules ルールよりも低く設定します。
  14. Saveを選択します。

    図 10:ルールのカスタムレスポンスボディを設定するコンソールのスクリーンショット

おわりに

この投稿では、バージョン管理、ラベル、スコープダウンステートメント、カスタム応答などの新しい AWS WAF 機能が、Webアプリケーションを保護しリスクを最小限に抑えるために AWS マネージドルールの動作をカスタマイズするのに役立つことを実証しました。これらの機能は、ラベルとリクエストプロパティを組み合わせて AWS マネージドルールをカスタマイズしてリクエストを許可またはブロックしたり、ラベルを使用してログのフィルタリングを支援するなど、さまざまな方法で使用することができます。

AWS WAF については、他の AWS WAF 関連のセキュリティブログの記事でより詳しく知ることができますのでご覧ください。

翻訳は Solutions Architect の長谷川 純也が担当しました。原文はこちらです。