AWS WAF のログを収集する
このドキュメントでは、Google Security Operations フィードを設定して AWS ウェブ アプリケーション ファイアウォール(WAF)のログを収集する方法について説明します。パーサーは、未加工の JSON 形式のログを Google SecOps UDM に準拠した構造化形式に変換します。IP アドレス、URL、ユーザー エージェント、セキュリティ ルールの詳細などのフィールドを抽出し、対応する UDM フィールドにマッピングして、一貫した表現と分析を実現します。
始める前に
*次の前提条件を満たしていることを確認します。
- Google SecOps インスタンス
- AWS への特権アクセス
Amazon S3 バケットを構成する
- バケットの作成のユーザーガイドに沿って、Amazon S3 バケットを作成します。
- 後で使用するために、バケットの名前とリージョンを保存します。
- IAM ユーザーの作成のユーザーガイドに沿って、ユーザーを作成します。
- 作成した [ユーザー] を選択します。
- [セキュリティ認証情報] タブを選択します。
- [アクセスキー] セクションで [アクセスキーを作成] をクリックします。
- [ユースケース] として [サードパーティ サービス] を選択します。
- [次へ] をクリックします。
- 省略可: 説明タグを追加します。
- [アクセスキーを作成] をクリックします。
- [CSV ファイルをダウンロード] をクリックして、[アクセスキー] と [シークレット アクセスキー] を保存し、後で使用できるようにします。
- [完了] をクリックします。
- [権限] タブを選択します。
- [権限ポリシー] セクションで、[権限を追加] をクリックします。
- [権限を追加] を選択します。
- [ポリシーを直接アタッチする] を選択します。
- AmazonS3FullAccess ポリシーを検索して選択します。
- [次へ] をクリックします。
- [権限を追加] をクリックします。
WAF ウェブ ACL(アクセス制御リスト)を作成する
AWS WAF をまだ設定していない場合は、WAF ウェブ ACL(アクセス制御リスト)を作成する必要があります。既存のセットアップの場合は、次の手順に進んでください。
- AWS コンソールで [AWS WAF & Shield] を検索して選択します。
- [ウェブ ACL を作成] をクリックします。
- 次の設定を指定します。
- 名前: ACL に名前を付けます(例:
my-waf-web-acl
)。 - リージョン: WAF を適用するリージョンを選択します。
- CloudWatch メトリクス: 指標の収集を有効にして、アクティビティとトリガーされたルールを追跡します。
- 名前: ACL に名前を付けます(例:
- 作成したら、ロギングを有効にするウェブ ACL を選択します。
AWS WAF ロギングを構成する方法
- AWS WAF コンソールで、ウェブ ACL の [ロギング] タブに移動します。
- [ロギングを有効にする] をクリックします。
- ログの宛先として [Amazon S3] を選択します。
- ログの保存先として、以前に作成した S3 バケットを選択します。
- 省略可: ログを整理するためのログ接頭辞(
waf-logs/
など)を構成します。 - [保存] をクリックします。
S3 バケットの権限を確認する
AWS WAF がログを書き込むための適切な権限が S3 バケットに付与されていることを確認します。
- S3 コンソールに移動します。
- ログを保存するバケットを選択します。
[権限] タブで、次のバケット ポリシーを追加して、AWS WAF がログを書き込めるようにします。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "wafv2.amazonaws.com" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::your-log-bucket-name/*" } ] }
- [保存] をクリックします。
フィードを設定する
Google SecOps プラットフォームでフィードを設定するには、次の 2 つのエントリ ポイントがあります。
- [SIEM 設定] > [フィード]
- [Content Hub] > [Content Packs]
[SIEM 設定] > [フィード] でフィードを設定する
このプロダクト ファミリー内で異なるログタイプに複数のフィードを構成するには、複数のフィードを構成するをご覧ください。
1 つのフィードを設定する手順は次のとおりです。
- [SIEM 設定] > [フィード] に移動します。
- [Add New Feed] をクリックします。
- 次のページで、[単一フィードを設定] をクリックします。
- [フィード名] フィールドに、フィードの名前を入力します(例: AWS WAF ログ)。
- [ソースタイプ] として [Amazon S3] を選択します。
- [ログタイプ] として [AWS WAF] を選択します。
- [次へ] をクリックします。
次の入力パラメータの値を指定します。
- リージョン: Amazon S3 バケットが配置されているリージョン。
- S3 URI: バケット URI。
s3://your-log-bucket-name/waf-logs/
- 次のように置き換えます。
your-log-bucket-name
: バケットの実際の名前。
- 次のように置き換えます。
- URI is a: [ディレクトリ] または [サブディレクトリを含むディレクトリ] を選択します。
- Source deletion options: 取り込みの設定に応じて削除オプションを選択します。
アクセスキー ID: S3 バケットから読み取る権限を持つユーザーのアクセスキー。
シークレット アクセスキー: S3 バケットから読み取る権限を持つユーザーのシークレット キー。
アセットの名前空間: アセットの名前空間。
Ingestion labels: このフィードのイベントに適用されるラベル。
[次へ] をクリックします。
[Finalize] 画面で新しいフィードの設定を確認し、[送信] をクリックします。
コンテンツ ハブからフィードを設定する
次のフィールドに値を指定します。
- リージョン: Amazon S3 バケットが配置されているリージョン。
- S3 URI: バケット URI。
s3://your-log-bucket-name/
your-log-bucket-name
は、実際の S3 バケットの名前に置き換えます。
- URI is a: バケット構造に応じて、[ディレクトリ] または [サブディレクトリを含むディレクトリ] を選択します。
- Source deletion options: 取り込みの設定に応じて削除オプションを選択します。
アクセスキー ID: S3 バケットから読み取る権限を持つユーザーのアクセスキー。
シークレット アクセスキー: S3 バケットから読み取る権限を持つユーザーのシークレット キー。
詳細オプション
- フィード名: フィードを識別する事前入力された値。
- ソースタイプ: Google SecOps にログを収集するために使用される方法。
- Asset Namespace: フィードに関連付けられた名前空間。
- Ingestion Labels: このフィードのすべてのイベントに適用されるラベル。
UDM マッピング テーブル
ログフィールド | UDM マッピング | ロジック |
---|---|---|
アクション | security_result.action | アクションが ALLOW の場合は、security_result.action を ALLOW に、security_result.severity を INFORMATIONAL に設定します。アクションが BLOCK の場合、security_result.action を BLOCK に設定します。アクションが CAPTCHA で、captchaResponse.responseCode が 405 の場合、security_result.action を BLOCK に設定し、security_result.action_details を「CAPTCHA {captchaResponse.failureReason}」に設定します。 |
captchaResponse.failureReason | security_result.action_details | action および captchaResponse.responseCode と組み合わせて使用され、security_result.action_details を決定します。 |
captchaResponse.responseCode | security_result.action_details | action と captchaResponse.failureReason と組み合わせて使用して、security_result.action_details を決定します。 |
httpRequest.clientIp | principal.ip、principal.asset.ip | principal.ip と principal.asset.ip に直接マッピングされます。 |
httpRequest.headers | target.hostname、target.asset.hostname、network.http.user_agent、network.http.parsed_user_agent、network.http.referral_url、target.location.country_or_region、target.resource.attribute.labels、target.user.userid | httpRequest.headers の各ヘッダーを反復処理します。ヘッダー名が「host」または「Host」の場合、値は target.hostname と target.asset.hostname にマッピングされます。ヘッダー名が「User-Agent」または「user-agent」の場合、値は network.http.user_agent にマッピングされ、network.http.parsed_user_agent に解析されます。ヘッダー名が「Referer」または「referer」の場合、値は network.http.referral_url にマッピングされます。ヘッダー名が「(?i)time-zone」の場合、値は target.location.country_or_region にマッピングされます。ヘッダー名が「authorization」の場合、値がデコードされ、ユーザー名が抽出されて target.user.userid にマッピングされます。他のすべてのヘッダーは、Key-Value ペアとして target.resource.attribute.labels に追加されます。 |
httpRequest.httpMethod | network.http.method | network.http.method に直接マッピングされます。 |
httpRequest.requestId | network.session_id | network.session_id に直接マッピングされます。 |
httpRequest.uri | target.url | target.url に直接マッピングされます。 |
httpSourceId | target.resource.name | target.resource.name に直接マッピングされます。 |
httpSourceName | metadata.product_event_type | metadata.product_event_type に直接マッピングされます。 |
ラベル | security_result.rule_labels | labels 内の各ラベルを反復処理します。ラベル名が空でない場合は、Key-Value ペアとして security_result.rule_labels に追加されます。 |
nonTerminatingMatchingRules | security_result.action_details、security_result.rule_labels | nonTerminatingMatchingRules の各ルールを反復処理します。アクションが ALLOW で、ルール アクションが CAPTCHA の場合、security_result.action_details を「CAPTCHA SUCCESSFUL」に設定し、キー「nonTerminatingCaptchaRuleName」を使用してルール ID を security_result.rule_labels に追加します。アクションが BLOCK または ALLOW で、ルール アクションが COUNT の場合、security_result.action_details を「COUNT RULE」に設定し、キー「nonTerminatingCountRuleName」を使用してルール ID を security_result.rule_labels に追加します。アクションが BLOCK または ALLOW で、ルール アクションが CHALLENGE の場合、security_result.action_details を「COUNT RULE」に設定し、キー「nonTerminatingChallengeRuleName」を使用してルール ID を security_result.rule_labels に追加します。 |
rateBasedRuleList | security_result.rule_id、security_result.rule_name、security_result.description | terminatingRuleType が「RATE_BASED」の場合、rateBasedRuleList の各ルールを反復処理します。terminatingRuleId がルール名と一致する場合、ルール ID、ルール名、説明はそれぞれ security_result.rule_id、security_result.rule_name、security_result.description にマッピングされます。 |
responseCodeSent | network.http.response_code | network.http.response_code に直接マッピングされ、整数に変換されます。 |
ruleGroupList | intermediary.labels、security_result.rule_id、security_result.rule_name、security_result.description、security_result.detection_fields | ruleGroupList の各ルールグループを反復処理します。ルールグループ ID は、Key-Value ペアとして intermediary.labels に追加されます。terminatingRuleType が「MANAGED_RULE_GROUP」で、terminatingRuleId がルールグループ ID と一致する場合、ルール ID、ルール名、説明はそれぞれ security_result.rule_id、security_result.rule_name、security_result.description にマッピングされます。terminatingRuleType が「GROUP」の場合、終了ルールの ID が抽出され、security_result.rule_name と security_result.description にマッピングされます。終了ルールグループ ID は、キー「terminatingRuleGroupName」とともに security_result.rule_labels に追加されます。terminatingRuleType が「REGULAR」の場合、終了ルールの action が抽出され、キー「terminatingRuleAction{index}」を使用して security_result.detection_fields に追加されます。 |
terminatingRuleId | security_result.rule_id、security_result.rule_name、security_result.description | terminatingRuleType が「RATE_BASED」、「MANAGED_RULE_GROUP」、「REGULAR」の場合、terminatingRuleId は security_result.rule_id と security_result.rule_name にマッピングされ、security_result.description の構築に使用されます。 |
terminatingRuleMatchDetails | security_result.description、security_result.category_details、security_result.detection_fields | terminatingRuleMatchDetails の各一致を反復処理します。security_result.description を「Terminating Rule」に設定します。条件タイプが空でない場合は、security_result.category_details に追加されます。ロケーションが空でない場合は、キー「location」を使用して security_result.detection_fields に追加されます。一致したデータ要素ごとに、キー「matchedData」を使用して security_result.detection_fields に追加されます。 |
terminatingRuleType | security_result.rule_type | security_result.rule_type に直接マッピングされます。 |
timestamp | metadata.event_timestamp | タイムスタンプに変換され、metadata.event_timestamp にマッピングされます。 |
webaclId | intermediary.resource.name | intermediary.resource.name に直接マッピングされます。 |
metadata.vendor_name | 「AMAZON」に設定します。 | |
metadata.product_name | 「AWS Web Application Firewall」に設定します。 | |
metadata.log_type | 「AWS_WAF」に設定します。 | |
network.application_protocol | 「HTTP」に設定します。 | |
metadata.event_type | httpRequest.headers に「host」または「Host」ヘッダーが含まれている場合は、「NETWORK_HTTP」に設定されます。それ以外の場合は、「STATUS_UPDATE」に設定します。 |
さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。