收集 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 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 私有访问密钥:输入私有访问密钥。
- 事件类型:选择所有必需的遥测数据类型。
- 测试并启用导出。
为 Google SecOps 创建只读 IAM 用户
- 依次前往 AWS 控制台 > IAM > 用户。
- 点击 Add users 。
- 提供以下配置详细信息:
- 用户:输入
secops-reader。 - 访问类型:选择 Access key – Programmatic access。
- 用户:输入
- 点击创建用户 。
- 添加最低限度的读取政策(自定义):Users > secops-reader > Permissions > Add permissions > Attach policies directly > Create policy。
在 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。依次前往 Create policy > search/select > Next > Add permissions。
依次前往 Security credentials > Access keys > Create access key 。
下载 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 专业人士的解答。