整合 Pub/Sub 與 Google SecOps

本文說明如何將 Pub/Sub 與 Google Security Operations 整合。

用途

Pub/Sub 整合功能支援下列用途:

  • 自動擷取快訊:持續擷取發布至 Pub/Sub 主題的安全性記錄、快訊和遙測資料,並以案件形式擷取至 Google SecOps。

  • 集中式安全性調度管理:透過 Pub/Sub 整合雲端和第三方系統的安全性事件轉送作業,觸發自動化應變手冊。

事前準備

在 Google SecOps 中設定 Pub/Sub 整合前,請先完成下列必要步驟:

  1. 建立服務帳戶。

  2. 將必要的 Identity and Access Management 角色授予服務帳戶。

  3. 選擇並設定下列其中一種驗證方式:

    • 方法 1:Workload Identity (建議):這個方法會使用服務帳戶模擬功能,產生短期權杖。

    • 方法 2:服務帳戶 JSON 金鑰:這個方法會使用靜態、長期有效的密鑰檔案。

建立服務帳戶

  1. 在 Google Cloud 控制台,依序前往 「IAM & Admin」(IAM 與管理) >「Service Accounts」(服務帳戶)。

    前往「Service Accounts」(服務帳戶)

  2. 按一下「add」「Create service account」(建立服務帳戶)。

  3. 輸入名稱和說明,然後按一下「完成」。記下服務帳戶的電子郵件地址。

授予 IAM 角色

授予權限後,整合功能就能查看及提取訂閱項目的訊息。如要指派標準角色,請完成下列步驟:

  1. 前往 Google Cloud 控制台的「IAM」。

    前往「IAM」(身分與存取權管理) 頁面

  2. 找出服務帳戶,然後按一下「Edit principal」(編輯主體) (編輯)。

  3. 按一下「Add another role」(新增其他角色),然後選取「Pub/Sub Viewer」(Pub/Sub 檢視者) (roles/pubsub.viewer)。

  4. 按一下 [儲存]。

設定 Workload Identity 憑證

建議您使用 Workload Identity,因為這項功能會透過服務帳戶模擬,使用短期存取權杖。

找出專屬執行個體身分

建立連線時,必須授予 Google SecOps 執行個體權限,才能模擬服務帳戶。

  1. 在 Google SecOps 中,依序前往 「Content Hub」 >「Response Integrations」。

  2. 選取「Pub/Sub」整合,然後在「Workload Identity Email」(Workload Identity 電子郵件) 中輸入服務帳戶電子郵件。

  3. 依序點選「儲存」 > 「測試」。測試預計會失敗。

  4. 按一下「Test」(測試) 按鈕旁的 close_small,然後找出開頭為 gke-init-python@... 或 soar-python@... 的身分電子郵件。

  5. 複製這個專屬電子郵件地址。

在 Google Cloud中授權執行個體身分

  1. 在 Google Cloud 控制台,依序前往 「IAM & Admin」(IAM 與管理) >「Service Accounts」(服務帳戶)。

    前往「Service Accounts」(服務帳戶)

  2. 選取目標服務帳戶,然後依序前往 「Permissions」(權限) >「Grant Access」(授予存取權)。

  3. 將不重複的電子郵件地址貼到「新增主體」,並指派「服務帳戶權杖建立者」角色 (roles/iam.serviceAccountTokenCreator)。

授予配額專案存取權

使用 Workload Identity 驗證時,必須提供 Quota Project ID,才能追蹤 API 使用情形和帳單。

  1. 在 Google Cloud 控制台中,前往做為配額專案的專案「IAM」。

    前往「IAM」(身分與存取權管理) 頁面

  2. 找到服務帳戶,然後按一下「Edit principal」(編輯主體) (編輯)。

  3. 按一下「Add another role」(新增其他角色),然後選取「Service Usage Consumer」(服務使用情形消費者) (roles/serviceusage.serviceUsageConsumer)。

  4. 按一下 [儲存]。

設定 JSON 金鑰

靜態、長期有效的密鑰檔案需要手動輪替。只有在無法使用 Workload Identity 驗證時,才應採用這個方法。

  1. 在 Google Cloud 控制台中,依序前往 「IAM & Admin」(IAM 與管理) >「Service Accounts」(服務帳戶),然後選取 服務帳戶。

    前往「Service Accounts」(服務帳戶)

  2. 前往「金鑰」分頁,依序點選「新增金鑰」 > 「建立新的金鑰」。

  3. 選取「JSON」,然後點選「建立」。瀏覽器會將 JSON 檔案下載到您的電腦。

整合參數

Pub/Sub 整合需要下列參數:

參數 說明
Workload Identity Email

選填。

服務帳戶的用戶端電子郵件地址。

只有在使用 Workload Identity 進行驗證時,才需要設定這個參數。如果設定這項屬性,則必須一併提供 Quota Project ID,系統會忽略 Service Account JSON File Content。

Service Account JSON File Content

選填。

服務帳戶金鑰 JSON 檔案的完整內容。

設定這個參數,即可使用服務帳戶金鑰驗證。

Quota Project ID

選填。

用於 API 使用和計費的專案 ID。

使用 Workload Identity 驗證時,必須提供這個參數。

如未提供任何值,整合作業會從服務帳戶憑證擷取 ID。

Project ID

選填。

Pub/Sub 中的目標專案 ID。

如未提供任何值,整合作業會從服務帳戶憑證擷取 ID。

Verify SSL

這是必填欄位。

驗證與伺服器連線的 SSL 憑證。(預設為啟用)。

如要瞭解如何在 Google SecOps 中設定整合功能,請參閱「設定整合功能」。

如有需要,您可以在後續階段進行變更。設定整合執行個體後,即可在應對手冊中使用。如要進一步瞭解如何設定及支援多個執行個體,請參閱「支援多個執行個體」。

動作

如要進一步瞭解動作,請參閱「 在工作區回應待處理動作」和「在案件中執行手動動作」。

乒乓

使用「連線偵測 (Ping)」動作,測試與 Pub/Sub 的連線。

這項動作不會在 Google SecOps 實體上執行。

動作輸入內容

無

動作輸出內容

Ping 動作會提供下列輸出內容:

動作輸出類型 可用性
案件總覽附件 無法使用
案件總覽連結 無法使用
案件總覽表格 無法使用
補充資訊表格 無法使用
JSON 結果 無法使用
輸出訊息 可用
指令碼執行結果 可用
輸出訊息

Ping 動作可能會傳回下列輸出訊息:

輸出訊息 訊息說明
Successfully connected to the Pub/Sub server with the provided connection parameters! 動作成功。
Failed to connect to the Pub/Sub server! Error is ERROR_REASON

動作失敗。

請檢查伺服器連線、輸入參數或憑證。

指令碼執行結果

下表列出使用 Ping 動作時,指令碼結果輸出的值:

指令碼結果名稱 值
is_success True或False

連接器

如要進一步瞭解如何在 Google SecOps 中設定連接器,請參閱「擷取資料 (連接器)」。

Pub/Sub - 訊息連接器

在 Google SecOps 平台中,Pub/Sub – Messages Connector 稱為 PubSub – Messages Connector。

使用 Pub/Sub - Messages 連接器,從 Pub/Sub 擷取訊息。

JSON 嚴重性對應

如要對應警告嚴重性,您必須指定 Pub/Sub - 訊息連接器使用哪個欄位,在 Severity Mapping JSON 參數中取得嚴重性值。連接器回應可包含值類型,例如 integer、float 和 string。

Pub/Sub – Messages 連接器會讀取 integer 和 float 值,並根據 Google SecOps 設定進行對應。下表列出 integer 值與 Google SecOps 嚴重程度的對應關係:

整數值 對應的嚴重性
100 Critical
自 80 至 100 High
自 60 至 80 Medium
自 40 至 60 Low
小於 40 Informational

如果回應包含 string 值,則必須額外設定 Pub/Sub - 訊息連接器。

一開始,預設值會顯示如下:

{
    "Default": 60
}

如果對應所需的值位於 event_severity JSON 鍵中,則值可能如下:

  • "Malicious"
  • "Benign"
  • "Unknown"

如要剖析 event_severity JSON 鍵值,並確保 JSON 物件格式正確,請按照下列方式設定 Severity Mapping JSON 參數:

{
    "event_severity": {
        "Malicious": 100,
        "Unknown": 60,
        "Benign": -1
    },
    "Default": 50
}

必須提供 "Default" 值。

如果同一個 JSON 物件有多個相符項目,Pub/Sub - 訊息連接器會優先處理第一個 JSON 物件索引鍵。

如要處理包含 integer 或 float 值的欄位,請在 Severity Mapping JSON 參數中設定鍵和空字串:

{
  "Default":"60",
  "integer_field": "",
  "float_field": ""
}

連接器輸入

Pub/Sub - Messages 連接器需要下列參數:

參數 說明
Product Field Name 必要

儲存產品名稱的欄位名稱。

預設值為 Product Name。

Event Field Name 必要

用於判斷事件名稱 (子類型) 的欄位名稱。

預設值為 event_type。

Environment Field Name 選用

儲存環境名稱的欄位名稱。

如果找不到環境欄位,系統會將環境設為預設環境。

預設值為 ""。

Environment Regex Pattern 選用

規則運算式模式,用於對 Environment Field Name 欄位中的值執行。這個參數可讓您使用規則運算式邏輯,操控環境欄位。

使用預設值 .* 擷取必要的原始 Environment Field Name 值。

如果規則運算式模式為空值或空白,或環境值為空值,則最終環境結果為預設環境。

PythonProcessTimeout 必要

執行目前指令碼的 Python 程序逾時限制 (以秒為單位)。

預設值為 60。

Service Account JSON File Content 選用

服務帳戶金鑰 JSON 檔案的內容。

您可以設定這項參數或 Workload Identity Email 參數。

如要設定這項參數,請提供您在建立服務帳戶時下載的服務帳戶金鑰 JSON 檔案完整內容。

如果是 Pub/Sub - Messages Connector,使用服務帳戶金鑰 JSON 檔案進行驗證的優先順序高於 Workload Identity Federation。

Workload Identity Email 選用

服務帳戶的用戶端電子郵件地址。

您可以設定這項參數或 Service Account JSON File Content 參數。

如要使用 Workload Identity Federation 模擬服務帳戶,請將 Service Account Token Creator 角色授予服務帳戶。

Project ID 選用

要在連接器中使用的專案 ID。

Quota Project ID 選用

用於 Google Cloud API 和計費的 Google Cloud 專案 ID。您必須將 Service Usage Consumer 角色授予服務帳戶,才能使用這項參數。如要進一步瞭解 IAM 角色,請參閱「使用 IAM 控管存取權」。

整合功能會將這個參數值附加至所有 API 要求。

Subscription ID 必要

Pub/Sub 訂閱項目 ID。

Case Name Template 選用

自訂案件名稱。

設定這項參數後,連接器會在 Google SecOps 事件中新增名為 custom_case_name 的金鑰。

您可以使用下列格式提供預留位置:[name of the field]。

範例:Phishing - [event_mailbox]

如果是預留位置,連接器會使用第一個 Google SecOps 事件。連接器只會處理包含字串值的索引鍵。如要設定這項參數,請指定不含前置字元的事件欄位。

Alert Name Template 必要

自訂快訊名稱。

您可以使用下列格式提供預留位置:[name of the field]。

範例:Phishing - [event_mailbox]。

如果是預留位置,連接器會使用第一個 Google SecOps 事件。連接器只會處理包含字串值的索引鍵。如未提供任何值或使用無效範本,連接器會使用下列格式的備用值:CONNECTOR_NAME - Alert。如要設定這項參數,請指定不含前置字元的事件欄位。

Rule Generator Template 必要

自訂規則產生器。

您可以使用下列格式提供預留位置:[name of the field]。

範例:Phishing - [event_mailbox]。

如果是預留位置,連接器會使用第一個 Google SecOps 事件。連接器只會處理包含字串值的索引鍵。如未提供任何值或使用無效範本,連接器會使用下列格式的備用值:CONNECTOR_NAME - Rule Generator。如要設定這項參數,請指定不含前置字元的事件欄位。

Timestamp Field 必要

定義 Google SecOps 快訊時間戳記的欄位名稱。

如果時間戳記並非採用 Unix 紀元時間格式,請在 Timestamp Format 參數中定義時間戳記格式。

預設值為 message_publishTime。

Timestamp Format 選用

訊息時間戳記格式。

連接器需要時間戳記,才能正確處理訊息。如果時間戳記並非採用 Unix 紀元時間格式,且您未設定時間戳記格式,連接器就會失敗。

預設值為 %Y-%m-%dT%H:%M:%S.%fZ。

Severity Mapping JSON 必要

JSON 物件,定義連接器如何從訊息中擷取嚴重性等級。

預設值如下:

    {
      "Default": "60"
    }
    

如要進一步瞭解嚴重程度對應,請參閱「JSON 嚴重程度對應」。

Unique ID Field 選用

用於確認訊息不重複的欄位名稱。您可以使用保留關鍵字 pubsub_message_id 擷取原生 Pub/Sub 訊息 ID。如果未設定值或找不到欄位,連接器會產生 SHA-256 雜湊,並將其做為訊息的 ID。

Max Messages To Fetch 必要

每次連接器疊代處理的訊息數量上限。

預設值為 100。

Disable Overflow 選用

如果選取,連接器會在建立快訊時忽略 Google SecOps 溢位機制。

預設為選取。

Verify SSL 必要

如果選取這個選項,整合作業會驗證用於連線至 Pub/Sub 的 SSL 憑證是否有效。

預設為選取。

Proxy Server Address 選用

要使用的 Proxy 伺服器位址。

Proxy Username 選用

用於驗證的 Proxy 使用者名稱。

Proxy Password 選用

用於驗證的 Proxy 密碼。

連接器規則

Pub/Sub - Messages 連接器支援 Proxy。

連接器事件

以下範例顯示 Pub/Sub - Messages 連接器產生的 Google SecOps 事件 JSON 輸出內容:

{
   "notificationConfigName": "organizations/ORGANIZATION_ID/notificationConfigs/soar_connector_toxic_notifications_config",
   "finding": {
       "name": "organizations/ORGANIZATION_ID/sources/SOURCE_ID/findings/FINDING_ID",
       "parent": "organizations/ORGANIZATION_ID/sources/SOURCE_ID",
       "resourceName": "//compute.googleapis.com/projects/PROJECT_ID/global/firewalls/FIREWALL_ID",
       "state": "ACTIVE",
       "category": "OPEN_NETBIOS_PORT",
       "externalUri": "https://console.cloud.google.com/networking/firewalls/details/default-allow-rdp?project\u003dPROJECT_ID",
       "sourceProperties": {
           "Recommendation": "Restrict the firewall rules at: https://console.cloud.google.com/networking/firewalls/details/default-allow-rdp?project\u003dPROJECT_ID",
           "ExceptionInstructions": "Add the security mark \"allow_open_netbios_port\" to the asset with a value of \"true\" to prevent this finding from being activated again.",
           "Explanation": "Firewall rules that allow connections from all IP addresses on TCP ports 137-139 or UDP ports 137-139 may expose NetBIOS services to attackers.",
           "ScannerName": "FIREWALL_SCANNER",
           "ResourcePath": [
               "projects/PROJECT_ID/",
               "folders/FOLDER_ID/",
               "folders/FOLDER_ID/",
               "organizations/ORGANIZATION_ID/"
           ],
           "ExposedService": "NetBIOS",
           "OpenPorts": {
               "TCP": [
                   137.0,
                   138.0,
                   139.0
               ],
               "UDP": [
                   137.0,
                   138.0,
                   139.0
               ]
           },
           "compliance_standards": {
               "iso": [
                   {
                       "ids": [
                           "A.13.1.1"
                       ]
                   }
               ],
               "pci": [
                   {
                       "ids": [
                           "1.2.1"
                       ]
                   }
               ],
               "nist": [
                   {
                       "ids": [
                           "SC-7"
                       ]
                   }
               ]
           },
           "ReactivationCount": 4.0
       },
       "securityMarks": {
           "name": "organizations/ORGANIZATION_ID/sources/SOURCE_ID/findings/FINDING_ID/securityMarks",
           "marks": {
               "peter": "e2e1"
           }
       },
       "eventTime": "2024-08-30T14:44:37.973090Z",
       "createTime": "2024-06-24T07:08:54.777Z",
       "propertyDataTypes": {
           "ResourcePath": {
               "listValues": {
                   "propertyDataTypes": [
                       {
                           "primitiveDataType": "STRING"
                       }
                   ]
               }
           },
           "ReactivationCount": {
               "primitiveDataType": "NUMBER"
           },
           "Explanation": {
               "primitiveDataType": "STRING"
           },
           "ExposedService": {
               "primitiveDataType": "STRING"
           },
           "ScannerName": {
               "primitiveDataType": "STRING"
           }
       }
   }
}

還有其他問題嗎?向社群成員和 Google SecOps 專業人員尋求解答。