Dataminr Alerts のログを収集する
このドキュメントでは、Google Cloud Storage V2、Cloud Run 関数、Cloud Scheduler を使用して Dataminr Alerts ログを Google Security Operations に取り込む方法について説明します。
Dataminr Pulse は、ディープウェブやダークウェブを含む 50 万を超える世界中の公開データソースから、AI を活用したリアルタイムのインテリジェンスを提供します。このプラットフォームは、組織とサードパーティに影響する新たなサイバー脅威、脆弱性、ランサムウェア攻撃、データ侵害、デジタル リスクに関する早期警告を提供します。Dataminr Pulse API は、OAuth 2.0 クライアント認証情報認証とカーソルベースのページネーションを使用してアラートを取得します。
始める前に
次の前提条件を満たしていることを確認してください。
- Google SecOps インスタンス
- 次の API が有効になっている Google Cloud プロジェクト。
- Cloud Storage API
- Cloud Run functions API
- Cloud Scheduler API
- Cloud Pub/Sub API
- GCS バケット、Cloud Run functions、Pub/Sub トピック、Cloud Scheduler ジョブの作成と管理権限
- GCS バケットの IAM ポリシーを管理する権限
- API アクセスが有効になっているアクティブな Dataminr Pulse アカウント
- Dataminr Pulse API 認証情報(クライアント ID とクライアント シークレット)
- Dataminr アカウントで構成された Dataminr Pulse Alert List が 1 つ以上ある
Google Cloud Storage バケットを作成する
- Google Cloud Console に移動します。
- プロジェクトを選択するか、新しいプロジェクトを作成します。
- ナビゲーション メニューで、[Cloud Storage > バケット] に移動します。
- [バケットを作成] をクリックします。
次の構成情報を提供してください。
設定 値 バケットに名前を付ける グローバルに一意の名前を入力します(例: dataminr-alert-logs)。ロケーション タイプ ニーズに基づいて選択します(リージョン、デュアルリージョン、マルチリージョン)。 ロケーション ロケーションを選択します(例: us-central1)。ストレージ クラス Standard(アクセス頻度の高いログにおすすめ) アクセス制御 均一(推奨) 保護ツール 省略可: オブジェクトのバージョニングまたは保持ポリシーを有効にする [作成] をクリックします。
Dataminr の認証情報を収集する
Cloud Run 関数でアラート データを取得できるようにするには、Dataminr アカウント担当者から OAuth 2.0 クライアント認証情報による認証を含む API 認証情報を取得する必要があります。
API 認証情報を取得する
- API へのアクセスをリクエストするには、Dataminr のアカウント担当者またはサポートチームにお問い合わせください。
- 次の情報を提供します。
- 組織名
- ユースケース: Google Chronicle SIEM との統合
- 必要なアクセス権: Dataminr Pulse API for Cyber Risk
Dataminr は API 認証情報をプロビジョニングし、次の情報を提供します。
- クライアント ID: 一意の OAuth 2.0 クライアント ID
- クライアント シークレット: OAuth 2.0 クライアント シークレット キー
API 認証情報を確認する
認証情報が機能していることを確認するには、次のコマンドを実行します。
curl -X POST https://gateway.dataminr.com/auth/2/token \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&grant_type=api_key"成功したレスポンスは、
access_tokenフィールドを含む JSON オブジェクトを返します。{ "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI...", "token_type": "Bearer", "expire": 3600 }
アラートリスト ID を収集する
https://app.dataminr.comで Dataminr Pulse ウェブ アプリケーションにログインします。- 構成済みのアラート リスト(ウォッチリスト)に移動します。
Google SecOps に取り込むアラートリストの ID をメモします。
Cloud Run functions のサービス アカウントを作成する
- Google Cloud コンソールで、[IAM と管理] > [サービス アカウント] に移動します。
- [サービス アカウントを作成] をクリックします。
- 次の構成の詳細を入力します。
- サービス アカウント名: 「
dataminr-alert-collector」と入力します。 - サービス アカウントの説明:
Service account for Dataminr Alerts Cloud Run function to write alert data to GCSと入力します。
- サービス アカウント名: 「
- [作成して続行] をクリックします。
- [このサービス アカウントにプロジェクトへのアクセスを許可する] セクションで、次のロールを追加します。
- [ロールを選択] をクリックし、[ストレージ オブジェクト管理者] を検索して選択します。
- [別のロールを追加] をクリックし、[Cloud Run 起動元] を検索して選択します。
- [続行] をクリックします。
- [完了] をクリックします。
GCS バケットに対する IAM 権限を付与する
- [Cloud Storage] > [バケット] に移動します。
- バケット名(
dataminr-alert-logsなど)をクリックします。 - [権限] タブに移動します。
- [アクセス権を付与] をクリックします。
- 次の構成の詳細を入力します。
- プリンシパルを追加: サービス アカウントのメールアドレス(例:
dataminr-alert-collector@PROJECT_ID.iam.gserviceaccount.com)を入力します。 - ロールを割り当てる: [ストレージ オブジェクト管理者] を選択します。
- プリンシパルを追加: サービス アカウントのメールアドレス(例:
- [保存] をクリックします。
Pub/Sub トピックの作成
Cloud Scheduler によってメッセージがパブリッシュされると、Pub/Sub トピックが Cloud Run functions の関数をトリガーします。
- Google Cloud コンソールで、[Pub/Sub> トピック] に移動します。
- [トピックを作成] をクリックします。
- 次の構成の詳細を入力します。
- トピック ID: 「
dataminr-alert-trigger」と入力します。 - デフォルトのサブスクリプションを追加する: チェックをオンのままにする
- トピック ID: 「
- [作成] をクリックします。
Cloud Run functions を作成する
- Google Cloud コンソールで、[Cloud Run functions] に移動します。
- [関数を作成] をクリックします。
次の構成情報を提供してください。
設定 値 環境 第 2 世代 関数名 dataminr-alert-collectorリージョン GCS バケットと同じリージョンを選択します。 トリガーのタイプ Cloud Pub/Sub Pub/Sub トピック dataminr-alert-trigger割り当てられたメモリ 512 MiB タイムアウト 540 秒 ランタイム サービス アカウント dataminr-alert-collector[次へ] をクリックします。
[ランタイム] を [Python 3.12] に設定します。
[エントリ ポイント] を
mainに設定します。requirements.txtファイルに次の依存関係を追加します。functions-framework==3.* google-cloud-storage==2.* requests==2.*main.pyファイルに次のコードを貼り付けます。import functions_framework import json import os import logging import time from datetime import datetime, timedelta, timezone from google.cloud import storage import requests logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) storage_client = storage.Client() TOKEN_URL = "https://gateway.dataminr.com/auth/2/token" ALERTS_URL = "https://gateway.dataminr.com/api/3/alerts" def _get_access_token(client_id: str, client_secret: str) -> str: """Obtain an OAuth 2.0 access token from Dataminr.""" payload = { "client_id": client_id, "client_secret": client_secret, "grant_type": "api_key", } headers = {"Content-Type": "application/x-www-form-urlencoded"} resp = requests.post(TOKEN_URL, data=payload, headers=headers, timeout=30) resp.raise_for_status() token_data = resp.json() access_token = token_data.get("access_token") if not access_token: raise ValueError("No access_token in token response") logger.info("Successfully obtained Dataminr access token.") return access_token def _load_state(bucket_name: str, state_key: str) -> dict: """Load the last cursor (alertId) from GCS.""" try: bucket = storage_client.bucket(bucket_name) blob = bucket.blob(state_key) if blob.exists(): data = json.loads(blob.download_as_text()) logger.info(f"Loaded state: {data}") return data except Exception as e: logger.warning(f"State read error: {e}") logger.info("No previous state found.") return {} def _save_state(bucket_name: str, state_key: str, state: dict) -> None: """Save the cursor state to GCS.""" bucket = storage_client.bucket(bucket_name) blob = bucket.blob(state_key) blob.upload_from_string( json.dumps(state), content_type="application/json" ) logger.info(f"Saved state: {state}") def _fetch_alerts( access_token: str, alert_lists: str, page_size: int, cursor: str = None, ) -> tuple: """Fetch a page of alerts from the Dataminr Pulse API.""" headers = { "Authorization": f"Bearer {access_token}", "Accept": "application/json", } params = { "lists": alert_lists, "num": page_size, } if cursor: params["from"] = cursor resp = requests.get( ALERTS_URL, headers=headers, params=params, timeout=60 ) # Handle rate limiting via response headers rate_remaining = resp.headers.get("x-ratelimit-remaining") rate_reset = resp.headers.get("x-ratelimit-reset") if resp.status_code == 429: reset_time = int(rate_reset) if rate_reset else 60 wait_seconds = max(reset_time - int(time.time()), 1) logger.warning( f"Rate limited. Waiting {wait_seconds}s before retry." ) time.sleep(wait_seconds) resp = requests.get( ALERTS_URL, headers=headers, params=params, timeout=60 ) resp.raise_for_status() if rate_remaining is not None: logger.info( f"Rate limit remaining: {rate_remaining}, reset: {rate_reset}" ) data = resp.json() alerts = data if isinstance(data, list) else data.get("data", []) return alerts @functions_framework.cloud_event def main(cloud_event): """Cloud Run function entry point triggered by Pub/Sub.""" bucket_name = os.environ["GCS_BUCKET"] prefix = os.environ.get("GCS_PREFIX", "dataminr_alerts") state_key = os.environ.get("STATE_KEY", "dataminr_state/cursor.json") client_id = os.environ["CLIENT_ID"] client_secret = os.environ["CLIENT_SECRET"] alert_lists = os.environ["ALERT_LISTS"] max_records = int(os.environ.get("MAX_RECORDS", "1000")) page_size = min(int(os.environ.get("PAGE_SIZE", "40")), 40) lookback_hours = int(os.environ.get("LOOKBACK_HOURS", "24")) try: access_token = _get_access_token(client_id, client_secret) state = _load_state(bucket_name, state_key) cursor = state.get("last_cursor") is_first_run = cursor is None all_alerts = [] total_fetched = 0 pages_fetched = 0 while total_fetched < max_records: logger.info( f"Fetching page {pages_fetched + 1} (cursor: {cursor})..." ) alerts = _fetch_alerts( access_token, alert_lists, page_size, cursor=cursor ) if not alerts: logger.info("No more alerts returned. Stopping pagination.") break # Filter by lookback window on first run (no prior cursor) if is_first_run: cutoff_ms = int( ( datetime.now(timezone.utc) - timedelta(hours=lookback_hours) ).timestamp() * 1000 ) alerts = [ a for a in alerts if a.get("eventTime", 0) >= cutoff_ms ] all_alerts.extend(alerts) total_fetched += len(alerts) pages_fetched += 1 # Update cursor to the last alertId in this page last_alert = alerts[-1] if alerts else None if last_alert and "alertId" in last_alert: cursor = last_alert["alertId"] else: break # Stop if we received fewer alerts than requested if len(alerts) < page_size: logger.info("Received partial page. Stopping pagination.") break logger.info( f"Collected {len(all_alerts)} alerts across {pages_fetched} pages." ) if not all_alerts: logger.info("No new alerts to write.") return "No new alerts", 200 # Write alerts as NDJSON to GCS now_str = datetime.now(timezone.utc).strftime("%Y%m%dT%H%M%SZ") blob_path = f"{prefix}/{now_str}.ndjson" ndjson_body = "\n".join( json.dumps(alert, separators=(",", ":")) for alert in all_alerts ) bucket = storage_client.bucket(bucket_name) blob = bucket.blob(blob_path) blob.upload_from_string( ndjson_body, content_type="application/x-ndjson" ) _save_state( bucket_name, state_key, { "last_cursor": cursor, "last_run": datetime.now(timezone.utc).isoformat(), }, ) msg = ( f"Wrote {len(all_alerts)} alerts to " f"gs://{bucket_name}/{blob_path}" ) logger.info(msg) return msg, 200 except Exception as e: logger.error(f"Error collecting Dataminr alerts: {e}") raise[デプロイ] をクリックします。
関数がデプロイされるまで待ちます。デプロイが完了すると、ステータスが緑色のチェックマークに変わります。
環境変数を構成する
- 関数がデプロイされたら、Cloud Run functions > dataminr-alert-collector に移動します。
- [新しいリビジョンの編集とデプロイ] をクリックします。
- [変数とシークレット] タブをクリックします(または、第 1 世代の場合は [ランタイム、ビルド、接続、セキュリティの設定] を開きます)。
次の環境変数を追加します。
キー 値の例 GCS_BUCKETdataminr-alert-logsGCS_PREFIXdataminr_alertsSTATE_KEYdataminr_state/cursor.jsonCLIENT_IDDataminr の OAuth 2.0 クライアント ID CLIENT_SECRETDataminr の OAuth 2.0 クライアント シークレット ALERT_LISTSDataminr アラートリスト ID のカンマ区切りのリスト MAX_RECORDS1000PAGE_SIZE40LOOKBACK_HOURS24[デプロイ] をクリックします。
Cloud Scheduler ジョブを作成する
Cloud Scheduler は、スケジュールに従って Pub/Sub トピックにメッセージをパブリッシュし、Cloud Run functions の関数をトリガーして、Dataminr Pulse で新しいアラートをポーリングします。
- Google Cloud コンソールで、[Cloud Scheduler] に移動します。
- [ジョブを作成] をクリックします。
次の構成情報を提供してください。
設定 値 名前 dataminr-alert-pollリージョン 関数と同じリージョンを選択します。 周波数 */5 * * * *(5 分ごと)タイムゾーン タイムゾーンを選択します(例: UTC)[続行] をクリックします。
[実行を構成する] セクションで、次の操作を行います。
- ターゲット タイプ: [Pub/Sub] を選択します。
- トピック:
dataminr-alert-triggerを選択します。 - メッセージ本文: 「
{"poll": true}」と入力します。
[作成] をクリックします。
Cloud Run functions の関数を確認する
- Cloud Scheduler で、
dataminr-alert-pollジョブを見つけます。 - [強制実行] をクリックして、すぐに実行するようにトリガーします。
- [Cloud Run Functions] > [dataminr-alert-collector] > [ログ] に移動します。
次のようなログエントリを確認して、関数が正常に実行されたことを確認します。
Successfully obtained Dataminr access token. Fetching page 1 (cursor: None)... Collected 35 alerts across 1 pages. Wrote 35 alerts to gs://dataminr-alert-logs/dataminr_alerts/20250115T103000Z.ndjson[Cloud Storage] > [バケット] > [dataminr-alert-logs] に移動します。
dataminr_alerts/接頭辞に移動します。Dataminr アラート データを含む NDJSON ファイルが作成されていることを確認します。
Google SecOps サービス アカウントを取得してフィードを構成する
Google SecOps は、一意のサービス アカウントを使用して GCS バケットからデータを読み取ります。このサービス アカウントにバケットへのアクセス権を付与する必要があります。
サービス アカウントのメールアドレスを取得する
- [SIEM 設定] > [フィード] に移動します。
- [Add New Feed] をクリックします。
- [単一フィードを設定] をクリックします。
- [フィード名] フィールドに、フィードの名前を入力します(例:
Dataminr Alerts)。 - [ソースタイプ] として [Google Cloud Storage V2] を選択します。
- [ログタイプ] として [Dataminr Alerts] を選択します。
- [サービス アカウントを取得する] をクリックします。
一意のサービス アカウント メールアドレスが表示されます(例:)。
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.comこのメールアドレスをコピーして、次のセクションで使用します。
[次へ] をクリックします。
次の入力パラメータの値を指定します。
ストレージ バケットの URL: 接頭辞パスを含む GCS バケット URI を入力します。
gs://dataminr-alert-logs/dataminr_alerts/Source deletion option: 必要に応じて削除オプションを選択します。
- なし: 転送後にファイルを削除しません(テストにおすすめ)。
- 転送されたファイルを削除する: 転送が完了した後にファイルを削除します。
転送されたファイルと空のディレクトリを削除する: 転送が完了した後にファイルと空のディレクトリを削除します。
ファイルの最大経過日数: 指定した日数以内に変更されたファイルを含めます(デフォルトは 180 日)。
Asset namespace: アセットの名前空間。
Ingestion labels: このフィードのイベントに適用されるラベル(
DATAMINR_ALERTなど)。
[次へ] をクリックします。
[Finalize] 画面で新しいフィードの設定を確認し、[送信] をクリックします。
Google SecOps サービス アカウントに IAM 権限を付与する
Google SecOps サービス アカウントには、GCS バケットに対する Storage オブジェクト閲覧者ロールが必要です。
- [Cloud Storage] > [バケット] に移動します。
- バケット名(
dataminr-alert-logsなど)をクリックします。 - [権限] タブに移動します。
- [アクセス権を付与] をクリックします。
- 次の構成の詳細を入力します。
- プリンシパルを追加: Google SecOps サービス アカウントのメールアドレスを貼り付けます。
- ロールを割り当てる: [Storage オブジェクト閲覧者] を選択します。
[保存] をクリックします。
UDM マッピング テーブル
| ログフィールド | UDM マッピング | ロジック |
|---|---|---|
| alertId | metadata.product_log_id | 値を直接コピーしました |
| alertType.color | about.labels.alertType_color | 値を直接コピーしました |
| alertType.id | about.labels.alertType_id | 値を直接コピーしました |
| alertType.name | about.labels.alertType_name | 値を直接コピーしました |
| availableRelatedAlerts | about.labels.availableRelatedAlerts | 文字列に変換しました |
| caption | metadata.description | 値を直接コピーしました |
| cat.name | security_result.category_details | 値を直接コピーしました |
| cat.id | security_result.detection_fields.categories_id | 値を直接コピーしました |
| cat.idStr | security_result.detection_fields.categories_idStr | 値を直接コピーしました |
| cat.path | security_result.detection_fields.categories_path | 値を直接コピーしました |
| cat.requested | security_result.detection_fields.categories_requested | 値を直接コピーしました |
| cat.retired | security_result.detection_fields.categories_retired | 文字列に変換しました |
| cat.topicType | about.labels.categories_topicType | 値を直接コピーしました |
| cat.name | security_result.category | cat.name == "Cybersecurity - Policy" の場合は POLICY_VIOLATION、["Cybersecurity - Threats & Vulnerabilities", "Cybersecurity - Crime & Malicious Activity", "Threats & Precautions", "Threats"] の場合は NETWORK_MALICIOUS、=~ "Cybersecurity" の場合は NETWORK_SUSPICIOUS、=~ "Email and Web Servers" の場合は MAIL_PHISHING、=~ "Data Exposure and Breaches" の場合は DATA_EXFILTRATION、=~ "Government, Policy, & Political Affairs" の場合は POLICY_VIOLATION、=~ "(Malware |
| comp.dm_bucket.name | security_result.about.resource.attribute.labels.dmbucket%{bucket.id} | 値を直接コピーしました |
| comp.dm_sector.name | security_result.about.resource.attribute.labels.dmsector%{sector.id} | 値を直接コピーしました |
| comp.id | security_result.about.resource.attribute.labels.companies_id | 値を直接コピーしました |
| comp.idStr | security_result.about.resource.attribute.labels.companies_idStr | 値を直接コピーしました |
| comp.locations.city | security_result.about.location.city | loc_index == 0 の場合、loc.city の値 |
| comp.locations.country、comp.locations.state.symbol | security_result.about.location.country_or_region | loc_index == 0 かつ両方が空でない場合は、%{loc.country} - %{loc.state.symbol} として連結されます。 |
| comp.locations.postalCode | security_result.about.resource.attribute.labels.locations_postalCode | loc_index == 0 で空でない場合は、値が直接コピーされます |
| comp.locations.state.name | security_result.about.location.state | loc_index == 0 の場合、値が直接コピーされる |
| comp.locations.city | about.labels.loc_%{loc_index}_city | loc_index != 0 で空でない場合は、値が直接コピーされます |
| comp.locations.country、comp.locations.state.symbol | about.labels.loc_%{loc_index}_country_or_region | loc_index != 0 かつ両方が空でない場合は、%{loc.country} - %{loc.state.symbol} として連結されます。 |
| comp.locations.postalCode | securityresult.about.resource.attribute.labels.locations%{loc_index}_postalCode | loc_index != 0 で空でない場合は、値が直接コピーされます |
| comp.locations.state.name | about.labels.loc_%{loc_index}_state_name | loc_index != 0 で空でない場合は、値が直接コピーされます |
| comp.name | security_result.about.resource.name | 値を直接コピーしました |
| comp.requested | security_result.about.resource.attribute.labels.companies_requested | 値を直接コピーしました |
| comp.retired | security_result.about.resource.attribute.labels.companies_retired | 文字列に変換しました |
| comp.ticker | security_result.about.resource.attribute.labels.companies_ticker | 値を直接コピーしました |
| comp.topicType | security_result.about.resource.attribute.labels.companies_topicType | 値を直接コピーしました |
| eventLocation.coordinates.0 | principal.location.region_coordinates.latitude | 値を直接コピーしました |
| eventLocation.coordinates.1 | principal.location.region_coordinates.longitude | 値を直接コピーしました |
| eventLocation.name | principal.location.name | 値を直接コピーしました |
| eventLocation.places | principal.labels.location_places | カンマ区切り文字で配列から結合 |
| eventLocation.probability | principal.labels.eventLocation_probability | 文字列に変換しました |
| eventLocation.radius | principal.labels.eventLocation_radius | 文字列に変換しました |
| eventMapLargeURL | principal.labels.eventMapLargeURL | 値を直接コピーしました |
| eventMapSmallURL | principal.labels.eventMapSmallURL | 値を直接コピーしました |
| eventTime | @timestamp | エポック ミリ秒からタイムスタンプに変換 |
| eventVolume | about.labels.eventVolume | 文字列に変換しました |
| expandAlertURL | metadata.url_back_to_product | 値を直接コピーしました |
| expandMapURL | principal.labels.expandMapURL | 値を直接コピーしました |
| headerColor | about.labels.headerColor | 値を直接コピーしました |
| headerLabel | about.labels.headerLabel | 値を直接コピーしました |
| metadata.cyber.addresses.ip | principal.ip | インデックスが 0 の場合は grok パターンを使用して抽出されます |
| metadata.cyber.addresses.port | principal.port | インデックスが 0 の場合は値を直接コピーし、整数に変換します。 |
| metadata.cyber.addresses.port | principal.labels.addresses_%{index}_port | インデックスが 0 でない場合、値が直接コピーされる |
| metadata.cyber.addresses.version | principal.labels.metadata_cyberaddresses%{index}_version | 値を直接コピーしました |
| metadata.cyber.asns | network.asn | index == 0 の場合、値が直接コピーされる |
| metadata.cyber.asns | about.labels.metadatacyber%{index}_asn | インデックスが 0 でない場合、値が直接コピーされる |
| metadata.cyber.hashValues.value | security_result.about.file.sha1 | type == SHA1 の場合、値は直接コピーされ、小文字に変換されます |
| metadata.cyber.hashValues.value | security_result.about.file.sha256 | type == SHA256 の場合、値を直接コピーし、小文字に変換 |
| metadata.cyber.malwares | security_result.associations.name | 値を直接コピーしました |
| metadata.cyber.malwares | security_result.associations.type | MALWARE に設定 |
| metadata.cyber.orgs | network.organization_name | index == 0 の場合、値が直接コピーされる |
| metadata.cyber.orgs | about.labels.metadatacyber%{index}_orgs | インデックスが 0 でない場合、値が直接コピーされる |
| metadata.cyber.products | principal.application | index == 0 の場合、値が直接コピーされる |
| metadata.cyber.products | principal.labels.metadata_cyberproducts%{index} | インデックスが 0 でない場合、値が直接コピーされる |
| metadata.cyber.threats | security_result.threat_name | index == 0 の場合、値が直接コピーされる |
| metadata.cyber.threats | security_result.about.labels.metadata_cyberthreats%{index} | インデックスが 0 でない場合、値が直接コピーされる |
| metadata.cyber.URLs | security_result.about.url | index == 0 の場合、値が直接コピーされる |
| metadata.cyber.URLs | securityresult.about.labels.url%{index} | インデックスが 0 でない場合、値が直接コピーされる |
| metadata.cyber.malwares.0 | security_result.category | 存在する場合は SOFTWARE_MALICIOUS に設定 |
| metadata.cyber.vulnerabilities.cvss | extensions.vulns.vulnerabilities.cvss_base_score | 値を直接コピーしました |
| metadata.cyber.vulnerabilities.exploitPocLinks | extensions.vulns.vulnerabilities.cve_description | 配列から「 n」区切り文字で結合 |
| metadata.cyber.vulnerabilities.id | extensions.vulns.vulnerabilities.cve_id | 値を直接コピーしました |
| metadata.cyber.vulnerabilities.products.productName | extensions.vulns.vulnerabilities.about.application | index == 0 の場合は値を直接コピー |
| metadata.cyber.vulnerabilities.products.productVendor | extensions.vulns.vulnerabilities.vendor | index == 0 の場合は値を直接コピー |
| metadata.cyber.vulnerabilities.products.productVersion | extensions.vulns.vulnerabilities.about.platform_version | index == 0 の場合は値が直接コピーされ、スペースが削除されます |
| metadata.cyber.vulnerabilities.products.productName | extensions.vulns.vulnerabilities.about.labels.productName_%{index} | インデックスが 0 でない場合、値が直接コピーされる |
| metadata.cyber.vulnerabilities.products.productVendor | extensions.vulns.vulnerabilities.about.labels.productVendor_%{index} | インデックスが 0 でない場合、値が直接コピーされる |
| metadata.cyber.vulnerabilities.products.productVersion | extensions.vulns.vulnerabilities.about.labels.productVersion_%{index} | index != 0 の場合は値が直接コピーされ、スペースが削除される |
| parentAlertId | about.labels.parentAlertId | 値を直接コピーしました |
| post.languages.lang | target.labels.post_languageslang%{index} | 値を直接コピーしました |
| post.languages.position | target.labels.post_languagesposition%{index} | 文字列に変換しました |
| post.link | target.labels.post_link | 値を直接コピーしました |
| post.media.link | principal.resource.name | index == 0 の場合、値が直接コピーされる |
| post.media.description | target.resource.attribute.labels.post_media_description | index == 0 の場合、値が直接コピーされる |
| post.media.display_url | target.resource.attribute.labels.post_media_display_url | index == 0 の場合は値を直接コピー |
| post.media.isSafe | target.resource.attribute.labels.post_media_isSafe | index == 0 の場合は文字列に変換 |
| post.media.media_url | target.resource.attribute.labels.post_media_media_url | index == 0 の場合は値を直接コピー |
| post.media.sizes.large.h | target.resource.attribute.labels.post_media_sizes_large_h | index == 0 の場合は文字列に変換 |
| post.media.sizes.large.resize | target.resource.attribute.labels.post_media_sizes_large_resize | index == 0 の場合、値が直接コピーされる |
| post.media.sizes.large.w | target.resource.attribute.labels.post_media_sizes_large_w | index == 0 の場合は文字列に変換 |
| post.media.sizes.medium.h | target.resource.attribute.labels.post_media_sizes_medium_h | index == 0 の場合は文字列に変換 |
| post.media.sizes.medium.resize | target.resource.attribute.labels.post_media_sizes_medium_resize | index == 0 の場合、値が直接コピーされる |
| post.media.sizes.medium.w | target.resource.attribute.labels.post_media_sizes_medium_w | index == 0 の場合は文字列に変換 |
| post.media.sizes.small.h | target.resource.attribute.labels.post_media_sizes_small_h | index == 0 の場合は文字列に変換 |
| post.media.sizes.small.resize | target.resource.attribute.labels.post_media_sizes_small_resize | index == 0 の場合は値を直接コピー |
| post.media.sizes.small.w | target.resource.attribute.labels.post_media_sizes_small_w | index == 0 の場合は文字列に変換 |
| post.media.sizes.thumb.h | target.resource.attribute.labels.post_media_sizes_thumb_h | index == 0 の場合は文字列に変換 |
| post.media.sizes.thumb.resize | target.resource.attribute.labels.post_media_sizes_thumb_resize | index == 0 の場合は値を直接コピー |
| post.media.sizes.thumb.w | target.resource.attribute.labels.post_media_sizes_thumb_w | index == 0 の場合は文字列に変換 |
| post.media.source | target.resource.attribute.labels.post_media_source | index == 0 の場合は値を直接コピー |
| post.media.thumbnail | target.resource.attribute.labels.post_media_thumbnail | index == 0 の場合は値を直接コピー |
| post.media.title | target.resource.attribute.labels.post_media_title | index == 0 の場合は値を直接コピー |
| post.media.url | target.resource.attribute.labels.post_media_url | index == 0 の場合は値を直接コピー |
| post.media.video_info.duration_millis | target.resource.attribute.labels.post_media_video_info_duration_millis | index == 0 の場合は文字列に変換 |
| post.media.video_info.aspect_ratio | target.resource.attribute.labels.post_media_video_info_aspect_ratio | index == 0 の場合、%{med.video_info.aspect_ratio.0}, %{med.video_info.aspect_ratio.1} として連結されます。 |
| post.media.video_info.variants.bitrate | target.resource.attribute.labels.post_media_video_info_variantsbitrate%{var_index} | 文字列に変換しました |
| post.media.video_info.variants.content_type | target.resource.attribute.labels.post_media_video_info_variants_contenttype%{var_index} | 値を直接コピーしました |
| post.media.video_info.variants.url | target.resource.attribute.labels.post_media_video_info_variantsurl%{var_index} | 値を直接コピーしました |
| post.media.type | principal.resource.resource_subtype | index == 0 の場合、値が直接コピーされる |
| post.media.link | about.resource.name | インデックスが 0 でない場合、値が直接コピーされる |
| post.media.description | about.resource.attribute.labels.post_media_description | インデックスが 0 でない場合、値が直接コピーされる |
| post.media.display_url | about.resource.attribute.labels.post_media_display_url | インデックスが 0 でない場合、値が直接コピーされる |
| post.media.isSafe | about.resource.attribute.labels.post_media_isSafe | index != 0 の場合、文字列に変換 |
| post.media.media_url | about.resource.attribute.labels.post_media_media_url | インデックスが 0 でない場合、値が直接コピーされる |
| post.media.sizes.large.h | about.resource.attribute.labels.post_media_sizes_large_h | index != 0 の場合、文字列に変換 |
| post.media.sizes.large.resize | about.resource.attribute.labels.post_media_sizes_large_resize | インデックスが 0 でない場合、値が直接コピーされる |
| post.media.sizes.large.w | about.resource.attribute.labels.post_media_sizes_large_w | index != 0 の場合、文字列に変換 |
| post.media.sizes.medium.h | about.resource.attribute.labels.post_media_sizes_medium_h | index != 0 の場合、文字列に変換 |
| post.media.sizes.medium.resize | about.resource.attribute.labels.post_media_sizes_medium_resize | インデックスが 0 でない場合、値が直接コピーされる |
| post.media.sizes.medium.w | about.resource.attribute.labels.post_media_sizes_medium_w | index != 0 の場合、文字列に変換 |
| post.media.sizes.small.h | about.resource.attribute.labels.post_media_sizes_small_h | index != 0 の場合、文字列に変換 |
| post.media.sizes.small.resize | about.resource.attribute.labels.post_media_sizes_small_resize | インデックスが 0 でない場合、値が直接コピーされる |
| post.media.sizes.small.w | about.resource.attribute.labels.post_media_sizes_small_w | index != 0 の場合、文字列に変換 |
| post.media.sizes.thumb.h | about.resource.attribute.labels.post_media_sizes_thumb_h | index != 0 の場合、文字列に変換 |
| post.media.sizes.thumb.resize | about.resource.attribute.labels.post_media_sizes_thumb_resize | インデックスが 0 でない場合、値が直接コピーされる |
| post.media.sizes.thumb.w | about.resource.attribute.labels.post_media_sizes_thumb_w | index != 0 の場合、文字列に変換 |
| post.media.source | about.resource.attribute.labels.post_media_source | インデックスが 0 でない場合、値が直接コピーされる |
| post.media.thumbnail | about.resource.attribute.labels.post_media_thumbnail | インデックスが 0 でない場合、値が直接コピーされる |
| post.media.title | about.resource.attribute.labels.post_media_title | インデックスが 0 でない場合、値が直接コピーされる |
| post.media.url | about.resource.attribute.labels.post_media_url | インデックスが 0 でない場合、値が直接コピーされる |
| post.media.video_info.duration_millis | about.resource.attribute.labels.post_media_video_info_duration_millis | index != 0 の場合、文字列に変換 |
| post.media.video_info.aspect_ratio | about.resource.attribute.labels.post_media_video_info_aspect_ratio | index != 0 の場合は %{med.video_info.aspect_ratio.0}, %{med.video_info.aspect_ratio.1} として連結 |
| post.media.video_info.variants.bitrate | about.resource.attribute.labels.post_media_video_info_variantsbitrate%{var_index} | 文字列に変換しました |
| post.media.video_info.variants.content_type | about.resource.attribute.labels.post_media_video_info_variants_contenttype%{var_index} | 値を直接コピーしました |
| post.media.video_info.variants.url | about.resource.attribute.labels.post_media_video_info_variantsurl%{var_index} | 値を直接コピーしました |
| post.media.type | about.resource.resource_subtype | インデックスが 0 でない場合、値が直接コピーされる |
| post.translatedText | target.labels.post_translatedText | 値を直接コピーしました |
| post.text | target.labels.post_text | 値を直接コピーしました |
| post.timestamp | target.resource.attribute.creation_time | エポック ミリ秒からタイムスタンプに変換 |
| publisherCategory.color | target.labels.publisherCategory_color | 値を直接コピーしました |
| publisherCategory.name | target.labels.publisherCategory_name | 値を直接コピーしました |
| publisherCategory.shortName | target.labels.publisherCategory_shortName | 値を直接コピーしました |
| relatedTerms.url | principal.labels.relatedTerms_%{terms.text} | 値を直接コピーしました |
| relatedTermsQueryURL | principal.labels.relatedTermsQueryURL | 値を直接コピーしました |
| sect.id | about.labels.sectors_id | 値を直接コピーしました |
| sect.idStr | about.labels.sectors_idStr | 値を直接コピーしました |
| sect.name | about.labels.sectors_name | 値を直接コピーしました |
| sect.retired | about.labels.sectors_retired | 文字列に変換しました |
| sect.topicType | about.labels.sectors_topicType | 値を直接コピーしました |
| source.channels.0 | principal.application | 値を直接コピーしました |
| source.displayName | principal.user.user_display_name | 値を直接コピーしました |
| source.link | principal.url | 値を直接コピーしました |
| source.verified | principal.labels.source_verified | 文字列に変換しました |
| subCaption.bullets.content | about.labels.subCaption_bullets_content | 値を直接コピーしました |
| subCaption.bullets.media | about.labels.subCaption_bullets_media | 値を直接コピーしました |
| subCaption.bullets.source | about.labels.subCaption_bullets_source | 値を直接コピーしました |
| watchlist.id | about.labels.watchlistsMatchedByType_id | 値を直接コピーしました |
| watchlist.externalTopicIds | about.labels.watchlistsMatchedByType_externalTopicIds | カンマ区切り文字で配列から結合 |
| watchlist.name | about.labels.watchlistsMatchedByType_name | 値を直接コピーしました |
| watchlist.type | about.labels.watchlistsMatchedByType_type | 値を直接コピーしました |
| watchlist.userProperties.omnilist | about.labels.watchlistsMatchedByType_userProperties_omnilist | 値を直接コピーしました |
| watchlist.userProperties.uiListType | about.labels.watchlistsMatchedByType_userProperties_uiListType | 値を直接コピーしました |
| watchlist.userProperties.watchlistColor | about.labels.watchlistsMatchedByType_userProperties_watchlistColor | 値を直接コピーしました |
| watchlist.locationGroups.locations.id | about.labels.watchlistsMatchedByTypelocationGroups%{lg_i}_locationsid%{loc_i} | 値を直接コピーしました |
| watchlist.locationGroups.locations.lng | about.labels.watchlistsMatchedByTypelocationGroups%{lg_i}_locationslng%{loc_i} | lg_i != 0 または loc_i != 0 の場合、文字列に変換されます |
| watchlist.locationGroups.locations.lat | about.labels.watchlistsMatchedByTypelocationGroups%{lg_i}_locationslat%{loc_i} | lg_i != 0 または loc_i != 0 の場合、文字列に変換されます |
| watchlist.locationGroups.locations.name | about.labels.watchlistsMatchedByTypelocationGroups%{lg_i}_locationsname%{loc_i} | lg_i != 0 または loc_i != 0 の場合、値を直接コピー |
| watchlist.locationGroups.id | about.labels.watchlistsMatchedByType_locationGroupsid%{lg_i} | 値を直接コピーしました |
| watchlist.locationGroups.name | about.labels.watchlistsMatchedByType_locationGroupsname%{lg_i} | 値を直接コピーしました |
| watchlist.locationGroups.locations.lng | about.location.region_coordinates.longitude | lg_i == 0 かつ loc_i == 0 の場合、値が直接コピーされる |
| watchlist.locationGroups.locations.lat | about.location.region_coordinates.latitude | lg_i == 0 かつ loc_i == 0 の場合、値が直接コピーされる |
| watchlist.locationGroups.locations.name | about.location.name | lg_i == 0 かつ loc_i == 0 の場合、値が直接コピーされる |
| source.entityName | principal.hostname | 値を直接コピーしました |
| metadata.event_type | 「GENERIC_EVENT」に設定します。principal_ip または principal.hostname が空でない場合は「SCAN_HOST」に変更されます |
さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。