收集 Symantec Web Security Service (WSS) 日志

支持的平台:

本文档介绍了如何使用 Google Cloud Storage 将 Symantec Web Security Service (WSS) 日志提取到 Google Security Operations。解析器首先尝试将日志消息解析为 JSON。如果失败,它会使用一系列越来越具体的 grok 模式从原始文本中提取字段,最终将提取的数据映射到统一数据模型 (UDM)。Symantec Web Security Service (WSS) 是一种基于云的网络安全解决方案,可针对基于网络的威胁(包括恶意软件、钓鱼式攻击和数据丢失)提供实时保护。

准备工作

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

  • Google SecOps 实例
  • 已启用 Cloud Storage API 的 GCP 项目
  • 创建和管理 GCS 存储分区的权限
  • 管理 GCS 存储分区的 IAM 政策的权限
  • 创建 Cloud Run 服务、Pub/Sub 主题和 Cloud Scheduler 作业的权限
  • 对 Symantec Web Security Service 门户网站的特权访问权限

收集 Symantec WSS API 凭据

获取 Symantec WSS 网站网址

  1. 登录 Symantec Web Security Service 门户网站。
  2. 记下浏览器地址栏中的门户网址。
    • 格式:https://portal.threatpulse.com 或您组织专用的网址
    • 示例:如果您通过 https://portal.threatpulse.com/reportpod 访问 WSS,则您的网站网址为 https://portal.threatpulse.com

创建 API 凭据

  1. 以管理员身份登录 Symantec Web Security Service 门户网站
  2. 前往账号 > API 凭据
  3. 点击添加 API 凭据
  4. 门户会显示“添加 API 凭据”对话框,其中包含自动生成的用户名密码
  5. 复制并妥善保存用户名密码

  6. 选择 API 过期选项:

    • 基于时间:定义此令牌的到期日期和时间。
    • 永不过期:令牌将无限期保持有效(建议在生产环境中使用)。
  7. 对于访问选项,选择报告访问日志

  8. 点击保存

验证权限

如需验证账号是否具有所需权限,请执行以下操作:

  1. 登录 Symantec Web Security Service 门户网站
  2. 前往账号 > API 凭据
  3. 如果您能看到自己创建的 API 凭据,且访问权限设置为报告访问日志,则表示您拥有所需的权限。
  4. 如果您看不到此选项,请与您的管理员联系,以获取报告访问日志权限。

测试 API 访问权限

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

    # Replace with your actual credentials
    WSS_USERNAME="your-api-username"
    WSS_PASSWORD="your-api-password"
    WSS_SYNC_URL="https://portal.threatpulse.com/reportpod/logs/sync"
    
    # Test API access (note: sync endpoint requires time parameters)
    curl -v -H "X-APIUsername: ${WSS_USERNAME}" \
      -H "X-APIPassword: ${WSS_PASSWORD}" \
      "${WSS_SYNC_URL}?startDate=0&endDate=1000&token=none"
    

预期响应:HTTP 200,包含日志数据;如果时间范围内没有日志,则为空响应。

创建 Google Cloud Storage 存储分区

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

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

为 Cloud Run 函数创建服务账号

Cloud Run 函数需要一个服务账号,该账号具有向 GCS 存储分区写入内容以及被 Pub/Sub 调用的权限。

创建服务账号

  1. GCP 控制台中,依次前往 IAM 和管理 > 服务账号
  2. 点击创建服务账号
  3. 提供以下配置详细信息:
    • 服务账号名称:输入 symantec-wss-collector-sa
    • 服务账号说明:输入 Service account for Cloud Run function to collect Symantec WSS 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. 点击您的存储分区名称。
  3. 前往权限标签页。
  4. 点击授予访问权限
  5. 提供以下配置详细信息:
    • 添加主账号:输入服务账号电子邮件地址(例如 symantec-wss-collector-sa@PROJECT_ID.iam.gserviceaccount.com)。
    • 分配角色:选择 Storage Object Admin
  6. 点击保存

创建发布/订阅主题

创建一个 Pub/Sub 主题,供 Cloud Scheduler 发布消息,并供 Cloud Run 函数订阅。

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

创建 Cloud Run 函数以收集日志

Cloud Run 函数由来自 Cloud Scheduler 的 Pub/Sub 消息触发,用于从 Symantec WSS Sync API 中提取日志并将其写入 GCS。

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

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

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

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

  8. 前往安全标签页:

    • 服务账号:选择服务账号 (symantec-wss-collector-sa)。
  9. 前往容器标签页:

    1. 点击变量和密钥
    2. 为每个环境变量点击 + 添加变量
    变量名称 示例值 说明
    GCS_BUCKET symantec-wss-logs GCS 存储分区名称
    GCS_PREFIX symantec/wss/ 日志文件的前缀
    STATE_KEY symantec/wss/state.json 状态文件路径
    WINDOW_SECONDS 3600 时间窗口(以秒为单位)(1 小时)
    HTTP_TIMEOUT 60 HTTP 请求超时时间(以秒为单位)
    MAX_RETRIES 3 重试次数上限
    USER_AGENT symantec-wss-to-gcs/1.0 用户代理字符串
    WSS_SYNC_URL https://portal.threatpulse.com/reportpod/logs/sync WSS 同步 API 端点
    WSS_API_USERNAME your-api-username(来自 API 凭据) WSS API 用户名
    WSS_API_PASSWORD your-api-password(来自 API 凭据) WSS API 密码
    WSS_TOKEN_PARAM none 同步 API 的令牌参数
  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 json
    import os
    import urllib3
    from datetime import datetime, timezone
    import uuid
    import time
    
    # Initialize HTTP client with timeouts
    http = urllib3.PoolManager(
        timeout=urllib3.Timeout(connect=5.0, read=60.0),
        retries=False,
    )
    
    # Initialize Storage client
    storage_client = storage.Client()
    
    @functions_framework.cloud_event
    def main(cloud_event):
        """
        Cloud Run function triggered by Pub/Sub to fetch logs from Symantec WSS Sync API and write to GCS.
    
        Args:
            cloud_event: CloudEvent object containing Pub/Sub message
        """
    
        # Get environment variables
        bucket_name = os.environ.get('GCS_BUCKET')
        prefix = os.environ.get('GCS_PREFIX', 'symantec/wss/')
        state_key = os.environ.get('STATE_KEY', 'symantec/wss/state.json')
        window_sec = int(os.environ.get('WINDOW_SECONDS', '3600'))
        http_timeout = int(os.environ.get('HTTP_TIMEOUT', '60'))
        max_retries = int(os.environ.get('MAX_RETRIES', '3'))
        user_agent = os.environ.get('USER_AGENT', 'symantec-wss-to-gcs/1.0')
        wss_sync_url = os.environ.get('WSS_SYNC_URL', 'https://portal.threatpulse.com/reportpod/logs/sync')
        api_username = os.environ.get('WSS_API_USERNAME')
        api_password = os.environ.get('WSS_API_PASSWORD')
        token_param = os.environ.get('WSS_TOKEN_PARAM', 'none')
    
        if not all([bucket_name, api_username, api_password]):
            print('Error: Missing required environment variables')
            return
    
        try:
            # Get GCS bucket
            bucket = storage_client.bucket(bucket_name)
    
            # Load state (last processed timestamp)
            state = load_state(bucket, state_key)
            now = datetime.now(timezone.utc).timestamp()
            from_ts = float(state.get('last_to_ts', now - window_sec))
            to_ts = now
    
            # Convert to milliseconds for WSS API
            start_ms = int(from_ts * 1000)
            end_ms = int(to_ts * 1000)
    
            print(f'Fetching Symantec WSS logs from {start_ms} to {end_ms}')
    
            # Fetch logs from WSS Sync API
            blob_data, content_type, content_encoding = fetch_wss_logs(
                wss_sync_url, api_username, api_password, token_param,
                start_ms, end_ms, user_agent, http_timeout, max_retries
            )
    
            print(f'Retrieved {len(blob_data)} bytes with content-type: {content_type}')
            if content_encoding:
                print(f'Content encoding: {content_encoding}')
    
            # Write to GCS
            if blob_data:
                blob_name = write_wss_data(
                    bucket, prefix, blob_data, content_type, content_encoding, from_ts, to_ts
                )
                print(f'Wrote logs to {blob_name}')
    
            # Update state
            save_state(bucket, state_key, {
                'last_to_ts': to_ts,
                'last_successful_run': now
            })
    
            print(f'Successfully processed logs up to {to_ts}')
    
        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():
                state_data = blob.download_as_text()
                return json.loads(state_data)
        except Exception as e:
            print(f'Warning: Could not load state: {str(e)}')
        return {}
    
    def save_state(bucket, key, state):
        """Save state to GCS."""
        try:
            blob = bucket.blob(key)
            blob.upload_from_string(
                json.dumps(state, separators=(',', ':')),
                content_type='application/json'
            )
        except Exception as e:
            print(f'Warning: Could not save state: {str(e)}')
    
    def fetch_wss_logs(sync_url, username, password, token, start_ms, end_ms, user_agent, timeout, max_retries):
        """Fetch logs from WSS Sync API with retry logic using custom HTTP headers."""
        params = f"startDate={start_ms}&endDate={end_ms}&token={token}"
        url = f"{sync_url}?{params}"
    
        attempt = 0
        backoff = 1.0
    
        while True:
            try:
                headers = {
                    'User-Agent': user_agent,
                    'X-APIUsername': username,
                    'X-APIPassword': password
                }
    
                response = http.request('GET', url, headers=headers, timeout=timeout)
    
                # Handle rate limiting with exponential backoff
                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:
                    content_type = response.headers.get('Content-Type', 'application/octet-stream')
                    content_encoding = response.headers.get('Content-Encoding', '')
                    return response.data, content_type, content_encoding
                else:
                    raise Exception(f'HTTP {response.status}: {response.data.decode("utf-8", errors="ignore")}')
    
            except Exception as e:
                attempt += 1
                print(f'HTTP error on attempt {attempt}: {e}')
                if attempt > max_retries:
                    raise
                # Exponential backoff with jitter
                time.sleep(min(60, 2 ** attempt) + (time.time() % 1))
    
    def determine_extension(content_type, content_encoding):
        """Determine file extension based on content type and encoding."""
        if 'zip' in content_type.lower():
            return '.zip'
        if 'gzip' in content_type.lower() or content_encoding.lower() == 'gzip':
            return '.gz'
        if 'json' in content_type.lower():
            return '.json'
        if 'csv' in content_type.lower():
            return '.csv'
        return '.bin'
    
    def write_wss_data(bucket, prefix, blob_data, content_type, content_encoding, from_ts, to_ts):
        """Write WSS data to GCS with unique key."""
        ts_path = datetime.fromtimestamp(to_ts, tz=timezone.utc).strftime('%Y/%m/%d')
        uniq = f"{int(time.time() * 1e6)}_{uuid.uuid4().hex[:8]}"
        ext = determine_extension(content_type, content_encoding)
        blob_name = f"{prefix}{ts_path}/symantec_wss_{int(from_ts)}_{int(to_ts)}_{uniq}{ext}"
    
        blob = bucket.blob(blob_name)
        blob.upload_from_string(
            blob_data,
            content_type=content_type
        )
    
        # Set metadata
        blob.metadata = {
            'source': 'symantec-wss',
            'from_timestamp': str(int(from_ts)),
            'to_timestamp': str(int(to_ts)),
            'content_encoding': content_encoding
        }
        blob.patch()
    
        return blob_name
    
    • 第二个文件: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. 提供以下配置详细信息:

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

时间表频率选项

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

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

测试集成

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

    Fetching Symantec WSS logs from [start_ms] to [end_ms]
    Retrieved X bytes with content-type: [type]
    Wrote logs to symantec/wss/YYYY/MM/DD/symantec_wss_[timestamps].[ext]
    Successfully processed logs up to [timestamp]
    
  8. 前往 Cloud Storage > 存储分区

  9. 点击您的存储分区名称。

  10. 前往前缀文件夹 (symantec/wss/)。

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

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

  • HTTP 401:检查环境变量中的 API 凭据。验证用户名和密码是否正确。
  • HTTP 403:验证 API 凭据是否已在 WSS 门户中启用“报告访问日志”权限。
  • HTTP 429:速率限制 - 函数将自动重试并进行退避。
  • 缺少环境变量:检查是否已在 Cloud Run 函数配置中设置所有必需的变量。

检索 Google SecOps 服务账号

Google SecOps 使用唯一的服务账号从您的 GCS 存储分区中读取数据。您必须授予此服务账号对您的存储分区的访问权限。

获取服务账号电子邮件地址

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

    chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com
    
  8. 复制此电子邮件地址,以便在下一步中使用。

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

Google SecOps 服务账号需要对您的 GCS 存储分区具有 Storage Object Viewer 角色。

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

在 Google SecOps 中配置 Feed 以注入 Symantec WSS 日志

  1. 依次前往 SIEM 设置 > Feed
  2. 点击添加新 Feed
  3. 点击配置单个 Feed
  4. Feed 名称字段中,输入 Feed 的名称(例如 Symantec WSS logs)。
  5. 选择 Google Cloud Storage V2 作为来源类型
  6. 选择 Symantec WSS 作为日志类型
  7. 点击下一步
  8. 为以下输入参数指定值:

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

      gs://symantec-wss-logs/symantec/wss/
      
        • symantec-wss-logs:您的 GCS 存储分区名称。
        • symantec/wss/:存储日志的可选前缀/文件夹路径(留空表示根目录)。
      • 示例

        • 根存储分区:gs://company-logs/
        • 带前缀:gs://company-logs/symantec-wss/
        • 使用子文件夹:gs://company-logs/symantec/wss/
    • 来源删除选项:根据您的偏好选择删除选项:

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

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

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

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

  9. 点击下一步

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

UDM 映射表

日志字段 UDM 映射 逻辑
category_id read_only_udm.metadata.product_event_type 如果 category_id 为 1,则 read_only_udm.metadata.product_event_type 设置为“Security”。如果 category_id 为 5,则 read_only_udm.metadata.product_event_type 设置为 Policy
collector_device_ip read_only_udm.principal.ip, read_only_udm.principal.asset.ip collector_device_ip 字段的值
connection.bytes_download read_only_udm.network.received_bytes connection.bytes_download 字段的值转换为整数
connection.bytes_upload read_only_udm.network.sent_bytes connection.bytes_upload 字段的值转换为整数
connection.dst_ip read_only_udm.target.ip connection.dst_ip 字段的值
connection.dst_location.country read_only_udm.target.location.country_or_region connection.dst_location.country 字段的值
connection.dst_name read_only_udm.target.hostname connection.dst_name 字段的值
connection.dst_port read_only_udm.target.port connection.dst_port 字段的值转换为整数
connection.http_status read_only_udm.network.http.response_code 将 connection.http_status 字段的值转换为整数
connection.http_user_agent read_only_udm.network.http.user_agent connection.http_user_agent 字段的值
connection.src_ip read_only_udm.principal.ip、read_only_udm.src.ip connection.src_ip 字段的值。如果 src_ip 或 collector_device_ip 不为空,则会映射到 read_only_udm.src.ip
connection.tls.version read_only_udm.network.tls.version_protocol connection.tls.version 字段的值
connection.url.host read_only_udm.target.hostname connection.url.host 字段的值
connection.url.method read_only_udm.network.http.method connection.url.method 字段的值
connection.url.path read_only_udm.target.url connection.url.path 字段的值
connection.url.text read_only_udm.target.url connection.url.text 字段的值
cs_connection_negotiated_cipher read_only_udm.network.tls.cipher cs_connection_negotiated_cipher 字段的值
cs_icap_status read_only_udm.security_result.description cs_icap_status 字段的值
device_id read_only_udm.target.resource.id, read_only_udm.target.resource.product_object_id device_id 字段的值
device_ip read_only_udm.intermediary.ip, read_only_udm.intermediary.asset.ip device_ip 字段的值
device_time read_only_udm.metadata.collected_timestamp, read_only_udm.metadata.event_timestamp 转换为字符串的 device_time 字段的值。如果 when 为空,则映射到 read_only_udm.metadata.event_timestamp
主机名 read_only_udm.principal.hostname, read_only_udm.principal.asset.hostname 主机名字段的值
log_time read_only_udm.metadata.event_timestamp log_time 字段的值已转换为时间戳。如果 when 和 device_time 为空,则映射到 read_only_udm.metadata.event_timestamp
msg_desc read_only_udm.metadata.description msg_desc 字段的值
os_details read_only_udm.target.asset.platform_software.platform, read_only_udm.target.asset.platform_software.platform_version os_details 字段的值。如果 os_details 不为空,则会对其进行解析以提取 os_name 和 os_ver。如果 os_name 包含 Windows,则将 read_only_udm.target.asset.platform_software.platform 设置为 WINDOWS。os_ver 映射到 read_only_udm.target.asset.platform_software.platform_version
product_data.cs(Referer) read_only_udm.network.http.referral_url product_data.cs(Referer) 字段的值
product_data.r-supplier-country read_only_udm.principal.location.country_or_region product_data.r-supplier-country 字段的值
product_data.s-supplier-ip read_only_udm.intermediary.ip, read_only_udm.intermediary.asset.ip product_data.s-supplier-ip 字段的值
product_data.x-bluecoat-application-name read_only_udm.target.application product_data.x-bluecoat-application-name 字段的值
product_data.x-bluecoat-transaction-uuid read_only_udm.metadata.product_log_id product_data.x-bluecoat-transaction-uuid 字段的值
product_data.x-client-agent-sw read_only_udm.observer.platform_version product_data.x-client-agent-sw 字段的值
product_data.x-client-agent-type read_only_udm.observer.application product_data.x-client-agent-type 字段的值
product_data.x-client-device-id read_only_udm.target.resource.type, read_only_udm.target.resource.id, read_only_udm.target.resource.product_object_id 如果不为空,则将 read_only_udm.target.resource.type 设置为 DEVICE。product_data.x-client-device-id 字段的值会映射到 read_only_udm.target.resource.id 和 read_only_udm.target.resource.product_object_id
product_data.x-client-device-name read_only_udm.src.hostname、read_only_udm.src.asset.hostname product_data.x-client-device-name 字段的值
product_data.x-cs-client-ip-country read_only_udm.target.location.country_or_region product_data.x-cs-client-ip-country 字段的值
product_data.x-cs-connection-negotiated-cipher read_only_udm.network.tls.cipher product_data.x-cs-connection-negotiated-cipher 字段的值
product_data.x-cs-connection-negotiated-ssl-version read_only_udm.network.tls.version_protocol product_data.x-cs-connection-negotiated-ssl-version 字段的值
product_data.x-exception-id read_only_udm.security_result.summary product_data.x-exception-id 字段的值
product_data.x-rs-certificate-hostname read_only_udm.network.tls.client.server_name product_data.x-rs-certificate-hostname 字段的值
product_data.x-rs-certificate-hostname-categories read_only_udm.security_result.category_details product_data.x-rs-certificate-hostname-categories 字段的值
product_data.x-rs-certificate-observed-errors read_only_udm.network.tls.server.certificate.issuer product_data.x-rs-certificate-observed-errors 字段的值
product_data.x-rs-certificate-validate-status read_only_udm.network.tls.server.certificate.subject product_data.x-rs-certificate-validate-status 字段的值
product_name read_only_udm.metadata.product_name product_name 字段的值
product_ver read_only_udm.metadata.product_version product_ver 字段的值
proxy_connection.src_ip read_only_udm.intermediary.ip, read_only_udm.intermediary.asset.ip proxy_connection.src_ip 字段的值
received_bytes read_only_udm.network.received_bytes received_bytes 字段的值已转换为整数
ref_uid read_only_udm.metadata.product_log_id ref_uid 字段的值
s_action read_only_udm.metadata.description s_action 字段的值
sent_bytes read_only_udm.network.sent_bytes 将 sent_bytes 字段的值转换为整数
severity_id read_only_udm.security_result.severity 如果 severity_id 为 1 或 2,则将 read_only_udm.security_result.severity 设置为 LOW。如果 severity_id 为 3 或 4,则将 read_only_udm.security_result.severity 设置为 MEDIUM。如果 severity_id 为 5 或 6,则将 read_only_udm.security_result.severity 设置为 HIGH
supplier_country read_only_udm.principal.location.country_or_region supplier_country 字段的值
target_ip read_only_udm.target.ip, read_only_udm.target.asset.ip target_ip 字段的值
user.full_name read_only_udm.principal.user.user_display_name user.full_name 字段的值
user.name read_only_udm.principal.user.user_display_name user.name 字段的值
user_name read_only_udm.principal.user.user_display_name user_name 字段的值
uuid read_only_udm.metadata.product_log_id UUID 字段的值
什么时候 read_only_udm.metadata.event_timestamp 字段转换为时间戳时的值
read_only_udm.metadata.event_type 如果主机名为空,但 connection.dst_ip 不为空,则设置为 NETWORK_UNCATEGORIZED。如果主机名不为空,则设置为 SCAN_NETWORK。如果 has_principal 和 has_target 为 true,则设置为 NETWORK_CONNECTION。如果 has_principal 为 true 且 has_target 为 false,则设置为 STATUS_UPDATE。如果 has_principal 和 has_target 均为 false,则设置为 GENERIC_EVENT
read_only_udm.metadata.log_type 始终设置为 SYMANTEC_WSS
read_only_udm.metadata.vendor_name 始终设置为 SYMANTEC
read_only_udm.security_result.action 如果 product_data.sc-filter_result 为 OBSERVED 或 PROXIED,则设置为 ALLOW。如果 product_data.sc-filter_result 为 DENIED,则设置为 BLOCK
read_only_udm.security_result.action_details product_data.sc-filter_result 字段的值
read_only_udm.target.resource.type 如果 product_data.x-client-device-id 不为空,则设置为 DEVICE

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