收集 CircleCI 审核日志

解析器版本: 2.0

支持的环境:

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

准备工作

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

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

设置 Feed

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

  1. 依次前往 SIEM 设置 > Feed
  2. 点击 Add New Feed (添加新 Feed)。
  3. 在下一页上,点击 Configure a single feed (配置单个 Feed)。
  4. Feed name (Feed 名称)字段中,输入 Feed 的名称(例如 CircleCI Logs )。
  5. 选择 Webhook 作为 Source type (来源类型)。
  6. 选择 CircleCI 作为 Log type (日志类型)。
  7. 点击下一步
  8. 可选:为以下输入参数指定值:
    • Split delimiter:用于分隔日志行的分隔符,例如 \n
    • Asset namespace资产命名空间
    • Ingestion labels:应用于此 Feed 中事件的标签。
  9. 点击下一步
  10. Finalize (最终确定)界面中检查 Feed 配置,然后点击提交
  11. 点击 Generate Secret Key (生成密钥)以生成用于对此 Feed 进行身份验证的密钥。
  12. 复制并存储密钥。您无法再次查看此密钥。如有需要,您可以重新生成新密钥,但此操作会使之前的密钥失效。
  13. 详细信息 标签页中,从 Endpoint Information (端点信息)字段复制 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. 选择 Webhooks
  5. 点击 Add Webhook
  6. 为以下输入参数指定值:

    • Webhook Name:提供描述性名称(例如 Google SecOps )。
    • Endpoint 网址:输入 Google SecOps API 端点的 <ENDPOINT_URL>
    • Events :选择应触发 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 ,其中对应的 keyaccount_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 ,其中对应的 keyjob_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 ,其中对应的 keyjob_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 ,其中对应的 keyjob_status
payload.workflow.id read_only_udm.about.resource.attribute.labels.value 原始日志中的 payload.workflow.id 值会分配给 UDM 字段 read_only_udm.about.resource.attribute.labels.value ,其中对应的 keyworkflow_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 ,其中对应的 keyscope_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 ,其中对应的 keyversion

更新日志

查看此解析器的更新日志

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