收集 Uptycs EDR 日志
支持的平台:
Google SecOps
SIEM
本文档介绍了如何使用 Amazon S3 将 Uptycs EDR 日志注入到 Google Security Operations。解析器将原始 JSON 日志转换为统一数据模型 (UDM)。它首先从 JSON 中提取字段,执行数据清理和丰富,然后将相关信息映射到相应的 UDM 字段,处理各种数据类型和边缘情况,以确保在 UDM 架构中准确且一致地表示数据。
准备工作
请确保满足以下前提条件:
- Google SecOps 实例
- 对 Uptycs 的特权访问权限
- 对 AWS (S3、IAM) 的特权访问权限
获取 Uptycs 前提条件
- 登录 Uptycs 管理控制台。
- 依次前往配置 > 用户。
- 选择您的用户或创建服务账号用户。
- 点击 User API key(用户 API 密钥)。
- 复制以下详细信息并将其保存在安全的位置:
- API 密钥
- API Secret
- 客户 ID
- API 网域(从您的 Uptycs 网址派生而来,例如
mystack.uptycs.io)
为 Google SecOps 配置 AWS S3 存储桶和 IAM
- 按照以下用户指南创建 Amazon S3 存储桶:创建存储桶。
- 保存存储桶名称和区域以供日后参考(例如
uptycs-telemetry-export)。 - 按照以下用户指南创建用户:创建 IAM 用户。
- 选择创建的用户。
- 选择安全凭据标签页。
- 在访问密钥部分中,点击创建访问密钥。
- 选择第三方服务作为使用情形。
- 点击下一步。
- 可选:添加说明标记。
- 点击创建访问密钥。
- 点击下载 CSV 文件,保存访问密钥和不公开的访问密钥以供日后参考。
- 点击完成。
- 选择权限标签页。
- 在权限政策部分中,点击添加权限。
- 选择添加权限。
- 选择直接附加政策。
- 搜索 AmazonS3FullAccess 政策。
- 选择相应政策。
- 点击下一步。
- 点击添加权限。
为 S3 上传配置 IAM 政策和角色
- 在 AWS 控制台中,依次前往 IAM > 政策。
- 依次点击创建政策 > JSON 标签页。
输入以下政策:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutObjects", "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::uptycs-telemetry-export/*" }, { "Sid": "AllowListBucket", "Effect": "Allow", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::uptycs-telemetry-export" } ] }- 如果您输入了其他存储桶名称,请替换
uptycs-telemetry-export。
- 如果您输入了其他存储桶名称,请替换
依次点击下一步 > 创建政策。
将政策命名为
uptycs-s3-write-policy。前往 IAM > 用户。
选择为 Uptycs 导出创建的用户。
依次点击添加权限 > 直接附加政策。
搜索并选择
uptycs-s3-write-policy。依次点击下一步 > 添加权限。
配置 Uptycs 导出原始遥测数据
- 登录 Uptycs 控制台。
- 前往导出配置部分。
- 配置 S3 导出目标位置。
- 提供以下配置详细信息:
- 导出类型:选择原始遥测数据。
- 目标平台:选择 Amazon S3。
- 格式:选择 JSON。
- S3 存储分区:输入
uptycs-telemetry-export。 - S3 路径前缀:输入
telemetry/。 - AWS 区域:选择您的存储桶区域。
- AWS 访问密钥 ID:输入 IAM 用户的访问密钥。
- AWS Secret Access Key:输入私有访问密钥。
- 事件类型:选择所有必需的遥测类型。
- 测试并启用导出功能。
为 Google SecOps 创建只读 IAM 用户
- 前往 AWS 控制台 > IAM > 用户。
- 点击 Add users(添加用户)。
- 提供以下配置详细信息:
- 用户:输入
secops-reader。 - 访问类型:选择访问密钥 - 以程序化方式访问。
- 用户:输入
- 点击创建用户。
- 附加最低限度的读取政策(自定义):用户 > secops-reader > 权限 > 添加权限 > 直接附加政策 > 创建政策。
在 JSON 编辑器中,输入以下政策:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:GetObject"], "Resource": "arn:aws:s3:::uptycs-telemetry-export/*" }, { "Effect": "Allow", "Action": ["s3:ListBucket"], "Resource": "arn:aws:s3:::uptycs-telemetry-export" } ] }将名称设置为
secops-reader-policy。依次前往创建政策 > 搜索/选择 > 下一步 > 添加权限。
依次前往安全凭据 > 访问密钥 > 创建访问密钥。
下载 CSV(这些值会输入到 Feed 中)。
在 Google SecOps 中配置 Feed 以注入 Uptycs 日志
- 依次前往 SIEM 设置 > Feed。
- 点击 + 添加新 Feed。
- 在Feed 名称字段中,输入 Feed 的名称(例如
Uptycs EDR logs)。 - 选择 Amazon S3 V2 作为来源类型。
- 选择 Uptycs EDR 作为日志类型。
- 点击下一步。
- 为以下输入参数指定值:
- S3 URI:
s3://uptycs-telemetry-export/telemetry/ - 源删除选项:根据您的偏好选择删除选项。
- 文件存在时间上限:包含在过去指定天数内修改的文件。默认值为 180 天。
- 访问密钥 ID:有权访问 S3 存储桶的用户访问密钥。
- 私有访问密钥:有权访问 S3 存储桶的用户私有密钥。
- 资产命名空间:资产命名空间。
- 注入标签:应用于此 Feed 中事件的标签。
- S3 URI:
- 点击下一步。
- 在最终确定界面中查看新的 Feed 配置,然后点击提交。
UDM 映射表
| 日志字段 | UDM 映射 | 逻辑 |
|---|---|---|
| osquery_raw_data.answer | read_only_udm.network.dns.answers.name | 如果 osquery_raw_data.answer 不为空,则取自 osquery_raw_data.answer 的值。 |
| osquery_raw_data.container_id | read_only_udm.metadata.product_log_id | 如果 osquery_raw_data.container_id 不为空,则取自 osquery_raw_data.container_id 的值。 |
| osquery_raw_data.local_address | read_only_udm.principal.ip | 如果 osquery_raw_data.local_address 不为空且是有效的 IP 地址,则取自 osquery_raw_data.local_address。 |
| osquery_raw_data.local | read_only_udm.principal.ip | 否则,如果 osquery_raw_data.local 不为空且是有效的 IP 地址,则从 osquery_raw_data.local 中获取值。 |
| osquery_raw_data.local_port | read_only_udm.principal.port | 如果 osquery_raw_data.local_port 不为空,则从 osquery_raw_data.local_port 中提取值并将其转换为整数。 |
| osquery_raw_data.md5 | read_only_udm.target.process.file.md5 | 如果 osquery_raw_data.md5 不为空,则取自 osquery_raw_data.md5 的值。 |
| osquery_raw_data.port | read_only_udm.target.port | 如果 osquery_raw_data.port 不为空,则从 osquery_raw_data.port 中提取值并将其转换为整数。 |
| osquery_raw_data.question | read_only_udm.network.dns.questions.name | 如果 osquery_raw_data.question 不为空,则取自 osquery_raw_data.question 的值。 |
| osquery_raw_data.remote_address | read_only_udm.intermediary.ip | 如果 osquery_raw_data.remote_address 不为空,则从 osquery_raw_data.remote_address 中获取值。 |
| osquery_raw_data.remote_port | read_only_udm.intermediary.port | 如果 osquery_raw_data.remote_port 不为空,则从 osquery_raw_data.remote_port 中提取值并将其转换为整数。 |
| osquery_raw_data.type | read_only_udm.network.dns.questions.type | 从 osquery_raw_data.type 中获取的值,如果 osquery_raw_data.type 不为空,则转换为整数。 |
| osquery_raw_data.uid | read_only_udm.principal.user.userid | 如果 osquery_raw_data.uid 不为空且不等于“0”,则从 osquery_raw_data.uid 中获取值。 |
| osquery_raw_data.worker_instance_id | read_only_udm.principal.user.userid | 否则,如果 osquery_raw_data.worker_instance_id 不为空,则取自 osquery_raw_data.worker_instance_id。 |
| upt_asset_group_id | read_only_udm.principal.user.group_identifiers | 如果 upt_asset_group_id 不为空,则取自 upt_asset_group_id。 |
| upt_asset_group_name | read_only_udm.principal.group.group_display_name | 如果 upt_asset_group_name 不为空,则取自 upt_asset_group_name。 |
| upt_asset_id | read_only_udm.principal.asset.asset_id | 如果 upt_asset_id 不为空,则为串联的字符串“UPT ASSET ID:”与 upt_asset_id 的值。 |
| upt_hash | read_only_udm.target.file.md5 | 将 upt_hash 中出现的所有“-”替换为“”。然后,如果 upt_hash 不为空,则将该值分配给 read_only_udm.target.file.md5。 |
| upt_hostname | read_only_udm.principal.hostname | 如果 upt_hostname 不为空,则从 upt_hostname 中获取值。 |
| upt_resource_type | read_only_udm.target.resource.type | 如果 upt_resource_type 不为空,则取自 upt_resource_type。 |
| upt_time | read_only_udm.metadata.event_timestamp.seconds | 如果 upt_time 不为空,则取自 upt_time。 |
| read_only_udm.metadata.event_type | 如果 osquery_raw_data.pid 不为空,则将值设置为“PROCESS_LAUNCH”。如果 osquery_raw_data.question 不为空,则将值设置为“NETWORK_DNS”。如果 event_type 为空,则将值设置为“GENERIC_EVENT”。 | |
| read_only_udm.metadata.log_type | 值设置为“UPTYCS_EDR”。 | |
| read_only_udm.metadata.product_name | 值设置为“UPTYCS_EDR”。 | |
| read_only_udm.metadata.vendor_name | 值设置为“UPTYCS”。 | |
| read_only_udm.network.application_protocol | 如果 osquery_raw_data.question 不为空,则将值设置为“DNS”。 | |
| read_only_udm.security_result.action | 如果 osquery_raw_data.return_code 等于“SUCCESS”或 osquery_raw_data.success 等于“1”,则将值设置为“ALLOW”。 | |
| read_only_udm.target.process.command_line | 如果 osquery_raw_data.cmdline 不为空,则取自 osquery_raw_data.cmdline。 | |
| read_only_udm.target.process.file.full_path | 如果 osquery_raw_data.path 不为空,则从 osquery_raw_data.path 中获取值。 | |
| read_only_udm.target.process.parent_process | 该值是通过迭代 osquery_raw_data.ancestor_list 中的 ancestor_list 数组构建的。对于数组中的每个元素,系统会提取 command_line、文件的 full_path 和 pid,并将其格式化为表示进程链的 JSON 结构。 | |
| read_only_udm.target.process.pid | 如果 osquery_raw_data.pid 不为空,则取自 osquery_raw_data.pid。 |
需要更多帮助?获得社区成员和 Google SecOps 专业人士的解答。