收集 Vectra XDR 日志

支持的平台:

本文档介绍了如何使用 Google Cloud Storage V2 将 Vectra XDR 日志注入到 Google Security Operations。

Vectra XDR 是一种扩展检测和响应平台,可关联网络、身份、云和 SaaS 环境中的威胁。Vectra AI Platform REST API v3 可让您以编程方式访问检测、评分、锁定、审核和健康状况日志。

准备工作

请确保满足以下前提条件:

  • Google SecOps 实例
  • 已启用 Cloud Storage API 的 GCP 项目
  • 创建和管理 GCS 存储分区的权限
  • 管理 GCS 存储分区的 IAM 政策的权限
  • 创建 Cloud Run 服务、Pub/Sub 主题和 Cloud Scheduler 作业的权限
  • 具有管理员权限的 Vectra AI 平台特权访问权限
  • 在 Vectra AI 平台中配置了客户端 ID 和客户端密钥的 API 客户端

创建 Google Cloud Storage 存储桶

  1. 前往 Google Cloud 控制台
  2. 选择您的项目或创建新项目。
  3. 在导航菜单中,依次前往 Cloud Storage > 存储分区
  4. 点击创建存储分区
  5. 提供以下配置详细信息:

    设置
    为存储桶命名 输入一个全局唯一的名称(例如 vectra-xdr-logs
    位置类型 根据您的需求进行选择(区域级、双区域、多区域)
    位置 选择营业地点(例如 us-central1
    存储类别 标准(建议用于经常访问的日志)
    访问权限控制 均匀(推荐)
    保护工具 可选:启用对象版本控制或保留政策
  6. 点击创建

收集 Vectra XDR API 凭据

创建 API 客户端

  1. 登录您的 Vectra AI Platform 实例(例如 https://your-tenant.vectra.ai)。
  2. 依次前往管理 > API 客户端
  3. 点击添加 API 客户端
  4. 输入 API 客户端的名称(例如 Google SecOps Integration)。
  5. 选择所需的角色(例如只读或具有检测和审核访问权限的自定义角色)。
  6. 点击生成凭据
  7. 复制以下详细信息并将其保存在安全的位置:

    • 客户端 ID:API 客户端 ID
    • 客户端密钥:API 客户端密钥

确定 API 基准网址

Vectra API 基准网址是您的租户网址:

格式 示例
租户网址 https://your-tenant.vectra.ai

测试 API 访问权限

  • 在继续进行集成之前,请先测试您的凭据:

    # Replace with your actual credentials
    VECTRA_CLIENT_ID="your-client-id"
    VECTRA_CLIENT_SECRET="your-client-secret"
    VECTRA_BASE_URL="https://your-tenant.vectra.ai"
    
    # Get access token using HTTP Basic Auth
    TOKEN=$(curl -s -X POST "${VECTRA_BASE_URL}/oauth2/token" \
      -u "${VECTRA_CLIENT_ID}:${VECTRA_CLIENT_SECRET}" \
      -H "Content-Type: application/x-www-form-urlencoded" \
      -d "grant_type=client_credentials" \
      | jq -r '.access_token')
    
    # Test API access - list detection events
    curl -s -X GET "${VECTRA_BASE_URL}/api/v3.4/events/detections/?limit=1" \
      -H "Authorization: Bearer ${TOKEN}"
    

为 Cloud Run 函数创建服务账号

Cloud Run 函数需要一个服务账号,该账号具有写入 GCS 存储桶的权限,并且可以由 Pub/Sub 调用。

创建服务账号

  1. GCP 控制台中,依次前往 IAM 和管理 > 服务账号
  2. 点击创建服务账号
  3. 提供以下配置详细信息:
    • 服务账号名称:输入 vectra-xdr-logs-collector-sa
    • 服务账号说明:输入 Service account for Cloud Run function to collect Vectra XDR logs
  4. 点击创建并继续
  5. 向此服务账号授予对项目的访问权限部分中,添加以下角色:
    1. 点击选择角色
    2. 搜索并选择 Storage Object Admin
    3. 点击 + 添加其他角色
    4. 搜索并选择 Cloud Run Invoker
    5. 点击 + 添加其他角色
    6. 搜索并选择 Cloud Functions Invoker
  6. 点击继续
  7. 点击完成

必须拥有这些角色,才能:

  • Storage Object Admin:将日志写入 GCS 存储桶并管理状态文件
  • Cloud Run Invoker:允许 Pub/Sub 调用函数
  • Cloud Functions Invoker:允许调用函数

授予对 GCS 存储桶的 IAM 权限

向服务账号授予对 GCS 存储桶的写入权限:

  1. 前往 Cloud Storage > 存储分区
  2. 点击您的存储桶名称(例如 vectra-xdr-logs)。
  3. 前往权限标签页。
  4. 点击授予访问权限
  5. 提供以下配置详细信息:
    • 添加主账号:输入服务账号电子邮件地址(例如 vectra-xdr-logs-collector-sa@PROJECT_ID.iam.gserviceaccount.com
    • 分配角色:选择 Storage Object Admin
  6. 点击保存

创建 Pub/Sub 主题

创建一个 Pub/Sub 主题,Cloud Scheduler 将向该主题发布消息,而 Cloud Run 函数将订阅该主题。

  1. GCP 控制台中,前往 Pub/Sub > 主题
  2. 点击创建主题
  3. 提供以下配置详细信息:
    • 主题 ID:输入 vectra-xdr-logs-trigger
    • 将其他设置保留为默认值
  4. 点击创建

创建 Cloud Run 函数以收集日志

Cloud Run 函数将由来自 Cloud Scheduler 的 Pub/Sub 消息触发,以从 Vectra AI Platform REST API 中提取日志并将其写入 GCS。

  1. GCP 控制台中,前往 Cloud Run
  2. 点击创建服务
  3. 选择函数(使用内嵌编辑器创建函数)。
  4. 配置部分中,提供以下配置详细信息:

    设置
    Service 名称 vectra-xdr-logs-collector
    区域 选择与您的 GCS 存储桶匹配的区域(例如 us-central1
    运行时 选择 Python 3.12 或更高版本
  5. 触发器(可选)部分中:

    1. 点击 + 添加触发器
    2. 选择 Cloud Pub/Sub
    3. 选择 Cloud Pub/Sub 主题部分,选择主题 vectra-xdr-logs-trigger
    4. 点击保存
  6. 身份验证部分中:

    1. 选择需要进行身份验证
    2. 检查 Identity and Access Management (IAM)
  7. 滚动到容器、网络、安全性并展开该部分。

  8. 前往安全性标签页:

    • 服务账号:选择服务账号 vectra-xdr-logs-collector-sa
  9. 前往容器标签页:

    1. 点击变量和密钥
    2. 为每个环境变量点击+ 添加变量

      变量名称 示例值 说明
      GCS_BUCKET vectra-xdr-logs GCS 存储桶名称
      GCS_PREFIX vectra 日志文件的前缀
      STATE_KEY vectra/state.json 状态文件路径
      VECTRA_CLIENT_ID your-client-id Vectra API 客户端 ID
      VECTRA_CLIENT_SECRET your-client-secret Vectra API 客户端密钥
      VECTRA_BASE_URL https://your-tenant.vectra.ai Vectra 租户网址
      MAX_RECORDS 5000 每次运行的记录数上限
      BATCH_SIZE 500 每个 API 请求的事件数(最多 1,000 个)
      LOOKBACK_HOURS 24 初始回溯期
  10. 变量和 Secret 部分中,滚动到请求

    • 请求超时:输入 600 秒(10 分钟)
  11. 前往设置标签页:

    • 资源部分中:
      • 内存:选择 512 MiB 或更高值
      • CPU:选择 1
  12. 修订版本伸缩部分中:

    • 实例数下限:输入 0
    • 实例数上限:输入 100(或根据预期负载进行调整)
  13. 点击创建

  14. 等待服务创建完成(1-2 分钟)。

  15. 创建服务后,系统会自动打开内嵌代码编辑器

添加函数代码

  1. 入口点字段中输入 main
  2. 在内嵌代码编辑器中,创建两个文件:

    • 第一个文件:main.py:

      import functions_framework
      from google.cloud import storage
      import base64
      import json
      import os
      import urllib3
      from datetime import datetime, timezone, timedelta
      import time
      
      # Initialize HTTP client with timeouts
      http = urllib3.PoolManager(
        timeout=urllib3.Timeout(connect=5.0, read=30.0),
        retries=False,
      )
      
      # Initialize Storage client
      storage_client = storage.Client()
      
      # Environment variables
      GCS_BUCKET = os.environ.get('GCS_BUCKET')
      GCS_PREFIX = os.environ.get('GCS_PREFIX', 'vectra')
      STATE_KEY = os.environ.get('STATE_KEY', 'vectra/state.json')
      VECTRA_CLIENT_ID = os.environ.get('VECTRA_CLIENT_ID')
      VECTRA_CLIENT_SECRET = os.environ.get('VECTRA_CLIENT_SECRET')
      VECTRA_BASE_URL = os.environ.get('VECTRA_BASE_URL')
      MAX_RECORDS = int(os.environ.get('MAX_RECORDS', '5000'))
      BATCH_SIZE = int(os.environ.get('BATCH_SIZE', '500'))
      LOOKBACK_HOURS = int(os.environ.get('LOOKBACK_HOURS', '24'))
      
      def get_access_token():
        """
        Obtain OAuth2 access token using HTTP Basic Auth
        with client credentials grant per Vectra API docs.
        """
        base_url = VECTRA_BASE_URL.rstrip('/')
        token_url = f"{base_url}/oauth2/token"
      
        credentials = base64.b64encode(
          f"{VECTRA_CLIENT_ID}:{VECTRA_CLIENT_SECRET}".encode()
        ).decode()
      
        headers = {
          'Content-Type': 'application/x-www-form-urlencoded',
          'Authorization': f'Basic {credentials}',
          'Accept': 'application/json'
        }
      
        body = 'grant_type=client_credentials'
      
        backoff = 1.0
        for attempt in range(3):
          response = http.request('POST', token_url, body=body, headers=headers)
      
          if response.status == 429:
            retry_after = int(response.headers.get('Retry-After', str(int(backoff))))
            print(f"Rate limited (429) on token request. Retrying after {retry_after}s...")
            time.sleep(retry_after)
            backoff = min(backoff * 2, 30.0)
            continue
      
          if response.status != 200:
            raise RuntimeError(f"Failed to get access token: {response.status} - {response.data.decode('utf-8')}")
      
          data = json.loads(response.data.decode('utf-8'))
          return data['access_token']
      
        raise RuntimeError("Failed to get access token after 3 retries")
      
      @functions_framework.cloud_event
      def main(cloud_event):
        """
        Cloud Run function triggered by Pub/Sub to fetch Vectra XDR
        detection and audit event logs and write to GCS.
        Uses the Vectra REST API v3.4 Events endpoints with
        checkpoint-based pagination.
        """
      
        if not all([GCS_BUCKET, VECTRA_CLIENT_ID, VECTRA_CLIENT_SECRET, VECTRA_BASE_URL]):
          print('Error: Missing required environment variables')
          return
      
        try:
          bucket = storage_client.bucket(GCS_BUCKET)
      
          # Load state (stores per-endpoint checkpoints)
          state = load_state(bucket, STATE_KEY)
      
          now = datetime.now(timezone.utc)
          token = get_access_token()
      
          # Fetch detection events and audit events
          all_records = []
          new_state = dict(state)
      
          for event_type in ['detections', 'audits']:
            checkpoint = state.get(f'{event_type}_checkpoint')
            last_time = state.get(f'{event_type}_last_time')
      
            # On first run, use lookback window
            start_time = None
            if not checkpoint and not last_time:
              start_time = now - timedelta(hours=LOOKBACK_HOURS)
      
            records, next_checkpoint = fetch_events(
              token=token,
              event_type=event_type,
              checkpoint=checkpoint,
              start_time=start_time,
              batch_size=BATCH_SIZE,
              max_records=MAX_RECORDS,
            )
            all_records.extend(records)
      
            # Save checkpoint for next run
            if next_checkpoint is not None:
              new_state[f'{event_type}_checkpoint'] = next_checkpoint
            new_state[f'{event_type}_last_time'] = now.isoformat()
      
          if not all_records:
            print("No new event records found.")
            save_state(bucket, STATE_KEY, new_state)
            return
      
          # Write to GCS as NDJSON
          timestamp = now.strftime('%Y%m%d_%H%M%S')
          object_key = f"{GCS_PREFIX}/logs_{timestamp}.ndjson"
          blob = bucket.blob(object_key)
      
          ndjson = '\n'.join(
            json.dumps(record, ensure_ascii=False) for record in all_records
          ) + '\n'
          blob.upload_from_string(ndjson, content_type='application/x-ndjson')
      
          print(f"Wrote {len(all_records)} records to gs://{GCS_BUCKET}/{object_key}")
      
          save_state(bucket, STATE_KEY, new_state)
          print(f"Successfully processed {len(all_records)} records")
      
        except Exception as e:
          print(f'Error processing logs: {str(e)}')
          raise
      
      def load_state(bucket, key):
        """Load state from GCS."""
        try:
          blob = bucket.blob(key)
          if blob.exists():
            return json.loads(blob.download_as_text())
        except Exception as e:
          print(f"Warning: Could not load state: {e}")
        return {}
      
      def save_state(bucket, key, state: dict):
        """Save state to GCS."""
        try:
          blob = bucket.blob(key)
          blob.upload_from_string(
            json.dumps(state, indent=2),
            content_type='application/json'
          )
          print(f"Saved state: {state}")
        except Exception as e:
          print(f"Warning: Could not save state: {e}")
      
      def fetch_events(token: str, event_type: str, checkpoint: int = None,
              start_time: datetime = None, batch_size: int = 500,
              max_records: int = 5000):
        """
        Fetch events from Vectra AI Platform REST API v3.4
        using checkpoint-based pagination.
      
        Endpoints:
          - /api/v3.4/events/detections/
          - /api/v3.4/events/audits/
      
        Args:
          token: OAuth2 access token
          event_type: 'detections' or 'audits'
          checkpoint: Resume from this event ID (from previous run)
          start_time: Only used on first run when no checkpoint exists
          batch_size: Number of events per request (max 1000)
          max_records: Maximum total events to fetch per run
      
        Returns:
          Tuple of (events list, next_checkpoint int or None)
        """
        base_url = VECTRA_BASE_URL.rstrip('/')
        endpoint = f"{base_url}/api/v3.4/events/{event_type}/"
      
        headers = {
          'Authorization': f'Bearer {token}',
          'Accept': 'application/json',
          'User-Agent': 'GoogleSecOps-VectraXDRCollector/1.0'
        }
      
        records = []
        batch_num = 0
        backoff = 1.0
        next_checkpoint = checkpoint
      
        while True:
          batch_num += 1
      
          if len(records) >= max_records:
            print(f"Reached max_records limit ({max_records}) for {event_type}")
            break
      
          # Build query parameters
          params = {
            'limit': min(batch_size, max_records - len(records)),
            'ordering': 'event_timestamp',
          }
      
          if next_checkpoint is not None:
            params['from'] = next_checkpoint
          elif start_time is not None:
            params['event_timestamp_gte'] = start_time.strftime('%Y-%m-%dT%H:%M:%SZ')
      
          # Include INFO detections (excluded by default in v3.4)
          if event_type == 'detections':
            params['include_info_category'] = 'true'
      
          query_string = '&'.join(f'{k}={v}' for k, v in params.items())
          url = f"{endpoint}?{query_string}"
      
          try:
            response = http.request('GET', url, headers=headers)
      
            if response.status == 429:
              retry_after = int(response.headers.get('Retry-After', str(int(backoff))))
              print(f"Rate limited (429). Retrying after {retry_after}s...")
              time.sleep(retry_after)
              backoff = min(backoff * 2, 30.0)
              continue
      
            backoff = 1.0
      
            if response.status != 200:
              print(f"HTTP {response.status}: {response.data.decode('utf-8')}")
              break
      
            data = json.loads(response.data.decode('utf-8'))
      
            events = data.get('events', [])
            remaining = data.get('remaining_count', 0)
            batch_checkpoint = data.get('next_checkpoint')
      
            if not events:
              print(f"No more events for {event_type}")
              break
      
            print(f"{event_type} batch {batch_num}: {len(events)} events, {remaining} remaining")
      
            # Tag events with source type
            for event in events:
              event['_vectra_event_type'] = event_type
      
            records.extend(events)
      
            # Update checkpoint for next batch/run
            if batch_checkpoint is not None:
              next_checkpoint = batch_checkpoint
      
            # No more events remaining
            if remaining == 0:
              print(f"All events fetched for {event_type}")
              break
      
          except Exception as e:
            print(f"Error fetching {event_type} events: {e}")
            break
      
        print(f"Retrieved {len(records)} total {event_type} events from {batch_num} batches")
        return records, next_checkpoint
      
    • 第二个文件:requirements.txt:

      functions-framework==3.*
      google-cloud-storage==2.*
      urllib3>=2.0.0
      
  3. 点击部署以保存并部署该函数。

  4. 等待部署完成(2-3 分钟)。

创建 Cloud Scheduler 作业

Cloud Scheduler 会定期向 Pub/Sub 主题发布消息,从而触发 Cloud Run 函数。

  1. GCP Console 中,前往 Cloud Scheduler
  2. 点击创建作业
  3. 提供以下配置详细信息:

    设置
    名称 vectra-xdr-logs-collector-hourly
    区域 选择与 Cloud Run 函数相同的区域
    频率 0 * * * *(每小时一次,整点时)
    时区 选择时区(建议选择世界协调时间 [UTC])
    目标类型 Pub/Sub
    主题 选择主题 vectra-xdr-logs-trigger
    消息正文 {}(空 JSON 对象)
  4. 点击创建

时间表频率选项

根据日志量和延迟时间要求选择频次:

频率 Cron 表达式 使用场景
每隔 5 分钟 */5 * * * * 大批量、低延迟
每隔 15 分钟 */15 * * * * 搜索量中等
每小时 0 * * * * 标准(推荐)
每 6 小时 0 */6 * * * 低成交量、批处理
每天 0 0 * * * 历史数据收集

测试集成

  1. Cloud Scheduler 控制台中,找到您的作业。
  2. 点击强制运行以手动触发作业。
  3. 等待几秒钟。
  4. 前往 Cloud Run > 服务
  5. 点击 vectra-xdr-logs-collector
  6. 点击日志标签页。
  7. 验证函数是否已成功执行。查找:

    detections batch 1: X events, Y remaining
    All events fetched for detections
    audits batch 1: X events, Y remaining
    All events fetched for audits
    Wrote X records to gs://vectra-xdr-logs/vectra/logs_YYYYMMDD_HHMMSS.ndjson
    Successfully processed X records
    
  8. 前往 Cloud Storage > 存储分区

  9. 点击您的存储桶名称 (vectra-xdr-logs)。

  10. 转到 vectra/ 文件夹。

  11. 验证是否已创建具有当前时间戳的新 .ndjson 文件。

如果您在日志中看到错误,请执行以下操作:

  • HTTP 401:检查环境变量中的客户端凭据
  • HTTP 403:验证 API 客户端是否在 Vectra AI 平台中拥有必需的权限
  • HTTP 429:速率限制 - 函数将自动重试并进行退避
  • 缺少环境变量:检查是否已设置所有必需的变量

在 Google SecOps 中配置 Feed 以注入 Vectra XDR 日志

  1. 依次前往 SIEM 设置 > Feed
  2. 点击添加新 Feed
  3. 点击配置单个 Feed
  4. Feed 名称字段中,输入 Feed 的名称(例如 Vectra XDR Logs)。
  5. 选择 Google Cloud Storage V2 作为来源类型
  6. 选择 Vectra XDR 作为日志类型
  7. 点击获取服务账号。系统会显示一个唯一的服务账号电子邮件地址,例如:

    chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com
    
  8. 复制此电子邮件地址。

  9. 点击下一步

  10. 为以下输入参数指定值:

    • 存储桶网址:输入带有前缀路径的 GCS 存储桶 URI:

      gs://vectra-xdr-logs/vectra/
      
      • 替换:
        • vectra-xdr-logs:您的 GCS 存储桶名称。
        • vectra:存储日志的可选前缀/文件夹路径(留空表示根目录)。
    • 来源删除选项:根据您的偏好选择删除选项:

      • 永不:转移后永不删除任何文件(建议用于测试)。
      • 删除已转移的文件:在成功转移后删除文件。
      • 删除已转移的文件和空目录:成功转移后删除文件和空目录。

    • 文件存在时间上限:包含在过去指定天数内修改的文件(默认值为 180 天)

    • 资产命名空间资产命名空间

    • 注入标签:要应用于此 Feed 中事件的标签

  11. 点击下一步

  12. 最终确定界面中查看新的 Feed 配置,然后点击提交

向 Google SecOps 服务账号授予 IAM 权限

Google SecOps 服务账号需要您的 GCS 存储桶的 Storage Object Viewer 角色。

  1. 前往 Cloud Storage > 存储分区
  2. 点击您的存储桶名称。
  3. 前往权限标签页。
  4. 点击授予访问权限
  5. 提供以下配置详细信息:
    • 添加主账号:粘贴 Google SecOps 服务账号电子邮件地址
    • 分配角色:选择 Storage Object Viewer
  6. 点击保存

UDM 映射表

日志字段 UDM 映射 逻辑
log_type_lable、id_label、triaged_label、detail_label、properties_label、event_object_label additional.fields 根据日志类型与各种标签合并
msg, d_type_vname extensions.auth.auth_details 对于 USER_LOGIN,设置为 msg;对于其他用户登录,设置为 d_type_vname
d_type_vname、category、type、msg metadata.event_type 最初设置为 GENERIC_EVENT;根据日志类型和条件替换为特定类型
d_type_vname、category、type、event_action metadata.product_event_type 在检测中设置为 d_type_vname,在评分中设置为 category,在锁定中设置为 type,在审核中设置为 event_action
detection_id, id metadata.product_log_id 设置为“检测”中的 detection_id、“锁定和审核”中的 id
版本、system.version.vectra_version metadata.product_version 在“审核”中设置为版本,在“健康”中设置为 system.version.vectra_version
_sensor.serial_number observer.asset_id 直接复制值
_sensor.name observer.hostname 直接复制值
_sensor.ip_address observer.ip 直接复制值
_sensor.location observer.location.name 直接复制值
entity_id principal.asset_id 直接复制的值,如果未以英文冒号分隔,则添加“Vectra:”前缀
entity_uid principal.hostname 如果匹配模式,则直接复制值
src_ip、source_ip principal.ip 如果 src_ip 是有效的 IP,则从检测中的 src_ip 设置;如果 source_ip 是有效的 IP,则从审核中的 source_ip 设置
var_entity_uid、var_username、var_api_client_id、var_user_type、var_entity_name principal.user.attribute.labels 根据日志类型与各种 var_ 合并
user_role principal.user.attribute.roles 直接复制值
entity_uid、name、entity_name、username principal.user.email_addresses 如果为电子邮件地址格式,则在检测中从 entity_uid 设置,在评分中从名称设置,在锁定中从 entity_name 设置,在审核中从用户名设置
locked_by principal.user.user_display_name 直接复制值
entity_id、user_id principal.user.userid 在检测/评分/锁定中,设置为 entity_id;在审核中,设置为 user_id
result_status security_result.action 如果成功,则设置为 ALLOW;如果失败,则设置为 FAIL
result_status security_result.action_details 直接复制值
斜接 security_result.attack_details.techniques 从斜接数组合并
类别 security_result.category 根据对“命令和控制”“僵尸网络活动”等的正则表达式匹配结果,映射到 category_temp。
类别 security_result.category_details 直接复制值
确定性 security_result.confidence_score 转换为浮点数
urgency_reason, msg security_result.description 在 Scoring 中设置为 urgency_reason,在 Audit 中设置为 msg
var_type、var_detection_type、var_triaged、var_id、var_active_detection_types、var_breadth_contrib、var_attack_rating、var_importance、var_last_detection_id、var_last_detection_type、var_last_detection_url、var_urgency_score、var_velocity_contrib、unlock_event_timestamp_label、var_detection_updated_at、var_sensor_connectivity_sensors_error、var_connectivity_sensors_affected_metadata_hours、var_connectivity_sensors_status、var_connectivity_updated_at、var_cpu_idle_percent、var_cpu_nice_percent、var_cpu_system_percent、var_cpu_updated_at、var_cpu_user_percent、var_disk_disk_utilization_free_bytes、var_disk_raid_disks_missing_output_label、var_disk_raid_disks_missing_error、var_disk_raid_disks_missing_status、var_disk_degraded_raid_volume_output、var_disk_degraded_raid_volume_error、var_disk_degraded_raid_volume_status、var_disk_disk_raid_error、var_disk_disk_raid_status、var_disk_disk_raid_output、var_disk_disk_utilization_total_bytes、var_disk_disk_utilization_usage_percent、var_disk_disk_utilization_used_bytes、var_disk_updated_at、var_hostid_artifact_counts_arsenic、var_hostid_artifact_counts_carbon_black、var_hostid_artifact_counts_cb_cloud、var_hostid_artifact_counts_clear_state、var_hostid_artifact_counts_cookie、var_hostid_artifact_counts_crowdstrike、var_hostid_artifact_counts_cybereason、var_hostid_artifact_counts_dhcp、var_hostid_artifact_counts_dns、var_hostid_artifact_counts_end_time、var_hostid_artifact_counts_fireeye、var_hostid_artifact_counts_generic_edr、var_hostid_artifact_counts_idle_end、var_hostid_artifact_counts_idle_start、var_hostid_artifact_counts_invalid、var_hostid_artifact_counts_kerberos_user、var_hostid_artifact_counts_kerberos、var_hostid_artifact_counts_mdns、var_hostid_artifact_counts_netbios、var_hostid_artifact_counts_proxy_ip、var_hostid_artifact_counts_rdns、var_hostid_artifact_counts_sentinelone、var_hostid_artifact_counts_split、var_hostid_artifact_counts_src_port、var_hostid_artifact_counts_static_ip、var_hostid_artifact_counts_TestEDR、var_hostid_artifact_counts_total、var_hostid_artifact_counts_uagent、var_hostid_artifact_counts_vmachine_info、var_hostid_artifact_counts_windows_defender、var_hostid_artifact_counts_zpa_user、var_hostid_ip_always_percent、var_hostid_ip_never_percent、var_hostid_ip_sometimes_percent、var_hostid_updated_at、var_dimm_stat_dimm、var_dimm_stat_status、var_memory_free_bytes、var_memory_total_bytes、var_memory_updated_at、var_memory_usage_percent、var_memory_used_bytes、network_interfaces_brain_label、var_network_interfaces_sensors_w4ftj0a8_eth0_link、var_network_traffic_brain_aggregated_peak_traffic_mbps、var_network_traffic_brain_interface_peak_traffic_label、var_network_traffic_sensors_edr_sensor_aggregated_peak_traffic_mbps、var_sensor_interface_peak_traffic_eth0_peak_traffic_mbps、var_network_updated_at、var_network_vlans_count、var_network_vlans_vlan_ids、var_power_error、var_power_status、var_power_updated_at、var_power_power_supply、var_sensors_headend_uri、var_sensors_id、var_sensors_last_seen、var_sensors_luid、var_sensors_mode、var_sensors_original_version、var_sensors_product_name、var_sensors_public_key、var_sensors_ssh_tunnel_port、var_sensors_status、var_sensors_update_count、var_sensors_version、var_trafficdrop_sensors_error、var_trafficdrop_sensors_ip_address、var_trafficdrop_sensors_luid、var_trafficdrop_sensors_name、var_trafficdrop_sensors_output_end、var_trafficdrop_sensors_output_interface_cutoff、var_trafficdrop_sensors_output_start、var_trafficdrop_sensors_output_interface_baseline、var_trafficdrop_sensors_output_interface_name、var_trafficdrop_sensors_output_interface_traffic、var_trafficdrop_sensors_serial_number、var_trafficdrop_sensors_status、var_trafficdrop_updated_at security_result.detection_fields 根据日志类型与各种 var_ 和标签合并
is_prioritized security_result.priority 如果为 true,则设置为 HIGH;如果为 false,则设置为 LOW
is_prioritized security_result.priority_details 直接复制值
威胁 security_result.risk_score 转换为浮点数
和程度上减少 security_result.severity 如果匹配 (?i)high,则设置为 HIGH;如果匹配 (?i)medium,则设置为 MEDIUM;如果匹配 (?i)low,则设置为 LOW
和程度上减少 security_result.severity_details 直接复制值
detection_href、url security_result.url_back_to_product 在 Detection 中设置为 detection_href,在 Scoring 中设置为网址
entity_id target.asset_id 直接复制的值,如果未以英文冒号分隔,则添加“Vectra:”前缀
entity_name、name target.hostname 如果不是 IP,则从锁定中的 entity_name 设置,从评分中的名称设置
target_ip_temp target.ip 直接复制值
lock_event_timestamp target.user.account_lockout_time 从字符串转换为时间戳
var_entity_name target.user.attribute.labels 已与 var_entity_name 合并
name, entity_name target.user.email_addresses 如果电子邮件模式,则在评分中设置发件人名称;如果电子邮件模式,则在锁定中设置实体名称
entity_id target.user.userid 直接复制值
metadata.product_name 设置为“XDR”
metadata.vendor_name 设置为“Vectra”
entity_uid principal.macprincipal.ip 从变更日志映射

更新日志

查看相应解析器的更改日志

需要更多帮助?获得社区成员和 Google SecOps 专业人士的解答。