【目次】

  1. 1. はじめに
  2. 2. ルールグループの例外機能を使用した誤検知対応の概要
  3. 3. 特定のルールで検知させるリクエストの送信
  4. 4. ルールグループの例外機能を設定
  5. 5. Rule action: Count 設定後の動作確認
  6. 6. WafCharmルールでアクションを変更する際の注意点
  7. 7. おわりに

安価で導入しやすいAWS WAFの運用課題の解決方法をご紹介

■ はじめに

本記事では new AWS WAF にて「ルールグループから個別ルールの例外設定」を行います。
誤検知が発生した際に、ルールグループから特定のルールを除外します。
特定のルールの除外とは、ルールを削除するのではなく、ルールのアクションを COUNT に変更することを表します。

■ルールグループの例外機能を使用した誤検知対応の概要

マネージドルールの中で、誤検知の発生したルールだけを COUNT に変更することが可能です。
該当のルールだけを COUNT に変更することで、誤検知対応した時に必要以上に防御力を低下させてしまうことはありません。

個別ルールの COUNT 設定イメージ
※ルールグループ内で誤検知が発生、ルール A のみを COUNT モードへ変更します。

■特定のルールで検知させるリクエストの送信

では、実際に特定のルールで検知リクエストを送信します。
今回は AWS 公式マネージドルールの AWS-AWSManagedRulesCommonRuleSet を使用します。マネージドルールの詳細内容は公開されていないため、BLOCK 内容が予測できるルール名「 NoUserAgent_HEADER 」で実施していきます。
ユーザーエージェントが何も入っていないアクセスを不正なアクセスとして、検知するルールだと予測して、以下のリクエストを行いました。

実行したリクエスト
$ curl http://XXXXXXXXX.ap-northeast-1.elb.amazonaws.com/ -A ""

結果
403 fobbiden
予測通り、 BLOCK されました。

■ルールグループの例外機能を設定

次に、検知したルール名を特定し、COUNT モードに設定する手順を追っていきましょう。
今回は S3 に WAF ログを出している状態として、検知履歴を確認していきます。
WAF ログ を S3 に出力する方法については以下の記事でご確認ください。
(参考:AWS WAF Full Log を S3 に出力する https://www.wafcharm.com/jp/blog/aws-waf-full-log-s3-output-jp/

Step1. WAF ログから該当のルール名を特定します。
検知したルール名は「 terminatingrule 」に記載されています。
今回は「 NoUserAgent_HEADER 」で検知したことが WAF ログから読み取れます。

{
    "timestamp": 1620866646423,
    "formatVersion": 1,
    "webaclId": "arn:aws:wafv2:ap-northeast-1:XXXXXXXXXXXX:regional/webacl/XXXXXXXXXXXX/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
    "terminatingRuleId": "AWS-AWSManagedRulesCommonRuleSet",
    "terminatingRuleType": "MANAGED_RULE_GROUP",
    "action": "BLOCK",
    "terminatingRuleMatchDetails": [],
    "httpSourceName": "ALB",
    "httpSourceId": "XXXXXXXXXXXX-app/XXXXXX/XXXXXXXXXXXX",
    "ruleGroupList": [
        {
            "ruleGroupId": "AWS#AWSManagedRulesCommonRuleSet",
            "terminatingRule": {
                "ruleId": "NoUserAgent_HEADER",
                "action": "BLOCK",
                "ruleMatchDetails": null
            },
            "nonTerminatingMatchingRules": [],
            "excludedRules": null
        }
    ],
    "rateBasedRuleList": [],
    "nonTerminatingMatchingRules": [],
    "requestHeadersInserted": null,
    "responseCodeSent": null,
    "httpRequest": {
        "clientIp": "XXX.XXX.XXX.XXX",
        "country": "JP",
        "headers": [
            {
                "name": "Host",
                "value": "XXXXXX-XXXXXXXXXXXX.ap-northeast-1.elb.amazonaws.com"
            },
            {
                "name": "Accept",
                "value": "*/*"
            }
        ],
        "uri": "/",
        "args": "",
        "httpVersion": "HTTP/1.1",
        "httpMethod": "GET",
        "requestId": "1-609c7656-5b29d6e63add2bb82069a082"
    }
}

Step2.Step1 で確認した Rule( NoUserAgent_HEADER )の Rule action を変更します。
Step2-1.new AWS WAF のコンソール( https://console.aws.amazon.com/wafv2/ )にアクセスします。

Step2-2.Web ACLs > "該当のWebACL" > 「 Rules 」タブをクリックします。

Step2-3.表示された一覧から該当するマネージドルールを編集します。
※ 該当するルール( AWS-AWSManagedRulesCommonRuleSet )にチェックを入れ、「 edit 」をクリックします。

Step2-4.Rule action を Count にします。

「NoUserAgent_HEADER」と記載されている箇所までスクロールし、プルダウンメニューをクリックして「Override to Count」を選択します。
※ 以下の図は、「 NoUserAgent_HEADER 」を「 Count 」 にした図です。

アクションをもとの「Block」に戻したい場合は、再度プルダウンを開いて「Remove Override」をクリックします。

Step2-5.設定変更の確認する。
Count へ変更設定されていることを確認し、「 Save rule 」をクリックします。

すべてのルールのアクションをCountにする場合は、「Override all rule actions」の箇所のプルダウンを使用します。設定を変更後、すべてのルールのOverrideを外したい場合には「Remove all overrides」をクリックします。

■ Rule action: Count 設定後の動作確認

Rule action を Count 設定後、意図した動作になっているか、確認を行います。

実行したリクエスト
curl http://XXXXXXXXX.ap-northeast-1.elb.amazonaws.com/ -A ""
ルールグループ例外設定前:403 fobbiden
ルールグループ例外設定後:200 OK

※通常 ステータスコード 200 は、リクエストが成功したことを表しますので、
コマンドプロンプトでは表示されません。
以下の方法でステータスコードを確認しました。
curl -s http://***********.ap-northeast-1.elb.amazonaws.com -o /dev/null -w ‘%{http_code}\n’

マネージドルールとしては、 BLOCK モードにして、ルールグループ例外機能を設定することで、設定したルールが COUNT となりました。
(WAFログ)

{
    "timestamp": 1620868080953,
    "formatVersion": 1,
    "webaclId": "arn:aws:wafv2:ap-northeast-1:XXXXXXXXXXXX:regional/webacl/XXXXXXXXXXXX/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
    "terminatingRuleId": "Default_Action",
    "terminatingRuleType": "REGULAR",
    "action": "ALLOW",
    "terminatingRuleMatchDetails": [],
    "httpSourceName": "ALB",
    "httpSourceId": "XXXXXXXXXXXX-app/XXXXXX/XXXXXXXXXXXX",
    "ruleGroupList": [
        {
            "ruleGroupId": "AWS#AWSManagedRulesCommonRuleSet",
            "terminatingRule": null,
            "nonTerminatingMatchingRules": [],
            "excludedRules": [
                {
                    "exclusionType": "EXCLUDED_AS_COUNT",
                    "ruleId": "NoUserAgent_HEADER"
                }
            ]
        }
    ],
    "rateBasedRuleList": [],
    "nonTerminatingMatchingRules": [],
    "requestHeadersInserted": null,
    "responseCodeSent": null,
    "httpRequest": {
        "clientIp": "XXX.XXX.XXX.XXX",
        "country": "JP",
        "headers": [
            {
                "name": "Host",
                "value": "XXXXXX-XXXXXXXXXXXX.ap-northeast-1.elb.amazonaws.com"
            },
(以下 省略)

■ WafCharmルールでアクションを変更する際の注意点

WafCharmルールをご利用の場合も、上記の Step2-4 に記載の通りの手順でアクションの切り替えが可能です。

なお、WafCharmルールは攻撃と思われる内容を検知し、ブロックするような構成となっています。
プルダウンからはAllowやCAPTCHA等他のアクションも選択可能ですが、Allowにすると本来ブロックしたい内容にマッチした場合に許可するような動きとなってしまいます。

また、WafCharmルールはCOUNT/BLOCKのいずれかでご利用いただくことを想定しておりますので、CAPTCHAやChallengeなどのアクションでは意図通り動作しない場合があります。

WafCharmルールのアクションをCOUNT/BLOCKの間で切り替える場合には、誤って意図しないアクションに変更されないようご注意ください。

■おわりに

WAFログの内容に ルール名が表示されているため、すぐに該当したルールが分かります。
また、ルールグループ例外の設定についても AWS WAF ナビゲーション画面に一覧表示されているため、 分かりやすくなりました。
緊急対応時にも安心して、設定出来るようになったと感じます。