Qualys-Logs für kontinuierliches Monitoring erfassen

Unterstützt in:

Mit diesem Logstash-Parsercode werden zuerst Felder wie Quell-IP, Nutzer, Methode und Anwendungsprotokoll aus Rohprotokollnachrichten mithilfe von Grok-Mustern extrahiert. Anschließend werden bestimmte Felder aus den Rohprotokolldaten den entsprechenden Feldern im einheitlichen Datenmodell (Unified Data Model, UDM) zugeordnet, Datentypen werden konvertiert und die Daten werden mit zusätzlichen Labels und Metadaten angereichert, bevor die Ausgabe schließlich im gewünschten UDM-Format strukturiert wird.

Hinweis

  • Sie benötigen eine Google Security Operations-Instanz.
  • Sie benötigen Lese- und Schreibzugriff auf Google Cloud.
  • Sie benötigen erhöhte Zugriffsrechte für Qualys.

Aktivieren Sie die erforderlichen APIs:

  1. Melden Sie sich in der Google Cloud Konsole an.
  2. Gehen Sie zu APIs und Dienste > Bibliothek.
  3. Suchen Sie die folgenden APIs und aktivieren Sie sie:
    • Cloud Functions API
    • Cloud Scheduler API
    • Cloud Pub/Sub (erforderlich, damit Cloud Scheduler Funktionen aufrufen kann)

Google Cloud Storage-Bucket erstellen

  1. Melden Sie sich in der Google Cloud Konsole an.
  2. Rufen Sie die Seite Cloud Storage-Buckets auf.

    Buckets aufrufen

  3. Klicken Sie auf Erstellen.

  4. Konfigurieren Sie den Bucket:

    • 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 Speicherort aus.
    • Wählen Sie eine Speicherklasse für Ihre Daten aus: Wählen Sie entweder eine Standardspeicherklasse für den Bucket oder Autoclass für die automatische Speicherklassenverwaltung aus.
    • Zugriff auf Objekte steuern: 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 je nach Bedarf eine Option aus, z. B. Standard.
  5. Klicken Sie auf Erstellen.

Google Cloud-Dienstkonto erstellen

  1. Melden Sie sich in der Google Cloud Konsole an.
  2. Rufen Sie IAM und Verwaltung > Dienstkonten auf.
  3. Erstellen Sie ein neues Dienstkonto.
  4. Geben Sie ihm einen aussagekräftigen Namen, z. B. qualys-user.
  5. Weisen Sie dem Dienstkonto die Rolle Storage-Objekt-Administrator für den GCS-Bucket zu, den Sie im vorherigen Schritt erstellt haben.
  6. Weisen Sie dem Dienstkonto die Rolle Cloud Functions-Aufrufer zu.
  7. Erstellen Sie einen SSH-Schlüssel für das Dienstkonto.
  8. Laden Sie eine JSON-Schlüsseldatei für das Dienstkonto herunter. Bewahren Sie diese Datei sicher auf.

Optional: Einen speziellen API-Nutzer in Qualys erstellen

  1. Melden Sie sich in der Qualys-Konsole an.
  2. Gehen Sie zu Nutzer.
  3. Klicken Sie auf Neu > Nutzer.
  4. Geben Sie die für den Nutzer erforderlichen Allgemeinen Informationen ein.
  5. Klicken Sie auf den Tab Nutzerrolle.
  6. Das Kästchen API-Zugriff muss für die Rolle ausgewählt sein.
  7. Klicken Sie auf Speichern.

Spezifische Qualys API-URL angeben

Option 1

Geben Sie Ihre URLs wie in der Plattformidentifikation angegeben an.

Option 2

  1. Melden Sie sich in der Qualys-Konsole an.
  2. Gehen Sie zu Hilfe > Info.
  3. Scrollen Sie nach unten zu „Security Operations Center (SOC)“.
  4. Kopieren Sie die URL der Qualys API.

Cloud Function konfigurieren

  1. Rufen Sie in der Google Cloud Console Cloud Functions auf.
  2. Klicken Sie auf Funktion erstellen.
  3. 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 von Ihnen bevorzugte Laufzeit)
    • Trigger: Wählen Sie bei Bedarf einen HTTP-Trigger oder Cloud Pub/Sub für die geplante Ausführung aus.
    • Authentifizierung: Sicher mit Authentifizierung.
    • Code mit einem Inline-Editor schreiben:
    ```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. Klicken Sie nach Abschluss der Konfiguration auf Bereitstellen.

Cloud Scheduler konfigurieren

  1. Rufen Sie in der Google Cloud Console Cloud Scheduler auf.
  2. Klicken Sie auf Job erstellen.
  3. Konfigurieren Sie den Job:

    • 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 eine stündliche Ausführung).
    • Zeitzone: Legen Sie Ihre bevorzugte Zeitzone fest.
    • Triggertyp: Wählen Sie HTTP aus.
    • Trigger-URL: Geben Sie die URL der Cloud Function ein, die Sie nach der Bereitstellung in den Funktionsdetails finden.
    • Methode: Wählen Sie POST aus.
  4. Erstellen Sie den Job.

Feed in Google SecOps konfigurieren, um Qualys-Logs für kontinuierliches Monitoring aufzunehmen

  1. Gehen Sie zu SIEM-Einstellungen > Feeds.
  2. Klicken Sie auf Neu hinzufügen.
  3. Geben Sie im Feld Feedname einen Namen für den Feed ein, z. B. „Qualys Continuous Monitoring Logs“.
  4. Wählen Sie Google Cloud Storage als Quelltyp aus.
  5. Wählen Sie Qualys Continuous Monitoring als Logtyp aus.
  6. Klicken Sie auf Weiter.
  7. Geben Sie Werte für die folgenden Eingabeparameter an:

    • Storage Bucket-URI: Google Cloud  URI der Speicher-Bucket-Quelle.
    • URI ist: Wählen Sie Einzelne Datei aus.
    • Optionen zum Löschen der Quelle: Wählen Sie die gewünschte Löschoption aus.
    • Asset-Namespace: der Asset-Namespace.
    • Aufnahmelabels: Das Label, das auf die Ereignisse aus diesem Feed angewendet werden soll.
  8. Klicken Sie auf Weiter.

  9. 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 von Alert.alertInfo.appVersion zugeordnet
Alert.alertInfo.operatingSystem principal.platform_version Direkt von Alert.alertInfo.operatingSystem zugeordnet
Alert.alertInfo.port additional.fields.value.string_value Direkt von Alert.alertInfo.port zugeordnet und als Schlüssel/Wert-Paar in additional.fields mit dem Schlüssel „Benachrichtigungsport“ hinzugefügt
Alert.alertInfo.protocol network.ip_protocol Direkt von Alert.alertInfo.protocol zugeordnet
Alert.alertInfo.sslIssuer network.tls.client.certificate.issuer Direkt von 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 „Ereignistyp“ hinzugefügt
Alert.hostname principal.hostname Direkt von Alert.hostname zugeordnet
Alert.id security_result.threat_id Direkt von Alert.id zugeordnet
Alert.ipAddress principal.ip Direkt von 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 „Profil-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 Als „QID: “ von Alert.qid zugeordnet
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 „Benachrichtigungsquelle“ hinzugefügt
Alert.triggerUuid metadata.product_log_id Direkt von Alert.triggerUuid zugeordnet
Alert.vulnCategory additional.fields.value.string_value Direkt aus Alert.vulnCategory zugeordnet und in additional.fields als Schlüssel/Wert-Paar mit dem Schlüssel „Vulnerability Category“ 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 von 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“ hinzugefügt
Host principal.ip Aus der Protokollzeile „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 „STATUS_UPDATE“ festlegen, wenn Alert.ipAddress, Alert.hostname oder src_ip vorhanden sind, andernfalls „GENERIC_EVENT“
metadata.event_timestamp Aus den Feldern Alert.eventDate oder timestamp extrahiert. Alert.eventDate wird priorisiert, falls vorhanden, andernfalls wird timestamp verwendet. Der Zeitstempel wird in UTC konvertiert.
metadata.event_type Gleiche Logik wie bei edr.raw_event_name
metadata.log_type Legen Sie den Wert auf „QUALYS_CONTINUOUS_MONITORING“ fest.
metadata.product_name Legen Sie den Wert auf „QUALYS_CONTINUOUS_MONITORING“ fest.
metadata.vendor_name Legen Sie den Wert auf „QUALYS_CONTINUOUS_MONITORING“ fest.
network.application_protocol Aus der Protokollzeile „ /user HTTP" geparst
network.http.method Aus der Protokollzeile „ /user HTTP" geparst
timestamp event.timestamp Aus den Feldern Alert.eventDate oder timestamp extrahiert. Alert.eventDate wird priorisiert, falls vorhanden, andernfalls wird timestamp verwendet. Der Zeitstempel wird in UTC konvertiert.

Änderungen

2022-08-30

  • Neu erstellter Parser.