收集 Microsoft Defender for Endpoint 日志

支持的平台:

本文档介绍了如何使用 Google Cloud Storage V2 将 Microsoft Defender for Endpoint(高级威胁防护)日志注入到 Google Security Operations。

Microsoft Defender for Endpoint 是一款企业级端点安全平台,可提供预防性保护、入侵后检测、自动化调查和响应功能。它会生成提醒、突发事件、设备清单和高级搜索遥测数据,这些数据可通过 Microsoft Security API 流式传输到外部存储空间,以便在 Google SecOps 中进行分析。

准备工作

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

  • Google SecOps 实例
  • 已启用 Cloud Storage API 的 GCP 项目
  • 创建和管理 GCS 存储分区的权限
  • 管理 GCS 存储分区的 IAM 政策的权限
  • 创建 Cloud Run 服务、Pub/Sub 主题和 Cloud Scheduler 作业的权限
  • Microsoft 365 E5 或 Microsoft Defender for Endpoint P2 许可
  • Microsoft Entra ID (Azure AD) 中的全局管理员或安全管理员角色
  • 在 Microsoft Entra ID 中注册且具有所需 API 权限的应用

创建 Google Cloud Storage 存储桶

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

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

在 Microsoft Entra ID 中注册应用

  1. 登录 Microsoft Entra 管理中心
  2. 依次前往身份 > 应用 > 应用注册
  3. 点击 New registration(新注册)。
  4. 提供以下配置详细信息:
    • 名称:输入一个描述性名称(例如 SecOps-Defender-ATP-Integration
    • 支持的账号类型:选择仅此组织目录中的账号
    • 重定向 URI:留空
  5. 点击注册
  6. 在应用概览页面上,复制并保存以下值:
    • 应用(客户端)ID
    • 目录(租户)ID

创建客户端密钥

  1. 在应用页面中,前往证书和密钥
  2. 点击 New client secret(新建客户端密钥)。
  3. 提供以下配置详细信息:
    • 说明:输入 SecOps Integration Secret
    • 到期时间:选择到期期限(例如 24 个月
  4. 点击 Add(添加)。
  5. 立即复制并保存客户端密钥的

授予 API 权限

  1. 在应用页面中,前往 API 权限
  2. 点击添加权限
  3. 选择组织使用的 API
  4. 搜索并选择 WindowsDefenderATP
  5. 选择应用权限
  6. 选择以下权限:
    • Alert.Read.All - 读取所有提醒
    • Machine.Read.All - 读取所有机器信息
    • SecurityRecommendation.Read.All - 读取安全建议
    • Vulnerability.Read.All - 读取漏洞信息
    • AdvancedQuery.Read.All - 运行高级查询
  7. 点击添加权限
  8. 点击为(您的组织)授予管理员同意书
  9. 点击进行确认。

验证权限

  1. API 权限页面中,验证所有权限在状态列中是否都显示已授予(您的组织)
  2. 如果任何权限显示未授予,请再次点击授予管理员同意书

测试 API 访问权限

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

    TENANT_ID="<your-tenant-id>"
    CLIENT_ID="<your-client-id>"
    CLIENT_SECRET="<your-client-secret>"
    
    # Get OAuth token
    TOKEN=$(curl -s -X POST "https://login.microsoftonline.com/${TENANT_ID}/oauth2/v2.0/token" \
        -H "Content-Type: application/x-www-form-urlencoded" \
        -d "client_id=${CLIENT_ID}&scope=https://api.securitycenter.microsoft.com/.default&client_secret=${CLIENT_SECRET}&grant_type=client_credentials" | python3 -c "import sys,json;print(json.load(sys.stdin)['access_token'])")
    
    # Test API access
    curl -s -H "Authorization: Bearer ${TOKEN}" "https://api.securitycenter.microsoft.com/api/alerts?\$top=1" | python3 -m json.tool
    

为 Cloud Run 函数创建服务账号

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

创建服务账号

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

创建 Cloud Run 函数以收集日志

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

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

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

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

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

  8. 前往安全性标签页:

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

    1. 点击变量和密钥
    2. 为每个环境变量点击+ 添加变量
    变量名称 示例值 说明
    GCS_BUCKET defender-atp-logs GCS 存储桶名称
    GCS_PREFIX defender-atp 日志文件的前缀
    STATE_KEY defender-atp/state.json 状态文件路径
    TENANT_ID your-tenant-id Microsoft Entra ID 租户 ID
    CLIENT_ID your-client-id 应用(客户端)ID
    CLIENT_SECRET your-client-secret 客户端密钥值
    MAX_RECORDS 10000 每次运行的记录数上限
    PAGE_SIZE 1000 每个 API 页面的记录数
    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
      
      # Initialize HTTP client with timeouts
      http = urllib3.PoolManager(
        timeout=urllib3.Timeout(connect=5.0, read=30.0),
        retries=False,
      )
      
      # Initialize Storage client
      storage_client = storage.Client()
      
      # Environment variables
      GCS_BUCKET = os.environ.get('GCS_BUCKET')
      GCS_PREFIX = os.environ.get('GCS_PREFIX', 'defender-atp')
      STATE_KEY = os.environ.get('STATE_KEY', 'defender-atp/state.json')
      TENANT_ID = os.environ.get('TENANT_ID')
      CLIENT_ID = os.environ.get('CLIENT_ID')
      CLIENT_SECRET = os.environ.get('CLIENT_SECRET')
      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 get_access_token(tenant_id, client_id, client_secret):
        """Get OAuth 2.0 access token from Microsoft Entra ID."""
        token_url = f"https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token"
        body = (
          f"client_id={client_id}"
          f"&scope=https%3A%2F%2Fapi.securitycenter.microsoft.com%2F.default"
          f"&client_secret={client_secret}"
          f"&grant_type=client_credentials"
        )
        headers = {'Content-Type': 'application/x-www-form-urlencoded'}
        response = http.request('POST', token_url, body=body.encode('utf-8'), headers=headers)
        if response.status != 200:
          raise Exception(f"Token request failed: {response.status} - {response.data.decode('utf-8')}")
        token_data = json.loads(response.data.decode('utf-8'))
        return token_data['access_token']
      
      def parse_datetime(value):
        """Parse ISO datetime string to datetime object."""
        if value.endswith("Z"):
          value = value[:-1] + "+00:00"
        return datetime.fromisoformat(value)
      
      @functions_framework.cloud_event
      def main(cloud_event):
        """Cloud Run function triggered by Pub/Sub to fetch Defender for Endpoint logs."""
        if not all([GCS_BUCKET, TENANT_ID, CLIENT_ID, CLIENT_SECRET]):
          print('Error: Missing required environment variables')
          return
      
        try:
          bucket = storage_client.bucket(GCS_BUCKET)
          state = load_state(bucket, STATE_KEY)
      
          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"])
              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 alerts from {last_time.isoformat()} to {now.isoformat()}")
      
          token = get_access_token(TENANT_ID, CLIENT_ID, CLIENT_SECRET)
      
          records, newest_event_time = fetch_alerts(
            token=token,
            start_time=last_time,
            end_time=now,
            page_size=PAGE_SIZE,
            max_records=MAX_RECORDS,
          )
      
          if not records:
            print("No new alert records found.")
            save_state(bucket, STATE_KEY, now.isoformat())
            return
      
          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}")
      
          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):
        """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_alerts(token, start_time, end_time, page_size, max_records):
        """Fetch alerts from Microsoft Defender for Endpoint API with pagination."""
        base_url = "https://api.securitycenter.microsoft.com/api/alerts"
        headers = {
          'Authorization': f'Bearer {token}',
          'Accept': 'application/json',
          'Content-Type': 'application/json',
        }
      
        start_iso = start_time.strftime('%Y-%m-%dT%H:%M:%SZ')
        end_iso = end_time.strftime('%Y-%m-%dT%H:%M:%SZ')
      
        filter_query = f"alertCreationTime ge {start_iso} and alertCreationTime le {end_iso}"
        url = f"{base_url}?$filter={filter_query}&$top={page_size}&$orderby=alertCreationTime asc"
      
        records = []
        newest_time = None
        page_num = 0
        backoff = 1.0
      
        while url:
          page_num += 1
      
          if len(records) >= max_records:
            print(f"Reached max_records limit ({max_records})")
            break
      
          try:
            response = http.request('GET', url, headers=headers)
      
            if response.status == 429:
              retry_after = int(response.headers.get('Retry-After', str(int(backoff))))
              print(f"Rate limited (429). Retrying after {retry_after}s...")
              time.sleep(retry_after)
              backoff = min(backoff * 2, 30.0)
              continue
      
            backoff = 1.0
      
            if response.status != 200:
              print(f"HTTP 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('value', [])
      
            if not page_results:
              print(f"No more results (empty page)")
              break
      
            print(f"Page {page_num}: Retrieved {len(page_results)} alerts")
            records.extend(page_results)
      
            for alert in page_results:
              try:
                event_time = alert.get('alertCreationTime')
                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}")
      
            url = data.get('@odata.nextLink')
      
          except Exception as e:
            print(f"Error fetching alerts: {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. 提供以下配置详细信息:

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

时间表频率选项

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

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

测试集成

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

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

  9. 点击您的存储桶名称(例如 defender-atp-logs)。

  10. 转到 defender-atp/ 文件夹。

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

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

  • HTTP 401:检查环境变量中的 API 凭据(TENANT_ID、CLIENT_ID、CLIENT_SECRET)
  • HTTP 403:验证应用是否拥有所需的 API 权限,以及是否已授予管理员同意权限
  • HTTP 429:速率限制 - 函数将自动重试并进行退避
  • 缺少环境变量:检查是否已设置所有必需的变量

检索 Google SecOps 服务账号

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

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

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

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

  10. 点击下一步

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

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

      gs://defender-atp-logs/defender-atp/
      
    • 来源删除选项:根据您的偏好选择删除选项:

      • 永不:转移后永不删除任何文件(建议用于测试)。
      • 删除已转移的文件:在成功转移后删除文件。
      • 删除已转移的文件和空目录:成功转移后删除文件和空目录。
    • 文件存在时间上限:包含在过去指定天数内修改的文件(默认值为 180 天)

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

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

  12. 点击下一步

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

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

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

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

UDM 映射表

日志字段 UDM 映射 逻辑
metadata.vendor_name metadata.vendor_name UDM 字段设置为 Microsoft。
metadata.product_name metadata.product_name UDM 字段设置为 Microsoft Defender for Endpoint。
id metadata.product_log_id id 日志字段映射到 metadata.product_log_id UDM 字段。
alertCreationTime metadata.event_timestamp alertCreationTime 日志字段映射到 metadata.event_timestamp UDM 字段。
title security_result.summary title 日志字段映射到 security_result.summary UDM 字段。
说明 security_result.description 说明日志字段映射到 security_result.description UDM 字段。
类别 security_result.category_details category 日志字段映射到 security_result.category_details UDM 字段。
和程度上减少 security_result.severity 严重程度日志字段映射到 security_result.severity UDM 字段。
状态 security_result.detection_fields[status] 状态日志字段映射到 security_result.detection_fields UDM 字段。
分类信息 security_result.detection_fields[classification] 分类日志字段映射到 security_result.detection_fields UDM 字段。
determination security_result.detection_fields[determination] determination 日志字段映射到 security_result.detection_fields UDM 字段。
investigationState security_result.detection_fields[investigationState] investigationState 日志字段映射到 security_result.detection_fields UDM 字段。
computerDnsName principal.hostname computerDnsName 日志字段映射到 principal.hostname UDM 字段。
machineId principal.asset.asset_id machineId 日志字段映射到 principal.asset.asset_id UDM 字段。
relatedUser.userName principal.user.userid relatedUser.userName 日志字段映射到 principal.user.userid UDM 字段。
relatedUser.domainName principal.administrative_domain relatedUser.domainName 日志字段映射到 principal.administrative_domain UDM 字段。
threatName security_result.threat_name threatName 日志字段映射到 security_result.threat_name UDM 字段。
threatFamilyName security_result.threat_name threatFamilyName 日志字段映射到 security_result.threat_name UDM 字段。
detectionSource security_result.detection_fields[detectionSource] detectionSource 日志字段映射到 security_result.detection_fields UDM 字段。
证据 security_result.detection_fields[evidence] 证据日志字段映射到 security_result.detection_fields UDM 字段。
properties.Application principal.application 从变更日志映射
properties.AccountDisplayName principal.user.user_display_name 从变更日志映射
properties.AccountId principal.user.product_object_id 从变更日志映射
properties.AccountType principal.user.attribute.labels 从变更日志映射
properties.UserAgent network.http.user_agent 从变更日志映射
properties.RawEventData.Id", "properties.RawEventData.item.id", "properties.RawEventData.ParentFolder.Id", "properties.AppInstanceId", "properties.ActivityType", "properties.ActivityObjects", "properties.ApplicationId", "properties.DeviceType", "properties.EnforcementMode", "properties.IsAnonymousProxy", "properties.IsAdminOperation", "properties.IsExternalUser", "properties.IsImpersonated", "properties.RawEventData.MDATPDeviceId", "properties.AdditionalFields.IsSatelliteProvider", "properties.RawEventData.DestinationLocationType", "properties.RawEventData.CreationTime", "properties.RawEventData.FileExtension", "properties.RawEventData.Hidden", "properties.RawEventData.FileType", "properties.IPCategory", "properties.ISP", "properties.IPTags", "properties.RawEventData.UserType", "properties.RawEventData.Version" and "properties.RawEventData.Workload", "properties.UserAgentTags", "operationName", "properties.ObjectType", "properties.RawEventData.Operation", "properties.ObjectName", "properties.RawEventData.Scope","properties.RawEventData.ClientProcessName", "properties.RawEventData.ClientInfoString", "properties.RawEventData.ClientRequestId", "properties.RawEventData.ClientVersion", "properties.RawEventData.ExternalAccess", "properties.RawEventData.LogonType", "properties.RawEventData.LogonUserSid", "properties.RawEventData.MailboxGuid", and "properties.RawEventData.UserKey additional.fields 从变更日志映射
properties.RawEventData.ClientIP" and "properties.IPAddress principal.ip 从变更日志映射
properties.RawEventData.DeviceName principal.hostname 从变更日志映射
metadata.event_type FILE_CREATION 从变更日志映射
properties.AccountObjectId principal.user.userid 从变更日志映射
properties.CountryCode principal.location.country_or_region 从变更日志映射
properties.City principal.location.city 从变更日志映射
properties.RawEventData.Application principal.application 从变更日志映射
properties.RawEventData.TargetFilePath target.file.full_path 从变更日志映射
properties.IPAddress principal.ip 从变更日志映射
properties.ApplicationId additional.fields 从变更日志映射
properties.RawEventData.FileExtension additional.fields 从变更日志映射
properties.RawEventData.MDATPDeviceId additional.fields 从变更日志映射
properties.RawEventData.FileType additional.fields 从变更日志映射
properties.RawEventData.Sha1 target.process.file.sha1 从变更日志映射
properties.RawEventData.Sha256 target.process.file.sha256 从变更日志映射
properties.RawEventData.FileSize target.process.file.size 从变更日志映射
metadata.entity_type ASSET 从变更日志映射
properties.DeviceId entity.asset.asset_id 从变更日志映射
AdditionalFields" and "properties.AdditionalFields principal.resource.attribute.labels 从变更日志映射
tenantId resource_ancestors.product_object_id 从变更日志映射
properties.RawEventData.Sha1 principal.process.file.sha1 从变更日志映射
properties.RawEventData.Sha256 principal.process.file.sha256 从变更日志映射
properties.RawEventData.FileSize principal.process.file.size 从变更日志映射
properties.InitiatingProcessVersionInfoCompanyName principal.user.company_name 从变更日志映射
properties.InitiatingProcessVersionInfoProductVersion metadata.product_version 从变更日志映射
properties.InitiatingProcessVersionInfoInternalFileName principal.resource.attribute.labels 从变更日志映射
properties.InitiatingProcessVersionInfoOriginalFileName principal.resource.attribute.labels 从变更日志映射
properties.properties.InitiatingProcessVersionInfoFileDescription principal.resource.attribute.labels 从变更日志映射
properties.AlertId metadata.product_log_id 从变更日志映射
properties.ReportId target.resource.product_object_id 从变更日志映射
properties.DeviceId principal.asset_id 从变更日志映射

更新日志

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

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