GITHUB
支持的语言:
Google SecOps
SIEM
本文档介绍了如何使用 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 前提条件(企业访问权限)
- 登录 GitHub Enterprise Cloud 管理控制台。
- 依次前往企业设置 > 设置 > 审核日志 > 日志流式传输。
- 确保您拥有企业所有者权限,可以配置审核日志流式传输。
- 复制以下详细信息并将其保存在安全的位置:
- GitHub Enterprise 名称
- 企业下的组织名称
为 Google SecOps 配置 AWS S3 存储桶和 Identity and Access Management
- 按照以下用户指南创建 Amazon S3 存储桶:创建存储桶
- 保存存储桶名称和区域以供日后参考(例如
github-audit-logs
)。 - 按照以下用户指南创建用户:创建 IAM 用户。
- 选择创建的用户。
- 选择安全凭据标签页。
- 在访问密钥部分中,点击创建访问密钥。
- 选择第三方服务作为使用情形。
- 点击下一步。
- 可选:添加说明标记。
- 点击创建访问密钥。
- 点击下载 .CSV 文件,保存访问密钥和秘密访问密钥,以供日后参考。
- 点击完成。
为 GitHub S3 流式传输配置 IAM 政策
- 在 AWS 控制台中,依次前往 IAM > 政策 > 创建政策 > JSON 标签页。
- 复制并粘贴以下政策。
政策 JSON(如果您输入了其他存储桶名称,请替换
github-audit-logs
):{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutObjects", "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::github-audit-logs/*" } ] }
依次点击下一步 > 创建政策。
为政策命名
GitHubAuditStreamingPolicy
,然后点击创建政策。返回到之前创建的 IAM 用户。
选择权限标签页。
依次点击添加权限 > 直接附加政策。
搜索并选择
GitHubAuditStreamingPolicy
。依次点击下一步 > 添加权限。
配置 GitHub Enterprise Cloud 审核日志流式传输
- 以企业所有者的身份登录 GitHub Enterprise Cloud。
- 点击您的个人资料照片,然后点击企业设置。
- 在企业账号边栏中,依次点击设置 > 审核日志 > 日志流式传输。
- 选择配置信息流,然后点击 Amazon S3。
- 在身份验证下,点击访问密钥。
- 提供以下配置详细信息:
- 区域:选择相应存储桶的区域(例如
us-east-1
)。 - 存储桶:输入要将数据流式传输到的存储桶的名称(例如
github-audit-logs
)。 - 访问密钥 ID:输入 IAM 用户的访问密钥 ID。
- Secret Key(密钥):输入 IAM 用户的密钥。
- 区域:选择相应存储桶的区域(例如
- 点击检查端点,验证 GitHub 是否可以连接到 Amazon S3 端点并向其写入数据。
- 成功验证端点后,点击保存。
为 Google SecOps 创建只读 IAM 用户和密钥
- 依次前往 AWS 控制台 > IAM > 用户 > 添加用户。
- 点击 Add users(添加用户)。
- 提供以下配置详细信息:
- 用户:输入
secops-reader
。 - 访问类型:选择访问密钥 - 以程序化方式访问。
- 用户:输入
- 点击创建用户。
- 附加最低限度的读取政策(自定义):依次点击用户 > secops-reader > 权限 > 添加权限 > 直接附加政策 > 创建政策。
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" } ] }
名称 =
secops-reader-policy
。依次点击创建政策 > 搜索/选择 > 下一步 > 添加权限。
为
secops-reader
创建访问密钥:安全凭据 > 访问密钥 > 创建访问密钥 > 下载.CSV
(您需要将这些值粘贴到 Feed 中)。
在 Google SecOps 中配置 Feed 以注入 GitHub 日志
- 依次前往 SIEM 设置> Feed。
- 点击 + 添加新 Feed。
- 在Feed 名称字段中,输入 Feed 的名称(例如
GitHub audit logs
)。 - 选择 Amazon S3 V2 作为来源类型。
- 选择 GitHub 作为日志类型。
- 点击下一步。
- 为以下输入参数指定值:
- S3 URI:
s3://github-audit-logs/
- 来源删除选项:根据您的偏好设置选择删除选项。
- 文件存在时间上限:包含在过去指定天数内修改的文件。默认值为 180 天。
- 访问密钥 ID:有权访问 S3 存储桶的用户访问密钥。
- 私有访问密钥:具有 S3 存储桶访问权限的用户私有密钥。
- 资源命名空间:资源命名空间。
- 注入标签:应用于此 Feed 中事件的标签。
- S3 URI:
- 点击下一步。
- 在最终确定界面中查看新的 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 |
该值根据 action 和 actor 字段确定。如果 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 专业人士那里获得解答。