收集 Qualys Continuous Monitoring 記錄
支援的國家/地區:
Google SecOps
SIEM
這段 Logstash 剖析器程式碼會先使用 grok 模式,從原始記錄訊息中擷取來源 IP、使用者、方法和應用程式通訊協定等欄位。然後將原始記錄資料中的特定欄位對應至整合式資料模型 (UDM) 中的對應欄位、執行資料類型轉換,並使用其他標籤和中繼資料擴充資料,最後以所需的 UDM 格式建構輸出內容。
事前準備
請確認您已完成下列事前準備事項:
- Google Security Operations 執行個體。
- Google Cloud的特殊存取權。
- Qualys 的特殊存取權。
啟用必要的 API:
- 登入 Google Cloud 主控台。
- 依序前往「API 和服務」>「程式庫」。
- 搜尋並啟用下列 API:
- Cloud Functions API
- Cloud Scheduler API
- Cloud Pub/Sub (Cloud Scheduler 必須使用這項服務才能叫用函式)
建立 Google Cloud 儲存空間 bucket
- 登入 Google Cloud 主控台。
前往「Cloud Storage Buckets」(Cloud Storage bucket) 頁面。
點選「建立」。
設定 bucket:
- 名稱:輸入符合值區名稱規定的專屬名稱 (例如 qualys-asset-bucket)。
- 選擇資料的儲存位置:選取位置。
- 為資料選擇儲存空間級別:選取值區的預設儲存空間級別,或選取「Autoclass」(自動分類),讓系統自動管理儲存空間級別。
- 選擇如何控制物件的存取權:選取「否」可強制禁止公開存取,並為 bucket 物件選取存取權控管模型。
- 儲存空間級別:依需求選擇 (例如「Standard」)。
點選「建立」。
建立 Google Cloud 服務帳戶
- 登入 Google Cloud 主控台。
- 依序前往「IAM & Admin」(IAM 與管理) >「Service Accounts」(服務帳戶)。
- 建立新的服務帳戶。
- 為其設定描述性名稱 (例如 qualys-user)。
- 在您上一個步驟建立的 GCS bucket 中,授予服務帳戶「Storage Object Admin」(Storage 物件管理員) 角色。
- 將 Cloud Functions 叫用者角色授予服務帳戶。
- 為服務帳戶建立 SSH 金鑰。
- 下載服務帳戶的 JSON 金鑰檔案。請妥善保管這個檔案。
選用:在 Qualys 中建立專屬的 API 使用者
- 登入 Qualys 控制台。
- 前往使用者。
- 依序點選「新增」>「使用者」。
- 輸入使用者的一般資訊。
- 選取「使用者角色」分頁標籤。
- 確認角色已勾選「API 存取權」核取方塊。
- 按一下 [儲存]。
找出特定 Qualys API 網址
選項 1
如「平台識別」一節所述,找出網址。
選項 2
- 登入 Qualys 控制台。
- 依序點選「說明」>「關於」。
- 捲動畫面,即可在「資安營運中心 (SOC)」下方查看這項資訊。
- 複製 Qualys API 網址。
設定 Cloud 函式
- 前往 Google Cloud 控制台的「Cloud Functions」。
- 按一下 [Create Function] (建立函式)。
設定函式:
- 名稱:輸入函式名稱 (例如 fetch-qualys-cm-alerts)。
- 「Region」(區域):選取靠近 Bucket 的區域。
- 執行階段:Python 3.10 (或您偏好的執行階段)。
- 觸發條件:視需要選擇 HTTP 觸發條件,或選擇 Cloud Pub/Sub 進行排程執行。
- 驗證:透過驗證確保安全。
- 使用內嵌編輯器編寫程式碼:
```python from google.cloud import storage import requests import base64 import json # Google Cloud Storage Configuration BUCKET_NAME = "<bucket-name>" FILE_NAME = "qualys_cm_alerts.json" # Qualys API Credentials QUALYS_USERNAME = "<qualys-username>" QUALYS_PASSWORD = "<qualys-password>" QUALYS_BASE_URL = "https://<qualys_base_url>" def fetch_cm_alerts(): """Fetch alerts from Qualys Continuous Monitoring.""" auth = base64.b64encode(f"{QUALYS_USERNAME}:{QUALYS_PASSWORD}".encode()).decode() headers = { "Authorization": f"Basic {auth}", "Content-Type": "application/xml" } payload = """ <ServiceRequest> <filters> <Criteria field="alert.date" operator="GREATER">2024-01-01</Criteria> </filters> </ServiceRequest> """ response = requests.post(f"{QUALYS_BASE_URL}/qps/rest/2.0/search/cm/alert", headers=headers, data=payload) response.raise_for_status() return response.json() def upload_to_gcs(data): """Upload data to Google Cloud Storage.""" client = storage.Client() bucket = client.get_bucket(BUCKET_NAME) blob = bucket.blob(FILE_NAME) blob.upload_from_string(json.dumps(data, indent=2), content_type="application/json") def main(request): """Cloud Function entry point.""" try: alerts = fetch_cm_alerts() upload_to_gcs(alerts) return "Qualys CM alerts uploaded to Cloud Storage successfully!" except Exception as e: return f"An error occurred: {e}", 500 ```
完成設定後,按一下「Deploy」(部署)。
設定 Cloud Scheduler
- 前往控制台的「Cloud Scheduler」頁面。 Google Cloud
- 按一下 [Create Job] (建立工作)。
設定工作:
- 名稱:輸入工作的名稱 (例如 trigger-fetch-qualys-cm-alerts)。
- 頻率:使用 cron 語法指定時間表 (例如
0 * * * *
表示每小時執行一次)。 - 時區:設定偏好的時區。
- 「觸發條件類型」:選擇「HTTP」。
- 「觸發網址」:輸入 Cloud Functions 的網址 (部署後可在函式詳細資料中找到)。
- 方法:選擇「POST」。
建立工作。
設定動態饋給
在 Google SecOps 平台中,有兩種不同的進入點可設定動態饋給:
- 「SIEM 設定」>「動態消息」
- 內容中心 > 內容包
依序前往「SIEM 設定」>「動態饋給」,設定動態饋給
如要設定動態消息,請按照下列步驟操作:
- 依序前往「SIEM 設定」>「動態消息」。
- 按一下「新增動態消息」。
- 在下一個頁面中,按一下「設定單一動態饋給」。
- 在「Feed name」(動態饋給名稱) 欄位中,輸入動態饋給的名稱,例如「Qualys Continuous Monitoring Logs」(Qualys 持續監控記錄)。
- 選取「Google Cloud Storage」做為「來源類型」。
- 選取「Qualys Continuous Monitoring」做為「記錄類型」。
- 點選「下一步」。
指定下列輸入參數的值:
- 儲存空間值區 URI:儲存空間值區來源 URI。 Google Cloud
- URI 為:選取「單一檔案」。
- 來源刪除選項:根據偏好選取刪除選項。
點選「下一步」。
在「Finalize」畫面上檢查新的動態饋給設定,然後按一下「Submit」。
從內容中心設定動態饋給
為下列欄位指定值:
- 儲存空間值區 URI:儲存空間值區來源 URI。 Google Cloud
- URI 為:選取「單一檔案」。
- 來源刪除選項:根據偏好選取刪除選項。
進階選項
- 動態饋給名稱:系統預先填入的值,用於識別動態饋給。
- 來源類型:將記錄收集到 Google SecOps 的方法。
- 資產命名空間:與動態饋給相關聯的命名空間。
- 擷取標籤:套用至這個動態饋給所有事件的標籤。
UDM 對應表
記錄欄位 | UDM 對應 | 邏輯 |
---|---|---|
Alert.alertInfo.appVersion | metadata.product_version | 直接對應自 Alert.alertInfo.appVersion |
Alert.alertInfo.operatingSystem | principal.platform_version | 直接對應自 Alert.alertInfo.operatingSystem |
Alert.alertInfo.port | additional.fields.value.string_value | 直接從 Alert.alertInfo.port 對應,並在 additional.fields 中新增為鍵/值組合,鍵為「Alert port」 |
Alert.alertInfo.protocol | network.ip_protocol | 直接對應自 Alert.alertInfo.protocol |
Alert.alertInfo.sslIssuer | network.tls.client.certificate.issuer | 直接對應自 Alert.alertInfo.sslIssuer |
Alert.alertInfo.sslName | additional.fields.value.string_value | 直接從 Alert.alertInfo.sslName 對應,並以鍵/值組合形式新增至 additional.fields ,鍵為「SSL 名稱」 |
Alert.alertInfo.sslOrg | additional.fields.value.string_value | 直接從 Alert.alertInfo.sslOrg 對應,並在 additional.fields 中新增為鍵/值組合,鍵為「SSL Org」 |
Alert.alertInfo.ticketId | additional.fields.value.string_value | 直接從 Alert.alertInfo.ticketId 對應,並在 additional.fields 中新增為鍵/值組合,索引鍵為「Ticket Id」 |
Alert.alertInfo.vpeConfidence | additional.fields.value.string_value | 直接從 Alert.alertInfo.vpeConfidence 對應,並以鍵/值組合形式新增至 additional.fields ,鍵為「VPE Confidence」 |
Alert.alertInfo.vpeStatus | additional.fields.value.string_value | 直接從 Alert.alertInfo.vpeStatus 對應,並以鍵/值組合形式新增至 additional.fields ,鍵為「VPE Confidence」 |
Alert.eventType | additional.fields.value.string_value | 直接從 Alert.eventType 對應,並以鍵/值組合形式新增至 additional.fields ,鍵為「Event Type」 |
Alert.hostname | principal.hostname | 直接對應自 Alert.hostname |
Alert.id | security_result.threat_id | 直接對應自 Alert.id |
Alert.ipAddress | principal.ip | 直接對應自 Alert.ipAddress |
Alert.profile.id | additional.fields.value.string_value | 直接從 Alert.profile.id 對應,並以「設定檔 ID」鍵的形式,在 additional.fields 中新增為鍵/值組合 |
Alert.profile.title | additional.fields.value.string_value | 直接從 Alert.profile.title 對應,並以「設定檔名稱」鍵的形式新增為 additional.fields 中的鍵/值組合 |
Alert.qid | vulnerability.name | 已從 Alert.qid 對應為「QID: |
Alert.source | additional.fields.value.string_value | 直接從 Alert.source 對應,並在 additional.fields 中新增為鍵/值組合,鍵為「Alert Source」 |
Alert.triggerUuid | metadata.product_log_id | 直接對應自 Alert.triggerUuid |
Alert.vulnCategory | additional.fields.value.string_value | 直接從 Alert.vulnCategory 對應,並在 additional.fields 中新增為鍵/值組合,鍵為「Vulnerability Category」(安全漏洞類別) |
Alert.vulnSeverity | vulnerability.severity | 根據 Alert.vulnSeverity 的值對應:1-3:低;4-6:中;7-8:高 |
Alert.vulnTitle | vulnerability.description | 直接對應自 Alert.vulnTitle |
Alert.vulnType | additional.fields.value.string_value | 直接從 Alert.vulnType 對應,並在 additional.fields 中新增為鍵/值組合,鍵為「Vulnerability Type」 |
主機 | principal.ip | 從記錄行「Host: |
edr.client.ip_addresses | 從 principal.ip 複製的項目 |
|
edr.client.hostname | 從 principal.hostname 複製的項目 |
|
edr.raw_event_name | 如果存在 Alert.ipAddress 、Alert.hostname 或 src_ip ,請設為「STATUS_UPDATE」,否則請設為「GENERIC_EVENT」 |
|
metadata.event_timestamp | 從 Alert.eventDate 或 timestamp 欄位擷取。如果 Alert.eventDate 存在,系統會優先使用該值,否則會使用 timestamp 。時間戳記會轉換為世界標準時間 (UTC)。 |
|
metadata.event_type | 與「edr.raw_event_name 」相同 |
|
metadata.log_type | 設為「QUALYS_CONTINUOUS_MONITORING」 | |
metadata.product_name | 設為「QUALYS_CONTINUOUS_MONITORING」 | |
metadata.vendor_name | 設為「QUALYS_CONTINUOUS_MONITORING」 | |
network.application_protocol | 從記錄行「 |
|
network.http.method | 從記錄行「/user HTTP」 |
|
時間戳記 | event.timestamp | 從 Alert.eventDate 或 timestamp 欄位擷取。如果 Alert.eventDate 存在,系統會優先使用該值,否則會使用 timestamp 。時間戳記會轉換為世界標準時間 (UTC)。 |
還有其他問題嗎?向社群成員和 Google SecOps 專業人員尋求答案。