BLOG

2019/12/26

new AWS WAF でのルールグループの例外設定

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

■ はじめに
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/blog/aws-waf-managed-rule-rulegourp-exception-jp/

■ルールグループ例外機能を使用した誤検知対応の概要
マネージドルールの中で、誤検知の発生したルールだけを COUNT で上書き( Override rules action )する設定が可能です。
該当のルールだけを COUNT に変更することで、誤検知対応した時に必要以上に防御力を低下させてしまうことはありません。

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

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

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

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

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

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

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

{
    "timestamp": 1575522688752,
    "formatVersion": 1,
    "webaclId": "arn:aws:wafv2:ap-northeast-1:358486443100:regional/webacl/XXXXXXXXXXX/38c619fd-df40-4178-9a50-b5ad038e9579",
    "terminatingruleId": "AWS-AWSManagedRulesCommonRuleSet",
    "terminatingruleType": "MANAGED_RULE_GROUP",
    "action": "BLOCK",
    "httpSourceName": "ALB",
    "httpSourceId": "358486443100-app/XXXXXXXXX/b7b00c767bdcac40",
    "ruleGroupList": [
        {
            "ruleGroupId": "AWS#AWSManagedRulesCommonRuleSet",
            "terminatingrule": {
                "ruleId": "NoUserAgent_HEADER",
                "action": "BLOCK"
            },
            "nonTerminatingMatchingRules": [],
            "excludedRules": null
        }
    ],
    "rateBasedRuleList": [],
    "nonTerminatingMatchingRules": [],
    "httpRequest": {
        "clientIp": "153.156.84.123",
        "country": "JP",
        "headers": [
            {
                "name": "Host",
                "value": "XXXXXXXXXXXXXXXXXXXX-northeast-1.elb.amazonaws.com"
            },
            {
                "name": "Accept",
                "value": "*/*"
            }
        ],
        "uri": "/",
        "args": "",
        "httpVersion": "HTTP/1.1",
        "httpMethod": "GET",
        "requestId": null
    }
}

Step2.Step1で確認したRule( NoUserAgent_HEADER )の Override rules action を変更します。
Step2-1.AWS WAF ナビゲーション( https://console.aws.amazon.com/waf/ )に
アクセスします。

Step2-2.AWS マネジメントコンソール > AWS WAF and AWS Shield > AWS WAF の Go to AWS WAF > Web ACLs > “該当のWebACL ” > 「 Rules 」タブをクリックします。

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

Step2-4.Override rules action 設定にします。
個々のルールとそのアクションが記載されている部分から該当のルールの「 Override rules action 」を有効にします。
※以下の図は、「 NoUserAgent_HEADER 」を「 Override rules action 」 にした図です。

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

ルール全体の Override rules action への変更も可能です。ルール全体の Action を「 Enable count mode 」に変更してください。

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

実行したリクエスト
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 となりました。
(フルログ)

{
    "timestamp": 1575529162740,
    "formatVersion": 1,
    "webaclId": "arn:aws:wafv2:ap-northeast-1:XXXXXXXXXXXXXXXX:regional/webacl/XXXXXXXXXXXXXXXX/38c619fd-df40-4178-9a50-b5ad038e9579",
    "terminatingruleId": "Default_Action",
    "terminatingruleType": "REGULAR",
    "action": "ALLOW",
    "httpSourceName": "ALB",
    "httpSourceId": "358486443100-app/XXXXXX/b7b00c767bdcac40",
    "ruleGroupList": [
        {
            "ruleGroupId": "AWS#AWSManagedRulesCommonRuleSet",
            "terminatingrule": {
                "ruleId": "NoUserAgent_HEADER",
                "action": "BLOCK"
            },
            "nonTerminatingMatchingRules": [],
            "excludedRules": null
        }
    ],
    "rateBasedRuleList": [],
    "nonTerminatingMatchingRules": [
        {
            "ruleId": "AWS-AWSManagedRulesCommonRuleSet",
            "action": "COUNT"
        }
    ],
    "httpRequest": {
        "clientIp": "XXXXXXXXXXXXXXXX",
        "country": "JP",
        "headers": [
            {
                "name": "Host",

(以下 省略)

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