收集 Custom Security Data Analytics 日志
本文档介绍了如何使用多种注入方法将自定义安全分析数据注入到 Google Security Operations 中。本指南适用于没有预构建解析器或日志类型的自定义安全数据源。
自定义安全数据分析涵盖专有安全遥测数据、自定义应用日志、内部安全工具,或来自未与 Google SecOps 原生集成的来源的任何与安全相关的数据。您可以将这些数据作为非结构化日志注入,并可选择使用自定义解析器对其进行规范化处理。
准备工作
请确保满足以下前提条件:
- Google SecOps 实例
- 能够以 JSON、CSV、SYSLOG 或其他结构化格式导出日志的自定义安全数据源
- 访问以下任一页面:
- Google Cloud Console(用于创建 API 密钥和 GCS)
- AWS 控制台(适用于 S3 或 Firehose)
- Azure 门户(适用于 Azure Blob Storage)
- 能够发送 webhook 请求的 HTTP 客户端或应用
- 在 Google SecOps 中创建和管理 Feed 的权限
选择注入方法
Google SecOps 支持多种自定义安全数据注入方法。选择最适合您数据源功能的方法:
| 注入方法 | 使用场景 | 延迟时间 | 设置复杂性 |
|---|---|---|---|
| Webhook | 来自应用的实时推送 | 秒 | 低 |
| Amazon S3 V2 | 批量导出到 S3 存储桶 | 几分钟到几小时 | 中 |
| Google Cloud Storage V2 | 批量导出到 GCS 存储桶 | 几分钟到几小时 | 中 |
| Azure Blob Storage V2 | 批量导出到 Azure 存储空间 | 几分钟到几小时 | 中 |
| Amazon Data Firehose | 从 AWS 进行实时流式传输 | 秒 | 高 |
方式 1:Webhook 注入(实时推送)
如果您的自定义安全应用可以向外部端点发送 HTTP POST 请求,请使用此方法。
在 Google SecOps 中创建 Webhook Feed
创建 Feed
- 依次前往 SIEM 设置> Feed。
- 点击添加新 Feed。
- 在下一页上,点击配置单个 Feed。
- 在 Feed 名称字段中,输入 Feed 的名称(例如
custom-security-analytics-webhook)。 - 选择 Webhook 作为来源类型。
- 选择自定义安全数据分析作为日志类型。
- 点击下一步。
- 为以下输入参数指定值:
- 拆分分隔符:可选:输入用于拆分多行事件的分隔符。常见值:
\n- 换行符分隔符(NDJSON 最常用的分隔符)- 如果每个请求都包含单个活动,请留空
- 资产命名空间:资产命名空间
- 注入标签:要应用于此 Feed 中事件的标签
- 拆分分隔符:可选:输入用于拆分多行事件的分隔符。常见值:
- 点击下一步。
- 在最终确定界面中查看新的 Feed 配置,然后点击提交。
生成并保存密钥
创建 Feed 后,您必须生成用于身份验证的密钥:
- 在 Feed 详情页面上,点击生成密钥。
- 系统会显示一个包含密钥的对话框。
复制并妥善保存此密钥。
获取 Feed 端点网址
- 前往相应 Feed 的详细信息标签页。
- 在端点信息部分,复制 Feed 端点网址。
网址格式为:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate或
https://<REGION>-malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate保存此网址以供后续步骤使用。
点击完成。
创建 Google Cloud API 密钥
Google SecOps 需要使用 API 密钥进行身份验证。在 Google Cloud Console 中创建受限 API 密钥。
创建 API 密钥
- 前往 Google Cloud 控制台的“凭据”页面。
- 选择您的项目(与您的 Chronicle 实例关联的项目)。
- 点击创建凭据 > API 密钥。
- 系统会创建一个 API 密钥,并在对话框中显示该密钥。
- 点击修改 API 密钥以限制密钥。
限制 API 密钥
- 在 API 密钥设置页面中:
- 名称:输入一个描述性名称(例如
Chronicle Webhook API Key)。
- 名称:输入一个描述性名称(例如
- 在 API 限制下:
- 选择限制密钥。
- 在选择 API 下拉菜单中,搜索并选择 Google SecOps API(或 Chronicle API)。
- 点击保存。
- 从页面顶部的 API 密钥字段复制 API 密钥值。
安全地保存 API 密钥。
配置自定义应用以发送数据
配置自定义安全应用或脚本,以将 HTTP POST 请求发送到 Chronicle 网络钩子端点。
构建网络钩子网址:
将 Chronicle 端点网址和 API 密钥组合在一起:
<ENDPOINT_URL>?key=<API_KEY>示例:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...
HTTP 请求格式:
方法:POST
网址:
<ENDPOINT_URL>?key=<API_KEY>标头:
Content-Type: application/json x-chronicle-auth: <SECRET_KEY>正文(单个事件):
{ "timestamp": "2025-01-15T10:30:00Z", "event_type": "authentication", "user": "john.doe@example.com", "action": "login", "result": "success", "source_ip": "203.0.113.45", "custom_field_1": "value1", "custom_field_2": "value2" }正文(以换行符分隔的多个事件):
{"timestamp": "2025-01-15T10:30:00Z", "event_type": "authentication", "action": "login"} {"timestamp": "2025-01-15T10:30:05Z", "event_type": "file_access", "action": "read"} {"timestamp": "2025-01-15T10:30:10Z", "event_type": "authentication", "action": "logout"}
示例:
示例:Python 脚本:
import requests import json from datetime import datetime # Configuration ENDPOINT_URL = "https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate" API_KEY = "your-api-key-here" SECRET_KEY = "your-secret-key-here" # Construct full URL url = f"{ENDPOINT_URL}?key={API_KEY}" # Headers headers = { "Content-Type": "application/json", "x-chronicle-auth": SECRET_KEY } # Sample event event = { "timestamp": datetime.utcnow().isoformat() + "Z", "event_type": "custom_security_event", "severity": "high", "source": "custom_security_tool", "message": "Suspicious activity detected", "user": "admin@example.com", "ip_address": "192.168.1.100" } # Send request response = requests.post(url, headers=headers, data=json.dumps(event)) if response.status_code == 200: print("Event sent successfully") else: print(f"Error: {response.status_code} - {response.text}")示例:c网址 命令:
curl -X POST \ "https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=YOUR_API_KEY" \ -H "Content-Type: application/json" \ -H "x-chronicle-auth: YOUR_SECRET_KEY" \ -d '{ "timestamp": "2025-01-15T10:30:00Z", "event_type": "security_alert", "severity": "critical", "source": "custom_tool", "message": "Threat detected" }'
身份验证方法参考
Google SecOps Webhook Feed 支持多种身份验证方法。选择您的应用支持的方法。
方法 1:自定义标头(推荐)
如果您的应用支持自定义 HTTP 标头,请使用此方法以提高安全性。
请求格式:
POST <ENDPOINT_URL> HTTP/1.1 Content-Type: application/json x-goog-chronicle-auth: <API_KEY> x-chronicle-auth: <SECRET_KEY> { "event": "data", "timestamp": "2025-01-15T10:30:00Z" }优势:
- API 密钥和 Secret 不会显示在网址中。
- 更安全,因为标头不会记录在 Web 服务器访问日志中。
- 如果应用支持,则为首选方法。
方法 2:查询参数
如果您的应用不支持自定义标头,请将凭据附加到网址。
网址格式:
<ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY>示例:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...&secret=abcd1234...请求格式:
POST <ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY> HTTP/1.1 Content-Type: application/json { "event": "data", "timestamp": "2025-01-15T10:30:00Z" }缺点:
- 凭据在网址中可见。
- 凭据可能会记录在 Web 服务器访问日志中。
- 安全性低于标头。
方法 3:混合(网址 + 标头)
某些配置在网址中使用 API 密钥,在标头中使用密钥。
请求格式:
POST <ENDPOINT_URL>?key=<API_KEY> HTTP/1.1 Content-Type: application/json x-chronicle-auth: <SECRET_KEY> { "event": "data", "timestamp": "2025-01-15T10:30:00Z" }
Webhook 限制和最佳实践
请求限制
| 限制 | 值 |
|---|---|
| 最大请求大小 | 4 MB |
| 最大 QPS(每秒查询次数) | 15000 |
| 请求超时 | 30 秒 |
| 重试行为 | 自动(使用指数退避算法 |
最佳做法
- 批量处理事件:使用以换行符分隔的 JSON (NDJSON) 格式在一个请求中发送多个事件,以减少开销。
- 包含时间戳:始终包含采用 ISO 8601 格式的时间戳字段,以便准确地对事件进行排序。
- 使用结构化数据:以 JSON 格式发送数据,以便更轻松地进行解析和提取字段。
- 实现重试逻辑:使用指数退避算法处理瞬时故障。
- 监控响应代码:记录并提醒非 200 响应。
方案 2:Amazon S3 V2 注入(批量导出)
如果您的自定义安全应用可以将日志导出到 Amazon S3 存储桶,请使用此方法。
创建 Amazon S3 存储桶
- 打开 Amazon S3 控制台。
- 点击创建存储桶。
- 提供以下配置详细信息:
- 存储桶名称:为存储桶输入一个有意义的名称(例如
custom-security-analytics-logs)。 - 区域:选择您的首选 AWS 区域(例如
us-east-1)。
- 存储桶名称:为存储桶输入一个有意义的名称(例如
- 点击创建。
创建具有 S3 访问权限的 IAM 用户
- 打开 IAM 控制台。
- 依次点击用户 > 添加用户。
- 输入用户名(例如
chronicle-s3-reader)。 - 选择以编程方式访问。
- 点击 Next: Permissions。
- 选择 Attach existing policies directly。
- 搜索并选择 AmazonS3FullAccess。
- 点击 Next: Tags。
- 点击下一步:检查。
- 点击创建用户。
- 点击下载 .csv 文件以保存访问密钥 ID 和私有访问密钥。
- 点击关闭。
配置应用以导出到 S3
配置自定义安全应用以将日志文件写入 S3 存储桶。应用应:
- 以结构化格式(JSON、CSV 或纯文本)写入日志。
- 使用一致的文件命名惯例。
- 可选:按日期整理文件(例如
logs/2025/01/15/events.json)。 写入完整的文件(避免部分写入)。
文件结构示例:
s3://custom-security-analytics-logs/ ├── security-events/ │ ├── 2025/01/15/ │ │ ├── events-10-00.json │ │ ├── events-11-00.json │ │ └── events-12-00.json日志文件格式示例 (NDJSON):
{"timestamp": "2025-01-15T10:00:00Z", "event_type": "login", "user": "alice@example.com", "result": "success"} {"timestamp": "2025-01-15T10:05:00Z", "event_type": "file_access", "user": "bob@example.com", "file": "/data/sensitive.txt"} {"timestamp": "2025-01-15T10:10:00Z", "event_type": "logout", "user": "alice@example.com"}
为 S3 配置 Google SecOps Feed
- 依次前往 SIEM 设置> Feed。
- 点击添加新 Feed。
- 在下一页上,点击配置单个 Feed。
- 在 Feed 名称字段中,输入 Feed 的名称(例如
custom-security-analytics-s3)。 - 选择 Amazon S3 V2 作为来源类型。
- 选择自定义安全数据分析作为日志类型。
- 点击下一步。
为以下输入参数指定值:
S3 URI:存储桶 URI,格式为:
s3://custom-security-analytics-logs/security-events/来源删除选项:根据您的偏好选择删除选项:
- 永不:转移后永不删除任何文件(建议用于测试)。
- 删除已转移的文件:在成功转移后删除文件。
- 删除已转移的文件和空目录:成功转移后删除文件和空目录。
文件存在时间上限:包含在过去指定天数内修改的文件(默认值为 180 天)。
访问密钥 ID:输入 IAM 用户的访问密钥。
私有访问密钥:输入 IAM 用户的私有密钥。
资产命名空间:资产命名空间。
注入标签:要应用于此 Feed 中事件的标签。
点击下一步。
在最终确定界面中查看新的 Feed 配置,然后点击提交。
选项 3:Google Cloud Storage V2 提取(批量导出)
如果您的自定义安全应用可以将日志导出到 Google Cloud Storage 存储桶,请使用此方法。
创建 GCS 存储桶
- 转到 Google Cloud Console。
- 选择您的项目或创建新项目。
- 在导航菜单中,依次前往 Cloud Storage > 存储分区。
- 点击创建存储分区。
提供以下配置详细信息:
设置 值 为存储桶命名 输入一个全局唯一的名称(例如 custom-security-analytics-logs)位置类型 根据您的需求进行选择(区域级、双区域级、多区域级) 位置 选择相应位置(例如 us-central1)存储类别 标准(建议用于经常访问的日志) 访问权限控制 均匀(推荐) 保护工具 可选:启用对象版本控制或保留政策 点击创建。
配置应用以导出到 GCS
使用以下方法之一,将自定义安全应用配置为将日志文件写入 GCS 存储桶:
- Google Cloud SDK:使用
gsutil或客户端库 - 服务账号:创建具有 Storage Object Creator 角色的服务账号
签名网址:生成签名网址以获取临时写入权限
使用 gsutil 的示例:
gsutil cp /path/to/logs/events.json gs://custom-security-analytics-logs/security-events/使用 Python 客户端库的示例:
from google.cloud import storage import json # Initialize client client = storage.Client() bucket = client.bucket('custom-security-analytics-logs') # Upload log file blob = bucket.blob('security-events/2025/01/15/events.json') # Write NDJSON data events = [ {"timestamp": "2025-01-15T10:00:00Z", "event_type": "login"}, {"timestamp": "2025-01-15T10:05:00Z", "event_type": "logout"} ] ndjson_data = '\n'.join([json.dumps(event) for event in events]) + '\n' blob.upload_from_string(ndjson_data, content_type='application/x-ndjson')
获取 Google SecOps 服务账号
- 依次前往 SIEM 设置> Feed。
- 点击添加新 Feed。
- 点击配置单个 Feed。
- 在 Feed 名称字段中,输入 Feed 的名称(例如
custom-security-analytics-gcs)。 - 选择 Google Cloud Storage V2 作为来源类型。
- 选择自定义安全数据分析作为日志类型。
- 点击获取服务账号。
系统会显示一个唯一的服务账号电子邮件地址,例如:
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com复制此电子邮件地址,以便在下一步中使用。
授予 IAM 权限
- 前往 Cloud Storage > 存储分区。
- 点击您的存储桶名称。
- 前往权限标签页。
- 点击授予访问权限。
- 提供以下配置详细信息:
- 添加主账号:粘贴 Google SecOps 服务账号电子邮件地址。
- 分配角色:选择 Storage Object Viewer。
点击保存。
为 GCS 配置 Google SecOps Feed
- 从 Feed 创建页面继续操作(或前往 SIEM 设置 > Feed > 添加新 Feed)。
- 点击下一步。
为以下输入参数指定值:
存储桶网址:输入带有前缀路径的 GCS 存储桶 URI:
gs://custom-security-analytics-logs/security-events/来源删除选项:根据您的偏好选择删除选项:
- 永不:转移后永不删除任何文件(建议用于测试)。
- 删除已转移的文件:在成功转移后删除文件。
- 删除已转移的文件和空目录:成功转移后删除文件和空目录。
文件存在时间上限:包含在过去指定天数内修改的文件(默认值为 180 天)。
资产命名空间:资产命名空间。
注入标签:要应用于此 Feed 中事件的标签。
点击下一步。
在最终确定界面中查看新的 Feed 配置,然后点击提交。
选项 4:Azure Blob Storage V2 提取(批量导出)
如果您的自定义安全应用可以将日志导出到 Azure Blob Storage,请使用此方法。
创建 Azure 存储账号
- 在 Azure 门户中,搜索存储账号。
- 点击 + 创建。
提供以下配置详细信息:
设置 值 订阅 选择您的 Azure 订阅 资源组 选择现有组或创建新组 存储账号名称 输入唯一名称(例如 customsecuritylogs)区域 选择区域(例如 East US)性能 标准(推荐) 冗余 GRS(地理位置冗余存储)或 LRS(本地冗余存储) 点击检查 + 创建。
查看账号概览,然后点击创建。
等待部署完成。
获取存储账号凭据
- 前往您刚刚创建的存储账号。
- 在左侧导航栏中,选择安全性 + 网络下的访问密钥。
- 点击显示密钥。
- 复制并保存以下内容以供日后使用:
- 存储账号名称:
customsecuritylogs - 密钥 1 或密钥 2:共享访问密钥
- 存储账号名称:
创建 Blob 容器
- 在同一存储账号中,从左侧导航栏中选择容器。
- 点击 + 容器。
- 提供以下配置详细信息:
- 名称:输入容器名称(例如
security-events) - 公开访问权限级别:选择私密(不允许匿名访问)
- 名称:输入容器名称(例如
- 点击创建。
配置应用以导出到 Azure Blob
使用以下方法之一,将自定义安全应用配置为将日志文件写入 Azure Blob 容器:
- Azure CLI:使用
az storage blob upload - Azure SDK:使用适用于您的编程语言的客户端库
- AzCopy:使用 AzCopy 命令行工具
示例:
使用 Azure CLI 的示例:
az storage blob upload \ --account-name customsecuritylogs \ --container-name security-events \ --name logs/2025/01/15/events.json \ --file /path/to/events.json \ --account-key <YOUR_ACCESS_KEY>使用 Python SDK 的示例:
from azure.storage.blob import BlobServiceClient import json # Initialize client connection_string = "DefaultEndpointsProtocol=https;AccountName=customsecuritylogs;AccountKey=<YOUR_KEY>;EndpointSuffix=core.windows.net" blob_service_client = BlobServiceClient.from_connection_string(connection_string) # Get container client container_client = blob_service_client.get_container_client("security-events") # Upload log file blob_client = container_client.get_blob_client("logs/2025/01/15/events.json") # Write NDJSON data events = [ {"timestamp": "2025-01-15T10:00:00Z", "event_type": "login"}, {"timestamp": "2025-01-15T10:05:00Z", "event_type": "logout"} ] ndjson_data = '\n'.join([json.dumps(event) for event in events]) + '\n' blob_client.upload_blob(ndjson_data, overwrite=True)
为 Azure Blob 配置 Google SecOps Feed
- 依次前往 SIEM 设置> Feed。
- 点击添加新 Feed。
- 在下一页上,点击配置单个 Feed。
- 在 Feed 名称字段中,输入 Feed 的名称(例如
custom-security-analytics-azure)。 - 选择 Microsoft Azure Blob Storage V2 作为来源类型。
- 选择自定义安全数据分析作为日志类型。
- 点击下一步。
为以下输入参数指定值:
Azure URI:输入包含容器路径的 Blob 服务端点网址:
https://customsecuritylogs.blob.core.windows.net/security-events/来源删除选项:根据您的偏好选择删除选项:
- 永不:转移后永不删除任何文件。
- 删除已转移的文件:在成功转移后删除文件。
- 删除已转移的文件和空目录:成功转移后删除文件和空目录。
文件存在时间上限:包含在过去指定天数内修改的文件(默认值为 180 天)。
共享密钥:输入存储账号中的共享密钥值(访问密钥)。
资产命名空间:资产命名空间。
注入标签:要应用于此 Feed 中事件的标签。
点击下一步。
在最终确定界面中查看新的 Feed 配置,然后点击提交。
选项 5:Amazon Data Firehose 注入(实时流式传输)
如果您的自定义安全应用将日志写入 Amazon CloudWatch Logs,并且您需要将日志实时流式传输到 Google SecOps,请使用此方法。
创建 Google SecOps Firehose Feed
- 依次前往 SIEM 设置> Feed。
- 点击添加新 Feed。
- 在 Feed 名称字段中,输入 Feed 的名称(例如
custom-security-analytics-firehose)。 - 选择 Amazon Data Firehose 作为来源类型。
- 选择自定义安全数据分析作为日志类型。
- 点击下一步。
- 为以下输入参数指定值:
- 拆分分隔符:可选:输入
\n可拆分以换行符分隔的日志。 - 资产命名空间:资产命名空间。
- 注入标签:要应用于此 Feed 中事件的标签。
- 拆分分隔符:可选:输入
- 点击下一步。
- 检查 Feed 配置,然后点击提交。
- 点击生成密钥,生成用于对此 Feed 进行身份验证的密钥。
- 请复制并保存此密钥,因为您将无法再次查看此密钥。
- 点击详细信息标签页。
- 从端点信息字段复制 Feed 端点网址。
- 点击完成。
创建 Google Cloud API 密钥
- 前往 Google Cloud 控制台中的凭据页面:https://console.cloud.google.com/apis/credentials
- 点击创建凭据,然后选择 API 密钥。
- 点击修改 API 密钥以限制密钥。
- 在 API 限制下,选择限制密钥。
- 搜索并选择 Google SecOps API。
- 点击保存。
- 复制并保存 API 密钥。
构建端点网址
以以下格式将 API 密钥附加到 Feed 端点网址:
<FEED_ENDPOINT_URL>?key=<API_KEY>示例:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...保存此完整网址以供在下一步中使用。
为 Firehose 创建 IAM 政策
- 在 AWS 控制台中,依次前往 IAM > 政策 > 创建政策 > JSON 标签页。
粘贴以下政策 JSON:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "firehose:PutRecord", "firehose:PutRecordBatch" ], "Resource": "arn:aws:firehose:<REGION>:<ACCOUNT_ID>:deliverystream/CustomSecurityToChronicle" } ] }替换以下内容:
<REGION>:您的 AWS 区域(例如us-east-1)。<ACCOUNT_ID>:您的 AWS 账号 ID(12 位数字)。
将政策命名为
CloudWatchLogsToFirehosePolicy。点击创建政策。
为 CloudWatch Logs 创建 IAM 角色
- 依次前往 IAM > 角色 > 创建角色。
选择自定义信任政策,然后粘贴以下内容:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "logs.<REGION>.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }将
<REGION>替换为您的 AWS 区域。点击下一步。
搜索并选择您在上一步中创建的政策
CloudWatchLogsToFirehosePolicy。点击下一步。
将角色命名为
CloudWatchLogsToFirehoseRole。点击 Create role。
创建 Kinesis Data Firehose 传送流
- 在 AWS 控制台中,依次前往 Kinesis > Data Firehose > 创建交付流。
提供以下配置详细信息:
来源和目的地:
- 来源:选择直接 PUT 或其他来源
- 目的地:选择 HTTP 端点
交付内容流名称:
- 交付数据流名称:输入
CustomSecurityToChronicle
- 交付数据流名称:输入
HTTP 端点目标:
- HTTP 端点网址:输入您之前构建的完整端点网址(Feed 端点 + API 密钥)
- 内容编码:选择 GZIP(建议选择此项以节省带宽)
自定义 HTTP 标头:
- 点击添加自定义 HTTP 标头
- 标头名称:输入
X-Goog-Chronicle-Auth - 标头值:输入您在上一步中保存的密钥
备份设置:
- Amazon S3 中的源记录备份:选择仅备份失败的数据(推荐)
- S3 存储桶:选择现有存储桶或为失败的记录创建新存储桶
缓冲提示:
- 缓冲区大小:输入
1MiB(HTTP 端点的最小值) - 缓冲间隔:输入
60秒
- 缓冲区大小:输入
重试时长:
- 重试时长:输入
300秒(5 分钟)
- 重试时长:输入
点击创建交付数据流。
等待传送数据流状态变为有效(1-2 分钟)。
将 CloudWatch 日志组订阅到 Firehose
- 在 AWS 控制台中,依次前往 CloudWatch > 日志 > 日志组。
- 选择包含自定义安全分析日志的目标日志组。
- 点击订阅过滤条件标签页。
- 依次点击创建 > 创建 Amazon Kinesis Data Firehose 订阅过滤器。
- 提供以下配置详细信息:
- 目标位置:选择交付数据流
CustomSecurityToChronicle。 - 授予权限:选择角色
CloudWatchLogsToFirehoseRole。 - 订阅过滤条件名称:输入
CustomSecurityToChronicle。 - 日志格式:选择其他(Google SecOps 会处理解析)。
- 订阅过滤模式:留空可发送所有事件,也可输入过滤模式以仅发送特定事件。
- 目标位置:选择交付数据流
- 点击开始直播。
- 日志现在将通过 Firehose 实时流式传输到 Google SecOps。
创建自定义解析器(可选)
以非结构化日志的形式注入自定义安全数据后,您可以创建自定义解析器,将数据标准化为 UDM 格式,以便更好地进行搜索和检测。
何时创建自定义解析器
在以下情况下创建自定义解析器:
- 您需要从自定义日志格式中提取特定字段
- 您希望在自定义数据上启用 UDM 搜索
- 您需要将自定义字段映射到标准 UDM 字段,才能使用检测规则
- 您希望通过为特定字段编制索引来提高搜索性能
创建自定义日志类型
- 依次前往 SIEM 设置 > 可用日志类型。
- 点击申请日志类型。
- 在创建自定义日志类型或请求预构建的日志类型部分下,选择创建自定义日志类型。
- 请提供以下信息:
- 日志类型名称:输入一个描述性名称(例如
CUSTOM_SECURITY_ANALYTICS)。 - 说明:输入日志类型的说明。
- 日志示例:粘贴 5-10 个原始格式的日志条目示例。
- 日志类型名称:输入一个描述性名称(例如
- 点击提交。
- 自定义日志类型将在大约 10 分钟后可用。
创建自定义解析器
- 依次前往 SIEM 设置 > 解析器。
- 点击创建解析器。
- 选择自定义解析器。
- 请提供以下信息:
- 解析器名称:输入一个描述性名称
- 日志类型:选择您的自定义日志类型(例如
CUSTOM_SECURITY_ANALYTICS) - 解析器代码:使用 Google SecOps 的解析器配置语言输入解析器配置
- 使用示例日志测试解析器。
- 点击提交以激活解析器。
解析器配置示例
对于自定义 JSON 日志格式:
{ "timestamp": "2025-01-15T10:30:00Z", "event_type": "authentication", "user": "john.doe@example.com", "action": "login", "result": "success", "source_ip": "203.0.113.45" }解析器配置示例:
filter { json { fields { timestamp: timestamp event_type: event_type user: user action: action result: result source_ip: source_ip } } } event { $e.metadata.event_timestamp.seconds = parseTimestamp(timestamp, "yyyy-MM-dd'T'HH:mm:ss'Z'") $e.metadata.event_type = "USER_LOGIN" $e.principal.user.email_addresses = user $e.target.ip = source_ip $e.security_result.action = if(result == "success", "ALLOW", "BLOCK") }如需详细了解如何创建自定义解析器,请参阅管理预建解析器和自定义解析器。
验证数据注入
配置 Feed 后,请验证数据是否已成功提取。
查看 Feed 状态
- 依次前往 SIEM 设置> Feed。
- 在列表中找到您的 Feed。
- 查看状态列:
- 有效:Feed 正在运行并提取数据
- 错误:Feed 遇到错误(点击可查看详情)
- 已暂停:Feed 已暂停
搜索已注入的日志
- 依次前往搜索 > 原始日志扫描。
输入搜索查询以查找自定义日志:
metadata.log_type = "CUSTOM_SECURITY_DATA_ANALYTICS"根据需要调整时间范围。
点击搜索。
验证您的日志是否显示在结果中。
监控 Feed 指标
- 依次前往 SIEM 设置> Feed。
- 点击您的 Feed 名称。
- 前往指标标签页。
- 查看以下指标:
- 注入的事件数:注入的事件总数
- 提取的字节数:提取的数据总量
- 注入速率:每秒事件数
- 错误:提取错误数量
问题排查
网络钩子提取问题
问题:HTTP 401 未授权
- 原因:API 密钥或密钥无效
- 解决方案:验证 API 密钥和密钥是否正确且未过期
问题:HTTP 403 Forbidden
- 原因:API 密钥没有 Chronicle API 权限
- 解决方案:修改 API 密钥,并确保在“API 限制”下选择了 Chronicle API
问题:HTTP 400 错误请求
- 原因:请求格式或载荷无效
- 解决方案:验证 Content-Type 标头是否已设置为
application/json,以及载荷是否为有效的 JSON
S3/GCS/Azure Blob 注入问题
问题:未提取任何数据
- 原因:存储桶 URI 不正确或缺少权限
- 解决方案:验证存储桶 URI 是否包含尾部斜杠,以及服务账号是否具有 Storage Object Viewer 角色
问题:文件在提取后未被删除
- 原因:服务账号没有删除权限
- 解决方案:授予 Storage Object Admin 角色,而不是 Storage Object Viewer 角色
问题:旧文件未被提取
- 原因:“文件存在时间上限”设置排除了旧文件
- 解决方案:增加 Feed 配置中的“最长文件存在时间”值
Firehose 提取问题
问题:交付数据流显示错误
- 原因:端点网址或身份验证无效
- 解决方案:验证端点网址是否包含 API 密钥参数,以及 X-Goog-Chronicle-Auth 标头是否包含正确的密钥
问题:数据新鲜度指标较高
- 原因:Firehose 受到限制或出现递送失败
- 解决方案:检查
ThrottledRecords和DeliveryToHTTP.Success比率的 CloudWatch 指标
问题:没有日志从 CloudWatch 流式传输
- 原因:未配置订阅过滤条件或 IAM 角色缺少权限
- 解决方案:验证订阅过滤条件是否处于有效状态,以及 IAM 角色是否具有
firehose:PutRecord权限
UDM 映射表
自定义安全数据分析日志以非结构化数据的形式提取。如需启用 UDM 字段映射,请按照上文“创建自定义解析器”部分中的说明创建自定义解析器。
创建自定义解析器后,系统会根据您的解析器配置填充 UDM 字段。安全分析数据的常见 UDM 字段包括:
| UDM 字段 | 说明 |
|---|---|
metadata.event_timestamp |
活动时间戳 |
metadata.event_type |
事件类型(例如 USER_LOGIN、FILE_ACCESS) |
principal.user.email_addresses |
用户电子邮件地址 |
principal.ip |
来源 IP 地址 |
target.resource.name |
目标资源名称 |
security_result.action |
安全操作(允许、屏蔽等) |
security_result.severity |
事件严重程度 |
如需查看 UDM 字段的完整列表,请参阅 UDM 字段参考。
需要更多帮助?获得社区成员和 Google SecOps 专业人士的解答。