收集 Teleport 访问平面日志

支持的平台:

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

Teleport Access Plane(现为 Teleport Access Platform)是一个零信任访问平台,可为 SSH 服务器、Kubernetes 集群、数据库和 Web 应用提供安全访问,并内置会话记录、基于身份的访问权限控制和全面的审核日志记录功能。可以通过 Teleport Events API 收集审核事件。

准备工作

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

  • Google SecOps 实例
  • 已启用 Cloud Storage API 的 GCP 项目
  • 创建和管理 GCS 存储分区的权限
  • 管理 GCS 存储分区的 IAM 政策的权限
  • 创建 Cloud Run 服务、Pub/Sub 主题和 Cloud Scheduler 作业的权限
  • 一个正在运行且具有管理员访问权限的 Teleport 集群
  • 用于 API 访问的 Teleport 身份文件或机器 ID 凭据

创建 Google Cloud Storage 存储桶

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

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

收集 Teleport Access Plane API 凭据

生成用于 API 访问的身份文件

Teleport 使用基于身份的身份验证来访问 API。生成身份文件或使用机器 ID 进行自动化访问。

方法 A:使用 tctl 生成身份文件

  1. 登录到具有 tctl 访问权限的机器。
  2. 为集成创建机器人用户:

    tctl bots add secops-collector --roles=auditor --logins=root
    
  3. 生成身份文件:

    tctl auth sign --user=secops-collector --out=secops-collector-identity --ttl=8760h
    
  4. 身份文件 secops-collector-identity 包含 API 身份验证所需的 TLS 证书、密钥和 CA 证书。

  1. 在将运行收集器的机器上安装 tbot
  2. 配置机器 ID:

    tctl bots add secops-collector --roles=auditor
    
  3. 启动机器人以持续更新凭据:

    tbot start \
      --destination-dir=/opt/teleport/certs \
      --token=secops-collector-token \
      --auth-server=teleport.yourcompany.com:443
    

确定 Teleport 代理地址

  1. 记下您的 Teleport 代理地址(例如 teleport.yourcompany.com:443)。
  2. API 端点与代理地址相同。

验证权限

如需验证机器人用户是否拥有所需权限,请执行以下操作:

  1. 登录 Teleport 网页界面。
  2. 依次前往管理 > 用户
  3. 验证机器人用户 secops-collector 是否存在且具有 auditor 角色。
  4. auditor 角色提供对审核事件和会话记录的读取权限。

测试 API 访问权限

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

    # Replace with your actual values
    TELEPORT_PROXY="teleport.yourcompany.com:443"
    IDENTITY_FILE="/path/to/secops-collector-identity"
    
    # Test API access using tsh
    tsh --proxy=${TELEPORT_PROXY} -i ${IDENTITY_FILE} \
      events ls --last=1h --format=json | head -5
    

为 Cloud Run 函数创建服务账号

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

创建服务账号

  1. GCP 控制台中,依次前往 IAM 和管理 > 服务账号
  2. 点击创建服务账号
  3. 提供以下配置详细信息:
    • 服务账号名称:输入 teleport-logs-collector-sa
    • 服务账号说明:输入 Service account for Cloud Run function to collect Teleport Access Plane 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. 点击您的存储桶名称(例如 teleport-audit-logs)。
  3. 前往权限标签页。
  4. 点击授予访问权限
  5. 提供以下配置详细信息:
    • 添加主账号:输入服务账号电子邮件地址(例如 teleport-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:输入 teleport-logs-trigger
    • 将其他设置保留为默认值
  4. 点击创建

创建 Cloud Run 函数以收集日志

Cloud Run 函数将由来自 Cloud Scheduler 的 Pub/Sub 消息触发,以从 Teleport Events API 中提取审核事件并将其写入 GCS。

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

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

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

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

  8. 前往安全性标签页:

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

    1. 点击变量和密钥
    2. 为每个环境变量点击+ 添加变量
    变量名称 示例值 说明
    GCS_BUCKET teleport-audit-logs GCS 存储桶名称
    GCS_PREFIX teleport-logs 日志文件的前缀
    STATE_KEY teleport-logs/state.json 状态文件路径
    TELEPORT_PROXY teleport.yourcompany.com:443 Teleport 代理地址
    TELEPORT_IDENTITY base64-encoded-identity-file 采用 Base64 编码的身份文件内容
    MAX_RECORDS 10000 每次运行的记录数上限
    PAGE_SIZE 1000 每页记录数
    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 json
    import os
    import urllib3
    from datetime import datetime, timezone, timedelta
    import time
    import base64
    import tempfile
    import ssl
    
    # Initialize Storage client
    storage_client = storage.Client()
    
    # Environment variables
    GCS_BUCKET = os.environ.get('GCS_BUCKET')
    GCS_PREFIX = os.environ.get('GCS_PREFIX', 'teleport-logs')
    STATE_KEY = os.environ.get('STATE_KEY', 'teleport-logs/state.json')
    TELEPORT_PROXY = os.environ.get('TELEPORT_PROXY')
    TELEPORT_IDENTITY = os.environ.get('TELEPORT_IDENTITY')
    MAX_RECORDS = int(os.environ.get('MAX_RECORDS', '10000'))
    PAGE_SIZE = int(os.environ.get('PAGE_SIZE', '1000'))
    LOOKBACK_HOURS = int(os.environ.get('LOOKBACK_HOURS', '24'))
    
    def parse_datetime(value: str) -> datetime:
      """Parse ISO datetime string to datetime object."""
      if value.endswith("Z"):
        value = value[:-1] + "+00:00"
      return datetime.fromisoformat(value)
    
    def create_http_client():
      """
      Create an HTTP client with TLS client certificate
      authentication from the Teleport identity file.
      """
      identity_data = base64.b64decode(TELEPORT_IDENTITY).decode('utf-8')
    
      # Parse identity file into cert, key, and CA
      cert_file = tempfile.NamedTemporaryFile(mode='w', suffix='.pem', delete=False)
      key_file = tempfile.NamedTemporaryFile(mode='w', suffix='.pem', delete=False)
      ca_file = tempfile.NamedTemporaryFile(mode='w', suffix='.pem', delete=False)
    
      current_section = None
      cert_data = []
      key_data = []
      ca_data = []
    
      for line in identity_data.split('\n'):
        if 'BEGIN CERTIFICATE' in line and not cert_data:
          current_section = 'cert'
        elif 'BEGIN CERTIFICATE' in line:
          current_section = 'ca'
        elif 'BEGIN' in line and 'KEY' in line:
          current_section = 'key'
        elif 'END CERTIFICATE' in line:
          if current_section == 'cert':
            cert_data.append(line)
          elif current_section == 'ca':
            ca_data.append(line)
          current_section = None
        elif 'END' in line and 'KEY' in line:
          key_data.append(line)
          current_section = None
    
        if current_section == 'cert':
          cert_data.append(line)
        elif current_section == 'key':
          key_data.append(line)
        elif current_section == 'ca':
          ca_data.append(line)
    
      cert_file.write('\n'.join(cert_data))
      cert_file.close()
      key_file.write('\n'.join(key_data))
      key_file.close()
      ca_file.write('\n'.join(ca_data))
      ca_file.close()
    
      http = urllib3.PoolManager(
        cert_file=cert_file.name,
        key_file=key_file.name,
        ca_certs=ca_file.name,
        timeout=urllib3.Timeout(connect=10.0, read=60.0),
        retries=False,
      )
    
      return http
    
    @functions_framework.cloud_event
    def main(cloud_event):
      """
      Cloud Run function triggered by Pub/Sub to fetch Teleport
      audit events and write to GCS.
    
      Args:
        cloud_event: CloudEvent object containing Pub/Sub message
      """
    
      if not all([GCS_BUCKET, TELEPORT_PROXY, TELEPORT_IDENTITY]):
        print('Error: Missing required environment variables')
        return
    
      try:
        bucket = storage_client.bucket(GCS_BUCKET)
    
        # Load state
        state = load_state(bucket, STATE_KEY)
    
        # Determine time window
        now = datetime.now(timezone.utc)
        last_time = None
    
        if isinstance(state, dict) and state.get("last_event_time"):
          try:
            last_time = parse_datetime(state["last_event_time"])
            # Overlap by 2 minutes to catch any delayed events
            last_time = last_time - timedelta(minutes=2)
          except Exception as e:
            print(f"Warning: Could not parse last_event_time: {e}")
    
        if last_time is None:
          last_time = now - timedelta(hours=LOOKBACK_HOURS)
    
        print(f"Fetching logs from {last_time.isoformat()} to {now.isoformat()}")
    
        # Create HTTP client with TLS auth
        http = create_http_client()
    
        # Fetch logs
        records, newest_event_time = fetch_logs(
          http=http,
          start_time=last_time,
          end_time=now,
          page_size=PAGE_SIZE,
          max_records=MAX_RECORDS,
        )
    
        if not records:
          print("No new log records found.")
          save_state(bucket, STATE_KEY, now.isoformat())
          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 records]) + '\n'
        blob.upload_from_string(ndjson, content_type='application/x-ndjson')
    
        print(f"Wrote {len(records)} records to gs://{GCS_BUCKET}/{object_key}")
    
        # Update state with newest event time
        if newest_event_time:
          save_state(bucket, STATE_KEY, newest_event_time)
        else:
          save_state(bucket, STATE_KEY, now.isoformat())
    
        print(f"Successfully processed {len(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():
          state_data = blob.download_as_text()
          return json.loads(state_data)
      except Exception as e:
        print(f"Warning: Could not load state: {e}")
    
      return {}
    
    def save_state(bucket, key, last_event_time_iso: str):
      """Save the last event timestamp to GCS state file."""
      try:
        state = {'last_event_time': last_event_time_iso}
        blob = bucket.blob(key)
        blob.upload_from_string(
          json.dumps(state, indent=2),
          content_type='application/json'
        )
        print(f"Saved state: last_event_time={last_event_time_iso}")
      except Exception as e:
        print(f"Warning: Could not save state: {e}")
    
    def fetch_logs(http, start_time: datetime, end_time: datetime, page_size: int, max_records: int):
      """
      Fetch audit events from Teleport Events API with pagination
      and rate limiting.
    
      Args:
        http: urllib3 PoolManager with TLS client certificates
        start_time: Start time for log query
        end_time: End time for log query
        page_size: Number of records per page
        max_records: Maximum total records to fetch
    
      Returns:
        Tuple of (records list, newest_event_time ISO string)
      """
      proxy_host = TELEPORT_PROXY.rstrip('/')
      if not proxy_host.startswith('https://'):
        proxy_host = f"https://{proxy_host}"
    
      endpoint = f"{proxy_host}/v1/events"
    
      records = []
      newest_time = None
      page_num = 0
      backoff = 1.0
      cursor = ""
    
      start_str = start_time.strftime("%Y-%m-%dT%H:%M:%SZ")
      end_str = end_time.strftime("%Y-%m-%dT%H:%M:%SZ")
    
      while True:
        page_num += 1
    
        if len(records) >= max_records:
          print(f"Reached max_records limit ({max_records})")
          break
    
        url = (
          f"{endpoint}"
          f"?from={start_str}"
          f"&to={end_str}"
          f"&limit={min(page_size, max_records - len(records))}"
        )
        if cursor:
          url += f"&startKey={cursor}"
    
        try:
          response = http.request('GET', url)
    
          # 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:
            print(f"HTTP Error: {response.status}")
            response_text = response.data.decode('utf-8')
            print(f"Response body: {response_text}")
            return [], None
    
          data = json.loads(response.data.decode('utf-8'))
    
          page_results = data.get('items', data.get('events', []))
    
          if not page_results:
            print(f"No more results (empty page)")
            break
    
          print(f"Page {page_num}: Retrieved {len(page_results)} events")
          records.extend(page_results)
    
          # Track newest event time
          for event in page_results:
            try:
              event_time = event.get('time') or event.get('ei', {}).get('time')
              if event_time:
                if newest_time is None or parse_datetime(event_time) > parse_datetime(newest_time):
                  newest_time = event_time
            except Exception as e:
              print(f"Warning: Could not parse event time: {e}")
    
          # Check for more results using cursor
          cursor = data.get('startKey', '')
          if not cursor:
            print("No more pages (no startKey cursor)")
            break
    
        except Exception as e:
          print(f"Error fetching logs: {e}")
          return [], None
    
      print(f"Retrieved {len(records)} total records from {page_num} pages")
      return records, newest_time
    
    • 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. 提供以下配置详细信息:

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

时间表频率选项

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

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

测试集成

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

    Fetching logs from YYYY-MM-DDTHH:MM:SS+00:00 to YYYY-MM-DDTHH:MM:SS+00:00
    Page 1: Retrieved X events
    Wrote X records to gs://teleport-audit-logs/teleport-logs/logs_YYYYMMDD_HHMMSS.ndjson
    Successfully processed X records
    
  8. 前往 Cloud Storage > 存储分区

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

  10. 转到 teleport-logs/ 文件夹。

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

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

  • HTTP 401/403:检查身份文件是否有效且未过期;验证机器人用户是否具有 auditor 角色
  • HTTP 429:速率限制 - 函数将自动重试并进行退避
  • TLS 错误:验证身份文件是否已正确进行 base64 编码,并且包含证书、密钥和 CA
  • 缺少环境变量:检查是否已设置所有必需的变量

在 Google SecOps 中配置 Feed 以注入 Teleport Access Plane 日志

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

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

  9. 点击下一步

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

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

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

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

    • 文件存在时间上限:包含在过去指定天数内修改的文件(默认值为 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 映射 逻辑
addr_local principal.ip、principal.asset.ip 连接的来源 IP 地址
addr_remote target.ip 连接的目标 IP 地址
addr_remote1 principal.ip、principal.asset.ip 连接的来源 IP 地址
argv target.process.command_line 进程的命令行实参
bot_instance_id principal.asset.product_object_id 相应素材资源的具体产品标识符
bot_name principal.application 涉及的应用的名称
调用方 principal.resource.attribute.labels 资源的属性键值对
cgroup_id metadata.ingestion_labels 提取元数据的标签的键值对
cluster_name, fields.cluster_name target.resource.name 目标资源的名称
代码 additional.fields 其他键值对的事件数据
组件 metadata.product_event_type 特定于产品的事件类型
dst_ip target.ip 连接的目标 IP 地址
dst_port target.port 连接的目标端口号
ei additional.fields 其他键值对的事件数据
事件 metadata.product_event_type 特定于产品的事件类型
活动类型 principal.resource.attribute.labels 资源的属性键值对
fields.addr.local principal.ip、principal.asset.ip 连接的来源 IP 地址
fields.addr.remote principal.ip、principal.asset.ip 连接的来源 IP 地址
fields.attributes.Account principal.resource.id 资源的标识符
fields.attributes.Arn principal.resource.attribute.labels 资源的属性键值对
fields.cluster_name target.resource.name 目标资源的名称
fields.code additional.fields 其他键值对的事件数据
fields.host_id target.resource.id 目标资源的标识符
fields.uid principal.user.userid 主账号的用户 ID
id_id metadata.product_log_id 特定于产品的日志标识符
冒充者 principal.resource.attribute.labels 资源的属性键值对
level security_result.severity 安全结果的严重程度级别
登录 principal.user.user_display_name 用户的显示名称
命名空间 principal.namespace 主账号的命名空间
路径 target.file.full_path 目标文件的完整路径
pid target.process.pid 进程 ID
ppid target.process.parent_process.pid 父级进程 ID
private_key_policy additional.fields 其他键值对的事件数据
计划 target.application 目标应用的名称
角色 principal.resource.attribute.labels 资源的属性键值对
server_hostname principal.hostname、principal.asset.hostname 主要资产的主机名
server_id target.resource.product_object_id, metadata.ingestion_labels 资源的商品专属标识符
server_labels.Environment target.asset.attribute.labels 相应素材资源的属性的键值对
server_labels.OS target.asset.attribute.labels 相应素材资源的属性的键值对
server_labels.Role target.user.attribute.roles 与用户关联的角色
server_labels.Uptime additional.fields 其他键值对的事件数据
server_labels.Version target.asset.attribute.labels 相应素材资源的属性的键值对
server_labels.aws_Name target.asset.attribute.labels 相应素材资源的属性的键值对
server_labels.aws_application target.application 目标应用的名称
server_labels.aws_backup target.asset.attribute.labels 相应素材资源的属性的键值对
server_labels.aws_cost_center target.asset.attribute.labels 相应素材资源的属性的键值对
server_labels.aws_environment target.asset.attribute.labels 相应素材资源的属性的键值对
server_labels.aws_role target.asset.attribute.labels 相应素材资源的属性的键值对
server_labels.aws_terraform target.asset.attribute.labels 相应素材资源的属性的键值对
server_labels.aws_tier target.asset.attribute.labels 相应素材资源的属性的键值对
server_labels.aws_zone target.asset.attribute.labels 相应素材资源的属性的键值对
server_version additional.fields 其他键值对的事件数据
session_id network.session_id 网络连接的会话标识符
和程度上减少 security_result.severity 安全结果的严重程度级别
sid network.session_id 网络连接的会话标识符
src_ip principal.ip 连接的来源 IP 地址
src_port principal.port 连接的来源端口号
sr_summary security_result.summary 安全性结果摘要
systemRoles principal.resource.attribute.labels 资源的属性键值对
类型 metadata.product_event_type 特定于产品的事件类型
type1 metadata.product_event_type 特定于产品的事件类型
uid principal.user.userid、target.user.userid 主账号或目标用户的用户 ID
用户 principal.user.attribute.labels, target.user.user_display_name 用户的显示名称
user_kind additional.fields 其他键值对的事件数据
working_directory metadata.ingestion_labels 提取元数据的标签的键值对
additional.fields 其他键值对的事件数据
metadata.event_type 事件类型(例如 USER_LOGIN、NETWORK_CONNECTION)
metadata.ingestion_labels 提取元数据的标签的键值对
metadata.product_name 生成事件的产品的名称
metadata.vendor_name 商品的供应商名称
network.session_id 网络连接的会话标识符
principal.asset.attribute.labels 相应素材资源的属性的键值对
principal.resource.attribute.labels 资源的属性键值对
principal.user.attribute.labels 用户的属性键值对
security_result 与安全相关的结果或操作
target.asset.attribute.labels 相应素材资源的属性的键值对
target.process.parent_process.pid 父级进程 ID
target.user.attribute.roles 与用户关联的角色
code event.idm.read_only_udm.additional.fields 从变更日志映射
ei event.idm.read_only_udm.additional.fields 从变更日志映射
orig_log_filename event.idm.read_only_udm.additional.fields 从变更日志映射
app_name event.idm.read_only_udm.target.application 从变更日志映射
app_public_addr event.idm.read_only_udm.target.hostnameevent.idm.read_only_udm.target.asset.hostname之间 从变更日志映射
app_uri event.idm.read_only_udm.target.url 从变更日志映射
method event.idm.read_only_udm.network.http.method 从变更日志映射
status_code event.idm.read_only_udm.network.http.response_code 从变更日志映射
path event.idm.read_only_udm.target.file.full_path 从变更日志映射
timestamp event.idm.read_only_udm.metadata.event_timestamp 从变更日志映射
bot_name event.idm.read_only_udm.principal.application 从变更日志映射
cluster_name event.idm.read_only_udm.target.resource.name 从变更日志映射
server_hostname event.idm.read_only_udm.principal.hostname 从变更日志映射
server_hostname event.idm.read_only_udm.principal.asset.hostname 从变更日志映射
server_id event.idm.read_only_udm.target.resource.product_object_id 从变更日志映射
event event.idm.read_only_udm.metadata.product_event_type 从变更日志映射
login event.idm.read_only_udm.principal.user.user_display_name 从变更日志映射
namespace event.idm.read_only_udm.principal.namespace 从变更日志映射
sid event.idm.read_only_udm.network.session_id 从变更日志映射
server_labels.Role event.idm.read_only_udm.target.user.attribute.roles 从变更日志映射
server_labels.aws_application event.idm.read_only_udm.target.application 从变更日志映射
user event.idm.read_only_udm.principal.user.attribute.labels 从变更日志映射
impersonator event.idm.read_only_udm.principal.resource.attribute.labels 从变更日志映射
server_id event.idm.read_only_udm.metadata.ingestion_labels 从变更日志映射
server_labels.Environment event.idm.read_only_udm.target.asset.attribute.labels 从变更日志映射
server_labels.OS event.idm.read_only_udm.target.asset.attribute.labels 从变更日志映射
server_labels.Version event.idm.read_only_udm.target.asset.attribute.labels 从变更日志映射
server_labels.aws_backup event.idm.read_only_udm.target.asset.attribute.labels 从变更日志映射
server_labels.aws_cost_center event.idm.read_only_udm.target.asset.attribute.labels 从变更日志映射
server_labels.aws_environment event.idm.read_only_udm.target.asset.attribute.labels 从变更日志映射
server_labels.aws_role event.idm.read_only_udm.target.asset.attribute.labels 从变更日志映射
server_labels.aws_terraform event.idm.read_only_udm.target.asset.attribute.labels 从变更日志映射
server_labels.aws_tier event.idm.read_only_udm.target.asset.attribute.labels 从变更日志映射
server_labels.aws_zone event.idm.read_only_udm.target.asset.attribute.labels 从变更日志映射
server_labels.aws_name event.idm.read_only_udm.target.asset.attribute.labels 从变更日志映射
private_key_policy event.idm.read_only_udm.additional.fields 从变更日志映射
server_labels.Uptime event.idm.read_only_udm.additional.fields 从变更日志映射
user_kind event.idm.read_only_udm.additional.fields 从变更日志映射
server_version event.idm.read_only_udm.additional.fields 从变更日志映射
remote_addr target.ip 从变更日志映射

更新日志

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

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