GITHUB

支持的语言:

本文档介绍了如何使用 Amazon S3 将 GitHub 审核日志注入到 Google Security Operations。解析器会尝试使用各种 Grok 模式从“message”字段中提取数据,同时处理 JSON 和非 JSON 格式。根据提取的“process_type”,它会使用 grok、kv 和其他过滤器应用特定的解析逻辑,将原始日志数据映射到统一数据模型 (UDM) 架构。

准备工作

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

  • Google SecOps 实例。
  • GitHub Enterprise Cloud 租户的特权访问权限,并具有企业所有者权限。
  • AWS(S3、IAM)的特权访问权限。

收集 GitHub Enterprise Cloud 前提条件(企业访问权限)

  1. 登录 GitHub Enterprise Cloud 管理控制台
  2. 依次前往企业设置 > 设置 > 审核日志 > 日志流式传输
  3. 确保您拥有企业所有者权限,可以配置审核日志流式传输。
  4. 复制以下详细信息并将其保存在安全的位置:
    • GitHub Enterprise 名称
    • 企业下的组织名称

为 Google SecOps 配置 AWS S3 存储桶和 Identity and Access Management

  1. 按照以下用户指南创建 Amazon S3 存储桶创建存储桶
  2. 保存存储桶名称区域以供日后参考(例如 github-audit-logs)。
  3. 按照以下用户指南创建用户创建 IAM 用户
  4. 选择创建的用户
  5. 选择安全凭据标签页。
  6. 访问密钥部分中,点击创建访问密钥
  7. 选择第三方服务作为使用情形
  8. 点击下一步
  9. 可选:添加说明标记。
  10. 点击创建访问密钥
  11. 点击下载 .CSV 文件,保存访问密钥秘密访问密钥,以供日后参考。
  12. 点击完成

为 GitHub S3 流式传输配置 IAM 政策

  1. 在 AWS 控制台中,依次前往 IAM > 政策 > 创建政策 > JSON 标签页
  2. 复制并粘贴以下政策。
  3. 政策 JSON(如果您输入了其他存储桶名称,请替换 github-audit-logs):

    {
    "Version": "2012-10-17",
    "Statement": [
        {
        "Sid": "AllowPutObjects",
        "Effect": "Allow",
        "Action": "s3:PutObject",
        "Resource": "arn:aws:s3:::github-audit-logs/*"
        }
    ]
    }
    
  4. 依次点击下一步 > 创建政策

  5. 为政策命名 GitHubAuditStreamingPolicy,然后点击创建政策

  6. 返回到之前创建的 IAM 用户。

  7. 选择权限标签页。

  8. 依次点击添加权限 > 直接附加政策

  9. 搜索并选择 GitHubAuditStreamingPolicy

  10. 依次点击下一步 > 添加权限

配置 GitHub Enterprise Cloud 审核日志流式传输

  1. 以企业所有者的身份登录 GitHub Enterprise Cloud
  2. 点击您的个人资料照片,然后点击企业设置
  3. 在企业账号边栏中,依次点击设置 > 审核日志 > 日志流式传输
  4. 选择配置信息流,然后点击 Amazon S3
  5. 身份验证下,点击访问密钥
  6. 提供以下配置详细信息:
    • 区域:选择相应存储桶的区域(例如 us-east-1)。
    • 存储桶:输入要将数据流式传输到的存储桶的名称(例如 github-audit-logs)。
    • 访问密钥 ID:输入 IAM 用户的访问密钥 ID。
    • Secret Key(密钥):输入 IAM 用户的密钥。
  7. 点击检查端点,验证 GitHub 是否可以连接到 Amazon S3 端点并向其写入数据。
  8. 成功验证端点后,点击保存

为 Google SecOps 创建只读 IAM 用户和密钥

  1. 依次前往 AWS 控制台 > IAM > 用户 > 添加用户
  2. 点击 Add users(添加用户)。
  3. 提供以下配置详细信息:
    • 用户:输入 secops-reader
    • 访问类型:选择访问密钥 - 以程序化方式访问
  4. 点击创建用户
  5. 附加最低限度的读取政策(自定义):依次点击用户 > secops-reader > 权限 > 添加权限 > 直接附加政策 > 创建政策
  6. JSON:

    {
    "Version": "2012-10-17",
    "Statement": [
        {
        "Effect": "Allow",
        "Action": ["s3:GetObject"],
        "Resource": "arn:aws:s3:::github-audit-logs/*"
        },
        {
        "Effect": "Allow",
        "Action": ["s3:ListBucket"],
        "Resource": "arn:aws:s3:::github-audit-logs"
        }
    ]
    }
    
  7. 名称 = secops-reader-policy

  8. 依次点击创建政策 > 搜索/选择 > 下一步 > 添加权限

  9. secops-reader 创建访问密钥:安全凭据 > 访问密钥 > 创建访问密钥 > 下载 .CSV(您需要将这些值粘贴到 Feed 中)。

在 Google SecOps 中配置 Feed 以注入 GitHub 日志

  1. 依次前往 SIEM 设置> Feed
  2. 点击 + 添加新 Feed
  3. Feed 名称字段中,输入 Feed 的名称(例如 GitHub audit logs)。
  4. 选择 Amazon S3 V2 作为来源类型
  5. 选择 GitHub 作为日志类型
  6. 点击下一步
  7. 为以下输入参数指定值:
    • S3 URIs3://github-audit-logs/
    • 来源删除选项:根据您的偏好设置选择删除选项。
    • 文件存在时间上限:包含在过去指定天数内修改的文件。默认值为 180 天。
    • 访问密钥 ID:有权访问 S3 存储桶的用户访问密钥。
    • 私有访问密钥:具有 S3 存储桶访问权限的用户私有密钥。
    • 资源命名空间资源命名空间
    • 注入标签:应用于此 Feed 中事件的标签。
  8. 点击下一步
  9. 最终确定界面中查看新的 Feed 配置,然后点击提交

UDM 映射表

日志字段 UDM 映射 逻辑
actor principal.user.userid 该值取自 actor 字段。
actor_id principal.user.attribute.labels.value 该值取自 actor_id 字段。
actor_ip principal.ip 该值取自 actor_ip 字段。
actor_location.country_code principal.location.country_or_region 该值取自 actor_location.country_code 字段。
application_name target.application 该值取自 application_name 字段。
business target.user.company_name 该值取自 business 字段。
business_id target.resource.attribute.labels.value 该值取自 business_id 字段。
config.url target.url 该值取自 config.url 字段。
created_at metadata.event_timestamp 该值从 UNIX 毫秒转换为时间戳。
data.cancelled_at extensions.vulns.vulnerabilities.scan_end_time 该值会从 ISO8601 格式转换为时间戳。
data.email target.email 该值取自 data.email 字段。
data.event security_result.about.labels.value 该值取自 data.event 字段。
data.events security_result.about.labels.value 该值取自 data.events 字段。
data.head_branch security_result.about.labels.value 该值取自 data.head_branch 字段。
data.head_sha target.file.sha256 该值取自 data.head_sha 字段。
data.hook_id target.resource.attribute.labels.value 该值取自 data.hook_id 字段。
data.started_at extensions.vulns.vulnerabilities.scan_start_time 该值会从 ISO8601 格式转换为时间戳。
data.team target.user.group_identifiers 该值取自 data.team 字段。
data.trigger_id security_result.about.labels.value 该值取自 data.trigger_id 字段。
data.workflow_id security_result.about.labels.value 该值取自 data.workflow_id 字段。
data.workflow_run_id security_result.about.labels.value 该值取自 data.workflow_run_id 字段。
enterprise.name additional.fields.value.string_value 该值取自 enterprise.name 字段。
external_identity_nameid target.user.email_addresses 如果该值为电子邮件地址,则会将其添加到 target.user.email_addresses 数组中。
external_identity_nameid target.user.userid 该值取自 external_identity_nameid 字段。
external_identity_username target.user.user_display_name 该值取自 external_identity_username 字段。
hashed_token network.session_id 该值取自 hashed_token 字段。
job_name target.resource.attribute.labels.value 该值取自 job_name 字段。
job_workflow_ref target.resource.attribute.labels.value 该值取自 job_workflow_ref 字段。
org target.administrative_domain 该值取自 org 字段。
org_id additional.fields.value.string_value 该值取自 org_id 字段。
programmatic_access_type additional.fields.value.string_value 该值取自 programmatic_access_type 字段。
public_repo additional.fields.value.string_value 该值取自 public_repo 字段。
public_repo target.location.name 如果值为“false”,则映射到“PRIVATE”。否则,它会映射到“PUBLIC”。
query_string additional.fields.value.string_value 该值取自 query_string 字段。
rate_limit_remaining additional.fields.value.string_value 该值取自 rate_limit_remaining 字段。
repo target.resource.name 该值取自 repo 字段。
repo_id additional.fields.value.string_value 该值取自 repo_id 字段。
repository_public additional.fields.value.string_value 该值取自 repository_public 字段。
request_body additional.fields.value.string_value 该值取自 request_body 字段。
request_method network.http.method 值会转换为大写。
route additional.fields.value.string_value 该值取自 route 字段。
status_code network.http.response_code 该值会转换为整数。
timestamp metadata.event_timestamp 该值从 UNIX 毫秒转换为时间戳。
token_id additional.fields.value.string_value 该值取自 token_id 字段。
token_scopes additional.fields.value.string_value 该值取自 token_scopes 字段。
transport_protocol_name network.application_protocol 值会转换为大写。
url_path target.url 该值取自 url_path 字段。
user target.user.user_display_name 该值取自 user 字段。
user_agent network.http.user_agent 该值取自 user_agent 字段。
user_agent network.http.parsed_user_agent 系统会解析该值。
user_id target.user.userid 该值取自 user_id 字段。
workflow.name security_result.about.labels.value 该值取自 workflow.name 字段。
workflow_run.actor.login principal.user.userid 该值取自 workflow_run.actor.login 字段。
workflow_run.event additional.fields.value.string_value 该值取自 workflow_run.event 字段。
workflow_run.head_branch security_result.about.labels.value 该值取自 workflow_run.head_branch 字段。
workflow_run.head_sha target.file.sha256 该值取自 workflow_run.head_sha 字段。
workflow_run.id target.resource.attribute.labels.value 该值取自 workflow_run.id 字段。
workflow_run.workflow_id security_result.about.labels.value 该值取自 workflow_run.workflow_id 字段。
不适用 metadata.event_type 该值根据 actionactor 字段确定。如果 action 字段包含“_member”,则将值设置为“USER_RESOURCE_UPDATE_PERMISSIONS”。如果 action 字段和 actor 字段均不为空,则该值设置为“USER_RESOURCE_UPDATE_CONTENT”。否则,该值设置为“USER_RESOURCE_ACCESS”。
不适用 metadata.log_type 该值设置为“GITHUB”。
不适用 metadata.product_name 该值设置为“GITHUB”。
不适用 metadata.vendor_name 该值设置为“GITHUB”。
不适用 target.resource.resource_type 该值设置为“STORAGE_OBJECT”。
不适用 security_result.about.labels.key 该值会根据相应的 data 字段设置为一个常量字符串。例如,对于 data.workflow_id,键设置为“工作流 ID”。
不适用 target.resource.attribute.labels.key 该值会根据相应的 data 字段设置为一个常量字符串。例如,对于 data.hook_id,键设置为“Hook Id”。

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