概要
WAFログ連携には、新方式と旧方式があります。
新方式は、チェックボックスにチェックをいれ、WAFログ連携にオプトインするだけでWAFログを連携できる方法です。
旧方式は、WafCharmダッシュボードにてご提供しておりましたLambdaを用いてWAFログを転送する方法です。
Legacyでのご利用の場合、旧方式でもご利用いただけますが、新方式へ切り替えることをおすすめします。
WAFログ連携の設定は、任意です。画面上は旧方式と新方式のいずれかを選択する必要があるように見えますが、もしWAFログ連携設定を実施したくない場合は、旧方式を選んだ上でWAF Configの設定を完了し、その後の旧方式のLambdaの設定を実施しないようにしてください。
旧方式では、2つの設定方法があります。
なお、AWS WAFの仕様上、CloudWatch LogsにもWAFログを出力することはできますが、WafCharmではこちらのフォーマットに対応していません。
事前準備
旧方式で設定を行う場合、AWSマネージメントコンソール上でIAMロールを作成したり、Lambdaの設定を行ったりする必要があります。そのため、お客様のAWSマネージメントコンソール上で、このような操作をできる権限を持っている必要があります。
基本的には、以下の権限があれば設定を進める上で問題は発生いたしません。
- S3バケットに直接WAFログを出力する場合
- AWSLambda_FullAccess
- IAMFullAccess
- CloudWatchFullAccess
- Amazon Data Firehoseを経由してS3バケットにWAFログを出力する場合
- AWSLambda_FullAccess
- IAMFullAccess
- CloudWatchFullAccess
- AmazonKinesisFullAccess
注意点・補足事項
- お客様の S3 に出力されたログファイルは必要に応じてライフサイクル機能等を用いて定期的 (1ヶ月毎等) に S3 Glacier への退避や削除することを推奨します。
- 弊社への WAF ログ転送確認をご希望の際は、事前に下記 2 点をご確認の上、S3バケットに出力されたWAFログのファイル名と対象の Web ACL ID を共有ください。
- S3バケット に WAF ログが出力されていること
- CloudWatch のイベントログに ERROR が出力されていないこと(START/END/REPORTの3行は都度出力されている)
- Lambda 起動後にロール(ポリシー)の権限を編集した場合、動作中の Lambda に変更点が反映されない可能性があるため、index.mjs の最終行に空白行の追加等を行い、再度デプロイを実施してください。
- WafCharm に AWS WAF のバージョン(AWS WAF v2とAWS WAF Classic)が異なる Web ACL を登録し、各 Web ACL にて本機能を利用する場合、Amazon Data Firehoseおよび Lambda はバージョン毎に作成してください。
- 同じAWS WAFバージョンの場合、Amazon Data Firehoseおよび Lambda を共有することは可能です。
- AWS WAF v2とAWS WAF Classicでは使用するindex.mjsが異なります。
- AWS より提供されているログフィルタリング機能の設定については基本的に非推奨となります。
- action: Block のみ保存するフィルタリングを設定した場合:
- BLOCK したログのみ作成されるため、WAFログアラート(検知通知)機能と月次レポートは BLOCK のログをベースに作成されます。
- action: Count のみ保存するフィルタリングを設定した場合:
- WafCharm の Count は AWS が定義している Count とは異なるため、WAFログアラート(検知通知)と月次レポートが正しく機能しません。
手順
S3バケットに直接出力する
ご利用までの流れ
アーキテクチャ概要は以下の通りです。
お客様のAWS環境にて、AWS WAFからS3へ直接ログ転送を行います。
S3バケットにWAFログが出力されたことをトリガー(S3 putObject Event Trigger)に、Lambdaにてスクリプトが実行されます。
WafCharmへデータが渡り、月次レポートについては追加の設定をせずとも毎月月初に作成される月次レポートを閲覧できます。
WafCharmコンソールにて検知通知の設定を行うと、WAFログアラート(検知通知)機能をご利用いただけます。
AWS WAFにてWAFログを出力する
- AWSマネージメントコンソールにログインする
- AWS WAFからWeb ACLsの一覧を開く
- 対象のWeb ACLを開く
- [Logging and metrics] をクリックする
- [Enable] をクリックする
- [Logging destination] にて [S3 bucket] を選択する
- [Amazon S3 bucket] の箇所で [Create new] をクリックする
- [Bucket name] に [aws-waf-logs-] から始まる名前を入力する
AWSの仕様上、WAFログを出力するS3バケットの名前の先頭に [aws-waf-logs-] とつける必要があります。
- AWS WAFの画面に戻り、先ほど作成したS3バケットをプルダウンから選択する
- [Save] をクリックする
- 対象のリソースにアクセスし、WAFログが当該S3バケットに出力されるか確認する
- S3バケットを開き、WAFログが出力されるパスを確認する
以下のようなフォーマットになります。この情報は後ほど使用します。
aws-waf-logs-指定したバケット名/AWSLogs/account-id/WAFLogs/Region/web-acl-name
S3バケット名以外では、account-id、Region、web-acl-nameはお客様環境によって値が変わります。
Lambdaで使用するIAMポリシーとロールを作成する
以下の3つを作成します。
- お客様のS3バケットに対するRead権限
- WafCharmのS3バケットにWAFログを転送するためのPut権限
- Lambdaで使用するための上記を含めたIAMロール
- IAMを開く
- お客様のS3バケットに対するRead権限を作成する
- [Policies] を開き、 [Create policy] をクリックする
- 以下の項目を設定する
- Review policyの画面に進んだら、ポリシーの名前と説明(任意)を入力する
名前はどのような値でも問題ありません。
例:wafcharm-waflog-s3-read
- WafCharmのS3バケットにWAFログを転送するためのPut権限を作成する
- [Policies] を開き、 [Create policy] をクリックする
- 以下の項目を設定する
- Review policyの画面に進んだら、ポリシーの名前と説明(任意)を入力する
名前はどのような値でも問題ありません。
例:wafcharm-waflog-s3-put
- Lambda用のIAMロールを作成する
- [Roles] を開き、 [Create role] をクリックする
- [Use case] にて [Lambda] を選択する
- [Permissions policies] にて以下のポリシーを検索し、チェックして追加する
- AWSLambdaExecute
- 上記で作成したRead権限(例:wafcharm-waflog-s3-read)
- 上記で作成したPut権限(例:wafcharm-waflog-s3-put)
- 次の画面に進み、ロール名と説明(任意)を入力する
名前はどのような値でも問題ありません。
例:wafcharm-waflog
Lambdaの設定を行う
- S3バケットを作成したリージョンに移動する
- Lambdaを開く
- [Create function] をクリックする
- [Function name] を入力する
名前はどのような値でも問題ありません。
例:wafcharm-waflog
- 以下の項目を設定する
Runtime: Node.js 18.x ~ Node.js 20.x
Execution Role: Use an existing role
Existing role: 先ほど作成したIAMロール(例:wafcharm-waflog)
- [Create function] をクリックする
- [Code source] 以下のエディタに、index.mjsを貼り付ける
index.mjs
- [Deploy] ボタンをクリックする
- [Add trigger] ボタンをクリックする
- 以下の項目を設定する
Select a source: S3
Bucket: 上記手順で作成したS3バケット
Event types: All object create events
Prefix: AWSLogs/account-id/WAFLogs/Region/web-acl-name/
account-id、Region、web-acl-nameはお客様環境によって値が変わります。
- [Add] をクリックする
- [Configuration] をクリックする
- [General configuration] の右側にある [Edit] ボタンをクリックする
- 以下の項目を設定する
Description(任意)
Timeout: 1分
- [Save] をクリックする
CloudWatch Logs上のLambdaの実行ログの保存期間の設定
こちらの設定は任意です。
ログの保存期間を変更したい場合は、以下の手順でご実施ください。
- Lambda関数を実行する
WAFログがS3バケットに出力されたことをトリガーに実行されますので、対象環境にアクセスしてWAFログを出力してください。
- CloudWatchを開く
- [ロググループ] をクリックする
- 先ほど作成したLambdaのロググループのチェックボックスにチェックを入れる
- [アクション] メニューから、[保持設定を編集] をクリックする
- [次の期間経過後にイベントを失効] にて、期間を変更する
デフォルトは「失効しない」になっているため、必要に応じて期間を変更してください。
Amazon Data Firehoseを経由して出力する
ご利用までの流れ
アーキテクチャ概要は以下の通りです。
お客様のAWS環境にて、AWS WAFからAmazon Data Firehoseを経由してS3へログ転送を行います。
S3バケットにWAFログが出力されたことをトリガー(S3 putObject Event Trigger)に、Lambdaにてスクリプトが実行されます。
WafCharmへデータが渡り、月次レポートについては追加の設定をせずとも毎月月初に作成される月次レポートを閲覧できます。
WafCharmコンソールにてメールによる検知通知の設定を行うと、WAFログアラート(検知通知)機能をご利用いただけます。
Amazon Data Firehoseを設定する
- AWSマネージメントコンソールにログインする
- Amazon Data Firehoseを使用する予定のWeb ACLと同じリージョンに移動する
CloudFrontをご利用の場合は、バージニアを選択します。
- [Amazon Data Firehose] を開く
- [Create Firehose stream] をクリックする
- [Choose source and destination] にて、以下の項目を設定をする
- Source: Direct PUT
- Destination: Amazon S3
- Firehose stream name: [aws-waf-logs-] から始まる名前を入力する
AWSの仕様上、名前の先頭に [aws-waf-logs-] とつける必要があります。
- S3 bucket: 任意のS3バケットを指定(例:csc-waftest)
- S3 bucket prefix(任意): プレフィックスを指定(例:waflog/)
プレフィックスをつける場合、必ず末尾にスラッシュを記載します。
- S3 bucket and S3 error output prefix time zone: UTC
正常に動作しない可能性がございますので、必ずUTCのままにしてください。
- Buffer size: 推奨は 5 MB
Buffer interval: 推奨は 60 seconds
※Buffer intervals、またはBuffer size に達した時点で S3 にログが作成されます
- Compression for data records: GZIP
- Service access(IAMロール)の作成あるいは既存のものを選択する
- [Create Firehose stream] をクリックする
AWS WAFにてWAFログを出力する
- AWS WAFからWeb ACLsの一覧を開く
- 対象のWeb ACLを開く
- [Logging and metrics] をクリックする
- [Enable] をクリックする
- [Logging destination] にて [Amazon Data Firehose stream] を選択する
- 先ほど作成したData Firehoseを選択する
- [Save] をクリックする
- 対象のリソースにアクセスし、WAFログが当該S3バケットに出力されるか確認する
- S3バケットを開き、WAFログが出力されるパスを確認する
以下のようなフォーマットになります。この情報は後ほど使用します。
csc-waftest/waflog/
S3バケット名とプレフィックス(あるいはその有無)は、上記手順での設定内容によって値が変わります。
Lambdaで使用するIAMポリシーとロールを作成する
以下の3つを作成します。
- お客様のS3バケットに対するRead権限
- WafCharmのS3バケットにWAFログを転送するためのPut権限
- Lambdaで使用するための上記を含めたIAMロール
- IAMを開く
- お客様のS3バケットに対するRead権限を作成する
- [Policies] を開き、 [Create policy] をクリックする
- 以下の項目を設定する
- Review policyの画面に進んだら、ポリシーの名前と説明(任意)を入力する
名前はどのような値でも問題ありません。
例:wafcharm-waflog-s3-read
- WafCharmのS3バケットにWAFログを転送するためのPut権限を作成する
- [Policies] を開き、 [Create policy] をクリックする
- 以下の項目を設定する
- Review policyの画面に進んだら、ポリシーの名前と説明(任意)を入力する
名前はどのような値でも問題ありません。
例:wafcharm-waflog-s3-put
- Lambda用のIAMロールを作成する
- [Roles] を開き、 [Create role] をクリックする
- [Use case] にて [Lambda] を選択する
- [Permissions policies] にて以下のポリシーを検索し、チェックして追加する
- AWSLambdaExecute
- 上記で作成したRead権限(例:wafcharm-waflog-s3-read)
- 上記で作成したPut権限(例:wafcharm-waflog-s3-put)
- 次の画面に進み、ロール名と説明(任意)を入力する
名前はどのような値でも問題ありません。
例:wafcharm-waflog
Lambdaの設定を行う
- S3バケットを作成したリージョンに移動する
- Lambdaを開く
- [Create function] をクリックする
- [Function name] を入力する
名前はどのような値でも問題ありません。
例:wafcharm-waflog
- 以下の項目を設定する
Runtime: Node.js 18.x ~ Node.js 20.x
Execution Role: Use an existing role
Existing role: 先ほど作成したIAMロール(例:wafcharm-waflog)
- [Create function] をクリックする
- [Code source] 以下のエディタに、以下のindex.mjsを貼り付ける
index.mjs
- [Deploy] ボタンをクリックする
- [Add trigger] ボタンをクリックする
- 以下の項目を設定する
Select a source: S3
Bucket: 上記手順で作成したS3バケット
Event types: All object create events
Prefix: 上記手順で作成したS3バケットのプレフィックス(例: waflog/
)
- [Add] をクリックする
- [Configuration] をクリックする
- [General configuration] の右側にある [Edit] ボタンをクリックする
- 以下の項目を設定する
Description(任意)
Timeout: 1分
- [Save] をクリックする
CloudWatch Logs上のLambdaの実行ログの保存期間の設定
こちらの設定は任意です。
ログの保存期間を変更したい場合は、以下の手順でご実施ください。
- Lambda関数を実行する
WAFログがS3バケットに出力されたことをトリガーに実行されますので、対象環境にアクセスしてWAFログを出力してください。
- CloudWatchを開く
- [ロググループ] をクリックする
- 先ほど作成したLambdaのロググループのチェックボックスにチェックを入れる
- [アクション] メニューから、[保持設定を編集] をクリックする
- [次の期間経過後にイベントを失効] にて、期間を変更する
デフォルトは「失効しない」になっているため、必要に応じて期間を変更してください。