Google Cloud Secure Web Proxy ログを収集する
このドキュメントでは、Google Cloud Storage V2 を使用して Google Cloud Secure Web Proxy ログを Google Security Operations に取り込む方法について説明します。
Secure Web Proxy は、下り(外向き)ウェブ トラフィック(HTTP と HTTPS)を保護するクラウド ファーストのサービスです。クラウド ファースト ID とウェブ アプリケーションに基づいた、柔軟かつ詳細なポリシーを実現するマネージド プロキシ ソリューションを提供します。Secure Web Proxy は、ポリシーに準拠していないトラフィックを識別して Cloud Logging に記録します。これにより、インターネットの使用状況をモニタリングし、ネットワークに対する脅威を検出し、セキュリティ インシデントに対応できます。
始める前に
次の前提条件を満たしていることを確認します。
- Google SecOps インスタンス
- Cloud Storage API が有効になっている Google Cloud プロジェクト
- GCS バケットを作成および管理する権限
- GCS バケットの IAM ポリシーを管理する権限
- Secure Web Proxy が Google Cloud 環境で有効になっており、構成されている
- Google Cloud への特権アクセスと、Secure Web Proxy ログにアクセスするための適切な権限
- Cloud Logging シンクを作成して管理する権限
Google Cloud Storage バケットを作成する
Google Cloud コンソールを使用する
- Google Cloud Console に移動します。
- プロジェクトを選択するか、新しいプロジェクトを作成します。
- ナビゲーション メニューで、[Cloud Storage > バケット] に移動します。
- [バケットを作成] をクリックします。
次の構成情報を提供してください。
設定 値 バケットに名前を付ける グローバルに一意の名前( Google Cloud-swp-logsなど)を入力します。ロケーション タイプ ニーズに基づいて選択します(リージョン、デュアルリージョン、マルチリージョン)。 ロケーション ロケーションを選択します(例: us-central1)。ストレージ クラス Standard(頻繁にアクセスされるログにおすすめ) アクセス制御 均一(推奨) 保護ツール 省略可: オブジェクトのバージョニングまたは保持ポリシーを有効にする [作成] をクリックします。
gcloud コマンドライン ツールを使用する
または、
gcloudコマンドを使用してバケットを作成します。gcloud storage buckets create gs://gcp-swp-logs \ --location=us-central1 \ --default-storage-class=STANDARD- 次のように置き換えます。
gcp-swp-logs: 目的のバケット名(グローバルに一意)。us-central1: 希望のリージョン(us-central1、europe-west1など)。
- 次のように置き換えます。
Secure Web Proxy ログを GCS にエクスポートするように Cloud Logging を構成する
Secure Web Proxy は、プロキシ トランザクション ログを Cloud Logging に自動的に記録します。これらのログを Cloud Storage にエクスポートするには、Cloud Logging シンクを作成する必要があります。
Google Cloud コンソールを使用する
- Google Cloud コンソールで、[ロギング] > [ログルーター] に移動します。
- [シンクを作成] をクリックします。
- 次の構成の詳細を指定します。
- シンク名: わかりやすい名前を入力します(例:
swp-export-sink)。 - シンクの説明: 省略可能な説明。
- シンク名: わかりやすい名前を入力します(例:
- [次へ] をクリックします。
- [シンクサービスの選択] セクションで、次の操作を行います。
- シンクサービス: [Cloud Storage バケット] を選択します。
- Cloud Storage バケットを選択: プルダウンから
gcp-swp-logsを選択します。
- [次へ] をクリックします。
[シンクに含めるログの選択] セクションに、次のフィルタ クエリを入力します。
logName="projects/<YOUR_PROJECT_ID>/logs/networkservices.googleapis.com/gateway_requests"<YOUR_PROJECT_ID>は、実際の Google Cloud プロジェクト ID に置き換えます。
[次へ] をクリックします。
構成を確認して、[シンクを作成] をクリックします。
シンクを作成すると、Cloud Logging にシンクの書き込み ID(サービス アカウントのメールアドレス)が表示されます。次の手順で使用するため、このサービス アカウントのメールアドレスをコピーします。
gcloud コマンドライン ツールを使用する
または、
gcloudコマンドを使用してシンクを作成します。gcloud logging sinks create swp-export-sink \ storage.googleapis.com/gcp-swp-logs \ --log-filter='logName="projects/<YOUR_PROJECT_ID>/logs/networkservices.googleapis.com/gateway_requests"'- 次のように置き換えます。
swp-export-sink: 目的のシンク名。gcp-swp-logs: GCS バケット名。<YOUR_PROJECT_ID>: Google Cloud プロジェクト ID。
- 次のように置き換えます。
Cloud Logging サービス アカウントに権限を付与する
Cloud Logging シンク ライター ID サービス アカウントには、GCS バケットにログを書き込む権限が必要です。
Google Cloud コンソールを使用する
- [Cloud Storage] > [バケット] に移動します。
- バケット名(
gcp-swp-logs)をクリックします。 - [権限] タブに移動します。
- [アクセス権を付与] をクリックします。
- 次の構成の詳細を指定します。
- プリンシパルを追加する: Cloud Logging シンク書き込み ID サービス アカウントのメールアドレス(
serviceAccount:service-123456789@gcp-sa-logging.iam.gserviceaccount.comなど)を貼り付けます。 - ロールを割り当てる: [Storage オブジェクト管理者] を選択します。
- プリンシパルを追加する: Cloud Logging シンク書き込み ID サービス アカウントのメールアドレス(
[保存] をクリックします。
gcloud コマンドライン ツールを使用する
または、
gcloudコマンドを使用して権限を付与します。gcloud storage buckets add-iam-policy-binding gs://gcp-swp-logs \ --member="serviceAccount:<LOGGING_SERVICE_ACCOUNT_EMAIL>" \ --role="roles/storage.objectAdmin"- 次のように置き換えます。
gcp-swp-logs: バケット名。<LOGGING_SERVICE_ACCOUNT_EMAIL>: Cloud Logging シンク ライター ID サービス アカウントのメールアドレス。
- 次のように置き換えます。
gsutil コマンドライン ツールを使用する(以前のバージョン)
ロギング サービス アカウントにオブジェクト管理者ロールを割り当てます。
gsutil iam ch serviceAccount:<LOGGING_SERVICE_ACCOUNT_EMAIL>:objectAdmin \ gs://gcp-swp-logs
権限を確認する
権限が正しく付与されたことを確認するには:
gcloud storage buckets get-iam-policy gs://gcp-swp-logs \ --flatten="bindings[].members" \ --filter="bindings.role:roles/storage.objectAdmin"
出力に Cloud Logging サービス アカウントのメールアドレスが表示されます。
Google SecOps サービス アカウントを取得する
Google SecOps は、一意のサービス アカウントを使用して GCS バケットからデータを読み取ります。このサービス アカウントにバケットへのアクセス権を付与する必要があります。
GCP Secure Web Proxy ログを取り込むように Google SecOps でフィードを構成する
- [SIEM 設定] > [フィード] に移動します。
- [Add New Feed] をクリックします。
- [単一フィードを設定] をクリックします。
- [フィード名] フィールドに、フィードの名前を入力します(例:
GGoogle CloudCP Secure Web Proxy Logs)。 - [ソースタイプ] として [Google Cloud Storage V2] を選択します。
[ログタイプ] として [GCP Secure Web Proxy] を選択します。
[サービス アカウントを取得する] をクリックします。一意のサービス アカウント メールアドレスが表示されます(例:)。
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.comこのメールアドレスをコピーして、次のステップで使用します。
[次へ] をクリックします。
次の入力パラメータの値を指定します。
- ストレージ バケットの URL: 接頭辞パスを含む GCS バケット URI を入力します。
gs://gcp-swp-logs/- 次のように置き換えます。
gcp-swp-logs: GCS バケット名。
Source deletion option: 必要に応じて削除オプションを選択します。
- なし: 転送後にファイルを削除しません(テストにおすすめ)。
- 転送されたファイルを削除する: 転送が完了した後にファイルを削除します。
転送されたファイルと空のディレクトリを削除する: 転送が完了した後にファイルと空のディレクトリを削除します。
ファイルの最大経過日数: 指定した日数以内に変更されたファイルを含めます。デフォルトは 180 日です。
アセットの名前空間: アセットの名前空間。
Ingestion labels: このフィードのイベントに適用されるラベル。
[次へ] をクリックします。
[Finalize] 画面で新しいフィードの設定を確認し、[送信] をクリックします。
Google SecOps サービス アカウントに IAM 権限を付与する
Google SecOps サービス アカウントには、GCS バケットに対する Storage オブジェクト閲覧者ロールが必要です。
Google Cloud コンソールを使用する
- [Cloud Storage] > [バケット] に移動します。
- バケット名をクリックします。
- [権限] タブに移動します。
- [アクセス権を付与] をクリックします。
- 次の構成の詳細を指定します。
- プリンシパルを追加: Google SecOps サービス アカウントのメールアドレスを貼り付けます。
- ロールを割り当てる: [Storage オブジェクト閲覧者] を選択します。
- [保存] をクリックします。
gcloud コマンドライン ツールを使用する
または、
gcloudコマンドを使用して権限を付与します。gcloud storage buckets add-iam-policy-binding gs://gcp-swp-logs \ --member="serviceAccount:<SECOPS_SERVICE_ACCOUNT_EMAIL>" \ --role="roles/storage.objectViewer"- 次のように置き換えます。
gcp-swp-logs: バケット名。<SECOPS_SERVICE_ACCOUNT_EMAIL>: Google SecOps サービス アカウントのメールアドレス。
- 次のように置き換えます。
gsutil コマンドライン ツールを使用する(以前のバージョン)
次のコマンドを実行して、SecOps サービス アカウントにオブジェクト閲覧者の権限を付与します。
gsutil iam ch serviceAccount:<SECOPS_SERVICE_ACCOUNT_EMAIL>:objectViewer \ gs://gcp-swp-logs
権限を確認する
権限が正しく付与されたことを確認するには:
gcloud storage buckets get-iam-policy gs://gcp-swp-logs \ --flatten="bindings[].members" \ --filter="bindings.role:roles/storage.objectViewer"
出力に Google SecOps サービス アカウントのメールアドレスが表示されます。
UDM マッピング テーブル
| ログフィールド | UDM マッピング | ロジック |
|---|---|---|
| httpRequest.latency、jsonPayload.@type、logName | additional.fields | latency_label(キー「HTTPRequest Latency」、値は latency)、type_label(キー「Log Type」、値は @type)、logname(キー「Log Name」、値は logName)と統合されます。 |
| receiveTimestamp | metadata.collected_timestamp | RFC3339 タイムスタンプとして解析 |
| metadata.event_type | has_principal が true、has_target が true、プロトコルが (?i)http と一致する場合は NETWORK_HTTP に設定します。has_principal が true、has_target が true、network が「」でない場合は NETWORK_CONNECTION に設定します。has_principal が true、has_target が true、has_principal_user が true の場合は USER_LOGIN に設定します。has_principal が true の場合は STATUS_UPDATE に設定します。それ以外の場合は GENERIC_EVENT に設定します。 | |
| insertId | metadata.product_log_id | 値を直接コピー |
| httpRequest.protocol | network.application_protocol | grok パターン %{DATA:protocol}/%{INT:http_version} を使用してプロトコルを抽出し、["HTTP","HTTPS"] の場合は設定します |
| httpRequest.protocol | network.application_protocol_version | grok パターン %{DATA:protocol}/%{INT:http_version} を使用して http_version を抽出しました |
| httpRequest.requestMethod | network.http.method | 値を直接コピー |
| httpRequest.userAgent | network.http.parsed_user_agent | 値を直接コピーし、parseduseragent に変換 |
| httpRequest.status | network.http.response_code | 文字列に変換してから整数に変換 |
| httpRequest.userAgent | network.http.user_agent | 値を直接コピー |
| httpRequest.responseSize | network.received_bytes | 値が直接コピーされ、uinteger に変換されます |
| httpRequest.requestSize | network.sent_bytes | 値が直接コピーされ、uinteger に変換されます |
| httpRequest.serverIp | principal.asset.ip | grok パターン %{IP:server_ip} を使用して IP を抽出し、空でない場合は設定します |
| httpRequest.serverIp | principal.ip | grok パターン %{IP:server_ip} を使用して IP を抽出し、空でない場合は設定します |
| jsonPayload.enforcedGatewaySecurityPolicy.matchedRules[].action | security_result.action | rule.action == ALLOW の場合は ALLOW、rule.action == DENIED の場合は BLOCK に設定 |
| jsonPayload.enforcedGatewaySecurityPolicy.matchedRules[].action | security_result.action_details | rule.action から直接コピーされた値 |
| jsonPayload.enforcedGatewaySecurityPolicy.requestWasTlsIntercepted、resource.labels.gateway_name、resource.labels.resource_container、resource.labels.gateway_type | security_result.detection_fields | tls_intercepted_label(キー「requestWasTlsIntercepted」、値は requestWasTlsIntercepted)、gateway_name_label(キー「gateway-name」、値は gateway_name)、resource_container_label(キー「resource_container」、値は resource_container)、gateway_type_label(キー「gateway-type」、値は gateway_type)と統合 |
| jsonPayload.enforcedGatewaySecurityPolicy.matchedRules[].name | security_result.rule_name | 値を直接コピー |
| 重要度 | security_result.severity | 重大度が CRITICAL の場合は CRITICAL、重大度が ERROR の場合は ERROR、重大度が [ALERT, EMERGENCY] の場合は HIGH、重大度が [INFO, NOTICE] の場合は INFORMATIONAL、重大度が DEBUG の場合は LOW、重大度が WARNING の場合は MEDIUM、それ以外の場合は UNKNOWN_SEVERITY に設定します。 |
| jsonPayload.enforcedGatewaySecurityPolicy.hostname | target.asset.hostname | 値を直接コピー |
| httpRequest.remoteIp | target.asset.ip | grok パターン %{IP:remote_ip} を使用して IP を抽出し、空でない場合は設定します |
| jsonPayload.enforcedGatewaySecurityPolicy.hostname | target.hostname | 値を直接コピー |
| httpRequest.remoteIp | target.ip | grok パターン %{IP:remote_ip} を使用して IP を抽出し、空でない場合は設定します |
| resource.labels.location | target.resource.attribute.cloud.availability_zone | 値を直接コピー |
| resource.labels.network_name、resource.type | target.resource.attribute.labels | rc_network_name_label(キー「rc_network_name」、network_name の値)、resource_type(キー「Resource Type」、resource.type の値)と統合されました |
| httpRequest.requestUrl | target.url | 値を直接コピー |
さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。