收集 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. 点击 Add API Credentials(添加 API 凭据)。
  4. 门户网站会显示添加 API 凭据对话框,其中包含自动生成的用户名和密码。
  5. 复制并妥善保存用户名和密码。

  6. 选择 API Expiry(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 主题

创建一个 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 function。

  1. 在 GCP 控制台中,前往 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 字段的值
when 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
application_name" from "cs_uri_path target.application 从更新日志映射
device_time" and "log_time metadata.event_timestamp 从更新日志映射
device_name target.hostname 从更新日志映射
product_data.x-client-device-id" and "device_id target.resource.product_object_id 从更新日志映射
connection.protocol_version tls.version 从更新日志映射

更新日志

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

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