收集 Qualys Continuous Monitoring 記錄

支援的國家/地區:

這段 Logstash 剖析器程式碼會先使用 grok 模式,從原始記錄訊息中擷取來源 IP、使用者、方法和應用程式通訊協定等欄位。接著,系統會將原始記錄資料中的特定欄位,對應至 Unified Data Model (UDM) 中的相應欄位、轉換資料類型,並加入額外標籤和中繼資料,最後再以所需的 UDM 格式輸出結構化資料。

事前準備

請確認您已完成下列事前準備事項:

  • Google Security Operations 執行個體。
  • Google Cloud的特殊存取權。
  • Qualys 的特殊存取權。

啟用必要 API:

  1. 登入 Google Cloud 控制台
  2. 依序前往「API 和服務」>「程式庫」。
  3. 搜尋並啟用下列 API:
    • Cloud Functions API
    • Cloud Scheduler API
    • Cloud Pub/Sub (Cloud Scheduler 必須使用這項服務才能叫用函式)

建立 Google Cloud 儲存空間 bucket

  1. 登入 Google Cloud 控制台
  2. 前往「Cloud Storage Buckets」(Cloud Storage bucket) 頁面。

    前往「Buckets」

  3. 點選「建立」。

  4. 設定 bucket:

    • 名稱:輸入符合 bucket 命名規定的不重複名稱,例如 qualys-asset-bucket。
    • 選擇資料的儲存位置:選取位置。
    • 為資料選擇儲存空間級別:選取 bucket 的預設儲存空間級別,或選取「Autoclass」,讓系統自動管理儲存空間級別。
    • 選擇如何控制物件的存取權:選取「否」來強制禁止公開存取,並為 bucket 的物件選取存取控管模式。
    • 儲存空間級別:依據需求選擇 (例如「Standard」)。
  5. 點選「建立」。

建立 Google Cloud 服務帳戶

  1. 登入 Google Cloud 控制台
  2. 依序前往「IAM 與管理」>「服務帳戶」。
  3. 建立新的服務帳戶。
  4. 為其命名,例如 qualys-user。
  5. 將「Storage 物件管理員」角色授予您在上個步驟中建立的 GCS bucket 服務帳戶。
  6. 將「Cloud Functions 叫用者」角色授予服務帳戶。
  7. 為服務帳戶建立安全殼層金鑰。
  8. 下載服務帳戶的 JSON 金鑰檔案。請妥善保管這個檔案。

選用:在 Qualys 中建立專屬 API 使用者

  1. 登入 Qualys 控制台。
  2. 前往使用者。
  3. 依序點選「新增」>「使用者」。
  4. 輸入使用者所需的一般資訊。
  5. 選取「使用者角色」分頁標籤。
  6. 確認角色已勾選「API 存取權」核取方塊。
  7. 按一下 [儲存]。

找出您的特定 Qualys API 網址

選項 1

如平台識別所述,找出網址。

選項 2

  1. 登入 Qualys 控制台。
  2. 依序前往「說明」>「關於」。
  3. 捲動畫面,即可在「資安營運中心 (SOC)」下方查看這項資訊。
  4. 複製 Qualys API 網址。

設定 Cloud 函式

  1. 前往 Google Cloud 控制台的「Cloud Functions」。
  2. 按一下「Create Function」(建立函式)。
  3. 設定函式:

    • 名稱:輸入函式名稱 (例如 fetch-qualys-cm-alerts)。
    • 區域:選取靠近 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
    ```
    
  4. 完成設定後,按一下「Deploy」(部署)。

設定 Cloud Scheduler

  1. 前往 Google Cloud 控制台的「Cloud Scheduler」。
  2. 點選「建立工作」。
  3. 設定工作:

    • 「Name」(名稱):輸入工作名稱 (例如 trigger-fetch-qualys-cm-alerts)。
    • 頻率:使用 cron 語法指定排程 (例如 0 * * * * 表示每小時執行一次)。
    • 時區:設定偏好的時區。
    • 觸發條件類型:選擇「HTTP」。
    • 觸發網址:輸入 Cloud 函式的網址 (部署後可在函式詳細資料中找到)。
    • 方法:選擇「POST」。
  4. 建立工作。

設定動態饋給

如要設定動態消息,請按照下列步驟操作:

  1. 依序前往「SIEM 設定」>「動態饋給」。
  2. 按一下「新增動態饋給」。
  3. 在下一個頁面中,按一下「設定單一動態饋給」。
  4. 在「動態饋給名稱」欄位中,輸入動態饋給的名稱,例如「Qualys Continuous Monitoring Logs」。
  5. 選取「Google Cloud Storage V2」做為「來源類型」。
  6. 選取「Qualys Continuous Monitoring」做為「Log type」(記錄類型)。
  7. 點選「下一步」。
  8. 指定下列輸入參數的值:

    • 儲存空間 Bucket URI: Google Cloud 儲存空間 Bucket 來源 URI。
    • 來源刪除選項:根據偏好選取刪除選項。
  9. 點選「下一步」。

  10. 在「Finalize」(完成) 畫面中檢查新的動態饋給設定,然後按一下「Submit」(提交)。

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 Name」
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 對應,並以「Ticket Id」鍵的形式新增為 additional.fields 中的鍵/值組合
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 對應,並以「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 從記錄檔行「 /user HTTP」剖析
network.http.method 從記錄行「/user HTTP」剖析
時間戳記 event.timestamp 從 Alert.eventDate 或 timestamp 欄位擷取。如果 Alert.eventDate 存在,系統會優先使用該值,否則會使用 timestamp。時間戳記會轉換為世界標準時間 (UTC)。

變更記錄

查看這個剖析器的變更記錄

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