Akamai WAF のログを収集する
このドキュメントでは、 Google Cloud Storage または AWS S3 を使用して Akamai WAF ログをエクスポートし、Google Security Operations に取り込む方法について説明します。パーサーはログを処理し、syslog 形式と CEF 形式の両方をサポートします。IP アドレス、URL、HTTP メソッド、レスポンス コード、ユーザー エージェント、セキュリティ ルール情報などのフィールドを抽出し、一貫した表現のために統合データモデル(UDM)にマッピングします。また、パーサーは attackData
や clientReputation
などの特定の Akamai フィールドも処理し、必要なデータ変換を実行して UDM 出力を拡充します。
始める前に
次の前提条件を満たしていることを確認してください。
- Google SecOps インスタンス
- Google Cloud または AWS への特権アクセス
- Akamai への特権アクセス
Cloud Storage から Akamai WAF ログをエクスポートして取り込む
このセクションでは、プロセスの最初の手順として、Akamai WAF ログに必要なストレージを設定する方法について説明します。
Google Cloud Storage バケットの作成
- Google Cloud コンソールにログインします。
[Cloud Storage バケット] のページに移動します。
[作成] をクリックします。
[バケットの作成] ページで、バケット情報を入力します。以下のステップでは、操作を完了した後に [続行] をクリックして、次のステップに進みます。
[始める] セクションで、次の操作を行います。
- バケット名の要件を満たす一意の名前を入力します(例:
akamai-waf-logs
)。 - 階層名前空間を有効にするには、展開矢印をクリックして [Optimize for file oriented and data-intensive workloads] セクションを開き、[このバケットで階層的な名前空間を有効にする] を選択します。
- バケットラベルを追加するには、展開矢印をクリックして [ラベル] セクションを開きます。
- [ラベルを追加] をクリックし、ラベルのキーと値を指定します。
- バケット名の要件を満たす一意の名前を入力します(例:
[データの保存場所の選択] セクションで、次の操作を行います。
- ロケーション タイプを選択してください。
- ロケーション タイプのプルダウン メニューを使用して、バケット内のオブジェクト データが永続的に保存されるロケーションを選択します。
- クロスバケット レプリケーションを設定するには、[クロスバケット レプリケーションを設定する] セクションを開きます。
[データのストレージ クラスを選択する] セクションで、バケットのデフォルトのストレージ クラスを選択します。あるいは、Autoclass を選択して、バケットデータのストレージ クラスを自動的に管理します。
[オブジェクトへのアクセスを制御する方法を選択する] セクションで、[なし] を選択して公開アクセスの防止を適用し、バケットのオブジェクトの [アクセス制御モデル] を選択します。
[オブジェクト データを保護する方法を選択する] セクションで、次の操作を行います。
- [データ保護] で、バケットに設定するオプションを選択します。
- オブジェクト データの暗号化方法を選択するには、[データ暗号化] というラベルの付いた展開矢印をクリックし、データの暗号化方法を選択します。
[作成] をクリックします。
Cloud Storage の権限を構成する
[サービス アカウントの作成] ページに移動します。
Google Cloud プロジェクトを選択します。
Google Cloud コンソールに表示するサービス アカウント名を入力します。
[作成して続行] をクリックします。
バケットに対する roles/storage.admin を付与します。
[完了] をクリックして、サービス アカウントの作成を完了します。
Google Cloud サービス アカウント キー ファイルを作成してダウンロードする
[サービス アカウント] ページに移動します。
Google Cloud プロジェクトを選択します。
新しく作成したサービス アカウントのメールアドレスをクリックします。
[キー] タブをクリックします。
[鍵を追加] メニューをクリックして、[新しい鍵を作成] を選択します。
鍵のタイプとして [JSON] を選択し、[作成] をクリックします。
- [作成] をクリックすると、サービス アカウント キーファイルがダウンロードされます。鍵ファイルをダウンロードした後、再度ダウンロードすることはできません。
- ダウンロードされる鍵の形式は次のとおりです。ここで
PRIVATE_KEY
は公開鍵 / 秘密鍵ペアの非公開部分です。
Cloud Storage にログを送信するように Akamai WAF を構成する
- Akamai コントロール センターにログインします。
- [セキュリティ] セクションに移動します。
- [ログ] を選択します。
- 新しいログ配信を構成します。
- ログソース: WAF 構成を選択します。
- 宛先: [Google Cloud Storage] を選択します。
- 表示名: 一意の名前の説明を入力します。
- バケット: 作成した Cloud Storage バケットの名前を指定します(例:
gs://akamai-waf-logs
)。 - プロジェクト ID: Google Cloud プロジェクトの一意の ID を入力します。
- サービス アカウント名: 先ほど作成したサービス アカウントの名前を入力します。
- 秘密鍵: 先ほど生成してダウンロードした JSON キーの private_key 値を入力します。(秘密鍵は PEM 形式で、改行(\n)記号を使用して入力する必要があります。例:
-----BEGIN PRIVATE KEY-----\nprivate_key\n-----END PRIVATE KEY-----\n
) - ログ形式: 必要なログ形式(JSON など)を選択します。
- Push Frequency: ログ配信の頻度を選択します(例:
every 60 seconds
)。
[検証して保存] をクリックして、宛先への接続を検証し、指定した詳細を保存します。
[次へ] をクリックして、[概要] タブに移動します。
フィードを設定する
Google SecOps プラットフォームでフィードを設定するには、次の 2 つのエントリ ポイントがあります。
- [SIEM 設定] > [フィード]
- [Content Hub] > [Content Packs]
[SIEM 設定] > [フィード] で Google Cloud ストレージを使用してフィードを設定する
フィードを構成する手順は次のとおりです。
- [SIEM 設定] > [フィード] に移動します。
- [Add New Feed] をクリックします。
- 次のページで [単一のフィードを設定] をクリックします。
- [フィード名] フィールドに、フィードの名前を入力します(例: Akamai WAF ログ)。
- [Source type] として [Google Cloud Storage] を選択します。
- [ログタイプ] として [Akamai WAF] を選択します。
- Chronicle サービス アカウントとして [サービス アカウントを取得する] をクリックします。
- [次へ] をクリックします。
次の入力パラメータの値を指定します。
- Storage Bucket URI: Google Cloud ストレージ バケットの URL(例:
gs://akamai-waf-logs
)。 - URI Is A: [サブディレクトリを含むディレクトリ] を選択します。
- Source deletion options: 必要に応じて削除オプションを選択します。
- Storage Bucket URI: Google Cloud ストレージ バケットの URL(例:
[次へ] をクリックします。
[Finalize] 画面で新しいフィードの設定を確認し、[送信] をクリックします。
コンテンツ ハブからフィードを設定する
次のフィールドに値を指定します。
- Storage Bucket URI: Google Cloud ストレージ バケットの URL(例:
gs://akamai-waf-logs
)。 - URI Is A: [サブディレクトリを含むディレクトリ] を選択します。
Source deletion options: 必要に応じて削除オプションを選択します。
詳細オプション
- フィード名: フィードを識別する事前入力された値。
- ソースタイプ: Google SecOps にログを収集するために使用される方法。
- アセットの名前空間: フィードに関連付けられた名前空間。
- Ingestion Labels: このフィードのすべてのイベントに適用されるラベル。
AWS S3 から Akamai WAF ログをエクスポートして取り込む
このセクションでは、Akamai WAF ログを受信して保存するように Amazon S3 バケットを設定する最初の手順について説明します。
Amazon S3 バケットを構成する
- バケットの作成のユーザーガイドに沿って、Amazon S3 バケットを作成します。
- 後で参照できるように、バケットの名前とリージョンを保存します。
- IAM ユーザーの作成のユーザーガイドに沿って、ユーザーを作成します。
- 作成した [ユーザー] を選択します。
- [セキュリティ認証情報] タブを選択します。
- [アクセスキー] セクションで [アクセスキーを作成] をクリックします。
- [ユースケース] として [サードパーティ サービス] を選択します。
- [次へ] をクリックします。
- 省略可: 説明タグを追加します。
- [アクセスキーを作成] をクリックします。
- [CSV ファイルをダウンロード] をクリックして、[アクセスキー] と [シークレット アクセスキー] を保存し、今後の参照に備えます。
- [完了] をクリックします。
- [権限] タブを選択します。
- [権限ポリシー] セクションの [権限を追加] をクリックします。
- [権限を追加] を選択します。
- [ポリシーを直接アタッチする] を選択します。
- AmazonS3FullAccess ポリシーを検索します。
- ポリシーを選択します。
- [次へ] をクリックします。
- [権限を追加] をクリックします。
ログを Amazon S3 に送信するように Akamai WAF を構成する
- Akamai コントロール センターにログインします。
- [セキュリティ] セクションに移動します。
- [ログ] を選択します。
新しいログ配信を構成します。
- ログソース: WAF 構成を選択します。
- 宛先: [Amazon S3] を選択します。
- S3 バケット: 作成した S3 バケットの名前を指定します。
- リージョン: S3 バケットが配置されている AWS リージョンを選択します。
- アクセスキー ID とシークレット アクセスキー: 生成した認証情報を指定します。
- ログ形式: 必要なログ形式(JSON など)を選択します。
配信頻度: ログ配信の頻度を選択します(例: 5 分ごと)。
ログ配信を確認します。
- LDS を構成したら、S3 バケットで受信ログファイルをモニタリングします。
[SIEM 設定] > [フィード] で AWS S3 を使用してフィードを設定する
フィードを構成する手順は次のとおりです。
- [SIEM 設定] > [フィード] に移動します。
- [Add New Feed] をクリックします。
- 次のページで [単一のフィードを設定] をクリックします。
- [フィード名] フィールドに、フィードの名前を入力します(例: Akamai WAF ログ)。
- [ソースタイプ] として [Amazon S3] を選択します。
- [ログタイプ] として [Akamai WAF] を選択します。
- [次へ] をクリックします。
次の入力パラメータの値を指定します。
- リージョン: Amazon S3 バケットが配置されているリージョン。
- S3 URI: バケット URI。
s3:/BUCKET_NAME
次のように置き換えます。BUCKET_NAME
: バケットの名前。
- URI is a: ログストリームの構成([単一ファイル] | [ディレクトリ] | [サブディレクトリを含むディレクトリ])に応じて URI タイプを選択します。
- Source deletion options: 必要に応じて削除オプションを選択します。
- アクセスキー ID: s3 バケットにアクセスできるユーザー アクセスキー。
- シークレット アクセスキー: s3 バケットにアクセスできるユーザーのシークレット キー。
[次へ] をクリックします。
[Finalize] 画面で新しいフィードの設定を確認し、[送信] をクリックします。
UDM マッピング テーブル
ログフィールド(昇順) | UDM マッピング | 論理 |
---|---|---|
attackData.clientIP |
principal.ip 、principal.asset.ip |
リクエストを開始したクライアントの IP アドレス。akamai_siem ログの attackData.clientIP フィールドから抽出されます。 |
attackData.configId |
metadata.product_log_id |
セキュリティ構成 ID。akamai_siem ログの attackData.configId フィールドから抽出されます。security_result オブジェクトの detection_field としても追加されました。 |
attackData.policyId |
なし | パーサー ロジックで使用され、security_result.summary に値 PolicyId:[value] を入力します。 |
attackData.ruleActions |
security_result.action 、security_result.action_details |
トリガーされたルールに基づいて実行されたアクション。akamai_siem ログの attackData.ruleActions フィールドから抽出されます。「deny」は BLOCK にマッピングされ、その他の値(「alert」、「monitor」、「allow」、「tarpit」)は ALLOW にマッピングされます。元の値は action_details にも保存されます。 |
attackData.ruleData |
security_result.detection_fields |
トリガーされたルールに関連付けられたデータ。akamai_siem ログの attackData.ruleData フィールドから抽出されます。キー「RuleData」で security_result.detection_fields に追加されます。 |
attackData.ruleMessages |
security_result.threat_name |
トリガーされたルールに関連付けられているメッセージ。akamai_siem ログの attackData.ruleMessages フィールドから抽出されます。 |
attackData.ruleSelectors |
security_result.detection_fields |
トリガーされたルールに関連付けられたセレクタ。akamai_siem ログの attackData.ruleSelectors フィールドから抽出されます。キー「RuleSelector」で security_result.detection_fields に追加されます。 |
attackData.ruleTags |
security_result.category_details |
トリガーされたルールに関連付けられたタグ。akamai_siem ログの attackData.ruleTags フィールドから抽出されます。 |
attackData.ruleVersions |
security_result.detection_fields |
トリガーされたルールのバージョン。akamai_siem ログの attackData.ruleVersions フィールドから抽出されます。キー「Rule Version」で security_result.detection_fields に追加されます。 |
clientReputation |
principal.labels |
クライアントの評判に関する情報。akamai_siem ログの clientReputation フィールドから抽出されます。キー「reputation」のラベルとしてプリンシパルに追加されます。 |
cliIP 、cli_ip 、principal_ip |
principal.ip 、principal.asset.ip |
クライアント IP アドレス。ログ形式に応じて、cliIP 、cli_ip 、principal_ip のいずれかから抽出されます。 |
cp |
additional.fields |
CP コード。cp フィールドから抽出されます。キー「cp」で additional.fields に追加されます。 |
eventId |
metadata.product_log_id |
イベント ID。eventId フィールドから抽出されます。 |
eventTime 、log_date |
metadata.event_timestamp |
イベントのタイムスタンプ。ログ形式に応じて、eventTime から抽出されるか、log_date から解析されます。 |
eventType.eventDefinition.eventDefinitionId |
target.resource.product_object_id |
イベント定義 ID。eventType.eventDefinition.eventDefinitionId から抽出されます。 |
eventType.eventDefinition.eventDescription |
metadata.description |
イベントの説明。eventType.eventDefinition.eventDescription から抽出されます。 |
eventType.eventDefinition.eventName |
metadata.product_event_type |
イベント名。eventType.eventDefinition.eventName から抽出されます。 |
eventType.eventTypeId |
additional.fields |
イベントタイプ ID。eventType.eventTypeId から抽出されます。キー「eventTypeId」で additional.fields に追加されます。 |
eventType.eventTypeName |
additional.fields |
イベントタイプの名前。eventType.eventTypeName から抽出されます。キー「eventTypeName」で additional.fields に追加されます。 |
format |
なし | パーサーがログ形式を特定するために使用します。 |
geo.asn |
principal.location.name |
自律システム番号(ASN)。ログ形式に応じて geo.asn または AkamaiSiemASN から抽出されます。値の先頭には「ASN 」が付きます。 |
geo.city |
principal.location.city |
市区町村。ログ形式に応じて geo.city または AkamaiSiemCity から抽出されます。 |
geo.country |
principal.location.country_or_region |
国。ログ形式に応じて geo.country または AkamaiSiemContinent から抽出されます。 |
httpMessage.bytes |
network.sent_bytes |
HTTP メッセージで送信されたバイト数。httpMessage.bytes から抽出されます。 |
httpMessage.host |
target.hostname 、target.asset.hostname |
ホスト名。ログ形式に応じて httpMessage.host または reqHost から抽出されます。 |
httpMessage.method |
network.http.method |
HTTP メソッド。ログ形式に応じて、httpMessage.method 、network_http_method 、reqMethod のいずれかから抽出されます。大文字に変換されました。 |
httpMessage.path |
target.url |
リクエストパス。ログ形式に応じて、httpMessage.path 、target_url 、reqPath のいずれかから抽出されます。httpMessage.query が存在する場合は、区切り文字「?」を使用してパスに追加されます。 |
httpMessage.port |
target.port |
ポート。ログ形式に応じて httpMessage.port または reqPort から抽出されます。 |
httpMessage.protocol |
なし | パーサーがプロトコルを特定するために使用します。 |
httpMessage.query |
なし | パーサー ロジックで使用され、存在する場合は httpMessage.path に追加されます。 |
httpMessage.requestId |
network.session_id |
リクエスト ID。ログ形式に応じて httpMessage.requestId または reqId から抽出されます。 |
httpMessage.requestHeaders 、AkamaiSiemRequestHeaders |
additional.fields |
リクエスト ヘッダー。ログ形式に応じて httpMessage.requestHeaders または AkamaiSiemRequestHeaders から抽出されます。キー「AkamaiSiemRequestHeaders」で additional.fields に追加されます。 |
httpMessage.responseHeaders 、AkamaiSiemResponseHeaders |
additional.fields |
レスポンス ヘッダー。ログ形式に応じて httpMessage.responseHeaders または AkamaiSiemResponseHeaders から抽出されます。キー「AkamaiSiemResponseHeaders」で additional.fields に追加されます。 |
httpMessage.status 、AkamaiSiemResponseStatus 、network_http_response_code 、statusCode |
network.http.response_code |
HTTP レスポンス コードログ形式に応じて、httpMessage.status 、AkamaiSiemResponseStatus 、network_http_response_code 、statusCode のいずれかから抽出されます。 |
httpMessage.tls 、AkamaiSiemTLSVersion 、tlsVersion |
network.tls.version |
TLS バージョン。ログ形式に応じて、httpMessage.tls 、AkamaiSiemTLSVersion 、tlsVersion のいずれかから抽出されます。 |
httpMessage.useragent 、network_http_user_agent 、UA 、useragent |
network.http.user_agent |
ユーザー エージェント。ログ形式に応じて、httpMessage.useragent 、network_http_user_agent 、UA 、useragent のいずれかから抽出されます。 |
log_description |
metadata.description |
ログの説明。log_description から抽出されます。 |
log_rule |
security_result.rule_name |
ログルール。log_rule から抽出されます。 |
message |
なし | 未加工のログ メッセージ。さまざまな抽出のためにパーサーで使用されます。 |
network_http_referral_url |
network.http.referral_url |
HTTP 参照 URL。network_http_referral_url から抽出されます。 |
proto |
なし | attackData.policyId が存在しない場合に security_result.summary を入力するために、パーサー ロジックで使用されます。 |
reqHost |
target.hostname 、target.asset.hostname |
ホストをリクエストします。reqHost から抽出されます。 |
reqId |
metadata.product_log_id 、network.session_id |
リクエスト ID。reqId から抽出されます。 |
reqMethod |
network.http.method |
リクエスト メソッド。reqMethod から抽出されます。 |
reqPath |
target.url |
リクエストパス。reqPath から抽出されます。 |
reqPort |
target.port |
リクエスト ポート。reqPort から抽出されます。 |
rspContentType |
target.file.mime_type |
レスポンスのコンテンツ タイプ。rspContentType から抽出されます。 |
securityRules |
security_result.rule_name 、security_result.about.resource.attribute.labels |
セキュリティ ルール。securityRules から抽出されます。最初の部分は rule_name にマッピングされ、残りの部分はキー「non_deny_rules」と「deny_rule_format」を持つラベルとして追加されます。 |
statusCode |
network.http.response_code |
ステータス コード。statusCode から抽出されます。 |
state |
principal.location.state 、target.user.personal_address.state |
State。state から抽出されます。 |
tlsVersion |
network.tls.version |
TLS バージョン。tlsVersion から抽出されます。 |
type |
metadata.product_event_type |
イベントタイプ。type から抽出されます。 |
UA |
network.http.user_agent |
ユーザー エージェント。UA から抽出されます。 |
version |
metadata.product_version 、principal.asset.software.version |
バージョン。version から抽出されます。 |
なし | metadata.event_timestamp |
イベントのタイムスタンプは、akamai_lds ログの _ts フィールド、akamai_siem ログの httpMessage.start フィールド、または他の形式の log_date フィールドから取得されます。 |
なし | metadata.vendor_name |
「Akamai」にハードコードされています。 |
なし | metadata.product_name |
「Kona」にハードコードされています。 |
なし | metadata.log_type |
「AKAMAI_WAF」にハードコードされています。 |
なし | network.application_protocol |
akamai_siem ログと akamai_lds ログの場合は「HTTP」、その他の形式の場合は「DNS」に設定します。 |
なし | security_result.severity |
「alert」アクションの場合は MEDIUM、「deny」アクションの場合は CRITICAL、その他のアクションの場合は HIGH に設定します。 |
なし | event.idm.read_only_udm.metadata.event_type |
ほとんどのログ形式では「NETWORK_HTTP」に設定します。eventId フィールドまたは eventData フィールドを含むイベントでは「GENERIC_EVENT」に設定します。cli_ip フィールドまたは p_ip フィールドを含むが reqHost フィールドを含まないイベントでは「STATUS_UPDATE」に設定します。 |
さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。