F5 Shape のログを収集する
このドキュメントでは、Google Cloud Storage V2 を使用して F5 Shape ログを Google Security Operations に取り込む方法について説明します。
F5 Distributed Cloud Bot Defense(旧 Shape Security)は、悪意のある bot を特定して軽減することで、自動化された攻撃からアプリケーションを保護します。Bot Defense は、JavaScript とネイティブ モバイル SDK を使用して、クライアント ブラウザとモバイル デバイスからテレメトリーを収集し、リクエストがアプリケーションに到達する前にこのテレメトリーを検査します。このサービスは、セキュリティ イベント、アクセスログ、監査ログなど、分析されたトラフィックに関する詳細情報を表示する統合ダッシュボードとレポートを提供します。
始める前に
次の前提条件を満たしていることを確認します。
- Google SecOps インスタンス
- Cloud Storage API が有効になっている GCP プロジェクト
- GCS バケットを作成および管理する権限
- GCS バケットの IAM ポリシーを管理する権限
- F5 Distributed Cloud Console への特権アクセス
- Multi-Cloud Network Connect または Shared Configuration サービスへのアクセス権を持つ F5 Distributed Cloud アカウント
Google Cloud Storage バケットを作成する
- Google Cloud Console に移動します。
- プロジェクトを選択するか、新しいプロジェクトを作成します。
- ナビゲーション メニューで、[Cloud Storage > バケット] に移動します。
- [バケットを作成] をクリックします。
次の構成情報を提供してください。
設定 値 バケットに名前を付ける グローバルに一意の名前( f5-xc-logsなど)を入力します。ロケーション タイプ ニーズに応じて選択します(リージョン、デュアルリージョン、マルチリージョン)。 ロケーション ロケーションを選択します(例: us-central1)。ストレージ クラス Standard(アクセス頻度の高いログにおすすめ)。 アクセス制御 均一(推奨)。 保護ツール 省略可: オブジェクトのバージョニングまたは保持ポリシーを有効にします。 [作成] をクリックします。
F5 Shape API 認証情報を生成する
F5 Distributed Cloud は、認証に API 証明書(mTLS)または API トークンを使用します。セキュリティを強化するために、API 証明書をおすすめします。
API 証明書を作成する
- F5 Distributed Cloud Console にログインします。
- コンソールのホームページで、[管理] を選択します。
- 左側のナビゲーション メニューで、[Personal Management] > [Credentials] に移動します。
- [Add Credentials](認証情報を追加)をクリックします。
- [メタデータ] セクションで、証明書の名前(
secops-integrationなど)を入力します。 - [認証情報の種類] リストから [API 証明書] を選択します。
- [Password] にパスワードを入力し、[Confirm Password] フィールドで確認します。
カレンダー リストから [有効期限] を選択します。
[ダウンロード] をクリックして、
.p12ファイル形式で証明書を生成してダウンロードします。ダウンロードした証明書ファイルとパスワードは、後で使用するために安全に保存してください。
F5 Distributed Cloud で GCP Cloud 認証情報を作成する
F5 Distributed Cloud では、GCS バケットにログを書き込むために Google Cloud サービス アカウントの認証情報が必要です。
Google Cloud サービス アカウントを作成する
- GCP Console で、[IAM と管理>サービス アカウント] に移動します。
- [サービス アカウントを作成] をクリックします。
- 次の構成の詳細を指定します。
- サービス アカウント名:
f5-xc-log-writer(または任意の名前)を入力します。 - サービス アカウントの説明: 「
Service account for F5 Distributed Cloud to write logs to GCS」と入力します。
- サービス アカウント名:
- [作成して続行] をクリックします。
- [このサービス アカウントにプロジェクトへのアクセスを許可する] セクションで、次の操作を行います。
- [ロールを選択] をクリックします。
- [ストレージ オブジェクト管理者] を検索して選択します。
- [続行] をクリックします。
- [完了] をクリックします。
GCS バケットに対する IAM 権限を付与する
- [Cloud Storage] > [バケット] に移動します。
- バケット名(
f5-xc-logsなど)をクリックします。 - [権限] タブに移動します。
- [アクセス権を付与] をクリックします。
- 次の構成の詳細を指定します。
- プリンシパルを追加: サービス アカウントのメールアドレス(例:
f5-xc-log-writer@PROJECT_ID.iam.gserviceaccount.com)を入力します。 - ロールを割り当てる: [Storage オブジェクト管理者] を選択します。
- プリンシパルを追加: サービス アカウントのメールアドレス(例:
- [保存] をクリックします。
サービス アカウントキーの作成
- GCP Console で、[IAM と管理>サービス アカウント] に移動します。
- サービス アカウント(例:
f5-xc-log-writer)を見つけてクリックします。 - [キー] タブに移動します。
- [鍵を追加] > [新しい鍵を作成] の順にクリックします。
- キーのタイプとして [JSON] を選択します。
- [作成] をクリックします。
- JSON 鍵ファイルが自動的にダウンロードされます。このファイルは安全な場所に保存してください。
F5 Distributed Cloud に Google Cloud Cloud 認証情報を追加する
- F5 Distributed Cloud Console のホームページで、[Multi-Cloud Network Connect] または [Shared Configuration] を選択します。
- 左側のナビゲーション メニューで、[管理> サイト管理> クラウド認証情報] に移動します。
- [Add Cloud Credentials] をクリックします。
- [メタデータ] セクションで、名前(例:
gcp-secops-logs)を入力します。 - [Cloud Credentials Type] リストから、[GCP Credentials] を選択します。
- [GCP 認証情報] セクションで、[構成] をクリックします。
- [サービス アカウント キー] セクションで次の操作を行います。
- [シークレット タイプ] リストから、[ブラインドフォールド シークレット] を選択します。
- [アクション] リストから、[新しいシークレットをブラインドフォールド] を選択します。
- [ポリシーの種類] リストから [組み込み] を選択します。
- [Secret to Blindfold] フィールドに、ダウンロードした JSON キーファイルの内容全体を貼り付けます。
- [適用] をクリックします。
- [保存して終了] をクリックします。
GCS 用のグローバル ログ受信者を構成する
F5 Distributed Cloud Global Log Receiver は、5 分ごとに NDJSON 形式(改行区切りの JSON)でログを GCS にストリーミングします。
グローバル ログ レシーバーを作成する
- F5 Distributed Cloud Console のホームページで、[Multi-Cloud Network Connect] または [Shared Configuration] を選択します。
- Multi-Cloud Network Connect の場合: [管理> ログ管理 > グローバル ログ レシーバ] に移動します。
- 共有構成の場合: [管理> グローバル ログ レシーバ] に移動します。
- [グローバルログ レシーバを追加] をクリックします。
- [メタデータ] セクションで、名前(例:
secops-gcs-receiver)を入力します。 - 必要に応じて、ラベルと説明を追加します。
[ログタイプ] リストで、収集するログタイプを選択します。
- リクエストログ: ロードバランサからの HTTP アクセスログ
- セキュリティ イベント: Bot Defense と WAF のセキュリティ イベント
- 監査ログ: 構成と管理の監査ログ
- DNS リクエストログ: DNS クエリログ
[Log Message Selection] リストで、次の操作を行います。
- Multi-Cloud Network Connect サービスを使用している場合は、[現在の名前空間からログを選択](システム名前空間)を選択します。
- 共有構成サービスを使用している場合は、次のいずれかを選択します。
- 現在の Namespace からログを選択: 共有 Namespace からのみログを送信します。
- すべての名前空間からログを選択する: すべての名前空間からログを送信します。
- 特定の名前空間のログを選択する: 特定の名前空間名を入力し、[項目を追加] をクリックして追加します。
[Receiver Configuration] リストから [GCP Bucket] を選択します。
[GCP バケット] セクションで、次の構成を指定します。
- GCP バケット名: GCS バケット名(
f5-xc-logsなど)を入力します。 - GCP Cloud Credentials: リストから、作成したクラウド認証情報(
gcp-secops-logsなど)を選択します。
- GCP バケット名: GCS バケット名(
詳細設定を構成する(省略可)
- [Show Advanced Fields] 切り替えボタンをクリックします。
[Batch Options] セクションで、次のオプションを構成します(省略可)。
- バッチ タイムアウト オプション: [タイムアウト(秒)] を選択して値を入力します(デフォルト:
300秒)。 - バッチの最大イベント数: [最大イベント数] を選択し、32 ~ 2,000 の値を入力します(省略可)。
- バッチ バイト数: [最大バイト数] を選択し、4,096 ~ 1,048,576 の値を入力します(デフォルト:
10485760バイト / 10 MB)。
- バッチ タイムアウト オプション: [タイムアウト(秒)] を選択して値を入力します(デフォルト:
構成を完了してテストする
- [保存して終了] をクリックして、グローバル ログ レシーバを作成します。
- [グローバル ログレシーバー] リストで、レシーバー(
secops-gcs-receiverなど)を見つけます。 - [アクション] 列で、3 つの点 ... をクリックし、[接続をテスト] を選択します。
テストが完了するまで待ちます。成功メッセージは、接続が機能していることを示します。
ログが GCS に書き込まれていることを確認します。
- GCP Console で、[Cloud Storage] > [バケット] に移動します。
- バケット名(
f5-xc-logsなど)をクリックします。 - 5 ~ 10 分以内に、次の構造でフォルダが作成されます。
- 日単位のフォルダ:
YYYY-MM-DD/ - 時間単位のサブフォルダ:
YYYY-MM-DD/HH/ - ログファイル:
YYYY-MM-DD/HH/logs_YYYYMMDDHHMMSS.ndjson.gz
- 日単位のフォルダ:
ファイアウォールの許可リストを構成する
F5 Distributed Cloud では、ログ配信のためにファイアウォールで特定の IP 範囲を許可する必要があります。
次の IP アドレス範囲をファイアウォールの許可リストに追加します。
193.16.236.64/29185.160.8.152/29
Google SecOps サービス アカウントを取得する
Google SecOps は、一意のサービス アカウントを使用して GCS バケットからデータを読み取ります。このサービス アカウントにバケットへのアクセス権を付与する必要があります。
サービス アカウントのメールアドレスを取得する
- [SIEM 設定] > [フィード] に移動します。
- [Add New Feed] をクリックします。
- [単一フィードを設定] をクリックします。
- [フィード名] フィールドに、フィードの名前を入力します(例:
F5 Distributed Cloud Bot Defense)。 - [ソースタイプ] として [Google Cloud Storage V2] を選択します。
- [ログタイプ] として [F5_SHAPE] を選択します。
[サービス アカウントを取得する] をクリックします。一意のサービス アカウント メールアドレスが表示されます(例:)。
secops-12345678@secops-gcp-prod.iam.gserviceaccount.com次のステップで使用するメールアドレスをコピーします。
[次へ] をクリックします。
次の入力パラメータの値を指定します。
ストレージ バケットの URL: 接頭辞パスを含む GCS バケット URI を入力します。
gs://f5-xc-logs/f5-xc-logsは、実際の GCS バケット名に置き換えます。- グローバル ログ レシーバで特定のプレフィックスを構成した場合は、パスにプレフィックスを含めます(例:
gs://f5-xc-logs/bot-defense/)。
Source deletion option: 必要に応じて削除オプションを選択します。
- なし: 転送後にファイルを削除しません(テストにおすすめ)。
- 転送されたファイルを削除する: 転送が完了した後にファイルを削除します。
転送されたファイルと空のディレクトリを削除する: 転送が完了した後にファイルと空のディレクトリを削除します。
ファイルの最大経過日数: 指定した日数以内に変更されたファイルを含めます(デフォルトは 180 日)。
アセットの名前空間: アセットの名前空間。
Ingestion labels: このフィードのイベントに適用されるラベル。
[次へ] をクリックします。
[Finalize] 画面で新しいフィードの設定を確認し、[送信] をクリックします。
Google SecOps サービス アカウントに IAM 権限を付与する
Google SecOps サービス アカウントには、GCS バケットに対する Storage オブジェクト閲覧者ロールが必要です。
- [Cloud Storage] > [バケット] に移動します。
- バケット名(
f5-xc-logsなど)をクリックします。 - [権限] タブに移動します。
- [アクセス権を付与] をクリックします。
- 次の構成の詳細を指定します。
- プリンシパルを追加: Google SecOps サービス アカウントのメールアドレスを貼り付けます。
- ロールを割り当てる: [Storage オブジェクト閲覧者] を選択します。
- [保存] をクリックします。
UDM マッピング テーブル
| ログフィールド | UDM マッピング | ロジック |
|---|---|---|
| msg.requestHeaders.Proxy-Client-IP、msg.requestHeaders.WF-Forwarded-For、msg.requestHeaders.X-Forwarded-For、msg.requestHeaders.wl-proxy-client-ip、msg.hashedUserAgent、msg.transactionId、msg.hashedUsername、msg.dcgShapeFailedOn、ShapeShifterId、eventType、eventId、latRequest、latResponse、latTotal、latRspWait、count、latEccWait | additional.fields | さまざまなフィールドから作成されたラベルから統合されました |
| intermediary | intermediary | 空でない場合、値が直接コピーされます |
| 説明 | metadata.description | 値を直接コピー |
| target、has_principal_machine | metadata.event_type | target != "" の場合は NETWORK_HTTP、has_principal_machine == true の場合は STATUS_UPDATE、それ以外の場合は GENERIC_EVENT に設定します。 |
| アプリ | network.application_protocol | 値が大文字に変換された |
| requestMethod、msg.method | network.http.method | requestMethod が空でない場合は requestMethod の値、それ以外の場合は msg.method |
| requestClientApplication、msg.requestHeaders.User-Agent | network.http.parsed_user_agent | requestClientApplication の値(空でない場合)、それ以外の場合は msg.requestHeaders.User-Agent。解析されたユーザー エージェントに変換されます。 |
| requestContext, msg.requestHeaders.Referer | network.http.referral_url | requestContext が空でない場合はその値、それ以外の場合は msg.requestHeaders.Referer |
| msg.sseResponseCode, prCode | network.http.response_code | 空でない場合は msg.sseResponseCode の値、それ以外の場合は prCode。整数に変換されます。 |
| requestClientApplication、msg.requestHeaders.User-Agent | network.http.user_agent | requestClientApplication が空でない場合はその値、それ以外の場合は msg.requestHeaders.User-Agent |
| requestHeader.x-shape-src-virtual | observer.ip | 値を直接コピー |
| プリンシパル | プリンシパル | 値を直接コピー |
| msg.host | principal.asset.hostname | 値を直接コピー |
| src、msg.src、msg.trueClientIP、requestHeader.X-Forwarded-For | principal.asset.ip | src が空でない場合は src の値、それ以外の場合は msg.src、それ以外の場合は msg.trueClientIP、それ以外の場合は X-Forwarded-For の最初の IP(src と異なる場合) |
| msg.host | principal.hostname | 値を直接コピー |
| src、msg.src、msg.trueClientIP、requestHeader.X-Forwarded-For | principal.ip | src が空でない場合は src の値、それ以外の場合は msg.src、それ以外の場合は msg.trueClientIP、それ以外の場合は X-Forwarded-For の最初の IP(src と異なる場合) |
| msg.requestHeaders | principal.resource.attribute.labels | msg.requestHeaders の Key-Value ペアから統合 |
| msg.uri | principal.url | 値を直接コピー |
| security_result | security_result | 値を直接コピー |
| deviceExternalId | security_result.about.asset_id | 値を直接コピー |
| flowLabel、agentLabel、requestHeader.Content-Length、requestHeader.Content-Type、requestHeader.Accept、requestHeader.Accept-Encoding、browserType、accountInfo、requestHeader.Via、asn、tid、ctag、requestHeader.Cache-Control、transactionResult | security_result.about.labels | さまざまなフィールドから作成されたラベルから統合されました |
| act, msg.transactionResult | security_result.action | act が PASS で isAttack の場合は ALLOW、それ以外の場合は UNKNOWN_ACTION に設定します。または、msg.transactionResult == Success の場合は ALLOW、Failure の場合は BLOCK に設定します。 |
| act, msg.transactionResult | security_result.action_details | act の値(空でない場合)、それ以外の場合は msg.transactionResult |
| 重要度 | security_result.severity | Error、error、warning の場合は HIGH、critical と一致する場合は CRITICAL、notice の場合は MEDIUM、information、info、INFO の場合は LOW に設定します。 |
| 重要度 | security_result.severity_details | 値を直接コピー |
| attackCause | security_result.threat_name | 値を直接コピー |
| ターゲット | ターゲット | 値を直接コピー |
| appName | target.application | 値を直接コピー |
| dst、msg.dst | target.asset.ip | dst が空でない場合は dst の値、それ以外の場合は msg.dst |
| dhost | target.hostname | 値を直接コピー |
| dst、msg.dst | target.ip | dst が空でない場合は dst の値、それ以外の場合は msg.dst |
| countryName | target.location.country_or_region | 値を直接コピー |
| dpt | target.port | 整数に変換しました |
| msg.responseHeaders | target.resource.attribute.labels | msg.responseHeaders の Key-Value ペアからマージされました |
| リクエスト | target.url | 値を直接コピー |
| requestHeader.X-Forwarded-For | intermediary.ip | X-Forwarded-For 配列の次の IP に設定 |
| metadata.product_name | [Shape] に設定します。 | |
| metadata.vendor_name | 「F5」に設定 |
さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。