收集 CircleCI 审核日志

解析器版本:2.0

支持范围:

此解析器会从 CSV 和 JSON 格式的 CircleCI 审核日志中提取字段,并将其转换为统一数据模型 (UDM)。它会处理这两种格式,执行数据转换和丰富,并将提取的字段映射到 event 对象中对应的 UDM 字段。它专注于用户操作、资源访问和更新事件,对这些事件进行分类并填充相关的 UDM 字段,例如 principal、target、network 和 metadata。

准备工作

确保您满足以下前提条件:

  • Google SecOps 实例。
  • 对 CircleCI 的特权访问权限。

设置 Feed

如需配置 Feed,请按以下步骤操作:

  1. 依次前往设置 > 数据管理 > Feed。如果您使用的是仅 SIEM 平台,请依次前往设置 > Feed。
  2. 点击添加新新闻信息流。
  3. 在下一页上,点击配置单个 Feed。
  4. 在 Feed 名称字段中,输入 Feed 的名称(例如 CircleCI Logs)。
  5. 选择 Webhook 作为来源类型。
  6. 选择 CircleCI 作为日志类型。
  7. 点击下一步。
  8. 可选:为以下输入参数指定值:
    • 拆分定界符:用于分隔日志行的定界符,例如 \n。
    • 资产命名空间:资产命名空间。
    • 注入标签:应用于此 Feed 中事件的标签。
  9. 点击下一步。
  10. 在最终确定界面中查看 Feed 配置,然后点击提交。
  11. 点击生成密钥,生成用于对此 Feed 进行身份验证的密钥。
  12. 复制并存储密钥。您无法再次查看此密钥。如有需要,您可以重新生成新的密钥,但此操作会使之前的密钥失效。
  13. 在详细信息标签页中,从端点信息字段复制 Feed 端点网址。您需要在客户端应用中指定此端点网址。
  14. 点击完成。

为 webhook Feed 创建 API 密钥

  1. 前往 Google Cloud 控制台 > 凭证。

    转到“凭据”页面

  2. 点击创建凭据,然后选择 API 密钥。

  3. 将 API 密钥访问权限限制为 Google Security Operations API。

指定端点网址

  1. 在客户端应用中,指定 Webhook Feed 中提供的 HTTPS 端点网址。
  2. 通过在自定义标头中以以下格式指定 API 密钥和密钥,启用身份验证:

    X-goog-api-key = API_KEY
    X-Webhook-Access-Key = SECRET
    

    建议:将 API 密钥指定为标头,而不是在网址中指定。

  3. 如果您的 webhook 客户端不支持自定义标头,您可以使用以下格式的查询参数指定 API 密钥和密钥:

    ENDPOINT_URL?key=API_KEY&secret=SECRET
    

    替换以下内容:

    • ENDPOINT_URL:Feed 端点网址。
    • API_KEY:用于向 Google SecOps 进行身份验证的 API 密钥。
    • SECRET:您为验证 Feed 而生成的密钥。

在 CircleCI 中配置 webhook

  1. 登录 CircleCI 网页界面。
  2. 选择要从中注入日志的项目。
  3. 点击项目设置。
  4. 选择 Webhook。
  5. 点击 Add Webhook(添加 Webhook)。
  6. 为以下输入参数指定值:

    • Webhook Name(Webhook 名称):提供一个描述性名称(例如 Google SecOps)。
    • 端点网址:输入 Google SecOps API 端点的 <ENDPOINT_URL>。
    • 事件:选择应触发 webhook 的 CircleCI 事件(例如,选择 workflow-completed 以在工作流完成后发送数据)。
  7. 点击保存以创建 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 “github:”前缀已从原始日志中的 target.name 字段中移除。剩余的值会分配给 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。

更新日志

查看此解析器的更新日志

需要更多帮助?获得社区成员和 Google SecOps 专业人士的解答。