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 バケットを作成する

  1. Google Cloud Console に移動します。
  2. プロジェクトを選択するか、新しいプロジェクトを作成します。
  3. ナビゲーション メニューで、[Cloud Storage > バケット] に移動します。
  4. [バケットを作成] をクリックします。
  5. 次の構成情報を提供してください。

    設定
    バケットに名前を付ける グローバルに一意の名前を入力します(例: dataminr-alert-logs)。
    ロケーション タイプ ニーズに基づいて選択します(リージョン、デュアルリージョン、マルチリージョン)。
    ロケーション ロケーションを選択します(例: us-central1)。
    ストレージ クラス Standard(アクセス頻度の高いログにおすすめ)
    アクセス制御 均一(推奨)
    保護ツール 省略可: オブジェクトのバージョニングまたは保持ポリシーを有効にする
  6. [作成] をクリックします。

Dataminr の認証情報を収集する

Cloud Run 関数でアラート データを取得できるようにするには、Dataminr アカウント担当者から OAuth 2.0 クライアント認証情報による認証を含む API 認証情報を取得する必要があります。

API 認証情報を取得する

  1. API へのアクセスをリクエストするには、Dataminr のアカウント担当者またはサポートチームにお問い合わせください。
  2. 次の情報を提供します。
    • 組織名
    • ユースケース: Google Chronicle SIEM との統合
    • 必要なアクセス権: Dataminr Pulse API for Cyber Risk
  3. 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 を収集する

  1. https://app.dataminr.comDataminr Pulse ウェブ アプリケーションにログインします。
  2. 構成済みのアラート リスト(ウォッチリスト)に移動します。
  3. Google SecOps に取り込むアラートリストの ID をメモします。

Cloud Run functions のサービス アカウントを作成する

  1. Google Cloud コンソールで、[IAM と管理] > [サービス アカウント] に移動します。
  2. [サービス アカウントを作成] をクリックします。
  3. 次の構成の詳細を入力します。
    • サービス アカウント名: 「dataminr-alert-collector」と入力します。
    • サービス アカウントの説明: Service account for Dataminr Alerts Cloud Run function to write alert data to GCS と入力します。
  4. [作成して続行] をクリックします。
  5. [このサービス アカウントにプロジェクトへのアクセスを許可する] セクションで、次のロールを追加します。
    1. [ロールを選択] をクリックし、[ストレージ オブジェクト管理者] を検索して選択します。
    2. [別のロールを追加] をクリックし、[Cloud Run 起動元] を検索して選択します。
  6. [続行] をクリックします。
  7. [完了] をクリックします。

GCS バケットに対する IAM 権限を付与する

  1. [Cloud Storage] > [バケット] に移動します。
  2. バケット名(dataminr-alert-logs など)をクリックします。
  3. [権限] タブに移動します。
  4. [アクセス権を付与] をクリックします。
  5. 次の構成の詳細を入力します。
    • プリンシパルを追加: サービス アカウントのメールアドレス(例: dataminr-alert-collector@PROJECT_ID.iam.gserviceaccount.com)を入力します。
    • ロールを割り当てる: [ストレージ オブジェクト管理者] を選択します。
  6. [保存] をクリックします。

Pub/Sub トピックの作成

Cloud Scheduler によってメッセージがパブリッシュされると、Pub/Sub トピックが Cloud Run functions の関数をトリガーします。

  1. Google Cloud コンソールで、[Pub/Sub> トピック] に移動します。
  2. [トピックを作成] をクリックします。
  3. 次の構成の詳細を入力します。
    • トピック ID: 「dataminr-alert-trigger」と入力します。
    • デフォルトのサブスクリプションを追加する: チェックをオンのままにする
  4. [作成] をクリックします。

Cloud Run functions を作成する

  1. Google Cloud コンソールで、[Cloud Run functions] に移動します。
  2. [関数を作成] をクリックします。
  3. 次の構成情報を提供してください。

    設定
    環境 第 2 世代
    関数名 dataminr-alert-collector
    リージョン GCS バケットと同じリージョンを選択します。
    トリガーのタイプ Cloud Pub/Sub
    Pub/Sub トピック dataminr-alert-trigger
    割り当てられたメモリ 512 MiB
    タイムアウト 540 秒
    ランタイム サービス アカウント dataminr-alert-collector
  4. [次へ] をクリックします。

  5. [ランタイム] を [Python 3.12] に設定します。

  6. [エントリ ポイント] を main に設定します。

  7. requirements.txt ファイルに次の依存関係を追加します。

    functions-framework==3.*
    google-cloud-storage==2.*
    requests==2.*
    
  8. 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
    
  9. [デプロイ] をクリックします。

  10. 関数がデプロイされるまで待ちます。デプロイが完了すると、ステータスが緑色のチェックマークに変わります。

環境変数を構成する

  1. 関数がデプロイされたら、Cloud Run functions > dataminr-alert-collector に移動します。
  2. [新しいリビジョンの編集とデプロイ] をクリックします。
  3. [変数とシークレット] タブをクリックします(または、第 1 世代の場合は [ランタイム、ビルド、接続、セキュリティの設定] を開きます)。
  4. 次の環境変数を追加します。

    キー 値の例
    GCS_BUCKET dataminr-alert-logs
    GCS_PREFIX dataminr_alerts
    STATE_KEY dataminr_state/cursor.json
    CLIENT_ID Dataminr の OAuth 2.0 クライアント ID
    CLIENT_SECRET Dataminr の OAuth 2.0 クライアント シークレット
    ALERT_LISTS Dataminr アラートリスト ID のカンマ区切りのリスト
    MAX_RECORDS 1000
    PAGE_SIZE 40
    LOOKBACK_HOURS 24
  5. [デプロイ] をクリックします。

Cloud Scheduler ジョブを作成する

Cloud Scheduler は、スケジュールに従って Pub/Sub トピックにメッセージをパブリッシュし、Cloud Run functions の関数をトリガーして、Dataminr Pulse で新しいアラートをポーリングします。

  1. Google Cloud コンソールで、[Cloud Scheduler] に移動します。
  2. [ジョブを作成] をクリックします。
  3. 次の構成情報を提供してください。

    設定
    名前 dataminr-alert-poll
    リージョン 関数と同じリージョンを選択します。
    周波数 */5 * * * *(5 分ごと)
    タイムゾーン タイムゾーンを選択します(例: UTC
  4. [続行] をクリックします。

  5. [実行を構成する] セクションで、次の操作を行います。

    • ターゲット タイプ: [Pub/Sub] を選択します。
    • トピック: dataminr-alert-trigger を選択します。
    • メッセージ本文: 「{"poll": true}」と入力します。
  6. [作成] をクリックします。

Cloud Run functions の関数を確認する

  1. Cloud Scheduler で、dataminr-alert-poll ジョブを見つけます。
  2. [強制実行] をクリックして、すぐに実行するようにトリガーします。
  3. [Cloud Run Functions] > [dataminr-alert-collector] > [ログ] に移動します。
  4. 次のようなログエントリを確認して、関数が正常に実行されたことを確認します。

    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
    
  5. [Cloud Storage] > [バケット] > [dataminr-alert-logs] に移動します。

  6. dataminr_alerts/ 接頭辞に移動します。

  7. Dataminr アラート データを含む NDJSON ファイルが作成されていることを確認します。

Google SecOps サービス アカウントを取得してフィードを構成する

Google SecOps は、一意のサービス アカウントを使用して GCS バケットからデータを読み取ります。このサービス アカウントにバケットへのアクセス権を付与する必要があります。

サービス アカウントのメールアドレスを取得する

  1. [SIEM 設定] > [フィード] に移動します。
  2. [Add New Feed] をクリックします。
  3. [単一フィードを設定] をクリックします。
  4. [フィード名] フィールドに、フィードの名前を入力します(例: Dataminr Alerts)。
  5. [ソースタイプ] として [Google Cloud Storage V2] を選択します。
  6. [ログタイプ] として [Dataminr Alerts] を選択します。
  7. [サービス アカウントを取得する] をクリックします。
  8. 一意のサービス アカウント メールアドレスが表示されます(例:)。

    chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com
    
  9. このメールアドレスをコピーして、次のセクションで使用します。

  10. [次へ] をクリックします。

  11. 次の入力パラメータの値を指定します。

    • ストレージ バケットの URL: 接頭辞パスを含む GCS バケット URI を入力します。

      gs://dataminr-alert-logs/dataminr_alerts/
      
    • Source deletion option: 必要に応じて削除オプションを選択します。

      • なし: 転送後にファイルを削除しません(テストにおすすめ)。
      • 転送されたファイルを削除する: 転送が完了した後にファイルを削除します。
      • 転送されたファイルと空のディレクトリを削除する: 転送が完了した後にファイルと空のディレクトリを削除します。

    • ファイルの最大経過日数: 指定した日数以内に変更されたファイルを含めます(デフォルトは 180 日)。

    • Asset namespace: アセットの名前空間

    • Ingestion labels: このフィードのイベントに適用されるラベル(DATAMINR_ALERT など)。

  12. [次へ] をクリックします。

  13. [Finalize] 画面で新しいフィードの設定を確認し、[送信] をクリックします。

Google SecOps サービス アカウントに IAM 権限を付与する

Google SecOps サービス アカウントには、GCS バケットに対する Storage オブジェクト閲覧者ロールが必要です。

  1. [Cloud Storage] > [バケット] に移動します。
  2. バケット名(dataminr-alert-logs など)をクリックします。
  3. [権限] タブに移動します。
  4. [アクセス権を付与] をクリックします。
  5. 次の構成の詳細を入力します。
    • プリンシパルを追加: Google SecOps サービス アカウントのメールアドレスを貼り付けます。
    • ロールを割り当てる: [Storage オブジェクト閲覧者] を選択します。
  6. [保存] をクリックします。

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 のプロフェッショナルから回答を得ることができます。