mazyu36の日記

某SIer所属のクラウドエンジニアのブログ

AWS CDKでAWS WAFのブロック時のログのみS3に出力する設定

はじめに

AWS CDKでAWS WAFのうち、BLOCKしたもののみS3バケットに保存したい時があり、試行錯誤してできたので記録として残しておく。

以下記事でCloudFormationで実装した例があったので参考にさせていただいた。

go-to-k.hatenablog.com

実装内容

実装内容としては以下である(WebACLとS3バケットの実装については省略)。 CfnLoggingConfigurationを使用している。

import { aws_wafv2 as wafv2 } from 'aws-cdk-lib';

const logConfig = new wafv2.CfnLoggingConfiguration(this, 'WafLoggingConfiguration', {
    logDestinationConfigs: [s3Bucket.bucketArn], // S3バケットのARNを指定
    resourceArn: webAcl.attrArn,// WebACLのみ指定

    // 以下フィルターを設定
    loggingFilter: {
        DefaultBehavior: 'DROP', //デフォルトはDROPとする
        // ただしBLOCKした場合のみKEEPの設定とする
        Filters: [{
            Behavior: 'KEEP', // 条件に合致した場合の挙動(KEEP)
            Conditions: [{
                ActionCondition: {
                    Action: 'BLOCK' // BLOCKされた場合のみ
                }
            }],
            Requirement: 'MEETS_ALL' . // 条件全てに合致した場合
        }]
    }
})

// 依存関係を定義
logConfig.addDependsOn(webAcl)
logConfig.addDependsOn(s3Bucket.node.defaultChild as cdk.CfnResource)

以下詳細を記載していく。

const logConfig = new wafv2.CfnLoggingConfiguration(this, 'WafLoggingConfiguration', {
    logDestinationConfigs: [s3Bucket.bucketArn], // S3バケットのARNを指定
    resourceArn: webAcl.attrArn,// WebACLのARNを指定

上記のようにログ出力先のバケット、WebACLのarnを指定する。

    // 以下フィルターを設定
    loggingFilter: {
        DefaultBehavior: 'DROP', //デフォルトはDROPとする
        // ただしBLOCKした場合のみKEEPの設定とする
        Filters: [{
            Behavior: 'KEEP', // 条件に合致した場合の挙動(KEEP)
            Conditions: [{
                ActionCondition: {
                    Action: 'BLOCK' // BLOCKされた場合のみ
                }
            }],
            Requirement: 'MEETS_ALL' . // 条件全てに合致した場合
        }]
    }

今回肝となる「BLOCK時のみ」のログ出力に該当する箇所。参考リンクのCloudFormation設定内容をそのまま参考にさせていただいた。

基本はログはDROP(捨てる)するが、ActionがBLOCKという条件の場合のみKEEP(保持)という設定である。

// 依存関係を定義
logConfig.addDependsOn(webAcl)
logConfig.addDependsOn(s3Bucket.node.defaultChild as cdk.CfnResource)

こちらはちょっとハマった箇所。cdk deploy時にログ設定をWebACLやS3バケットよりも先に作ろうとしてエラーなってしまうことがあった。 そのためWebACL,S3バケットが作成された後でログ設定を行うように依存関係を明示している。

以上でAWS WAFのログでブロックしたもののみS3に出力できる。