收集 JumpCloud Directory Insights 日志
本文档介绍了如何使用 Google Cloud Storage V2 将 JumpCloud Directory Insights 日志注入到 Google Security Operations 中。
JumpCloud 是一个云目录平台,可提供身份管理、单点登录和设备管理功能。目录数据洞见可提供涵盖用户身份验证、管理员操作和系统事件的审核日志和活动日志。解析器会将日志字段映射到统一数据模型 (UDM),并处理用户登录、资源更改和安全操作等事件类型。
准备工作
请确保满足以下前提条件:
- Google SecOps 实例
- 已启用 Cloud Storage API 的 GCP 项目
- 创建和管理 GCS 存储分区及 IAM 政策的权限
- 具有管理员或经理角色的 JumpCloud 账号以及有效的 API 密钥
创建 Google Cloud Storage 存储桶
- 前往 Google Cloud 控制台。
- 选择您的项目或创建新项目。
- 在导航菜单中,依次前往 Cloud Storage > 存储分区。
- 点击创建存储分区。
提供以下配置详细信息:
设置 值 为存储桶命名 输入一个全局唯一的名称(例如 jumpcloud-directory-insights-logs)位置类型 根据您的需求进行选择(区域级、双区域、多区域) 位置 选择营业地点(例如 us-central1)存储类别 标准(建议用于经常访问的日志) 访问权限控制 均匀(推荐) 保护工具 可选:启用对象版本控制或保留政策 点击创建。
将 JumpCloud Directory Insights 日志导出到 Google Cloud Storage
JumpCloud Directory Insights 通过 Directory Insights API 公开事件。使用预定脚本或 Cloud Run 函数拉取事件,并将其写入 GCS。
生成 JumpCloud API 密钥:
- 登录 JumpCloud 管理员门户。
- 前往您的个人资料图标,然后选择 My API Key(我的 API 密钥)。
- 复制 API 密钥。
创建一个 Cloud Run 函数,该函数可查询 JumpCloud Directory Insights API、检索事件并将事件写入 GCS。
使用 Cloud Scheduler 和 Pub/Sub 按预定时间触发函数。
- 确保导出的文件保留其原始 JSON 格式。
- 每个文件应包含一条或多条事件记录。
检索 Google SecOps 服务账号
- 登录 Google SecOps 控制台。
- 依次前往 SIEM 设置 > Feed。
- 点击添加新 Feed。
- 点击配置单个 Feed。
- 选择 Google Cloud Storage V2 作为来源类型。
- 选择 JumpCloud Directory Insights 作为日志类型。
点击获取服务账号。系统会显示一个唯一的服务账号电子邮件地址,例如:
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com复制此电子邮件地址。您将在下一步骤中用到它。
向 Google SecOps 服务账号授予 IAM 权限
- 前往 Cloud Storage > 存储分区。
- 点击您的存储桶名称。
- 前往权限标签页。
- 点击授予访问权限。
- 提供以下配置详细信息:
- 添加主账号:粘贴 Google SecOps 服务账号电子邮件地址。
- 分配角色:选择 Storage Object Viewer。
- 点击保存。
在 Google SecOps 中配置 Feed 以注入 JumpCloud Directory Insights 日志
- 依次前往 SIEM 设置 > Feed。
- 点击添加新 Feed。
- 点击配置单个 Feed。
- 在 Feed 名称字段中,输入 Feed 的名称(例如
JumpCloud Directory Insights Logs)。 - 选择 Google Cloud Storage V2 作为来源类型。
- 选择 JumpCloud Directory Insights 作为日志类型。
- 点击下一步。
为以下输入参数指定值:
字段 值 存储桶 URI gs://jumpcloud-directory-insights-logs/jumpcloud/来源删除选项 根据您的偏好选择删除选项 文件最长保留天数 默认值为 180 天 资产命名空间 资源命名空间 注入标签 要应用于相应 Feed 中事件的标签 - 将
jumpcloud-directory-insights-logs替换为您的实际 GCS 存储桶名称。 - 请务必在 URI 末尾添加尾随斜杠 (
/)。
- 将
点击下一步。
在最终确定界面中查看新的 Feed 配置,然后点击提交。
UDM 映射表
| 日志字段 | UDM 映射 | 逻辑 |
|---|---|---|
| data.profile_list.payload_content.payload_type, data.profile_list.payload_content.payload_identifier, data.profile_list.payload_content.payload_uuid, data.profile_list.payload_content.payload_organization, data.profile_list.payload_content.payload_display_name, data.profile_list.payload_content.payload_description | 关于 | 已与 payloadContent 中的属性标签合并 |
| data.association.op, data.association.action_source, data.geoip.region_code, data.service, data.event_type, data.@version, data.application.version, data.application.publisher, data.application.uninstall_string, data.changes.0.field, data.changes.0.from, data.changes.0.to, data.available_os_updates.allows_install_later | additional.fields | 与相应标签合并 |
| extensions.auth.type | 当 event_type 为 USER_LOGIN 时,设置为“MACHINE” | |
| data.timestamp | metadata.event_timestamp | 使用日期匹配 ISO8601、RFC 3339、yyyy-MM-ddTHH:mm:ss.SSSSSSZ 进行转换 |
| data.message、data.client_ip、data.initiated_by.username、data.system.hostname | metadata.event_type | 如果消息与“logged in”匹配且目标不为空,则设置为 USER_LOGIN;否则,如果存在 IP 地址和用户 ID,则设置为 USER_UNCATEGORIZED;否则,如果存在主机名或 IP 地址,则设置为 STATUS_UPDATE;否则,如果存在用户 ID,则设置为 USER_UNCATEGORIZED;否则,设置为 GENERIC_EVENT |
| data.id | metadata.product_log_id | 直接复制值 |
| data.@version、data.application.version | metadata.product_version | 设置为 data.@version,然后替换为 data.application.version |
| data.application.name | principal.application | 直接复制值 |
| data.mdm_type | principal.asset.hardware | 与制造商合并,设置为 data.mdm_type |
| data.command_uuid | principal.asset_id | 串联为“commandUuid:” + data.command_uuid |
| data.system.hostname | principal.hostname | 直接复制值 |
| data.client_ip | principal.ip | 从 data.client_ip 合并 |
| data.geoip.country_code | principal.location.country_or_region | 直接复制值 |
| data.geoip.region_code | principal.location.name | 直接复制值 |
| data.geoip.latitude | principal.location.region_latitude | 转换为字符串,然后再转换为浮点数 |
| data.geoip.longitude | principal.location.region_longitude | 转换为字符串,然后再转换为浮点数 |
| data.geoip.region_name | principal.location.state | 直接复制值 |
| data.application.path, data.process_name | principal.process.file.full_path | 设置为 data.application.path,然后替换为 data.process_name |
| data.association.connection.from.name、data.mdm_device_manager_id、data.request_type | principal.resource.attribute.labels | 与 connection_from_name、mdm_device_manager_id、request_type 的标签合并 |
| data.system.id、data.resource.id、data.mdm_device_id | principal.resource.id | 设置为 data.system.id,然后替换为 data.resource.id,再替换为 data.mdm_device_id |
| data.resource.username | principal.resource.name | 直接复制值 |
| data.association.connection.from.object_id | principal.resource.product_object_id | 直接复制值 |
| data.association.connection.from.type | principal.resource.type | 直接复制值 |
| data.initiated_by.email | principal.user.email_addresses | 如果电子邮件地址与 ^.+@.+$ 匹配,则合并 |
| data.system.displayName | principal.user.user_display_name | 直接复制值 |
| data.initiated_by.username, data.admin_info.name | principal.user.userid | 设置为 data.initiated_by.username,然后替换为 data.admin_info.name,再替换为 data.initiated_by.username |
| data.success、data.status | sec_result.action | 如果成功为 true 或状态为“已确认”,则设置为 ALLOW;如果成功为 false,则设置为 BLOCK |
| data.status、data.success | sec_result.action_details | 如果不为空,则设置为状态,否则设置为成功 |
| data.success、data.status、data.security_info.management_status.is_activation_lock_manageable、data.security_info.management_status.is_user_enrollment、data.security_info.management_status.enrolled_via_dep、data.organization、data.windows_meta.logon_type、data.security_info.management_status.user_approved_enrollment | sec_result.detection_fields | 与 is_activation_lock_manageable、is_user_enrollment、enrolled_via_dep、组织、logon_type、user_approved_enrollment 的标签合并 |
| data.query_responses.device_name | target.hostname | 直接复制值 |
| data.query_responses.wifi_mac | target.mac | 从 data.query_responses.wifi_mac 合并 |
| data.query_responses.model_name | target.platform | 如果匹配 (?i)mac,则设置为“MAC” |
| data.query_responses.os_version | target.platform_version | 直接复制值 |
| data.query_responses.available_device_capacity, data.query_responses.device_capacity | target.resource.attribute.labels | 与 available_device_capacity、device_capacity 的标签合并 |
| data.association.connection.to.name | target.resource.name | 直接复制值 |
| data.association.connection.to.object_id | target.resource.product_object_id | 直接复制值 |
| data.association.connection.to.type | target.resource.type | 直接复制值 |
| data.profile_list.payload_organization | target.user.department | 从 profile_payload_organization 合并 |
| metadata.vendor_name | 设置为“JUMPCLOUD_DIRECTORY_INSIGHTS” | |
| metadata.product_name | 设置为“JUMPCLOUD_DIRECTORY_INSIGHTS” | |
data.alert_id |
event.idm.read_only_udm.metadata.product_log_id |
从变更日志映射 |
data.alert_title |
event.idm.read_only_udm.security_result.summary |
从变更日志映射 |
data.category |
event.idm.read_only_udm.security_result.category_details |
从变更日志映射 |
data.description |
event.idm.read_only_udm.security_result.description |
从变更日志映射 |
data.priority |
event.idm.read_only_udm.security_result.priority |
从变更日志映射 |
data.rule_id |
event.idm.read_only_udm.security_result.rule_id |
从变更日志映射 |
data.event_description |
event.idm.read_only_udm.metadata.description |
从变更日志映射 |
data.di_event.event_type |
event.idm.read_only_udm.metadata.product_event_type |
从变更日志映射 |
data.di_event.initiated_by.email |
event.idm.read_only_udm.principal.user.email_addresses |
从变更日志映射 |
data.di_event.initiated_by.id |
event.idm.read_only_udm.principal.user.product_object_id |
从变更日志映射 |
data.di_event.client_ip |
event.idm.read_only_udm.principal.ip |
从变更日志映射 |
data.di_event.association.connection.from.name |
event.idm.read_only_udm.target.group.group_display_name |
从变更日志映射 |
data.di_event.association.connection.to.name |
event.idm.read_only_udm.about.user.userid |
从变更日志映射 |
data.di_event.association.connection.to.object_id |
event.idm.read_only_udm.about.user.product_object_id |
从变更日志映射 |
data.di_event.success |
event.idm.read_only_udm.security_result.action |
从变更日志映射 |
data.di_event.service |
event.idm.read_only_udm.target.application |
从变更日志映射 |
data.di_event.geoip.country_code |
event.idm.read_only_udm.principal.location.country_or_region |
从变更日志映射 |
data.organization_name |
event.idm.read_only_udm.principal.user.company_name |
从变更日志映射 |
data.di_event.@version |
event.idm.read_only_udm.metadata.product_version |
从变更日志映射 |
data.source_url |
event.idm.read_only_udm.principal.url |
从变更日志映射 |
data.di_event.initiated_by.source |
event.idm.read_only_udm.principal.hostname |
从变更日志映射 |
data.source_name |
event.idm.read_only_udm.principal.user.userid |
从变更日志映射 |
data.di_event.geoip.latitude |
event.idm.read_only_udm.principal.location.region_latitude |
从变更日志映射 |
data.di_event.geoip.longitude |
event.idm.read_only_udm.principal.location.region_longitude |
从变更日志映射 |
data.di_event.geoip.region_name |
event.idm.read_only_udm.principal.location.state |
从变更日志映射 |
data.di_event.organization |
event.idm.read_only_udm.security_result.detection_fields |
从变更日志映射 |
association_op", "action_source", and "sso_token_success |
additional.fields |
从变更日志映射 |
connection_from_type |
principal.resource.resource_type |
从变更日志映射 |
connection_from_object_id |
principal.resource.product_object_id |
从变更日志映射 |
connection_to_name |
target.resource.name |
从变更日志映射 |
connection_to_type |
target.resource.resource_type |
从变更日志映射 |
connection_to_object_id |
target.resource.product_object_id |
从变更日志映射 |
更新日志
需要更多帮助?获得社区成员和 Google SecOps 专业人士的解答。