收集 CircleCI 审核日志
解析器版本: 2.0
支持的环境:
Google SecOps
SIEM
此解析器会从 CSV 和 JSON 格式的 CircleCI 审核日志中提取字段,并将其转换为统一数据模型 (UDM)。它会处理这两种格式,执行数据转换和扩充,并将提取的字段映射到 event 对象中对应的 UDM 字段。它专注于用户操作、资源访问和更新事件,对其进行分类并填充相关的 UDM 字段,例如 principal、target、network 和 metadata。
准备工作
请确保满足以下前提条件:
- Google SecOps 实例。
- 对 CircleCI 的特权访问权限。
设置 Feed
如需配置 Feed,请按以下步骤操作:
- 依次前往 SIEM 设置 > Feed。
- 点击 Add New Feed (添加新 Feed)。
- 在下一页上,点击 Configure a single feed (配置单个 Feed)。
- 在 Feed name (Feed 名称)字段中,输入 Feed 的名称(例如 CircleCI Logs )。
- 选择 Webhook 作为 Source type (来源类型)。
- 选择 CircleCI 作为 Log type (日志类型)。
- 点击下一步 。
- 可选:为以下输入参数指定值:
- Split delimiter:用于分隔日志行的分隔符,例如
\n。 - Asset namespace:资产命名空间。
- Ingestion labels:应用于此 Feed 中事件的标签。
- Split delimiter:用于分隔日志行的分隔符,例如
- 点击下一步 。
- 在 Finalize (最终确定)界面中检查 Feed 配置,然后点击提交 。
- 点击 Generate Secret Key (生成密钥)以生成用于对此 Feed 进行身份验证的密钥。
- 复制并存储密钥。您无法再次查看此密钥。如有需要,您可以重新生成新密钥,但此操作会使之前的密钥失效。
- 在详细信息 标签页中,从 Endpoint Information (端点信息)字段复制 Feed 端点网址。您需要在客户端应用中指定此端点网址。
- 点击完成 。
为 Webhook Feed 创建 API 密钥
依次前往 Google Cloud 控制台 > 凭据。
点击创建凭据 ,然后选择 API 密钥 。
将 API 密钥访问权限限制为 Google Security Operations API 。
指定端点网址
- 在客户端应用中,指定 Webhook Feed 中提供的 HTTPS 端点网址。
通过以以下格式在自定义标头中指定 API 密钥和密钥来启用身份验证:
X-goog-api-key = API_KEY X-Webhook-Access-Key = SECRET建议:将 API 密钥指定为标头,而不是在网址中指定。
如果您的 Webhook 客户端不支持自定义标头,您可以使用以下格式的查询参数指定 API 密钥和密钥:
ENDPOINT_URL?key=API_KEY&secret=SECRET替换以下内容:
ENDPOINT_URL:Feed 端点网址。API_KEY:用于向 Google SecOps 进行身份验证的 API 密钥。SECRET:您生成的用于对 Feed 进行身份验证的密钥。
在 CircleCI 中配置 Webhook
- 登录 CircleCI 网页界面。
- 选择要从中注入日志的项目。
- 点击项目设置 。
- 选择 Webhooks 。
- 点击 Add Webhook 。
为以下输入参数指定值:
- Webhook Name:提供描述性名称(例如 Google SecOps )。
- Endpoint 网址:输入 Google SecOps API 端点的
<ENDPOINT_URL>。
- Events :选择应触发 Webhook 的 CircleCI 事件(例如,选择 workflow-completed 以在工作流完成后发送数据)。
点击保存 以创建 Webhook。
UDM 映射表
| 日志字段 | UDM 映射 | 逻辑 |
|---|---|---|
| account.id | read_only_udm.about.resource.attribute.labels.value | 原始日志中的 account.id 值会分配给 UDM 字段 read_only_udm.about.resource.attribute.labels.value ,其中对应的 key 为 account_id 。 |
| action | read_only_udm.metadata.product_event_type | 原始日志中的 action 值会分配给 UDM 字段 read_only_udm.metadata.product_event_type 。 |
| actor.id | read_only_udm.principal.user.product_object_id | 原始日志中的 actor.id 值会分配给 UDM 字段 read_only_udm.principal.user.product_object_id 。 |
| actor.name | read_only_udm.principal.user.userid | 系统会从原始日志的 actor.name 字段中移除“github: ”前缀。剩余的值会分配给 UDM 字段 read_only_udm.principal.user.userid 。如果原始日志中存在 actor.name ,则值 USER_RESOURCE_UPDATE_CONTENT 会分配给 read_only_udm.metadata.event_type 。否则,系统会分配 USER_RESOURCE_ACCESS 。 |
| id | read_only_udm.metadata.product_log_id | 原始日志中的 id 值会分配给 UDM 字段 read_only_udm.metadata.product_log_id 。解析器会将 read_only_udm.metadata.log_type 设置为 CIRCLECI 。解析器会将 read_only_udm.metadata.product_name 设置为 CIRCLECI 。解析器会将 read_only_udm.metadata.vendor_name 设置为 CIRCLECI 。 |
| occurred_at | read_only_udm.metadata.event_timestamp | 原始日志中的 occurred_at 值会解析为时间戳,并分配给 UDM 字段 read_only_udm.metadata.event_timestamp 。 |
| organization.name | read_only_udm.target.administrative_domain | 系统会从原始日志的 organization.name 字段中移除“github: ”前缀。剩余的值会分配给 UDM 字段 read_only_udm.target.administrative_domain 。 |
| payload.job.id | read_only_udm.about.resource.attribute.labels.value | 原始日志中的 payload.job.id 值会分配给 UDM 字段 read_only_udm.about.resource.attribute.labels.value ,其中对应的 key 为 job_id 。 |
| payload.job.job_name | read_only_udm.about.resource.attribute.labels.value | 原始日志中的 payload.job.job_name 值会分配给 UDM 字段 read_only_udm.about.resource.attribute.labels.value ,其中对应的 key 为 job_name 。 |
| payload.job.job_status | read_only_udm.about.resource.attribute.labels.value | 原始日志中的 payload.job.job_status 值会分配给 UDM 字段 read_only_udm.about.resource.attribute.labels.value ,其中对应的 key 为 job_status 。 |
| payload.workflow.id | read_only_udm.about.resource.attribute.labels.value | 原始日志中的 payload.workflow.id 值会分配给 UDM 字段 read_only_udm.about.resource.attribute.labels.value ,其中对应的 key 为 workflow_id 。 |
| request.id | read_only_udm.network.session_id | 原始日志中的 request.id 值会分配给 UDM 字段 read_only_udm.network.session_id 。 |
| scope.id | read_only_udm.about.resource.attribute.labels.value | 原始日志中的 scope.id 值会分配给 UDM 字段 read_only_udm.about.resource.attribute.labels.value ,其中对应的 key 为 scope_id 。解析器最初会将 sec_action 设置为 BLOCK 。如果原始日志中的 success 字段为 true,则 sec_action 会更改为 ALLOW 。然后,sec_action 的值会分配给 UDM 字段 read_only_udm.security_result.action 。 |
| target.id | read_only_udm.target.resource.product_object_id | 原始日志中的 target.id 值会分配给 UDM 字段 read_only_udm.target.resource.product_object_id 。 |
| target.name | read_only_udm.target.resource.name | 系统会从原始日志的 target.name 字段中移除“github: ”前缀。剩余的值会分配给 UDM 字段 read_only_udm.target.resource.name 。解析器会将 read_only_udm.target.resource.resource_type 设置为 STORAGE_OBJECT 。 |
| version | read_only_udm.target.resource.attribute.labels.value | 原始日志中的 version 值会转换为字符串,并分配给 UDM 字段 read_only_udm.target.resource.attribute.labels.value ,其中对应的 key 为 version 。 |