收集 Cisco Identity Intelligence 日志
本文档介绍了如何配置 Cisco Identity Intelligence,以使用 Webhook 将日志推送到 Google Security Operations。
Cisco Identity Intelligence(前身为 Oort Security)是一个身份威胁检测和响应平台,可跨身份提供方持续监控用户行为、身份验证模式、设备使用情况和访问权限。它通过分析用户活动、失败的安全检查、信任分数和风险行为,检测基于身份的威胁、错误配置和合规性违规行为。
准备工作
请确保您满足以下前提条件:
- Google SecOps 实例
- 对 Cisco Identity Intelligence 租户的特权访问权限
- 在 Cisco Identity Intelligence 中管理集成的管理权限
- Google Cloud Console 访问权限(用于创建 API 密钥)
在 Google SecOps 中创建 webhook Feed
创建 Feed
- 前往 SIEM 设置 > Feed。
- 点击添加新 Feed。
- 在下一页上,点击配置单个 Feed。
- 在 Feed 名称字段中,输入 Feed 的名称(例如
Cisco Identity Intelligence Events)。 - 选择 Webhook 作为来源类型。
- 选择 Cisco Identity Intelligence 作为日志类型。
- 点击下一步。
- 为以下输入参数指定值:
- 拆分定界符(可选):输入
\n以拆分多行事件。 - 资产命名空间:资产命名空间
- 注入标签:要应用于此 Feed 中事件的标签
- 拆分定界符(可选):输入
- 点击下一步。
- 在最终确定界面中查看新的新闻信息流配置,然后点击提交。
生成并保存密钥
创建 Feed 后,您必须生成用于身份验证的密钥:
- 在 Feed 详情页面上,点击生成密钥。
- 系统会显示一个对话框,其中包含密钥。
- 复制并妥善保存密钥。
获取 Feed 端点网址
- 前往该 Feed 的详细信息标签页。
- 在端点信息部分,复制 Feed 端点网址。
网址格式为:
https://{region}-chronicle.googleapis.com/v1/{parent}/logs:import其中,
{region}是 Google SecOps 实例所在的区域(例如us、europe或asia-southeast1),{parent}是资源路径,格式为projects/<PROJECT_ID>/locations/<LOCATION>/instances/<INSTANCE_ID>/logTypes/<LOG_TYPE>。保存此网址,以便在后续步骤中使用。
点击完成。
创建 Google Cloud API 密钥
Chronicle 需要使用 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 密钥。
配置 Cisco Identity Intelligence webhook
构建网络钩子网址
将 Chronicle 端点网址和 API 密钥组合在一起:
<ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY>示例:
https://{region}-chronicle.googleapis.com/v1/{parent}/logs:import?key=AIzaSyD...&secret=abcd1234...
替换以下内容:
<ENDPOINT_URL>:之前复制的 Chronicle Feed 端点网址<API_KEY>:之前创建的 Google Cloud API 密钥<SECRET_KEY>:之前生成的 Chronicle Webhook 密钥
在 Cisco Identity Intelligence 中创建 webhook 通知目标
- 登录 Cisco Identity Intelligence。
- 前往集成。
- 点击添加集成。
- 向下滚动到 Webhook 部分。
- 点击添加 Webhook 目标。
- 提供以下配置详细信息:
- 名称:输入一个描述性名称(例如
Chronicle SIEM Integration)。 - 网络钩子网址:粘贴上述包含 API 密钥和密钥的完整端点网址。
- 授权类型:选择 API 密钥。
- API Key Name:输入密钥名称(例如
x-goog-chronicle-auth)。 - API 密钥值:输入 Google Cloud API 密钥。
- 名称:输入一个描述性名称(例如
- 展开调用 HTTP 参数部分。
- 添加以下类型为标头的参数:
- 键:
Content-Type,值:application/json - 键:
Accept,值:application/json
- 键:
- 在将此目标用于部分中,选择检查失败,以便在身份检查检测到失败结果时收到通知。
点击保存。
测试网络钩子连接
- 在集成页面上,找到您创建的 webhook 通知目标。
- 点击该行右侧的三点状菜单。
- 选择测试连接。
- 验证测试消息是否已成功送达。
为身份检查启用 Webhook
创建 webhook 通知目标后,您必须为要监控的特定身份检查启用该目标。
- 前往 Cisco Identity Intelligence 中所需的检查详情页面。
- 展开页面右上角的下拉菜单。
- 选中您创建的 webhook 通知目标对应的复选框。
针对要发送给 Google SecOps 的每项检查重复上述步骤。
如需了解详情,请参阅 Cisco Identity Intelligence webhook 文档。
身份验证方法参考
Chronicle 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://{region}-chronicle.googleapis.com/v1/{parent}/logs:import?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" }
身份验证标头名称
Chronicle 接受以下标头名称进行身份验证:
对于 API 密钥:
x-goog-chronicle-auth(推荐)X-Goog-Chronicle-Auth(不区分大小写)
对于密钥:
x-chronicle-auth(推荐)X-Chronicle-Auth(不区分大小写)
Webhook 限制和最佳实践
请求限制
| 限制 | 值 |
|---|---|
| 请求大小上限 | 4 MB |
| 最大 QPS(每秒查询次数) | 15000 |
| 请求超时 | 30 秒 |
| 重试行为 | 自动重试(使用指数退避算法) |
UDM 映射表
| 日志字段 | UDM 映射 | 逻辑 |
|---|---|---|
| 账号 | account_label.value | 直接复制的值 |
| 账号 | account_label.key | 设为“account” |
| account_label | security_result.detection_fields | 已合并到 detection_fields |
| additional_detaildescription.key | additional_detaildescription.key | 设置为“详细说明” |
| detaildescription | additional_detaildescription.value.list_value.values | 从 detaildescription 合并 |
| additional_detaildescription | event.idm.read_only_udm.additional.fields | 已合并到 additional.fields 中 |
| additional_recommendedaction.key | additional_recommendedaction.key | 设为“推荐措施” |
| recommendedAction | additional_recommendedaction.value.list_value.values | 从 recommendedAction 合并 |
| additional_recommendedaction | event.idm.read_only_udm.additional.fields | 已合并到 additional.fields |
| data1 | usersFailing_label | 直接复制的值 |
| data.login | login_label | 直接复制的值 |
| detail-type | security_result.summary | 直接复制的值 |
| detail.id | security_result.rule_id | 直接复制的值 |
| detail.title | security_result.rule_name | 直接复制的值 |
| detail.severity | security_result.severity | 如果 detail.severity 的值为 [CRITICAL,ERROR,HIGH,INFORMATIONAL,LOW,MEDIUM] 之一,则采用该值;如果为 moderate,则采用 MEDIUM |
| detaildescription | value_array.string_value | 直接复制值 |
| detailsdata.key | add_label.value, add_label.key | 如果不是 failedSigninDetails 或 ips,则值为 detailsdata.value,键为“loginDetails %{index} details %{detailindex} %{detailsdata.key}” |
| detailsdata.value | add_label.value、add_label.key | |
| detailsdata.key | security_result.detection_fields | 如果满足条件,则合并 add_label |
| detailsdata.value | security_result.detection_fields | |
| field_.value | security_result.detection_fields | 已合并 json_array 中的各种嵌套字段(msg、ipInfo、asn、coordinates、first_event、second_event、locations),键名如“%{index} %{detailindex} %{index1} %{key}”等,不包括 ipAddress、ip 等。 |
| field_.key | security_result.detection_fields | |
| id | metadata.product_log_id | 直接复制的值 |
| login_label | principal.user.email_addresses | 如果匹配邮箱正则表达式,则合并 |
| msg.ipAddress | principal.ip | 如果非空,则合并 |
| msg.first_event.ip_address | principal.ip | 如果不为空,则合并 |
| msg.second_event.ip_address | principal.ip | 如果不为空,则合并 |
| msg_travels_first_event_ip_address | principal.ip | 如果非空,则合并 |
| msg_travels_second_event_ip_address | principal.ip | |
| recommendedAction | value_array.string_value | 直接复制值 |
| security_result | event.idm.read_only_udm.security_result | 已合并到 security_result 中 |
| 来源 | source_label.value | 直接复制值 |
| 来源 | source_label.key | 设置为“source” |
| source_label | event.idm.read_only_udm.src.labels | 已合并到 src.labels |
| 时间 | @timestamp | 使用日期过滤条件(ISO8601、RFC 3339、yyyy-MM-ddTHH:mm:ss.SSSSSSZ)进行解析 |
| usersFailing_label | principal.user.email_addresses | 如果匹配邮箱正则表达式,则合并 |
| 版本 | metadata.product_version | 直接复制的值 |
| has_principal | event.idm.read_only_udm.metadata.event_type | 如果 has_principal 为 true,则设置为“STATUS_UPDATE”;如果 has_user 为 true,则设置为“USER_UNCATEGORIZED”;否则设置为“GENERIC_EVENT” |
| has_user | event.idm.read_only_udm.metadata.event_type | |
| metadata.product_name | metadata.product_name | 设为“OORT” |
| metadata.vendor_name | metadata.vendor_name | 设置为“OORT” |
detail.published |
event.idm.read_only_udm.metadata.collected_timestamp |
从更新日志映射 |
detail.login |
event.idm.read_only_udm.principal.user.userid |
从更新日志映射 |
detail.userTrustLevel |
event.idm.read_only_udm.principal.user.attribute.labels |
从更新日志映射 |
detail.login |
event.idm.read_only_udm.principal.user.user_display_name |
从更新日志映射 |
detail.checkTopics |
event.idm.read_only_udm.security_result.category_details |
从更新日志映射 |
region |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
detail.checkId |
event.idm.read_only_udm.security_result.detection_fields |
从更新日志映射 |
detail.checkScope |
event.idm.read_only_udm.security_result.detection_fields |
从更新日志映射 |
detail.frameworks |
event.idm.read_only_udm.security_result.detection_fields |
从更新日志映射 |
detail.explainabilityEventIds |
event.idm.read_only_udm.security_result.detection_fields |
从更新日志映射 |
data.value |
event.idm.read_only_udm.security_result.detection_fields |
从更新日志映射 |
更新日志
需要更多帮助?获得社区成员和 Google SecOps 专业人士的解答。