收集 GitLab 記錄
剖析器版本:9.0
支援的國家/地區:
Google SecOps
SIEM
這個剖析器會從 GitLab JSON 記錄檔中擷取欄位,將這些欄位正規化為 Unified Data Model (UDM),並使用額外內容擴充資料。這項服務會處理各種 GitLab 事件類型,著重於使用者動作、資源存取權和安全性結果,同時也會處理網路和應用程式相關資訊。剖析器也會根據 GitLab 中的角色和動作執行邏輯,將事件分類並指派適當的嚴重性。
事前準備
請確認您已完成下列事前準備事項:
- Google SecOps 執行個體。
- GitLab 的特殊存取權。
設定動態饋給
如要設定動態消息,請按照下列步驟操作:
- 依序前往「SIEM 設定」>「動態饋給」。
- 按一下「新增動態饋給」。
- 在下一個頁面中,按一下「設定單一動態饋給」。
- 在「Feed name」(動態消息名稱) 欄位中,輸入動態消息的名稱 (例如「GitLab Logs」)。
- 選取「Webhook」做為「來源類型」。
- 選取「Gitlab」做為「記錄類型」。
- 點選「下一步」。
- 選用:指定下列輸入參數的值:
- 分割分隔符號:用於分隔記錄行的分隔符號,例如
\n。 - 資產命名空間:資產命名空間。
- 擷取標籤:套用至這個動態饋給事件的標籤。
- 分割分隔符號:用於分隔記錄行的分隔符號,例如
- 點選「下一步」。
- 在「Finalize」畫面中檢查動態饋給設定,然後按一下「Submit」。
- 按一下「產生密鑰」,產生用於驗證這個動態饋給的密鑰。
- 複製並儲存密鑰。您無法再次查看這組密鑰。如有需要,您可以重新產生新的密鑰,但這項操作會使先前的密鑰失效。
- 在「詳細資料」分頁中,複製「端點資訊」欄位中的動態消息端點網址。您必須在用戶端應用程式中指定這個端點網址。
- 按一下「完成」。
為 Webhook 動態饋給建立 API 金鑰
前往 Google Cloud 控制台 > 憑證。
按一下 [Create credentials] (建立憑證),然後選取 [API key] (API 金鑰)。
將 API 金鑰存取權限制為 Chronicle API。
指定端點網址
- 在用戶端應用程式中,指定 Webhook 動態饋給提供的 HTTPS 端點網址。
如要啟用驗證,請在自訂標頭中指定 API 金鑰和密鑰,格式如下:
X-goog-api-key = API_KEY X-Webhook-Access-Key = SECRET建議:請將 API 金鑰指定為標頭,而非網址。如果 Webhook 用戶端不支援自訂標頭,您可以使用下列格式的查詢參數指定 API 金鑰和密鑰:
ENDPOINT_URL?key=API_KEY&secret=SECRET
更改下列內容:
ENDPOINT_URL:動態饋給端點網址。API_KEY:用於向 Google Security Operations 進行驗證的 API 金鑰。SECRET:您產生的密鑰,用於驗證動態饋給。
在 GitLab 中設定 Google SecOps 的 Webhook
- 開啟網路瀏覽器,然後前往要設定 Webhook 的 GitLab 專案。
- 在專案中,依序前往「設定」>「Webhook」。
- 按一下「新增 Webhook」。
- 在「URL」欄位中,貼上 Google SecOps 端點網址。
- 按一下「新增自訂標頭」。
- 在「Header Name」欄位中輸入 X-Webhook-Access-Key。
- 在「Header Value」欄位,複製設定 Google SecOps 資訊提供時產生的 Secret Key。
- 按一下「新增自訂標頭」。
- 在「Header Name」欄位中輸入 X-goog-api-key。
- 在「Header Value」(標頭值) 欄位中,複製在設定 Google SecOps 動態饋給時產生的 API 金鑰。 注意:為提升安全性,請產生密鑰權杖,並將其新增至 GitLab 網頁掛鉤設定和對應的 Google SecOps 資訊提供設定。這有助於驗證傳入 Webhook 的真偽。
- 選擇應觸發 Webhook 的 GitLab 事件。舉例來說,您可以選取「推送事件」,在每次將程式碼推送至存放區時,將資料傳送至 Google SecOps。請仔細考量哪些事件與您的安全監控需求相關。事件過多可能會導致不必要的負載。
- 為 Webhook 取個有意義的名稱,例如 Google SecOps Webhook,以便清楚瞭解其用途。
- 確認已勾選「Enable SSL verification」核取方塊。這對安全通訊至關重要。
- 按一下「新增 Webhook」儲存設定。
UDM 對應表
| 記錄欄位 | UDM 對應 | 邏輯 |
|---|---|---|
author_id |
principal.user.userid |
已轉換為字串。 |
author_name |
principal.user.email_addresses |
值與電子郵件地址規則運算式相符。 |
author_name |
principal.user.user_display_name |
如果值不符合電子郵件地址規則運算式。 |
details.as |
principal.resource.attribute.labels |
以「as」鍵新增為標籤。 |
details.add |
principal.resource.attribute.labels |
新增為標籤,鍵為「add」。 |
details.as |
principal.user.role_name |
原始記錄欄位值。 |
details.as |
principal.user.attribute.roles.type |
如果 details.as 為「擁有者」,請設為「ADMINISTRATOR」;如果 details.as 為「開發人員」、「維護人員」或「報表產生者」,請設為「SERVICE_ACCOUNT」;如果 details.as 為「訪客」,請設為「TYPE_UNSPECIFIED」。 |
details.custom_message |
security_result.description |
原始記錄欄位值。 |
details.custom_message.action |
security_result.summary |
原始記錄欄位值。 |
details.entity_path |
target.file.full_path |
原始記錄欄位值。 |
details.target_id |
target.resource.id |
已轉換為字串。 |
entity_path |
target.file.full_path |
原始記錄欄位值。 |
entity_type |
target.resource.attribute.labels |
新增為標籤,鍵為「Entity Type」。 |
event_type |
metadata.product_event_type |
原始記錄欄位值。 |
insertId |
metadata.product_log_id |
原始記錄欄位值。 |
ip_address |
principal.ip、principal.asset.ip |
原始記錄欄位值。 |
jsonPayload.action |
additional.fields |
新增為欄位,鍵為「action」,值為字串。 |
jsonPayload.controller |
additional.fields |
以「controller」鍵和字串值新增為欄位。 |
jsonPayload.correlation_id |
principal.asset_id |
開頭為「id: 」。 |
jsonPayload.cpu_s |
additional.fields |
以「cpu_s」鍵和字串值新增為欄位。 |
jsonPayload.details.custom_message.protocol |
network.application_protocol |
如果值為「web」,則設為「UNKNOWN_APPLICATION_PROTOCOL」,否則會轉換為大寫。如果值為「web」,也會以「Application Protocol」鍵新增為額外欄位。 |
jsonPayload.mem_total_bytes |
additional.fields |
新增為欄位,鍵為「mem_total_bytes」,值為字串。 |
jsonPayload.meta_caller_id |
additional.fields |
以「Caller Id」為鍵,並以字串值新增為欄位。 |
jsonPayload.meta_client_id |
target.user.userid |
原始記錄欄位值。 |
jsonPayload.meta_feature_category |
additional.fields |
新增為欄位,鍵為「Feature Category」,值為字串。 |
jsonPayload.meta_remote_ip |
principal.ip、principal.asset.ip |
原始記錄欄位值,會剖析為 JSON 陣列並合併至 IP 欄位。 |
jsonPayload.meta_user |
principal.user.userid |
如果 jsonPayload.username 為空,系統會使用這個屬性做為備用值。 |
jsonPayload.method |
network.http.method |
原始記錄欄位值。 |
jsonPayload.path |
target.process.file.full_path |
原始記錄欄位值。 |
jsonPayload.pid |
target.process.pid |
已轉換為字串。 |
jsonPayload.remote_ip |
principal.ip、principal.asset.ip |
原始記錄欄位值。 |
jsonPayload.request_urgency |
additional.fields |
以「Request Urgency」鍵和字串值新增為欄位。 |
jsonPayload.severity |
security_result.severity |
如果值為「INFO」,請設為「INFORMATIONAL」;如果值為「ERROR」,請設為「ERROR」;如果值為「NOTICE」,請設為「MEDIUM」。 |
jsonPayload.status |
network.http.response_code |
如果不是「ACTIVE」,則會轉換為整數。 |
jsonPayload.ua |
network.http.user_agent |
原始記錄欄位值。 |
jsonPayload.username |
principal.user.userid |
原始記錄欄位值。 |
jsonPayload.worker_id |
principal.application |
原始記錄欄位值。 |
labels.instance_name |
principal.hostname、principal.asset.hostname |
原始記錄欄位值,如果訊息包含「Removing user」,就會使用這個值。 |
logName |
security_result.category_details |
原始記錄欄位值。 |
message |
security_result.summary |
原始記錄欄位值,如果 jsonPayload.severity 為「ERROR」,則會使用這個值。 |
protoPayload.@type |
additional.fields |
以鍵為「protoPayload type」和字串值的欄位形式新增。 |
protoPayload.authenticationInfo.principalEmail |
principal.user.email_addresses、principal.user.userid |
原始記錄欄位值。 |
protoPayload.authenticationInfo.principalSubject |
additional.fields |
新增為鍵為「authenticationInfo principalSubject」的欄位,並設有字串值。 |
protoPayload.authenticationInfo.serviceAccountKeyName |
additional.fields |
新增為欄位,鍵為「authenticationInfo serviceAccountKeyName」,值為字串。 |
protoPayload.authorizationInfo |
target.resource.attribute.labels、security_result.action |
這個欄位中的值會新增為標籤,且鍵的前置字串為「authenticationInfo」。如果 granted 中的值為 true,security_result.action 會設為「ALLOW」;如果為 false,則會設為「BLOCK」。此外,系統也會將 resourceAttributes 等巢狀欄位新增為標籤,並以「authenticationInfo_resourceAttributes」做為鍵的前置字串。 |
protoPayload.methodName |
additional.fields |
新增為欄位,鍵為「protoPayload methodName」,值為字串。 |
protoPayload.request.@type |
additional.fields |
以「Request Type」鍵和字串值新增為欄位。 |
protoPayload.request.resource |
target.resource.attribute.labels |
以「要求資源」為鍵新增為標籤。 |
protoPayload.requestMetadata.callerIp |
additional.fields |
以「requestMetadata callerIp」做為鍵,並以字串值做為欄位新增。 |
protoPayload.requestMetadata.callerSuppliedUserAgent |
additional.fields |
新增為欄位,鍵為「requestMetadata callerSuppliedUserAgent」,值為字串。 |
protoPayload.serviceName |
additional.fields |
以鍵「serviceName」和字串值新增為欄位。 |
protoPayload.status.code |
additional.fields |
以鍵為「protoPayload status code」的欄位新增,並設為字串值。 |
protoPayload.status.message |
additional.fields、target.user.email_addresses、target.user.userid |
以鍵「protoPayload status message」和字串值新增為欄位。如果系統能從郵件中擷取電子郵件地址,就會將該地址新增至 target.user.email_addresses 和 target.user.userid。 |
receiveTimestamp |
metadata.event_timestamp、timestamp |
系統會將此值剖析為事件時間戳記。 |
resource.labels.project_id |
target.resource.attribute.labels |
以「專案 ID」鍵新增為標籤。 |
resource.labels.zone |
target.cloud.availability_zone |
原始記錄欄位值。 |
resource.type |
target.cloud.environment |
如果值符合「gce」,請設為「GOOGLE_CLOUD_PLATFORM」。 |
security_result.action |
security_result.action |
衍生自 protoPayload.authorizationInfo.granted。 |
security_result.category_details |
security_result.category_details |
已與「logName」合併。 |
security_result.description |
security_result.description |
衍生自 jsonPayload.details.custom_message。 |
security_result.severity |
security_result.severity |
衍生自 severity 或 jsonPayload.severity。 |
security_result.summary |
security_result.summary |
衍生自 jsonPayload.details.custom_message.action 或 jsonPayload.message。 |
severity |
security_result.severity |
如果值為「INFO」,請設為「INFORMATIONAL」;如果值為「ERROR」,請設為「ERROR」;如果值為「NOTICE」,請設為「MEDIUM」。 |
sourceLocation |
principal.resource.attribute.labels |
這個欄位中的值會新增為標籤。 |
target_details |
target.resource.attribute.labels |
以「目標詳細資料」鍵新增為標籤。 |
target_type |
target.resource.attribute.labels |
新增為標籤,鍵為「target type」。 |
timestamp |
timestamp |
原始記錄欄位值。根據主體和目標欄位是否存在來設定。如未符合任何特定條件,預設為「GENERIC_EVENT」。可能的值為「USER_RESOURCE_UPDATE_CONTENT」、「USER_RESOURCE_ACCESS」、「USER_UNCATEGORIZED」。設為「GITLAB」。設為「GITLAB」。 |
變更記錄
還有其他問題嗎?向社群成員和 Google SecOps 專家尋求解答。