收集 Cisco AMP for Endpoints 日志
本文档介绍了如何使用 Google Cloud Storage 将 Cisco AMP for Endpoints 日志提取到 Google Security Operations。解析器将原始 JSON 格式的日志转换为符合 Chronicle UDM 的结构化格式。它从嵌套的 JSON 对象中提取字段,将其映射到 UDM 架构,识别事件类别,分配严重程度,并最终生成统一的事件输出,在满足特定条件时标记安全提醒。
准备工作
确保您满足以下前提条件:
- Google SecOps 实例
- 启用了 Cloud Storage API 的 GCP 项目
- 创建和管理 GCS 存储分区的权限
- 管理 GCS 存储分区的 IAM 政策的权限
- 创建 Cloud Run 服务、Pub/Sub 主题和 Cloud Scheduler 作业的权限
- 对 Cisco AMP for Endpoints 控制台的特权访问权限
收集 Cisco AMP for Endpoints API 凭据
- 登录 Cisco AMP for Endpoints 控制台。
- 依次前往账号 > API 凭据。
- 点击 New API Credential(新的 API 凭据)以创建新的 API 密钥和客户端 ID。
- 提供以下配置详细信息:
- 应用名称:输入一个名称(例如
Chronicle SecOps Integration)。 - 范围:选择只读以进行基本事件轮询。
- 应用名称:输入一个名称(例如
- 点击创建。
- 复制以下详细信息并将其保存在安全的位置:
- 3API 客户端 ID
- API 密钥
- API 基准网址:取决于您所在的地区:
- 美国:
https://api.amp.cisco.com - 欧盟:
https://api.eu.amp.cisco.com - APJC:
https://api.apjc.amp.cisco.com
- 美国:
验证权限
如需验证账号是否具有所需权限,请执行以下操作:
- 登录 Cisco AMP for Endpoints 控制台。
- 依次前往账号 > API 凭据。
- 如果您能看到 API 凭据页面,并且其中列出了您新建的凭据,则表示您拥有所需的权限。
- 如果您看不到此选项,请与您的管理员联系,以获取 API 访问权限。
测试 API 访问权限
在继续进行集成之前,请先测试您的凭据:
# Replace with your actual credentials AMP_CLIENT_ID="your-client-id" AMP_API_KEY="your-api-key" API_BASE="https://api.amp.cisco.com" # Test API access curl -v -u "${AMP_CLIENT_ID}:${AMP_API_KEY}" "${API_BASE}/v1/events?limit=1"
创建 Google Cloud Storage 存储分区
- 前往 Google Cloud 控制台。
- 选择您的项目或创建新项目。
- 在导航菜单中,依次前往 Cloud Storage > 存储分区。
- 点击创建存储分区。
提供以下配置详细信息:
设置 值 为存储分区命名 输入一个全局唯一的名称(例如 cisco-amp-logs)位置类型 根据您的需求进行选择(区域级、双区域级、多区域级) 位置 选择相应位置(例如 us-central1)存储类别 标准(建议用于经常访问的日志) 访问权限控制 统一(推荐) 保护工具 可选:启用对象版本控制或保留政策 点击创建。
为 Cloud Run 函数创建服务账号
Cloud Run 函数需要一个服务账号,该账号具有向 GCS 存储分区写入内容以及被 Pub/Sub 调用的权限。
创建服务账号
- 在 GCP 控制台中,依次前往 IAM 和管理 > 服务账号。
- 点击创建服务账号。
- 提供以下配置详细信息:
- 服务账号名称:输入
cisco-amp-collector-sa。 - 服务账号说明:输入
Service account for Cloud Run function to collect Cisco AMP for Endpoints logs。
- 服务账号名称:输入
- 点击创建并继续。
- 在向此服务账号授予对项目的访问权限部分中,添加以下角色:
- 点击选择角色。
- 搜索并选择 Storage Object Admin。
- 点击 + 添加其他角色。
- 搜索并选择 Cloud Run Invoker。
- 点击 + 添加其他角色。
- 搜索并选择 Cloud Functions Invoker。
- 点击继续。
- 点击完成。
必须拥有这些角色,才能:
- Storage Object Admin:将日志写入 GCS 存储分区并管理状态文件
- Cloud Run Invoker:允许 Pub/Sub 调用函数
- Cloud Functions Invoker:允许调用函数
授予对 GCS 存储分区的 IAM 权限
向服务账号 (cisco-amp-collector-sa) 授予对 GCS 存储分区的写入权限:
- 前往 Cloud Storage > 存储分区。
- 点击您的存储分区名称。
- 前往权限标签页。
- 点击授予访问权限。
- 提供以下配置详细信息:
- 添加主账号:输入服务账号电子邮件地址(例如
cisco-amp-collector-sa@PROJECT_ID.iam.gserviceaccount.com)。 - 分配角色:选择 Storage Object Admin。
- 添加主账号:输入服务账号电子邮件地址(例如
- 点击保存。
创建发布/订阅主题
创建一个 Pub/Sub 主题,供 Cloud Scheduler 发布消息,并供 Cloud Run 函数订阅。
- 在 GCP 控制台中,前往 Pub/Sub > 主题。
- 点击创建主题。
- 提供以下配置详细信息:
- 主题 ID:输入
cisco-amp-events-trigger。 - 将其他设置保留为默认值。
- 主题 ID:输入
- 点击创建。
创建 Cloud Run 函数以收集日志
Cloud Run 函数将由来自 Cloud Scheduler 的 Pub/Sub 消息触发,以从 Cisco AMP for Endpoints API 中提取日志并将其写入 GCS。
- 在 GCP 控制台中,前往 Cloud Run。
- 点击创建服务。
- 选择函数(使用内嵌编辑器创建函数)。
在配置部分中,提供以下配置详细信息:
设置 值 Service 名称 cisco-amp-events-collector区域 选择与您的 GCS 存储分区匹配的区域(例如 us-central1)运行时 选择 Python 3.12 或更高版本 在触发器(可选)部分中:
- 点击 + 添加触发器。
- 选择 Cloud Pub/Sub。
- 在选择 Cloud Pub/Sub 主题中,选择 Pub/Sub 主题 (
cisco-amp-events-trigger)。 - 点击保存。
在身份验证部分中:
- 选择需要进行身份验证。
- 选择 Identity and Access Management (IAM)。
- 滚动到容器、网络、安全性并展开该部分。
- 前往安全性标签页:
- 服务账号:选择服务账号 (
cisco-amp-collector-sa)。
- 服务账号:选择服务账号 (
前往容器标签页:
- 点击变量和密钥。
为每个环境变量点击 + 添加变量:
变量名称 示例值 说明 GCS_BUCKETcisco-amp-logsGCS 存储分区名称 GCS_PREFIXcisco-amp-events/日志文件的前缀 STATE_KEYcisco-amp-events/state.json状态文件路径 API_BASEhttps://api.amp.cisco.comAPI 基本网址 AMP_CLIENT_IDyour-client-idAPI 客户端 ID AMP_API_KEYyour-api-keyAPI 密钥 PAGE_SIZE500每页记录数 MAX_PAGES10要提取的最大网页数
在变量和 Secret 部分中,滚动到请求:
- 请求超时:输入
600秒(10 分钟)。
- 请求超时:输入
前往设置标签页:
- 在资源部分中:
- 内存:选择 512 MiB 或更高值。
- CPU:选择 1。
- 在资源部分中:
在修订版本扩缩部分中:
- 实例数下限:输入
0。 - 实例数上限:输入
100(或根据预期负载进行调整)。
- 实例数下限:输入
点击创建。
等待服务创建完成(1-2 分钟)。
创建服务后,系统会自动打开内嵌代码编辑器。
添加函数代码
- 在入口点字段中输入 main。
在内嵌代码编辑器中,创建两个文件:
- 第一个文件: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 # 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', 'cisco-amp-events/') STATE_KEY = os.environ.get('STATE_KEY', 'cisco-amp-events/state.json') API_BASE = os.environ.get('API_BASE') AMP_CLIENT_ID = os.environ.get('AMP_CLIENT_ID') AMP_API_KEY = os.environ.get('AMP_API_KEY') PAGE_SIZE = int(os.environ.get('PAGE_SIZE', '500')) MAX_PAGES = int(os.environ.get('MAX_PAGES', '10')) 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) @functions_framework.cloud_event def main(cloud_event): """ Cloud Run function triggered by Pub/Sub to fetch Cisco AMP events and write to GCS. Args: cloud_event: CloudEvent object containing Pub/Sub message """ if not all([GCS_BUCKET, API_BASE, AMP_CLIENT_ID, AMP_API_KEY]): print('Error: Missing required environment variables') return try: # Get GCS bucket 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(days=1) print(f"Fetching logs from {last_time.isoformat()} to {now.isoformat()}") # Fetch logs records, newest_event_time = fetch_logs( api_base=API_BASE, client_id=AMP_CLIENT_ID, api_key=AMP_API_KEY, start_time=last_time, page_size=PAGE_SIZE, max_pages=MAX_PAGES, ) 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}cisco_amp_events_{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(api_base: str, client_id: str, api_key: str, start_time: datetime, page_size: int, max_pages: int): """ Fetch logs from Cisco AMP for Endpoints API with pagination and rate limiting. Args: api_base: API base URL client_id: API client ID api_key: API key start_time: Start time for log query page_size: Number of records per page max_pages: Maximum total pages to fetch Returns: Tuple of (records list, newest_event_time ISO string) """ # Clean up base URL base_url = api_base.rstrip('/') endpoint = f"{base_url}/v1/events" # Create Basic Auth header auth_string = f"{client_id}:{api_key}" auth_bytes = auth_string.encode('utf-8') auth_b64 = base64.b64encode(auth_bytes).decode('utf-8') headers = { 'Authorization': f'Basic {auth_b64}', 'Accept': 'application/json', 'User-Agent': 'GoogleSecOps-CiscoAMPCollector/1.0' } records = [] newest_time = None page_num = 0 backoff = 1.0 # Build initial URL with start_date parameter start_date_str = start_time.isoformat() + 'Z' if not start_time.isoformat().endswith('Z') else start_time.isoformat() next_url = f"{endpoint}?limit={page_size}&start_date={start_date_str}" while next_url and page_num < max_pages: page_num += 1 try: response = http.request('GET', next_url, headers=headers) # 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[:256]}") return [], None data = json.loads(response.data.decode('utf-8')) # Extract events from response page_results = data.get('data', []) 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('date') 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 next page URL in metadata next_url = data.get('metadata', {}).get('links', {}).get('next') if not next_url: print("No more pages (no next URL)") 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点击部署以保存并部署该函数。
等待部署完成(2-3 分钟)。
创建 Cloud Scheduler 作业
Cloud Scheduler 会定期向 Pub/Sub 主题发布消息,从而触发 Cloud Run 函数。
- 在 GCP Console 中,前往 Cloud Scheduler。
- 点击创建作业。
提供以下配置详细信息:
设置 值 名称 cisco-amp-events-collector-hourly区域 选择与 Cloud Run 函数相同的区域 频率 0 * * * *(每小时一次,在整点时)时区 选择时区(建议选择世界协调时间 [UTC]) 目标类型 Pub/Sub 主题 选择 Pub/Sub 主题 ( cisco-amp-events-trigger)消息正文 {}(空 JSON 对象)点击创建。
时间表频率选项
根据日志量和延迟时间要求选择频次:
频率 Cron 表达式 使用场景 每隔 5 分钟 */5 * * * *高容量、低延迟 每隔 15 分钟 */15 * * * *搜索量中等 每小时 0 * * * *标准(推荐) 每 6 小时 0 */6 * * *量小、批处理 每天 0 0 * * *历史数据收集
测试集成
- 在 Cloud Scheduler 控制台中,找到您的作业。
- 点击强制运行以手动触发作业。
- 等待几秒钟。
- 前往 Cloud Run > 服务。
- 点击函数名称 (
cisco-amp-events-collector)。 - 点击日志标签页。
验证函数是否已成功执行。查找以下项:
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://cisco-amp-logs/cisco-amp-events/cisco_amp_events_YYYYMMDD_HHMMSS.ndjson Successfully processed X records前往 Cloud Storage > 存储分区。
点击您的存储分区名称。
前往前缀文件夹 (
cisco-amp-events/)。验证是否已创建具有当前时间戳的新
.ndjson文件。
如果您在日志中看到错误,请执行以下操作:
- HTTP 401:检查环境变量中的 API 凭据
- HTTP 403:验证账号是否具有所需权限
- HTTP 429:速率限制 - 函数将自动重试并进行退避
- 缺少环境变量:检查是否已设置所有必需的变量
检索 Google SecOps 服务账号
Google SecOps 使用唯一的服务账号从您的 GCS 存储分区中读取数据。您必须授予此服务账号对您的存储分区的访问权限。
获取服务账号电子邮件地址
- 依次前往 SIEM 设置 > Feed。
- 点击添加新 Feed。
- 点击配置单个 Feed。
- 在Feed 名称字段中,输入 Feed 的名称(例如
Cisco AMP for Endpoints logs)。 - 选择 Google Cloud Storage V2 作为来源类型。
- 选择 Cisco AMP 作为日志类型。
点击获取服务账号。系统会显示一个唯一的服务账号电子邮件地址,例如:
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com复制此电子邮件地址,以便在下一步中使用。
向 Google SecOps 服务账号授予 IAM 权限
Google SecOps 服务账号需要对您的 GCS 存储分区具有 Storage Object Viewer 角色。
- 前往 Cloud Storage > 存储分区。
- 点击您的存储分区名称。
- 前往权限标签页。
- 点击授予访问权限。
- 提供以下配置详细信息:
- 添加主账号:粘贴 Google SecOps 服务账号电子邮件地址。
- 分配角色:选择 Storage Object Viewer。
- 点击保存。
在 Google SecOps 中配置 Feed 以注入 Cisco AMP for Endpoints 日志
- 依次前往 SIEM 设置 > Feed。
- 点击添加新 Feed。
- 点击配置单个 Feed。
- 在Feed 名称字段中,输入 Feed 的名称(例如
Cisco AMP for Endpoints logs)。 - 选择 Google Cloud Storage V2 作为来源类型。
- 选择 Cisco AMP 作为日志类型。
- 点击下一步。
为以下输入参数指定值:
存储分区网址:输入带有前缀路径的 GCS 存储分区 URI:
gs://cisco-amp-logs/cisco-amp-events/- 替换:
cisco-amp-logs:您的 GCS 存储分区名称。cisco-amp-events/:存储日志的前缀/文件夹路径。
- 替换:
来源删除选项:根据您的偏好选择删除选项:
- 永不:永不删除转移后的任何文件(建议用于测试)。
- 删除已转移的文件:在成功转移后删除文件。
删除已转移的文件和空目录:在成功转移后删除文件和空目录。
文件存在时间上限:包含在过去指定天数内修改的文件。默认值为 180 天。
资产命名空间:资产命名空间。
注入标签:要应用于此 Feed 中事件的标签。
点击下一步。
在最终确定界面中查看新的 Feed 配置,然后点击提交。
UDM 映射表
| 日志字段 | UDM 映射 | 逻辑 |
|---|---|---|
| 有效 | read_only_udm.principal.asset.active | 直接从 computer.active 映射 |
| connector_guid | read_only_udm.principal.asset.uuid | 直接从 computer.connector_guid 映射 |
| 日期 | read_only_udm.metadata.event_timestamp.seconds | 直接从日期映射,在转换为时间戳后 |
| 检测 | read_only_udm.security_result.threat_name | 直接从检测结果映射 |
| detection_id | read_only_udm.security_result.detection_fields.value | 直接从 detection_id 映射 |
| disposition | read_only_udm.security_result.description | 直接从 file.disposition 映射 |
| error.error_code | read_only_udm.security_result.detection_fields.value | 直接从 error.error_code 映射 |
| error.description | read_only_udm.security_result.detection_fields.value | 直接从 error.description 映射 |
| event_type | read_only_udm.metadata.product_event_type | 直接从 event_type 映射 |
| event_type_id | read_only_udm.metadata.product_log_id | 直接从 event_type_id 映射 |
| external_ip | read_only_udm.principal.asset.external_ip | 直接从 computer.external_ip 映射。 |
| file.file_name | read_only_udm.target.file.names | 直接从 file.file_name 映射 |
| file.file_path | read_only_udm.target.file.full_path | 直接从 file.file_path 映射 |
| file.identity.md5 | read_only_udm.security_result.about.file.md5 | 直接从 file.identity.md5 映射 |
| file.identity.md5 | read_only_udm.target.file.md5 | 直接从 file.identity.md5 映射 |
| file.identity.sha1 | read_only_udm.security_result.about.file.sha1 | 直接从 file.identity.sha1 映射 |
| file.identity.sha1 | read_only_udm.target.file.sha1 | 直接从 file.identity.sha1 映射 |
| file.identity.sha256 | read_only_udm.security_result.about.file.sha256 | 直接从 file.identity.sha256 映射 |
| file.identity.sha256 | read_only_udm.target.file.sha256 | 直接从 file.identity.sha256 映射 |
| file.parent.disposition | read_only_udm.target.resource.attribute.labels.value | 直接从 file.parent.disposition 映射 |
| file.parent.file_name | read_only_udm.target.resource.attribute.labels.value | 直接从 file.parent.file_name 映射 |
| file.parent.identity.md5 | read_only_udm.target.resource.attribute.labels.value | 直接从 file.parent.identity.md5 映射 |
| file.parent.identity.sha1 | read_only_udm.target.resource.attribute.labels.value | 直接从 file.parent.identity.sha1 映射 |
| file.parent.identity.sha256 | read_only_udm.target.resource.attribute.labels.value | 直接从 file.parent.identity.sha256 映射 |
| file.parent.process_id | read_only_udm.security_result.about.process.parent_process.pid | 直接从 file.parent.process_id 映射 |
| file.parent.process_id | read_only_udm.target.process.parent_process.pid | 直接从 file.parent.process_id 映射 |
| 主机名 | read_only_udm.principal.asset.hostname | 直接从 computer.hostname 映射 |
| 主机名 | read_only_udm.target.hostname | 直接从 computer.hostname 映射 |
| 主机名 | read_only_udm.target.asset.hostname | 直接从 computer.hostname 映射 |
| ip | read_only_udm.principal.asset.ip | 直接从 computer.network_addresses.ip 映射 |
| ip | read_only_udm.principal.ip | 直接从 computer.network_addresses.ip 映射 |
| ip | read_only_udm.security_result.about.ip | 直接从 computer.network_addresses.ip 映射 |
| mac | read_only_udm.principal.mac | 直接从 computer.network_addresses.mac 映射 |
| mac | read_only_udm.security_result.about.mac | 直接从 computer.network_addresses.mac 映射 |
| 和程度上减少 | read_only_udm.security_result.severity | 根据以下逻辑从严重程度进行映射:“中”->“中”;“高”或“严重”->“高”;“低”->“低”;否则 ->“未知严重程度” |
| 时间戳 | read_only_udm.metadata.event_timestamp.seconds | 直接从时间戳映射 |
| 用户 | read_only_udm.security_result.about.user.user_display_name | 直接从 computer.user 映射 |
| 用户 | read_only_udm.target.user.user_display_name | 直接从 computer.user 映射 |
| vulnerabilities.cve | read_only_udm.extensions.vulns.vulnerabilities.cve_id | 直接从 vulnerabilities.cve 映射 |
| vulnerabilities.name | read_only_udm.extensions.vulns.vulnerabilities.name | 直接从 vulnerabilities.name 映射 |
| vulnerabilities.score | read_only_udm.extensions.vulns.vulnerabilities.cvss_base_score | 直接从漏洞的 score 映射,并转换为浮点数 |
| vulnerabilities.url | read_only_udm.extensions.vulns.vulnerabilities.vendor_knowledge_base_article_id | 直接从 vulnerabilities.url 映射 |
| vulnerabilities.version | read_only_udm.extensions.vulns.vulnerabilities.cvss_version | 直接从 vulnerabilities.version 映射 |
| is_alert | 如果 event_type 为以下值之一,则设置为 true:“检测到威胁”“漏洞利用防范”“已执行的恶意软件”“潜在的投放程序感染”“多个受感染的文件”“检测到存在漏洞的应用”,或者如果 security_result.severity 为“HIGH” | |
| is_significant | 如果 event_type 为以下值之一,则设置为 true:“检测到威胁”“漏洞利用防范”“已执行的恶意软件”“潜在的投放程序感染”“多个受感染的文件”“检测到存在漏洞的应用”,或者如果 security_result.severity 为“HIGH” | |
| read_only_udm.metadata.event_type | 根据 event_type 和 security_result.severity 值确定。- 如果 event_type 是以下类型之一:“Executed malware”“Threat Detected”“Potential Dropper Infection”“Cloud Recall Detection”“Malicious Activity Detection”“Exploit Prevention”“Multiple Infected Files”“Cloud IOC”“System Process Protection”“Vulnerable Application Detected”“Threat Quarantined”“Execution Blocked”“Cloud Recall Quarantine Successful”“Cloud Recall Restore from Quarantine Failed”“Cloud Recall Quarantine Attempt Failed”“Quarantine Failure”,则将事件类型设置为“SCAN_FILE”。- 如果 security_result.severity 为“HIGH”,则将事件类型设置为“SCAN_FILE”。- 如果 has_principal 和 has_target 均为 true,则将事件类型设置为“SCAN_UNCATEGORIZED”。- 否则,事件类型将设置为“GENERIC_EVENT”。 | |
| read_only_udm.metadata.log_type | 设置为“CISCO_AMP” | |
| read_only_udm.metadata.vendor_name | 设置为“CISCO_AMP” | |
| read_only_udm.security_result.about.file.full_path | 直接从 file.file_path 映射 | |
| read_only_udm.security_result.about.hostname | 直接从 computer.hostname 映射 | |
| read_only_udm.security_result.about.user.user_display_name | 直接从 computer.user 映射 | |
| read_only_udm.security_result.detection_fields.key | 对于 detection_id,设置为“检测 ID”;对于 error.error_code,设置为“错误代码”;对于 error.description,设置为“错误说明”;对于 file.parent.disposition,设置为“父处置”;对于 file.parent.file_name,设置为“父文件名”;对于 file.parent.identity.md5,设置为“父 MD5”;对于 file.parent.identity.sha1,设置为“父 SHA1”;对于 file.parent.identity.sha256,设置为“父 SHA256” | |
| read_only_udm.security_result.summary | 如果 event_type 为以下值之一,则设置为 event_type:“Threat Detected”“Exploit Prevention”“Executed malware”“Potential Dropper Infection”“Multiple Infected Files”“Vulnerable Application Detected”;如果 security_result.severity 为“HIGH”,则设置为 event_type | |
| read_only_udm.target.asset.ip | 直接从 computer.network_addresses.ip 映射 | |
| read_only_udm.target.resource.attribute.labels.key | 对于 file.parent.disposition,设置为“Parent Disposition”;对于 file.parent.file_name,设置为“Parent File Name”;对于 file.parent.identity.md5,设置为“Parent MD5”;对于 file.parent.identity.sha1,设置为“Parent SHA1”;对于 file.parent.identity.sha256,设置为“Parent SHA256” | |
| timestamp.seconds | 直接从日期映射(在转换为时间戳后) |
需要更多帮助?获得社区成员和 Google SecOps 专业人士的解答。