收集自定义应用访问日志
本文档介绍了如何使用 Cloud Storage 或流式注入方法将自定义应用访问日志注入到 Google Security Operations 中。
自定义应用访问日志可捕获专有应用或自定义应用中的身份验证事件、授权决策和访问模式。这些日志对于监控用户活动、检测未经授权的访问尝试以及保持安全政策合规性至关重要。
准备工作
请确保满足以下前提条件:
- Google SecOps 实例
- JSON、CSV 或结构化文本格式的自定义应用访问日志
- 访问以下任一页面:
- Google Cloud Storage 存储桶(用于 GCS 注入)
- Amazon S3 存储桶(用于 S3 提取)
- Microsoft Azure Storage 账号(用于 Azure Blob 注入)
- Webhook 端点功能(用于基于推送的注入)
- Amazon Kinesis Data Firehose(用于流式注入)
创建自定义日志类型
日志类型 CUSTOM_APPLICATION_ACCESS 在 Google SecOps 中不存在,无法作为预构建解析器使用。您必须先创建自定义日志类型,然后才能提取日志。
- 依次前往 SIEM 设置 > 可用日志类型。
- 点击申请日志类型。
- 在自行创建自定义日志类型下方,输入以下详细信息:
- 供应商/产品:输入
Custom Application Access Logs - 日志类型:输入
CUSTOM_APPLICATION_ACCESS
- 供应商/产品:输入
点击创建日志类型。
等待 10 分钟,确保新日志类型在所有组件中都可用,然后再创建 Feed。
选择注入方法
选择最适合您基础设施的注入方法:
- Google Cloud Storage (GCS):如果您的应用将日志写入 GCS 存储分区,或者您可以将日志导出到 GCS,请使用此选项
- Amazon S3:如果您的应用将日志写入 S3 存储分区,或者您可以将日志导出到 S3,请使用此选项
- Azure Blob Storage:如果您的应用将日志写入 Azure 存储空间,或者您可以将日志导出到 Azure,请使用此选项
- Webhook:如果您的应用可以向外部端点发送 HTTP POST 请求,请使用此选项
- Amazon Kinesis Data Firehose:如果您的应用写入 CloudWatch Logs,或者您需要实时流式传输,请使用此选项
方法 1:从 Google Cloud Storage 注入
创建 Google Cloud Storage 存储分区
- 转到 Google Cloud Console。
- 选择您的项目或创建新项目。
- 在导航菜单中,依次前往 Cloud Storage > 存储分区。
- 点击创建存储分区。
提供以下配置详细信息:
设置 值 为存储桶命名 输入一个全局唯一的名称(例如 custom-app-access-logs)位置类型 根据您的需求进行选择(区域级、双区域级、多区域级) 位置 选择相应位置(例如 us-central1)存储类别 标准(建议用于经常访问的日志) 访问权限控制 均匀(推荐) 保护工具 可选:启用对象版本控制或保留政策 点击创建。
配置应用以将日志写入 GCS
将自定义应用配置为将访问日志写入您创建的 GCS 存储桶。日志应采用以下格式之一:
JSON 格式(推荐):
{"timestamp": "2025-01-15T10:30:00Z", "user": "john.doe@example.com", "action": "login", "result": "success", "source_ip": "203.0.113.45", "application": "custom-app", "resource": "/api/users"}CSV 格式:
timestamp,user,action,result,source_ip,application,resource 2025-01-15T10:30:00Z,john.doe@example.com,login,success,203.0.113.45,custom-app,/api/users以换行符分隔的 JSON (NDJSON):
{"timestamp": "2025-01-15T10:30:00Z", "user": "john.doe@example.com", "action": "login", "result": "success"} {"timestamp": "2025-01-15T10:30:05Z", "user": "jane.smith@example.com", "action": "access", "result": "denied"}
检索 Google SecOps 服务账号
Google SecOps 使用唯一的服务账号从您的 GCS 存储桶中读取数据。您必须向此服务账号授予对您的存储桶的访问权限。
- 依次前往 SIEM 设置> Feed。
- 点击添加新 Feed。
- 点击配置单个 Feed。
- 在 Feed 名称字段中,输入 Feed 的名称(例如
Custom Application Access Logs - GCS)。 - 选择 Google Cloud Storage V2 作为来源类型。
- 选择 CUSTOM_APPLICATION_ACCESS_CUSTOM 作为日志类型。
- 点击获取服务账号。
系统会显示一个唯一的服务账号电子邮件地址,例如:
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
- 返回到 Feed 创建页面(或前往 SIEM 设置 > Feed > 添加新 Feed)。
- 点击下一步。
为以下输入参数指定值:
存储桶网址:输入带有前缀路径的 GCS 存储桶 URI:
gs://custom-app-access-logs/来源删除选项:根据您的偏好选择删除选项:
- 永不:转移后永不删除任何文件(建议用于测试)。
- 删除已转移的文件:在成功转移后删除文件。
- 删除已转移的文件和空目录:成功转移后删除文件和空目录。
文件存在时间上限:包含在过去指定天数内修改的文件(默认值为 180 天)。
资产命名空间:资产命名空间。
注入标签:要应用于此 Feed 中事件的标签(例如
custom_app_access)。
点击下一步。
在最终确定界面中查看新的 Feed 配置,然后点击提交。
选项 2:从 Amazon S3 提取数据
创建 Amazon S3 存储桶
- 打开 Amazon S3 控制台。
- 点击创建存储桶。
- 提供以下配置详细信息:
- 存储桶名称:为存储桶输入一个有意义的名称(例如
custom-app-access-logs)。 - 区域:选择应用运行的区域(例如
us-east-1)。
- 存储桶名称:为存储桶输入一个有意义的名称(例如
- 点击创建。
创建具有 S3 访问权限的 IAM 用户
- 打开 IAM 控制台。
- 依次点击用户 > 添加用户。
- 输入用户名(例如
chronicle-s3-reader)。 - 选择以编程方式访问。
- 点击 Next: Permissions。
- 选择 Attach existing policies directly。
- 搜索并选择 AmazonS3FullAccess 政策。
- 点击 Next: Tags。
- 点击下一步:检查。
- 点击创建用户。
- 点击下载 .csv 文件以保存访问密钥和密钥,供日后参考。
- 点击关闭。
配置应用以将日志写入 S3
配置自定义应用,以将访问日志写入您创建的 S3 存储桶。使用与 GCS 部分中所述相同的日志格式(JSON、CSV 或 NDJSON)。
在 Google SecOps 中配置 Feed 以注入来自 S3 的日志
- 依次前往 SIEM 设置> Feed。
- 点击添加新 Feed。
- 点击配置单个 Feed。
- 在 Feed 名称字段中,输入 Feed 的名称(例如
Custom Application Access Logs - S3)。 - 选择 Amazon S3 V2 作为来源类型。
- 选择 CUSTOM_APPLICATION_ACCESS_CUSTOM 作为日志类型。
- 点击下一步,然后点击提交。
为以下输入参数指定值:
S3 URI:以以下格式输入存储桶 URI:
s3://custom-app-access-logs/来源删除选项:根据您的偏好选择删除选项。
文件存在时间上限:包含在过去指定天数内修改的文件(默认值为 180 天)。
访问密钥 ID:有权访问 S3 存储桶的用户访问密钥。
私有访问密钥:具有 S3 存储桶访问权限的用户私有密钥。
资产命名空间:资产命名空间。
注入标签:要应用于此 Feed 中事件的标签(例如
custom_app_access)。
点击下一步,然后点击提交。
选项 3:从 Azure Blob Storage 中提取数据
创建 Azure 存储账号
- 在 Azure 门户中,搜索存储账号。
- 点击 + 创建。
提供以下配置详细信息:
设置 值 订阅 选择您的 Azure 订阅 资源组 选择现有组或创建新组 存储账号名称 输入唯一名称(例如 customappaccesslogs)区域 选择区域(例如 East US)性能 标准(推荐) 冗余 LRS(本地冗余存储) 点击 Review + create(检查 + 创建)。
查看账号概览,然后点击创建。
等待部署完成。
获取存储账号凭据
- 前往您刚刚创建的存储账号。
- 在左侧导航栏中,选择安全性 + 网络下的访问密钥。
- 点击显示密钥。
- 复制并保存以下内容以供日后使用:
- 存储账号名称:
customappaccesslogs - 密钥 1 或密钥 2:共享访问密钥
- 存储账号名称:
创建 Blob 容器
- 在同一存储账号中,从左侧导航栏中选择容器。
- 点击 + 容器。
- 提供以下配置详细信息:
- 名称:输入
access-logs - 公开访问权限级别:选择私密(不允许匿名访问)
- 名称:输入
- 点击创建。
配置应用以将日志写入 Azure Blob Storage
将自定义应用配置为将访问日志写入您创建的 Azure Blob Storage 容器。使用与 GCS 部分中所述相同的日志格式(JSON、CSV 或 NDJSON)。
在 Google SecOps 中配置 Feed 以注入 Azure 日志
- 依次前往 SIEM 设置> Feed。
- 点击添加新 Feed。
- 点击配置单个 Feed。
- 在 Feed 名称字段中,输入 Feed 的名称(例如
Custom Application Access Logs - Azure)。 - 选择 Microsoft Azure Blob Storage V2 作为来源类型。
- 选择 CUSTOM_APPLICATION_ACCESS_CUSTOM 作为日志类型。
- 点击下一步。
为以下输入参数指定值:
Azure URI:输入包含容器路径的 Blob 服务端点网址:
https://customappaccesslogs.blob.core.windows.net/access-logs/来源删除选项:根据您的偏好选择删除选项
文件存在时间上限:包含在过去指定天数内修改的文件(默认值为 180 天)
共享密钥:输入您从存储账号中捕获的共享密钥值(访问密钥)
资产命名空间:资产命名空间
注入标签:要应用于相应 Feed 中事件的标签(例如
custom_app_access)
点击下一步。
在最终确定界面中查看新的 Feed 配置,然后点击提交。
方法 4:使用 Webhook 提取
在 Google SecOps 中创建 Webhook Feed
- 依次前往 SIEM 设置> Feed。
- 点击添加新 Feed。
- 点击配置单个 Feed。
- 在 Feed 名称字段中,输入 Feed 的名称(例如
Custom Application Access Logs - Webhook)。 - 选择 Webhook 作为来源类型。
- 选择 CUSTOM_APPLICATION_ACCESS_CUSTOM 作为日志类型。
- 点击下一步。
- 为以下输入参数指定值:
- 拆分分隔符:输入
\n以拆分以换行符分隔的事件(如果每个请求发送多个事件)。 - 资产命名空间:资产命名空间。
- 注入标签:要应用于此 Feed 中事件的标签(例如
custom_app_access)。
- 拆分分隔符:输入
- 点击下一步。
- 在最终确定界面中查看新的 Feed 配置,然后点击提交。
生成并保存密钥
- 在 Feed 详情页面上,点击生成密钥。
- 系统会显示一个包含密钥的对话框。
复制并妥善保存密钥。
获取 Feed 端点网址
- 前往相应 Feed 的详细信息标签页。
- 在端点信息部分,复制 Feed 端点网址。
网址格式为:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate保存此网址以供后续步骤使用。
点击完成。
创建 Google Cloud API 密钥
Google SecOps 需要使用 API 密钥进行身份验证。在 Google Cloud Console 中创建受限 API 密钥。
- 前往 Google Cloud 控制台的“凭据”页面。
- 选择您的项目(与您的 Chronicle 实例关联的项目)。
- 点击创建凭据 > API 密钥。
- 系统会创建一个 API 密钥,并在对话框中显示该密钥。
- 点击修改 API 密钥以限制密钥。
- 在 API 密钥设置页面中:
- 名称:输入一个描述性名称(例如
Chronicle Webhook API Key)。
- 名称:输入一个描述性名称(例如
- 在 API 限制下:
- 选择限制密钥。
- 在选择 API 下拉菜单中,搜索并选择 Google SecOps API(或 Chronicle API)。
- 点击保存。
- 复制页面顶部 API 密钥字段中的 API 密钥值。
- 安全地保存 API 密钥。
配置应用以通过 Webhook 发送日志
将您的自定义应用配置为向 Chronicle Webhook 端点发送 HTTP POST 请求。
构建网络钩子网址:
将 API 密钥附加到 Feed 端点网址:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=<API_KEY>将
<API_KEY>替换为您创建的 API 密钥。
HTTP POST 请求格式:
POST https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=<API_KEY> HTTP/1.1 Content-Type: application/json x-chronicle-auth: <SECRET_KEY> {"timestamp": "2025-01-15T10:30:00Z", "user": "john.doe@example.com", "action": "login", "result": "success", "source_ip": "203.0.113.45"}对于多个事件(以换行符分隔):
POST https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=<API_KEY> HTTP/1.1 Content-Type: application/json x-chronicle-auth: <SECRET_KEY> {"timestamp": "2025-01-15T10:30:00Z", "user": "john.doe@example.com", "action": "login", "result": "success"} {"timestamp": "2025-01-15T10:30:05Z", "user": "jane.smith@example.com", "action": "access", "result": "denied"}使用 curl 的示例:
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", "user": "john.doe@example.com", "action": "login", "result": "success", "source_ip": "203.0.113.45"}'
选项 5:使用 Amazon Kinesis Data Firehose 提取数据
在 Google SecOps 中创建 Feed
- 依次前往 SIEM 设置> Feed。
- 点击添加新 Feed。
- 点击配置单个 Feed。
- 在 Feed 名称字段中,输入 Feed 的名称(例如
Custom Application Access Logs - Firehose)。 - 选择 Amazon Data Firehose 作为来源类型。
- 选择 CUSTOM_APPLICATION_ACCESS_CUSTOM 作为日志类型。
- 点击下一步。
- 为以下输入参数指定值:
- 拆分分隔符:输入
\n可拆分以换行符分隔的日志。 - 资产命名空间:资产命名空间。
- 注入标签:要应用于此 Feed 中事件的标签(例如
custom_app_access)。
- 拆分分隔符:输入
- 点击下一步。
- 检查 Feed 配置,然后点击提交。
- 点击生成密钥,生成用于对此 Feed 进行身份验证的密钥。
- 复制并保存密钥,因为您无法再次查看此密钥。
- 点击详细信息标签页。
- 从端点信息字段中复制 Feed 端点网址。
- 点击完成。
为 Amazon Data Firehose Feed 创建 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>替换以下内容:
<FEED_ENDPOINT_URL>:上一步中的 Feed 端点网址<API_KEY>:上一步中的 API 密钥
示例:
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:us-east-1:123456789012:deliverystream/CustomAppAccessToChronicle" } ] }替换以下内容:
us-east-1:您的 AWS 区域123456789012:您的 AWS 账号 ID(12 位数字)CustomAppAccessToChronicle:您的 Firehose 传送流名称(您将在下一步中创建此名称)
将政策命名为
CustomAppAccessFirehoseWritePolicy。点击创建政策。
为 CloudWatch Logs 创建 IAM 角色
- 依次前往 IAM > 角色 > 创建角色。
选择自定义信任政策,然后粘贴以下内容:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "logs.us-east-1.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }将
us-east-1替换为您的 AWS 区域。点击下一步。
搜索并选择您在上一步中创建的政策
CustomAppAccessFirehoseWritePolicy。点击下一步。
将角色命名为
CloudWatchLogsToFirehoseRole。点击 Create role。
创建 Kinesis Data Firehose 传送流
- 在 AWS 控制台中,依次前往 Kinesis > Data Firehose > 创建交付流。
提供以下配置详细信息:
来源和目的地:
- 来源:选择直接 PUT 或其他来源
- 目的地:选择 HTTP 端点
交付内容流名称:
- 交付数据流名称:输入
CustomAppAccessToChronicle
- 交付数据流名称:输入
HTTP 端点目标:
- HTTP 端点网址:输入您之前构建的完整端点网址(Feed 端点 + API 密钥)
- 内容编码:选择 GZIP(建议选择此项以节省带宽)
自定义 HTTP 标头:
- 点击添加自定义 HTTP 标头
- 标头名称:输入
X-Goog-Chronicle-Auth - 标头值:输入您在上一步中保存的密钥
备份设置:
- Amazon S3 中的源记录备份:选择仅备份失败的数据(推荐)
- S3 存储桶:选择现有存储桶或为失败的记录创建新存储桶
缓冲区提示:
- 缓冲区大小:输入
1MiB(HTTP 端点的最小值) - 缓冲间隔:输入
60秒
- 缓冲区大小:输入
重试时长:
- 重试时长:输入
300秒(5 分钟)
- 重试时长:输入
点击创建交付数据流。
等待传送数据流状态变为有效(1-2 分钟)。
配置应用以写入 CloudWatch Logs
配置自定义应用以将访问日志写入 CloudWatch 日志组。然后,创建订阅过滤器以将日志流式传输到 Firehose。
- 在 AWS 控制台中,依次前往 CloudWatch > 日志 > 日志组。
- 创建新的日志组,或选择应用写入日志的现有日志组。
- 点击订阅过滤条件标签页。
- 依次点击创建 > 创建 Amazon Kinesis Data Firehose 订阅过滤器。
提供以下配置详细信息:
- 目标位置:选择交付数据流
CustomAppAccessToChronicle。 - 授予权限:选择角色
CloudWatchLogsToFirehoseRole。 - 订阅过滤条件名称:输入
CustomAppAccessToChronicle。 - 日志格式:选择其他(Google SecOps 会处理解析)。
- 订阅过滤模式:留空可发送所有事件。
- 目标位置:选择交付数据流
点击开始直播。
日志通过 Firehose 实时流式传输到 Google SecOps。
创建自定义解析器
注入日志后,您必须创建自定义解析器,将数据标准化为 UDM 格式。
- 依次前往 SIEM 设置 > 解析器。
- 点击创建解析器。
- 选择 CUSTOM_APPLICATION_ACCESS_CUSTOM 作为日志类型。
使用解析器编辑器创建将日志字段映射到 UDM 字段的 Grok 模式或解析器扩展程序。
解析器映射示例:
自定义日志字段 UDM 字段 timestampmetadata.event_timestampuserprincipal.user.email_addressesactionsecurity_result.actionresultsecurity_result.summarysource_ipprincipal.ipapplicationtarget.applicationresourcetarget.resource.name使用示例日志测试解析器。
点击保存以激活解析器。
如需了解详细的解析器创建说明,请参阅自助式解析器选项。
验证注入
配置 Feed 和解析器后,验证日志是否正在被提取:
- 依次前往搜索 > UDM 搜索。
请运行以下查询:
metadata.log_type = "CUSTOM_APPLICATION_ACCESS_CUSTOM"验证活动是否显示在搜索结果中。
检查 UDM 字段是否根据您的解析器配置正确填充。
UDM 映射表
| 日志字段 | UDM 映射 | 逻辑 |
|---|---|---|
| 其他 | 与根据服务、环境、msg.attachment.fileName、msg.attachment.digest、msg.attachment.key、msg.attachment.authorizeId、msg.attachment.contentType、dest.type、type、msg.sortID、msg.refID、state.reported.applications_installed、state.reported.applications_status、state.reported.ota_queue、state.reported.VICMB_Deg_Battery_LimpHome、state.reported.VICMB_Inhibit_Propulsion、state.reported.VICMB_FA_LostComm_BPCM、state.reported.VICMB_FA_LostComm_SFAM1、state.reported.VICMB_Inhibit_HV、state.reported.VICMB_FA_LostComm_RIDM、state.reported.VICMB_FA_LostComm_RWAM1、state.reported.uname、meta.reported.battery_charging_rate_kw.timestamp、state.reported.battery_charging_rate_kw、meta.reported.cell.connected.timestamp、meta.reported.cell.packet_loss.timestamp、meta.reported.cell.average_ping_ms.timestamp、meta.reported.cell.bitrate.timestamp、meta.reported.cell.download_speed_bytes_per_sec.timestamp、meta.reported.cell.signal_strength.timestamp、meta.reported.cell.signal.timestamp、state.reported.cell.connected、state.reported.cell.packet_loss、state.reported.cell.average_ping_ms、state.reported.cell.bitrate、state.reported.cell.download_speed_bytes_per_sec、state.reported.cell.signal_strength、state.reported.cell.signal 创建的标签合并 | |
| request_time | metadata.collected_timestamp | 使用 ISO8601 格式从 request_time 解析 |
| msg_1, msg.body | metadata.description | 如果 msg_1 不为空,则为 msg_1 中的值,否则为 msg.body |
| user_id, src_email, otadata.1687965118.initiator | metadata.event_type | 如果存在 user_id、src_email、otadata.1687965118.initiator 中的任何一个,则设置为“USER_UNCATEGORIZED”,否则设置为“GENERIC_EVENT” |
| otadata.1687965118.deployment_id | metadata.product_deployment_id | 直接复制值 |
| 版本 | metadata.product_version | 直接复制值 |
| response.status | network.http.response_code | 转换为整数 |
| request_id | principal.resource.product_object_id | 直接复制值 |
| msg.attachment.url, otadata.1687965118.download_url | principal.url | 如果 msg.attachment.url 不为空,则使用该值;否则使用 otadata.1687965118.download_url |
| src_email, otadata.1687965118.initiator | principal.user.email_addresses | 如果与电子邮件正则表达式匹配,则为 src_email 中的值;否则为 otadata.1687965118.initiator 中的值 |
| user_id | principal.user.userid | 直接复制值 |
| level | security_result.severity | 如果级别为“INFO”,则设置为“INFORMATIONAL” |
| metadata.product_name | 设置为“自定义应用访问权限” | |
| metadata.vendor_name | 设置为“自定义应用访问权限” |
需要更多帮助?获得社区成员和 Google SecOps 专业人士的解答。