【目次】

  1. 1. はじめに
  2. 2. ルールグループの例外機能を使用した誤検知対応の概要
  3. 3. AWS WAF Classic と new AWS WAF の個々のルールへの例外設定方法の違い
  4. 4. 特定のルールで検知させるリクエストの送信
  5. 5. ルールグループの例外機能を設定
  6. 6. Rule action: Count 設定後の動作確認
  7. 7. おわりに

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

■ はじめに

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

記事中では新しいものを new AWS WAF、以前のもの(今までの AWS WAF )を AWS WAF Classic と表記しています。
※ AWS WAF Classic でのマネージドルールの個々のルールを制御する方法については、以下の Blog を参照してください。
【新機能】AWS WAFのマネージドルールで個々のルールを制御できる「ルールグループの例外機能」がリリース!
https://www.wafcharm.com/jp/blog/aws-waf-managed-rule-rulegourp-exception-jp/

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

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

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

■ AWS WAF Classic と new AWS WAF の個々のルールへの例外設定方法の違い

AWS WAF Classic ではルールの ID を WAF ログから特定し、そのルールの ID を AWS コンソールから指定する方式でした。
new AWS WAF ではルールの ID の記載が英数字の表示ではなく、ルール名の表示に変わり、操作もルール名で指定することになります。
※ AWS WAF で検査されるすべてのウェブリクエストに対して完全な WAF のログを「WAF ログ」と表記しています。

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

では、実際に特定のルールで検知リクエストを送信します。
今回は 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 にします。
個々のルールとそのアクションが記載されている部分から該当のルールの「 Count 」を有効にします。
※ 以下の図は、「 NoUserAgent_HEADER 」を「 Count 」 にした図です。

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

各ルールを一括で「 Count 」 へ変更することも可能です。
「 Set all rule actions to count 」を有効にしてください。

■ 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"
            },
(以下 省略)

■おわりに

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