GITHUB
本文說明如何使用 Amazon S3,將 GitHub 稽核記錄擷取至 Google Security Operations。剖析器會嘗試使用各種 Grok 模式,從「message」欄位擷取資料,並處理 JSON 和非 JSON 格式。根據擷取的「process_type」,使用 grok、kv 和其他篩選器套用特定剖析邏輯,將原始記錄資料對應至 Unified Data Model (UDM) 結構定義。
事前準備
請確認您已完成下列事前準備事項:
- Google SecOps 執行個體。
- 具有企業主權限的 GitHub Enterprise Cloud 租戶特殊存取權。
- AWS (S3、IAM) 的特殊權限存取權。
收集 GitHub Enterprise Cloud 的必要條件 (企業存取權)
- 登入 GitHub Enterprise Cloud 管理控制台。
- 依序前往「企業設定」「設定」「稽核記錄」「記錄串流」。
- 請確認您具備企業擁有者權限,可設定稽核記錄串流。
- 複製下列詳細資料並儲存於安全位置:
- GitHub Enterprise 名稱
- 企業底下的機構名稱
為 Google SecOps 設定 AWS S3 值區和身分與存取權管理
- 按照本使用指南建立 Amazon S3 值區:建立值區
- 儲存 bucket 的「名稱」和「區域」,以供日後參考 (例如
github-audit-logs
)。 - 請按照這份使用者指南建立使用者:建立 IAM 使用者。
- 選取建立的「使用者」。
- 選取「安全憑證」分頁標籤。
- 在「Access Keys」部分中,按一下「Create Access Key」。
- 選取「第三方服務」做為「用途」。
- 點選「下一步」。
- 選用:新增說明標記。
- 按一下「建立存取金鑰」。
- 按一下「下載 .CSV 檔案」,儲存「存取金鑰」和「私密存取金鑰」以供日後參考。
- 按一下 [完成]。
設定 GitHub S3 串流的 IAM 政策
- 在 AWS 控制台中,依序前往「IAM」>「Policies」>「Create policy」>「JSON」分頁標籤。
- 複製並貼上下列政策。
政策 JSON (如果您輸入的 bucket 名稱不同,請替換
github-audit-logs
):{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutObjects", "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::github-audit-logs/*" } ] }
依序點選「Next」>「Create policy」。
為政策命名
GitHubAuditStreamingPolicy
,然後按一下「建立政策」。返回先前建立的 IAM 使用者。
選取 [權限] 分頁標籤。
依序點選「新增權限」>「直接附加政策」。
搜尋並選取
GitHubAuditStreamingPolicy
。依序點選「下一步」>「新增權限」。
設定 GitHub Enterprise Cloud 稽核記錄串流
- 以企業主身分登入 GitHub Enterprise Cloud。
- 按一下個人資料相片,然後按一下「企業版設定」。
- 在企業帳戶側欄中,依序按一下「設定」>「稽核記錄」>「記錄串流」。
- 選取「設定串流」,然後按一下「Amazon S3」。
- 在「驗證」之下點選「存取金鑰」。
- 提供下列設定詳細資料:
- 區域:選取 bucket 的區域 (例如
us-east-1
)。 - 值區:輸入要串流至的值區名稱 (例如
github-audit-logs
)。 - 存取金鑰 ID:輸入 IAM 使用者的存取金鑰 ID。
- Secret Key (密鑰):輸入 IAM 使用者的密鑰。
- 區域:選取 bucket 的區域 (例如
- 按一下「檢查端點」,確認 GitHub 可以連線至 Amazon S3 端點並寫入資料。
- 成功驗證端點後,請按一下「儲存」。
為 Google SecOps 建立唯讀 IAM 使用者和金鑰
- 依序前往 AWS 管理中心 > IAM > 使用者 > 新增使用者。
- 點選 [Add users] (新增使用者)。
- 提供下列設定詳細資料:
- 使用者:輸入
secops-reader
。 - 存取類型:選取「存取金鑰 - 程式輔助存取」。
- 使用者:輸入
- 按一下「建立使用者」。
- 附加最低讀取權限政策 (自訂):依序選取「Users」>「secops-reader」>「Permissions」>「Add permissions」>「Attach policies directly」>「Create policy」。
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" } ] }
Name =
secops-reader-policy
。依序點選「建立政策」> 搜尋/選取 >「下一步」>「新增權限」。
為
secops-reader
建立存取金鑰:依序點選「安全憑證」>「存取金鑰」>「建立存取金鑰」> 下載.CSV
(您會將這些值貼到動態饋給中)。
在 Google SecOps 中設定資訊提供,以便擷取 GitHub 記錄
- 依序前往「SIEM 設定」>「動態饋給」。
- 按一下「+ 新增動態消息」。
- 在「動態饋給名稱」欄位中輸入動態饋給名稱 (例如
GitHub audit logs
)。 - 選取「Amazon S3 V2」做為「來源類型」。
- 選取「GitHub」做為「記錄類型」。
- 點選「下一步」。
- 指定下列輸入參數的值:
- S3 URI:
s3://github-audit-logs/
- 來源刪除選項:根據偏好設定選取刪除選項。
- 檔案存在時間上限:包含在過去天數內修改的檔案。預設值為 180 天。
- 存取金鑰 ID:具有 S3 值區存取權的使用者存取金鑰。
- 存取密鑰:具有 S3 bucket 存取權的使用者私密金鑰。
- 資產命名空間:資產命名空間。
- 擷取標籤:套用至這個動態饋給事件的標籤。
- S3 URI:
- 點選「下一步」。
- 在「Finalize」畫面上檢查新的動態饋給設定,然後按一下「Submit」。
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 專業人員尋求答案。