收集 Cisco Catalyst SD-WAN Manager 日志

解析器版本:7.0

支持的平台:

本文档介绍了如何使用 Google Cloud Storage 将 Cisco Catalyst SD-WAN Manager(以前称为 vManage)日志注入到 Google Security Operations。Cisco Catalyst SD-WAN Manager 是一种集中式网络管理系统,可提供对 SD-WAN 结构的可见性和控制,使管理员能够监控网络性能、配置政策以及管理分布式企业网络中的安全性。

准备工作

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

  • Google SecOps 实例
  • 已启用 Cloud Storage API 的 GCP 项目
  • 创建和管理 GCS 存储分区的权限
  • 管理 GCS 存储分区的 IAM 政策的权限
  • 创建 Cloud Run 服务、Pub/Sub 主题和 Cloud Scheduler 作业的权限
  • 对 Cisco Catalyst SD-WAN Manager 管理控制台的特权访问权限
  • 具有 API 访问权限的 Cisco Catalyst SD-WAN Manager 用户账号

创建 Google Cloud Storage 存储桶

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

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

收集 Cisco Catalyst SD-WAN Manager API 凭据

创建 API 用户账号

  1. 登录 Cisco Catalyst SD-WAN Manager 控制台
  2. 在菜单中,依次前往管理 > 管理用户
  3. 点击添加用户
  4. 提供以下配置详细信息:
    • 用户名:输入用于 API 访问的用户名(例如 chronicle-api)。
    • 密码:输入安全系数高的密码。
    • 确认密码:重新输入密码。
    • 用户组:选择具有适当权限的用户组(请参阅下一部分)。
  5. 点击 Add(添加)。
  6. 复制以下详细信息并将其保存在安全的位置:

    • 用户名:您的 Catalyst SD-WAN Manager 用户名。
    • 密码:您的 Catalyst SD-WAN Manager 密码。
    • Catalyst SD-WAN Manager 基础网址:Catalyst SD-WAN Manager 服务器的基础网址(例如 https://sdwan-manager.example.com:8443)。

配置用户权限

API 用户账号需要特定权限才能访问审核日志、提醒和事件。

  1. Cisco Catalyst SD-WAN Manager 控制台中,依次前往菜单中的管理 > 管理用户 > 用户群组
  2. 选择分配给 API 用户的用户组(或点击添加用户组以创建新组)。
  3. 点击修改
  4. 功能部分中,确保已启用以下权限:
    • 审核日志:选择读取权限。
    • 闹钟:选择读取权限。
    • 活动:选择读取权限。
  5. 点击更新

验证 API 访问权限

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

  1. 打开终端或命令提示符。
  2. 运行以下命令以测试身份验证:

    # Replace with your actual credentials
    SDWAN_HOST="https://sdwan-manager.example.com:8443"
    SDWAN_USERNAME="chronicle-api"
    SDWAN_PASSWORD="your-password"
    
    # Test authentication using session-based login (returns JSESSIONID cookie)
    curl -c cookies.txt -X POST \
      "${SDWAN_HOST}/j_security_check" \
      -H "Content-Type: application/x-www-form-urlencoded" \
      -d "j_username=${SDWAN_USERNAME}&j_password=${SDWAN_PASSWORD}"
    
    # Get CSRF token (X-XSRF-TOKEN)
    curl -b cookies.txt \
      "${SDWAN_HOST}/dataservice/client/token"
    

如果身份验证成功,第二个命令将返回 CSRF 令牌字符串。

为 Cloud Run 函数创建服务账号

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

创建服务账号

  1. GCP 控制台中,依次前往 IAM 和管理 > 服务账号
  2. 点击创建服务账号
  3. 提供以下配置详细信息:
    • 服务账号名称:输入 cisco-sdwan-collector-sa
    • 服务账号说明:输入 Service account for Cloud Run function to collect Cisco Catalyst SD-WAN Manager 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. 提供以下配置详细信息:
    • 添加主账号:输入服务账号电子邮件地址(例如 cisco-sdwan-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:输入 cisco-sdwan-trigger
    • 将其他设置保留为默认值。
  4. 点击创建

创建 Cloud Run 函数以收集日志

Cloud Run 函数将由来自 Cloud Scheduler 的 Pub/Sub 消息触发,以从 Cisco Catalyst SD-WAN Manager API 中提取日志并将其写入 GCS。

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

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

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

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

  8. 前往安全性标签页:

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

    1. 点击变量和密钥
    2. 为每个环境变量点击+ 添加变量
    变量名称 示例值
    GCS_BUCKET cisco-sdwan-logs-bucket
    GCS_PREFIX cisco-sdwan
    STATE_KEY cisco-sdwan/state.json
    SDWAN_HOST https://sdwan-manager.example.com:8443
    SDWAN_USERNAME chronicle-api
    SDWAN_PASSWORD your-sdwan-password
    LOOKBACK_HOURS 1
  10. 变量和密钥标签页中,向下滚动到请求

    • 请求超时:输入 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
      import urllib.parse
      from datetime import datetime, timezone, timedelta
      import time
      
      # Disable SSL warnings for self-signed certificates (testing only)
      urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
      
      # Initialize HTTP client with timeouts
      http = urllib3.PoolManager(
          timeout=urllib3.Timeout(connect=10.0, read=60.0),
          cert_reqs='CERT_NONE',
          retries=urllib3.Retry(total=3, backoff_factor=1)
      )
      
      # Initialize Storage client
      storage_client = storage.Client()
      
      # Environment variables
      SDWAN_HOST = os.environ.get('SDWAN_HOST', '').rstrip('/')
      SDWAN_USERNAME = os.environ.get('SDWAN_USERNAME', '')
      SDWAN_PASSWORD = os.environ.get('SDWAN_PASSWORD', '')
      GCS_BUCKET = os.environ.get('GCS_BUCKET', '')
      GCS_PREFIX = os.environ.get('GCS_PREFIX', 'cisco-sdwan')
      STATE_KEY = os.environ.get('STATE_KEY', 'cisco-sdwan/state.json')
      LOOKBACK_HOURS = int(os.environ.get('LOOKBACK_HOURS', '1'))
      
      class CatalystSDWANAPI:
          """Client for Cisco Catalyst SD-WAN Manager API (formerly vManage)."""
      
          def __init__(self, host, username, password):
              self.host = host
              self.username = username
              self.password = password
              self.jsessionid = None
              self.xsrf_token = None
      
          def authenticate(self):
              """Authenticate using session-based login (j_security_check)."""
              try:
                  login_url = f"{self.host}/j_security_check"
                  login_data = urllib.parse.urlencode({
                      'j_username': self.username,
                      'j_password': self.password
                  }).encode('utf-8')
      
                  response = http.request(
                      'POST',
                      login_url,
                      body=login_data,
                      headers={'Content-Type': 'application/x-www-form-urlencoded'},
                  )
      
                  if b'<html>' in response.data or response.status != 200:
                      print(f"Authentication failed: HTTP {response.status}")
                      return False
      
                  # Extract JSESSIONID from Set-Cookie header
                  cookie_header = response.headers.get('Set-Cookie', '')
                  for part in cookie_header.split(','):
                      if 'JSESSIONID=' in part:
                          self.jsessionid = part.split('JSESSIONID=')[1].split(';')[0]
                          break
      
                  if not self.jsessionid:
                      print("Failed to extract JSESSIONID from response")
                      return False
      
                  # Get XSRF token
                  token_url = f"{self.host}/dataservice/client/token"
                  headers = {
                      'Content-Type': 'application/json',
                      'Cookie': f"JSESSIONID={self.jsessionid}"
                  }
                  response = http.request('GET', token_url, headers=headers)
      
                  if response.status == 200:
                      self.xsrf_token = response.data.decode('utf-8').strip()
                      print("Successfully authenticated with Catalyst SD-WAN Manager")
                      return True
                  else:
                      print(f"Failed to get XSRF token: HTTP {response.status}")
                      return False
      
              except Exception as e:
                  print(f"Authentication error: {e}")
                  return False
      
          def _get_headers(self):
              """Build headers for authenticated API requests."""
              return {
                  'Content-Type': 'application/json',
                  'Accept': 'application/json',
                  'Cookie': f"JSESSIONID={self.jsessionid}",
                  'X-XSRF-TOKEN': self.xsrf_token
              }
      
          def _build_query(self, last_epoch_ms=None):
              """Build a query payload with entry_time filter."""
              query = {
                  "query": {
                      "condition": "AND",
                      "rules": []
                  },
                  "size": 10000
              }
              if last_epoch_ms:
                  query["query"]["rules"].append({
                      "value": [str(last_epoch_ms)],
                      "field": "entry_time",
                      "type": "date",
                      "operator": "greater"
                  })
              else:
                  query["query"]["rules"].append({
                      "value": [str(LOOKBACK_HOURS)],
                      "field": "entry_time",
                      "type": "date",
                      "operator": "last_n_hours"
                  })
              return query
      
          def fetch_data(self, endpoint, last_epoch_ms=None):
              """Fetch data from a /dataservice endpoint using POST with query body."""
              url = f"{self.host}/dataservice/{endpoint}"
              headers = self._get_headers()
              query = self._build_query(last_epoch_ms)
      
              try:
                  response = http.request(
                      'POST',
                      url,
                      body=json.dumps(query),
                      headers=headers,
                  )
      
                  if response.status == 200:
                      return json.loads(response.data.decode('utf-8'))
                  else:
                      print(f"Failed to get {endpoint}: HTTP {response.status}")
                      return None
      
              except Exception as e:
                  print(f"Error fetching {endpoint}: {e}")
                  return None
      
      def load_state(bucket):
          """Load the last run timestamp (epoch ms) from GCS state file."""
          try:
              blob = bucket.blob(STATE_KEY)
              if blob.exists():
                  state_data = json.loads(blob.download_as_text())
                  return state_data.get('last_run_time')
          except Exception as e:
              print(f"Warning: Could not load state: {e}")
          return None
      
      def save_state(bucket, epoch_ms):
          """Save the current run timestamp (epoch ms) to GCS state file."""
          try:
              state_data = {
                  'last_run_time': epoch_ms,
                  'updated_at': datetime.now(timezone.utc).isoformat()
              }
              blob = bucket.blob(STATE_KEY)
              blob.upload_from_string(
                  json.dumps(state_data),
                  content_type='application/json'
              )
              print(f"Saved state: last_run_time={epoch_ms}")
          except Exception as e:
              print(f"Warning: Could not save state: {e}")
      
      def upload_to_gcs(bucket, records, log_type):
          """Upload log records to GCS as NDJSON."""
          if not records:
              print(f"No {log_type} records to upload")
              return 0
      
          dt = datetime.now(timezone.utc)
          object_key = (
              f"{GCS_PREFIX}/{log_type}/"
              f"{dt.strftime('%Y/%m/%d')}/"
              f"{log_type}_{dt.strftime('%Y%m%d_%H%M%S')}.ndjson"
          )
      
          ndjson = '\n'.join(
              json.dumps(record, ensure_ascii=False) for record in records
          ) + '\n'
      
          blob = bucket.blob(object_key)
          blob.upload_from_string(ndjson, content_type='application/x-ndjson')
          print(f"Uploaded {len(records)} {log_type} records to gs://{GCS_BUCKET}/{object_key}")
          return len(records)
      
      @functions_framework.cloud_event
      def main(cloud_event):
          """
          Cloud Run function triggered by Pub/Sub.
          Fetches audit logs, alarms, and events from Cisco Catalyst SD-WAN Manager
          API and writes them to GCS as NDJSON files.
      
          Args:
              cloud_event: CloudEvent object containing Pub/Sub message
          """
          print(f"Starting Cisco Catalyst SD-WAN Manager log collection at {datetime.now(timezone.utc).isoformat()}")
      
          if not all([SDWAN_HOST, SDWAN_USERNAME, SDWAN_PASSWORD, GCS_BUCKET]):
              print("Error: Missing required environment variables")
              return
      
          try:
              bucket = storage_client.bucket(GCS_BUCKET)
      
              # Load last run timestamp
              last_run_time = load_state(bucket)
              if last_run_time:
                  print(f"Resuming from last_run_time={last_run_time}")
              else:
                  print(f"No previous state found, collecting last {LOOKBACK_HOURS} hour(s) of logs")
      
              # Authenticate
              api = CatalystSDWANAPI(SDWAN_HOST, SDWAN_USERNAME, SDWAN_PASSWORD)
              if not api.authenticate():
                  print("Failed to authenticate with Catalyst SD-WAN Manager")
                  return
      
              # Current timestamp for state tracking (epoch milliseconds)
              current_time = int(datetime.now(timezone.utc).timestamp() * 1000)
      
              # Collect audit logs, alarms, and events
              endpoints = [
                  ('audit_logs', 'auditlog'),
                  ('alarms', 'alarms'),
                  ('events', 'events'),
              ]
      
              total_records = 0
              for log_type, endpoint in endpoints:
                  try:
                      print(f"Collecting {log_type} from /dataservice/{endpoint}...")
                      response_data = api.fetch_data(endpoint, last_run_time)
                      if response_data and 'data' in response_data:
                          count = upload_to_gcs(bucket, response_data['data'], log_type)
                          total_records += count
                      else:
                          print(f"No {log_type} data returned")
                  except Exception as e:
                      print(f"Error processing {log_type}: {e}")
                      continue
      
              # Update state
              save_state(bucket, current_time)
      
              print(f"Collection completed. Total records processed: {total_records}")
      
          except Exception as e:
              print(f"Function execution error: {e}")
              raise
      
    • 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. 提供以下配置详细信息:

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

时间表频率选项

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

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

测试集成

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

    Starting Cisco Catalyst SD-WAN Manager log collection at ...
    Successfully authenticated with Catalyst SD-WAN Manager
    Collecting audit_logs from /dataservice/auditlog...
    Uploaded N audit_logs records to gs://...
    Collection completed. Total records processed: N
    
  8. 前往 Cloud Storage > 存储分区

  9. 点击您的存储桶名称。

  10. 前往前缀文件夹 (cisco-sdwan/)。

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

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

  • HTTP 401:检查环境变量中的 API 凭据
  • HTTP 403:验证用户账号是否具有审核日志、提醒和事件所需的读取权限
  • 身份验证失败:验证 Catalyst SD-WAN Manager 基本网址是否包含正确的端口(默认 8443
  • 缺少环境变量:检查是否已设置所有必需的变量

在 Google SecOps 中配置 Feed 以注入 Cisco Catalyst SD-WAN Manager 日志

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

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

  9. 点击下一步

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

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

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

      • 永不:转移后永不删除任何文件(建议用于测试)。
      • 删除已转移的文件:在成功转移后删除文件。
      • 删除已转移的文件和空目录:成功转移后删除文件和空目录。
    • 文件存在时间上限:包含在过去指定天数内修改的文件(默认值为 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 映射 逻辑
Tunnel_id_label additional.fields 已合并
additional_tag additional.fields 已合并
count_label additional.fields 已合并
dst_vrf_label additional.fields 已合并
logfeature_label additional.fields 已合并
logmodule_label additional.fields 已合并
meta_sequenceId_label additional.fields 已合并
msg_label additional.fields 已合并
qfp_label additional.fields 已合并
result_label additional.fields 已合并
rsa_sha256_label additional.fields 已合并
rsa_type_label additional.fields 已合并
sequence_label additional.fields 已合并
src_vrf_label additional.fields 已合并
tenant_vpn_id_label additional.fields 已合并
thread_label additional.fields 已合并
tos_label additional.fields 已合并
unknown_tenant_label additional.fields 已合并
vlan_id_label additional.fields 已合并
vpn_id_label additional.fields 已合并
description_1 extensions.auth.type 已映射:(?i)closedAUTHTYPE_UNSPECIFIED
msg1 extensions.auth.type 已映射:authenticatedAUTHTYPE_UNSPECIFIED
msgs extensions.auth.type 已映射:(?i)successAUTHTYPE_UNSPECIFIED
prod_type extensions.auth.type 已映射:(?i)LOGOUTAUTHTYPE_UNSPECIFIED
host_name intermediary.asset.hostname 直接映射
host_name intermediary.hostname 直接映射
inter_host intermediary.hostname 直接映射
logmsg metadata.description 直接映射
message_value metadata.description 直接映射
msgs metadata.description 直接映射
date_time metadata.event_timestamp 解析为 ISO8601
time metadata.event_timestamp 解析为 ISO8601
time_t metadata.event_timestamp 解析为 ISO8601
timestamp metadata.event_timestamp 解析为 ISO8601
description_1 metadata.event_type 已映射:(?i)closedUSER_LOGOUT
has_principal metadata.event_type 已映射:trueNETWORK_CONNECTIONtrueSTATUS_UPDATE
has_principal_user metadata.event_type 已映射:trueUSER_UNCATEGORIZED
msg1 metadata.event_type 已映射:authenticatedUSER_LOGIN
msgs metadata.event_type 已映射:(?i)successUSER_LOGIN
prod_type metadata.event_type 已映射:(?i)LOGOUTUSER_LOGOUT
prod_type metadata.product_event_type 直接映射
log_id metadata.product_log_id 直接映射
logid metadata.product_log_id 直接映射
application_protocol network.application_protocol 已映射:(?i)SSHSSH
message network.application_protocol 映射:(?i)SSHSSH(?i)netconfNETCONF(?i)dhcpDHCP
type1 network.dhcp.type 已映射:DHCPDISCOVERDISCOVER
message network.ip_protocol 已映射:(?i)tcpTCP
network_protocol network.ip_protocol 直接映射
bytes network.sent_bytes 直接映射
session_id network.session_id 直接映射
network_host network.tls.cipher 直接映射
hostname principal.asset.hostname 直接映射
host principal.asset.ip 已合并
initiator_ip principal.asset.ip 已合并
ip principal.asset.ip 已合并
ipaddress principal.asset.ip 已合并
logusersrcip principal.asset.ip 已合并
peer_ip principal.asset.ip 已合并
principal_ip principal.asset.ip 已合并
principal_ip1 principal.asset.ip 已合并
proxy_host principal.asset.ip 已合并
src_ip principal.asset.ip 已合并
system_ip principal.asset.ip 已合并
addr principal.hostname 直接映射
hostname principal.hostname 直接映射
host principal.ip 已合并
initiator_ip principal.ip 已合并
ip principal.ip 已合并
ipaddress principal.ip 已合并
logusersrcip principal.ip 已合并
peer_ip principal.ip 已合并
principal_ip principal.ip 已合并
principal_ip1 principal.ip 已合并
proxy_host principal.ip 已合并
src_ip principal.ip 已合并
system_ip principal.ip 已合并
initiator_port principal.port 直接映射
port principal.port 直接映射
ports principal.port 直接映射
principal_port principal.port 直接映射
principal_port1 principal.port 直接映射
src_port principal.port 直接映射
process_path principal.process.file.full_path 直接映射
parent_pid principal.process.parent_process.pid 直接映射
pid principal.process.pid 直接映射
process_label principal.resource.attribute.labels 已合并
process_name_label principal.resource.attribute.labels 已合并
loguser principal.user.userid 直接映射
user1 principal.user.userid 直接映射
user_id principal.user.userid 直接映射
username principal.user.userid 直接映射
action security_result.action 已合并
message security_result.action 已映射:(?i)(succeeded/accounting start/open/occurred/update/successfully/success) → `acti...
classification security_result.category_details 已合并
msg1 security_result.description 直接映射
Malware_label security_result.detection_fields 已合并
direction_label security_result.detection_fields 已合并
egress_interface_label security_result.detection_fields 已合并
ingress_interface_label security_result.detection_fields 已合并
log_prefix_label security_result.detection_fields 已合并
log_reason_label security_result.detection_fields 已合并
packet_label security_result.detection_fields 已合并
policy_label security_result.detection_fields 已合并
port_label security_result.detection_fields 已合并
protocol_label security_result.detection_fields 已合并
proxy_port_label security_result.detection_fields 已合并
sent_bytes_1_label security_result.detection_fields 已合并
sent_bytes_2_label security_result.detection_fields 已合并
tty_label security_result.detection_fields 已合并
type_label security_result.detection_fields 已合并
udp_packets_label security_result.detection_fields 已合并
priority security_result.severity 已映射:1LOW
description_1 security_result.summary 直接映射
dst_ip target.asset.ip 已合并
ipadres target.asset.ip 已合并
logdeviceid target.asset.ip 已合并
responder_ip target.asset.ip 已合并
target_ip target.asset.ip 已合并
target_ip1 target.asset.ip 已合并
filename target.file.names 已合并
dst_ip target.ip 已合并
ipadres target.ip 已合并
logdeviceid target.ip 已合并
responder_ip target.ip 已合并
target_ip target.ip 已合并
target_ip1 target.ip 已合并
dst_port target.port 直接映射
prts target.port 直接映射
responder_port target.port 直接映射
target_port target.port 直接映射
target_port1 target.port 直接映射
filetype target.process.file.mime_type 直接映射
parent_identifier_label target.resource.attribute.labels 已合并
specific_identifer_label target.resource.attribute.labels 已合并
target_name target.resource.name 直接映射
instance_id target.resource.product_object_id 直接映射
target_username target.user.userid 直接映射
user target.user.userid 直接映射
不适用 extensions.auth.type 常量:AUTHTYPE_UNSPECIFIED
不适用 metadata.event_type 常量:USER_LOGIN
不适用 network.application_protocol 常量:SSH
不适用 network.dhcp.type 常量:DISCOVER
不适用 network.ip_protocol 常量:TCP
不适用 security_result.severity 常量:LOW
rsa_type event.idm.read_only_udm.additional.fields 从变更日志映射
sha_256 event.idm.read_only_udm.additional.fields 从变更日志映射
NETCONF event.idm.read_only_udm.network.application_protocol 从变更日志映射
TCP event.idm.read_only_udm.network.ip_protocol 从变更日志映射
DHCP event.idm.read_only_udm.network.application_protocol 从变更日志映射
username1 target.user.userid 从变更日志映射
security_result.action ALLOW 从变更日志映射
ip_1 principal.ip 从变更日志映射
ip_2 target.ip 从变更日志映射
port_1 principal.port 从变更日志映射
port_2 target.port 从变更日志映射
message_1 metadata.description 从变更日志映射
malware security_result.detection_fields 从变更日志映射

更新日志

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

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