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 的必要條件 (企業存取權)

  1. 登入 GitHub Enterprise Cloud 管理控制台
  2. 依序前往「企業設定」「設定」「稽核記錄」「記錄串流」
  3. 請確認您具備企業擁有者權限,可設定稽核記錄串流。
  4. 複製下列詳細資料並儲存於安全位置:
    • GitHub Enterprise 名稱
    • 企業底下的機構名稱

為 Google SecOps 設定 AWS S3 值區和身分與存取權管理

  1. 按照本使用指南建立 Amazon S3 值區建立值區
  2. 儲存 bucket 的「名稱」和「區域」,以供日後參考 (例如 github-audit-logs)。
  3. 請按照這份使用者指南建立使用者建立 IAM 使用者
  4. 選取建立的「使用者」
  5. 選取「安全憑證」分頁標籤。
  6. 在「Access Keys」部分中,按一下「Create Access Key」
  7. 選取「第三方服務」做為「用途」
  8. 點選「下一步」
  9. 選用:新增說明標記。
  10. 按一下「建立存取金鑰」
  11. 按一下「下載 .CSV 檔案」,儲存「存取金鑰」和「私密存取金鑰」以供日後參考。
  12. 按一下 [完成]

設定 GitHub S3 串流的 IAM 政策

  1. 在 AWS 控制台中,依序前往「IAM」>「Policies」>「Create policy」>「JSON」分頁標籤
  2. 複製並貼上下列政策。
  3. 政策 JSON (如果您輸入的 bucket 名稱不同,請替換 github-audit-logs):

    {
    "Version": "2012-10-17",
    "Statement": [
        {
        "Sid": "AllowPutObjects",
        "Effect": "Allow",
        "Action": "s3:PutObject",
        "Resource": "arn:aws:s3:::github-audit-logs/*"
        }
    ]
    }
    
  4. 依序點選「Next」>「Create policy」

  5. 為政策命名 GitHubAuditStreamingPolicy,然後按一下「建立政策」

  6. 返回先前建立的 IAM 使用者。

  7. 選取 [權限] 分頁標籤。

  8. 依序點選「新增權限」>「直接附加政策」

  9. 搜尋並選取 GitHubAuditStreamingPolicy

  10. 依序點選「下一步」>「新增權限」。

設定 GitHub Enterprise Cloud 稽核記錄串流

  1. 以企業主身分登入 GitHub Enterprise Cloud
  2. 按一下個人資料相片,然後按一下「企業版設定」
  3. 在企業帳戶側欄中,依序按一下「設定」>「稽核記錄」>「記錄串流」
  4. 選取「設定串流」,然後按一下「Amazon S3」。
  5. 在「驗證」之下點選「存取金鑰」。
  6. 提供下列設定詳細資料:
    • 區域:選取 bucket 的區域 (例如 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. 附加最低讀取權限政策 (自訂):依序選取「Users」>「secops-reader」>「Permissions」>「Add permissions」>「Attach policies directly」>「Create policy」
  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. Name = secops-reader-policy

  8. 依序點選「建立政策」> 搜尋/選取 >「下一步」>「新增權限」

  9. secops-reader 建立存取金鑰:依序點選「安全憑證」>「存取金鑰」>「建立存取金鑰」> 下載 .CSV (您會將這些值貼到動態饋給中)。

在 Google SecOps 中設定資訊提供,以便擷取 GitHub 記錄

  1. 依序前往「SIEM 設定」>「動態饋給」
  2. 按一下「+ 新增動態消息」
  3. 在「動態饋給名稱」欄位中輸入動態饋給名稱 (例如 GitHub audit logs)。
  4. 選取「Amazon S3 V2」做為「來源類型」
  5. 選取「GitHub」做為「記錄類型」
  6. 點選「下一步」
  7. 指定下列輸入參數的值:
    • S3 URIs3://github-audit-logs/
    • 來源刪除選項:根據偏好設定選取刪除選項。
    • 檔案存在時間上限:包含在過去天數內修改的檔案。預設值為 180 天。
    • 存取金鑰 ID:具有 S3 值區存取權的使用者存取金鑰。
    • 存取密鑰:具有 S3 bucket 存取權的使用者私密金鑰。
    • 資產命名空間資產命名空間
    • 擷取標籤:套用至這個動態饋給事件的標籤。
  8. 點選「下一步」
  9. 在「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 系統會根據 actionactor 欄位的值判斷。如果 action 欄位包含「_member」,值會設為「USER_RESOURCE_UPDATE_PERMISSIONS」。如果 actionactor 欄位都不為空白,值會設為「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 專業人員尋求答案。