Mit diesem Logstash-Parsercode werden zuerst Felder wie Quell-IP, Nutzer, Methode und Anwendungsprotokoll aus Rohlogmeldungen extrahiert. Dazu werden Grok-Muster verwendet. Anschließend werden bestimmte Felder aus den Logrohdaten den entsprechenden Feldern im einheitlichen Datenmodell (Unified Data Model, UDM) zugeordnet, Datentypkonvertierungen durchgeführt und die Daten mit zusätzlichen Labels und Metadaten angereichert, bevor die Ausgabe im gewünschten UDM-Format strukturiert wird.
Hinweise
Prüfen Sie, ob die folgenden Voraussetzungen erfüllt sind:
Google Security Operations-Instanz.
Privilegierter Zugriff auf Google Cloud.
Privilegierter Zugriff auf Qualys.
Erforderliche APIs aktivieren:
In der Google Cloud Console anmelden
Rufen Sie APIs und Dienste>Bibliothek auf.
Suchen Sie nach den folgenden APIs und aktivieren Sie sie:
Cloud Functions API
Cloud Scheduler API
Cloud Pub/Sub (erforderlich, damit Cloud Scheduler Funktionen aufrufen kann)
Name: Geben Sie einen eindeutigen Namen ein, der den Anforderungen für Bucket-Namen entspricht (z. B. qualys-asset-bucket).
Speicherort für Daten auswählen: Wählen Sie einen Standort aus.
Speicherklasse für Ihre Daten auswählen: Wählen Sie entweder eine Standardspeicherklasse für den Bucket oder Autoclass für die automatische Verwaltung der Speicherklassen aus.
Legen Sie fest, wie der Zugriff auf Objekte gesteuert wird: Wählen Sie nicht aus, um die Verhinderung des öffentlichen Zugriffs zu erzwingen, und wählen Sie ein Zugriffssteuerungsmodell für die Objekte Ihres Buckets aus.
Speicherklasse: Wählen Sie die Option aus, die Ihren Anforderungen am besten entspricht, z. B. Standard.
Klicken Sie auf Erstellen.
Google Cloud-Dienstkonto erstellen
In der Google Cloud Console anmelden
Rufen Sie IAM und Verwaltung>Dienstkonten auf.
Erstellen Sie ein neues Dienstkonto.
Geben Sie ihm einen aussagekräftigen Namen (z. B. qualys-user).
Weisen Sie dem Dienstkonto die Rolle Storage-Objekt-Administrator für den GCS-Bucket zu, den Sie im vorherigen Schritt erstellt haben.
Weisen Sie dem Dienstkonto die Rolle Cloud Functions-Aufrufer zu.
Erstellen Sie einen SSH-Schlüssel für das Dienstkonto.
Laden Sie eine JSON-Schlüsseldatei für das Dienstkonto herunter. Bewahren Sie diese Datei sicher auf.
Optional: Einen dedizierten API-Nutzer in Qualys erstellen
Melden Sie sich in der Qualys-Konsole an.
Gehen Sie zu Nutzer.
Klicken Sie auf Neu>Nutzer.
Geben Sie die erforderlichen Allgemeinen Informationen für den Nutzer ein.
Scrollen Sie nach unten, um diese Informationen unter „Security Operations Center (SOC)“ zu sehen.
Kopieren Sie die Qualys API-URL.
Cloud Functions-Funktion konfigurieren
Rufen Sie in der Google Cloud -Console Cloud Functions auf.
Klicken Sie auf Funktion erstellen.
Funktion konfigurieren:
Name: Geben Sie einen Namen für die Funktion ein (z. B. fetch-qualys-cm-alerts).
Region: Wählen Sie eine Region in der Nähe Ihres Buckets aus.
Laufzeit: Python 3.10 (oder die bevorzugte Laufzeit).
Trigger: Wählen Sie bei Bedarf einen HTTP-Trigger oder Cloud Pub/Sub für die geplante Ausführung aus.
Authentifizierung: Mit Authentifizierung sichern.
Code mit einem Inline-Editor schreiben:
```pythonfromgoogle.cloudimportstorageimportrequestsimportbase64importjson# Google Cloud Storage ConfigurationBUCKET_NAME="<bucket-name>"FILE_NAME="qualys_cm_alerts.json"# Qualys API CredentialsQUALYS_USERNAME="<qualys-username>"QUALYS_PASSWORD="<qualys-password>"QUALYS_BASE_URL="https://<qualys_base_url>"deffetch_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()returnresponse.json()defupload_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")defmain(request):"""Cloud Function entry point."""try:alerts=fetch_cm_alerts()upload_to_gcs(alerts)return"Qualys CM alerts uploaded to Cloud Storage successfully!"exceptExceptionase:returnf"An error occurred: {e}",500```
Klicken Sie nach Abschluss der Konfiguration auf Bereitstellen.
Cloud Scheduler konfigurieren
Rufen Sie in der Google Cloud Console Cloud Scheduler auf.
Klicken Sie auf Job erstellen.
Job konfigurieren:
Name: Geben Sie einen Namen für den Job ein, z. B. trigger-fetch-qualys-cm-alerts.
Häufigkeit: Verwenden Sie die cron-Syntax, um den Zeitplan anzugeben (z. B. 0 * * * * für die Ausführung stündlich).
Zeitzone: Legen Sie Ihre bevorzugte Zeitzone fest.
Triggertyp: Wählen Sie HTTP aus.
Trigger-URL: Geben Sie die URL der Cloud Functions-Funktion ein. Sie finden sie nach der Bereitstellung in den Funktionsdetails.
Methode: Wählen Sie POST aus.
Erstellen Sie den Job.
Feeds einrichten
So konfigurieren Sie einen Feed:
Rufen Sie die SIEM-Einstellungen>Feeds auf.
Klicken Sie auf Neuen Feed hinzufügen.
Klicken Sie auf der nächsten Seite auf Einen einzelnen Feed konfigurieren.
Geben Sie im Feld Feed name (Feedname) einen Namen für den Feed ein, z. B. Qualys Continuous Monitoring Logs (Qualys-Protokolle für kontinuierliche Überwachung).
Wählen Sie Google Cloud Storage V2 als Quelltyp aus.
Wählen Sie Qualys Continuous Monitoring als Logtyp aus.
Klicken Sie auf Weiter.
Geben Sie Werte für die folgenden Eingabeparameter an:
Storage-Bucket-URI: Der Quell-URI des Google Cloud Storage-Buckets.
Optionen zum Löschen der Quelle: Wählen Sie die gewünschte Option aus.
Klicken Sie auf Weiter.
Prüfen Sie die neue Feedkonfiguration auf dem Bildschirm Abschließen und klicken Sie dann auf Senden.
UDM-Zuordnungstabelle
Logfeld
UDM-Zuordnung
Logik
Alert.alertInfo.appVersion
metadata.product_version
Direkt aus Alert.alertInfo.appVersion zugeordnet
Alert.alertInfo.operatingSystem
principal.platform_version
Direkt aus Alert.alertInfo.operatingSystem zugeordnet
Alert.alertInfo.port
additional.fields.value.string_value
Direkt aus Alert.alertInfo.port zugeordnet und als Schlüssel/Wert-Paar in additional.fields mit dem Schlüssel „Alert port“ (Benachrichtigungsport) hinzugefügt
Alert.alertInfo.protocol
network.ip_protocol
Direkt aus Alert.alertInfo.protocol zugeordnet
Alert.alertInfo.sslIssuer
network.tls.client.certificate.issuer
Direkt aus Alert.alertInfo.sslIssuer zugeordnet
Alert.alertInfo.sslName
additional.fields.value.string_value
Direkt aus Alert.alertInfo.sslName zugeordnet und als Schlüssel/Wert-Paar in additional.fields mit dem Schlüssel „SSL Name“ hinzugefügt
Alert.alertInfo.sslOrg
additional.fields.value.string_value
Direkt aus Alert.alertInfo.sslOrg zugeordnet und als Schlüssel/Wert-Paar in additional.fields mit dem Schlüssel „SSL Org“ hinzugefügt
Alert.alertInfo.ticketId
additional.fields.value.string_value
Direkt aus Alert.alertInfo.ticketId zugeordnet und als Schlüssel/Wert-Paar in additional.fields mit dem Schlüssel „Ticket-ID“ hinzugefügt
Alert.alertInfo.vpeConfidence
additional.fields.value.string_value
Direkt aus Alert.alertInfo.vpeConfidence zugeordnet und als Schlüssel/Wert-Paar in additional.fields mit dem Schlüssel „VPE Confidence“ hinzugefügt
Alert.alertInfo.vpeStatus
additional.fields.value.string_value
Direkt aus Alert.alertInfo.vpeStatus zugeordnet und als Schlüssel/Wert-Paar in additional.fields mit dem Schlüssel „VPE Confidence“ hinzugefügt
Alert.eventType
additional.fields.value.string_value
Direkt aus Alert.eventType zugeordnet und als Schlüssel/Wert-Paar in additional.fields mit dem Schlüssel „Event Type“ (Ereignistyp) hinzugefügt
Alert.hostname
principal.hostname
Direkt aus Alert.hostname zugeordnet
Alert.id
security_result.threat_id
Direkt aus Alert.id zugeordnet
Alert.ipAddress
principal.ip
Direkt aus Alert.ipAddress zugeordnet
Alert.profile.id
additional.fields.value.string_value
Direkt aus Alert.profile.id zugeordnet und als Schlüssel/Wert-Paar in additional.fields mit dem Schlüssel „Profile Id“ hinzugefügt
Alert.profile.title
additional.fields.value.string_value
Direkt aus Alert.profile.title zugeordnet und als Schlüssel/Wert-Paar in additional.fields mit dem Schlüssel „Profiltitel“ hinzugefügt
Alert.qid
vulnerability.name
Zugeordnet als „QID: “ aus Alert.qid
Alert.source
additional.fields.value.string_value
Direkt aus Alert.source zugeordnet und als Schlüssel/Wert-Paar in additional.fields mit dem Schlüssel „Alert Source“ (Benachrichtigungsquelle) hinzugefügt
Alert.triggerUuid
metadata.product_log_id
Direkt aus Alert.triggerUuid zugeordnet
Alert.vulnCategory
additional.fields.value.string_value
Direkt aus Alert.vulnCategory zugeordnet und als Schlüssel/Wert-Paar in additional.fields mit dem Schlüssel „Vulnerability Category“ (Sicherheitslücke) hinzugefügt
Alert.vulnSeverity
vulnerability.severity
Zuordnung basierend auf dem Wert von Alert.vulnSeverity: 1–3: NIEDRIG, 4–6: MITTEL, 7–8: HOCH
Alert.vulnTitle
vulnerability.description
Direkt aus Alert.vulnTitle zugeordnet
Alert.vulnType
additional.fields.value.string_value
Direkt aus Alert.vulnType zugeordnet und als Schlüssel/Wert-Paar in additional.fields mit dem Schlüssel „Vulnerability Type“ (Schwachstellentyp) hinzugefügt
Host
principal.ip
Aus der Logzeile „Host: “ geparst
edr.client.ip_addresses
Vom principal.ip-Gerät kopiert
edr.client.hostname
Vom principal.hostname-Gerät kopiert
edr.raw_event_name
Auf „STATUS_UPDATE“ festgelegt, wenn Alert.ipAddress, Alert.hostname oder src_ip vorhanden sind. Andernfalls auf „GENERIC_EVENT“ festgelegt.
metadata.event_timestamp
Aus den Feldern Alert.eventDate oder timestamp extrahiert. Alert.eventDate hat Vorrang, falls vorhanden. Andernfalls wird timestamp verwendet. Der Zeitstempel wird in UTC konvertiert.
metadata.event_type
Gleiche Logik wie edr.raw_event_name
metadata.log_type
Auf „QUALYS_CONTINUOUS_MONITORING“ festlegen
metadata.product_name
Auf „QUALYS_CONTINUOUS_MONITORING“ festlegen
metadata.vendor_name
Auf „QUALYS_CONTINUOUS_MONITORING“ festlegen
network.application_protocol
Aus der Logzeile /user HTTP geparst
network.http.method
Aus der Logzeile /user HTTP geparst
timestamp
event.timestamp
Aus den Feldern Alert.eventDate oder timestamp extrahiert. Alert.eventDate hat Vorrang, falls vorhanden. Andernfalls wird timestamp verwendet. Der Zeitstempel wird in UTC konvertiert.
[[["Leicht verständlich","easyToUnderstand","thumb-up"],["Mein Problem wurde gelöst","solvedMyProblem","thumb-up"],["Sonstiges","otherUp","thumb-up"]],[["Schwer verständlich","hardToUnderstand","thumb-down"],["Informationen oder Beispielcode falsch","incorrectInformationOrSampleCode","thumb-down"],["Benötigte Informationen/Beispiele nicht gefunden","missingTheInformationSamplesINeed","thumb-down"],["Problem mit der Übersetzung","translationIssue","thumb-down"],["Sonstiges","otherDown","thumb-down"]],["Zuletzt aktualisiert: 2025-09-03 (UTC)."],[[["\u003cp\u003eThis guide details how to collect and ingest Qualys Continuous Monitoring logs into Google Security Operations (SecOps), including the necessary steps for setup, configuration, and UDM mapping.\u003c/p\u003e\n"],["\u003cp\u003eThe process involves enabling specific APIs in Google Cloud, creating a storage bucket, setting up a service account with proper permissions, and optionally creating a dedicated Qualys API user.\u003c/p\u003e\n"],["\u003cp\u003eA Google Cloud Function is used to fetch alerts from Qualys, and then store them in a GCS Bucket, while Cloud Scheduler is employed to automate the triggering of the function on a set schedule.\u003c/p\u003e\n"],["\u003cp\u003eThe UDM mapping table explains how Qualys log fields are transformed and mapped to their corresponding fields within the Unified Data Model, ensuring proper data normalization.\u003c/p\u003e\n"],["\u003cp\u003eOnce the data is present in the GCS bucket, a new feed must be created in the Google SecOps platform to ingest the information, setting the appropriate source type, log type and storage location, and selecting the appropriate ingestion labels.\u003c/p\u003e\n"]]],[],null,["# Collect Qualys Continuous Monitoring logs\n=========================================\n\nSupported in: \nGoogle secops [SIEM](/chronicle/docs/secops/google-secops-siem-toc)\n| **Note:** This feature is covered by [Pre-GA Offerings Terms](https://chronicle.security/legal/service-terms/) of the Google Security Operations Service Specific Terms. Pre-GA features might have limited support, and changes to pre-GA features might not be compatible with other pre-GA versions. For more information, see the [Google SecOps Technical Support Service guidelines](https://chronicle.security/legal/technical-support-services-guidelines/) and the [Google SecOps Service Specific Terms](https://chronicle.security/legal/service-terms/).\n\nThis Logstash parser code first extracts fields such as source IP, user, method, and application protocol from raw log messages using grok patterns. It thenmaps specific fields from the raw log data to their corresponding fields in the Unified Data Model (UDM), performs data type conversions, and enriches the data with additional labels and metadata before finally structuring the output in the desired UDM format.\n\nBefore you begin\n----------------\n\nEnsure that you have the following prerequisites:\n\n- Google Security Operations instance.\n- Privileged access to Google Cloud.\n- Privileged access to Qualys.\n\nEnable Required APIs:\n---------------------\n\n1. Sign in to the Google Cloud console.\n2. Go to **APIs \\& Services** \\\u003e **Library**.\n3. Search for the following APIs and enable them:\n - Cloud Functions API\n - Cloud Scheduler API\n - Cloud Pub/Sub (required for Cloud Scheduler to invoke functions)\n\nCreate a Google Cloud Storage Bucket\n------------------------------------\n\n1. Sign in to the Google Cloud console.\n2. Go to the **Cloud Storage Buckets** page.\n\n [Go to Buckets](https://console.cloud.google.com/storage/browser)\n3. Click **Create**.\n\n4. Configure the bucket:\n\n - **Name** : enter a unique name that meets the bucket name requirements (for example, **qualys-asset-bucket**).\n - **Choose where to store your data**: select a location.\n - **Choose a storage class for your data** : either select a **default storage class** for the bucket, or select **Autoclass** for automatic storage class management.\n - **Choose how to control access to objects** : select **not** to enforce **public access prevention** , and select an **access control model** for your bucket's objects.\n\n | **Note:** If public access prevention is already enforced by your project's organization policy, the **Prevent public access** checkbox is locked.\n - **Storage class** : choose based on your needs (for example, **Standard**).\n5. Click **Create**.\n\n| **Note:** Do not set a retention policy, as the last data entry may need to be overwritten in case of a timeout.\n\nCreate a Google Cloud Service Account\n-------------------------------------\n\n1. Sign in to the Google Cloud console.\n2. Go to to **IAM \\& Admin** \\\u003e **Service Accounts**.\n3. Create a new service account.\n4. Give it a descriptive name (for example, **qualys-user**).\n5. Grant the service account with **Storage Object Admin** role on the GCS bucket you created in the previous step.\n6. Grant the service account with **Cloud Functions Invoker** role.\n7. Create an [**SSH key**](/iam/docs/keys-create-delete) for the service account.\n8. Download a JSON key file for the service account. Keep this file secure.\n\nOptional: Create a dedicated API User in Qualys\n-----------------------------------------------\n\n1. Sign in to the Qualys console.\n2. Go to **Users**.\n3. Click **New** \\\u003e **User**.\n4. Enter the **General Information** required for the user.\n5. Select the **User Role** tab.\n6. Make sure the role has the **API Access** checkbox selected.\n7. Click **Save**.\n\nIdentify your specific Qualys API URL\n-------------------------------------\n\n### Option 1\n\nIdentify your URLs as mentioned in the [platform identification](https://www.qualys.com/platform-identification).\n\n### Option 2\n\n1. Sign in to the Qualys console.\n2. Go to **Help** \\\u003e **About**.\n3. Scroll to see this information under Security Operations Center (SOC).\n4. Copy the Qualys API URL.\n\nConfigure the Cloud Function\n----------------------------\n\n1. Go to **Cloud Functions** in the Google Cloud console.\n2. Click **Create Function**.\n3. Configure the Function:\n\n - **Name** : enter a name for your function (for example, **fetch-qualys-cm-alerts**).\n - **Region**: select a region close to your Bucket.\n - **Runtime**: Python 3.10 (or your preferred runtime).\n - **Trigger**: choose HTTP trigger if needed or Cloud Pub/Sub for scheduled execution.\n - **Authentication**: secure with authentication.\n - **Write the Code** with an inline editor:\n\n **Note:** Make sure to replace the following with your data: `\u003cbucket-name\u003e`, `\u003cqualys-username\u003e`, `\u003cqualys-password\u003e`, `\u003cqualys_base_url\u003e`. \n\n ```python\n from google.cloud import storage\n import requests\n import base64\n import json\n\n # Google Cloud Storage Configuration\n BUCKET_NAME = \"\u003cbucket-name\u003e\"\n FILE_NAME = \"qualys_cm_alerts.json\"\n\n # Qualys API Credentials\n QUALYS_USERNAME = \"\u003cqualys-username\u003e\"\n QUALYS_PASSWORD = \"\u003cqualys-password\u003e\"\n QUALYS_BASE_URL = \"https://\u003cqualys_base_url\u003e\"\n\n def fetch_cm_alerts():\n \"\"\"Fetch alerts from Qualys Continuous Monitoring.\"\"\"\n auth = base64.b64encode(f\"{QUALYS_USERNAME}:{QUALYS_PASSWORD}\".encode()).decode()\n headers = {\n \"Authorization\": f\"Basic {auth}\",\n \"Content-Type\": \"application/xml\"\n }\n payload = \"\"\"\n \u003cServiceRequest\u003e\n \u003cfilters\u003e\n \u003cCriteria field=\"alert.date\" operator=\"GREATER\"\u003e2024-01-01\u003c/Criteria\u003e\n \u003c/filters\u003e\n \u003c/ServiceRequest\u003e\n \"\"\"\n response = requests.post(f\"{QUALYS_BASE_URL}/qps/rest/2.0/search/cm/alert\", headers=headers, data=payload)\n response.raise_for_status()\n return response.json()\n\n def upload_to_gcs(data):\n \"\"\"Upload data to Google Cloud Storage.\"\"\"\n client = storage.Client()\n bucket = client.get_bucket(BUCKET_NAME)\n blob = bucket.blob(FILE_NAME)\n blob.upload_from_string(json.dumps(data, indent=2), content_type=\"application/json\")\n\n def main(request):\n \"\"\"Cloud Function entry point.\"\"\"\n try:\n alerts = fetch_cm_alerts()\n upload_to_gcs(alerts)\n return \"Qualys CM alerts uploaded to Cloud Storage successfully!\"\n except Exception as e:\n return f\"An error occurred: {e}\", 500\n ```\n\n4. Click **Deploy** after completing the configuration.\n\nConfigure Cloud Scheduler\n-------------------------\n\n1. Go to **Cloud Scheduler** in the Google Cloud console.\n2. Click **Create Job**.\n3. Configure the Job:\n\n - **Name** : enter a name for your job (for example, **trigger-fetch-qualys-cm-alerts**).\n - **Frequency** : use **cron** syntax to specify the schedule (for example, `0 * * * *` to run every hour).\n - **Time Zone**: set your preferred time zone.\n - **Trigger Type** : choose **HTTP**.\n - **Trigger URL**: Enter the Cloud Function's URL (found in the function details after deployment).\n - **Method** : Choose **POST**.\n\n | **Note:** If authentication is enabled for the function, select **Service Account** and ensure the account has the **Cloud Functions Invoker** role.\n4. Create the job.\n\nSet up feeds\n------------\n\nTo configure a feed, follow these steps:\n\n1. Go to **SIEM Settings** \\\u003e **Feeds**.\n2. Click **Add New Feed**.\n3. On the next page, click **Configure a single feed**.\n4. In the **Feed name** field, enter a name for the feed; for example, **Qualys Continuous Monitoring Logs**.\n5. Select **Google Cloud Storage V2** as the **Source type**.\n6. Select **Qualys Continuous Monitoring** as the **Log type**.\n7. Click **Next**.\n8. Specify values for the following input parameters:\n\n - **Storage Bucket URI**: the Google Cloud storage bucket source URI.\n - **Source deletion options**: select the deletion option according to your preference.\n\n | **Note:** If you select the `Delete transferred files` or `Delete transferred files and empty directories` option, make sure that you granted appropriate permissions to the service account. \\* **Maximum File Age**: Includes files modified in the last number of days. Default is 180 days.\n9. Click **Next**.\n\n10. Review your new feed configuration in the **Finalize** screen, and then click **Submit**.\n\nUDM Mapping Table\n-----------------\n\n**Need more help?** [Get answers from Community members and Google SecOps professionals.](https://security.googlecloudcommunity.com/google-security-operations-2)"]]