Qualys Virtual Scanner-Logs erfassen

Unterstützt in:

Dieser Parser wandelt unformatierte JSON-formatierte Qualys Virtual Scanner-Logs in ein strukturiertes Format um, das dem Google Security Operations-UDM entspricht. Es werden relevante Felder wie Asset-Informationen, Scandetails und erkannte Sicherheitslücken extrahiert und den entsprechenden UDM-Feldern zugeordnet, um eine einheitliche Darstellung und Analyse zu ermöglichen.

Hinweis

Folgende Voraussetzungen müssen erfüllt sein:

  • Google Security Operations-Instanz
  • Privilegierter Zugriff auf Google Cloud.
  • Privilegierter Zugriff auf Qualys.

Erforderliche APIs aktivieren:

  1. In der Google Cloud Console anmelden
  2. Rufen Sie APIs und Dienste > Bibliothek auf.
  3. 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)

Google Cloud -Storage-Bucket erstellen

  1. In der Google Cloud Console anmelden
  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-vscanner-bucket).
    • Speicherort für Daten auswählen: Wählen Sie einen Standort aus.
    • Speicherklasse für Daten auswählen: 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 aus, dass die Verhinderung des öffentlichen Zugriffs nicht erzwungen werden soll, und wählen Sie ein Zugriffssteuerungsmodell für die Objekte Ihres Buckets aus.
    • Speicherklasse: Wählen Sie die Speicherklasse nach Ihren Anforderungen aus (z. B. Standard).
  5. Klicken Sie auf Erstellen.

Google Cloud-Dienstkonto erstellen

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

Optional: Dedizierten 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 erforderlichen allgemeinen Informationen für den Nutzer ein.
  5. Wählen Sie den Tab Nutzerrolle aus.
  6. Achten Sie darauf, dass für die Rolle das Kästchen API-Zugriff aktiviert ist.
  7. Klicken Sie auf Speichern.

Spezifische Qualys API-URL ermitteln

Option 1

Geben Sie Ihre URLs wie in der Plattformidentifikation beschrieben an.

Option 2

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

Cloud Functions-Funktion konfigurieren

  1. Rufen Sie in der Google Cloud Console Cloud Functions auf.
  2. Klicken Sie auf Funktion erstellen.
  3. Konfigurieren Sie die Funktion:

    • Name: Geben Sie einen Namen für die Funktion ein (z. B. fetch-qualys-vscanner).
    • Region: Wählen Sie eine Region in der Nähe Ihres Buckets aus.
    • 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 schreiben mit einem Inline-Editor:
    ```python
    from google.cloud import storage
    import requests
    import base64
    import json
    
    # Google Cloud Storage Configuration
    BUCKET_NAME = "<bucket-name>"
    FILE_NAME = "qualys_virtual_scanners.json"
    
    # Qualys API Credentials
    QUALYS_USERNAME = "qualys-username"
    QUALYS_PASSWORD = "<qualys-password>"
    QUALYS_BASE_URL = "https://<qualys_base_url>"  # for example, https://qualysapi.qualys.com
    
    def fetch_virtual_scanners():
        """Fetch Virtual Scanner details from Qualys."""
        auth = base64.b64encode(f"{QUALYS_USERNAME}:{QUALYS_PASSWORD}".encode()).decode()
        headers = {
            "Authorization": f"Basic {auth}",
            "Content-Type": "application/xml"
        }
        url = f"{QUALYS_BASE_URL}/api/2.0/fo/scanner/"
        payload = {
            "action": "list",
            "scanner_type": "virtual"
        }
        response = requests.post(url, headers=headers, data=payload)
        response.raise_for_status()
        return response.text  # Qualys API returns XML data
    
    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(data, content_type="application/xml")
    
    def main(request):
        """Cloud Function entry point."""
        try:
            scanners = fetch_virtual_scanners()
            upload_to_gcs(scanners)
            return "Qualys Virtual Scanners data 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-vscanner).
    • Häufigkeit: Verwenden Sie die cron-Syntax, um den Zeitplan anzugeben (z. B. 0 0 * * * für täglich um Mitternacht).
    • Zeitzone: Legen Sie Ihre bevorzugte Zeitzone fest.
    • Triggertyp: Wählen Sie HTTP aus.
    • Trigger-URL: Geben Sie die URL der Cloud Functions-Funktion ein (zu finden in den Funktionsdetails nach der Bereitstellung).
    • Methode: Wählen Sie POST aus.
  4. Erstellen Sie den Job.

Feeds einrichten

So konfigurieren Sie einen Feed:

  1. Rufen Sie die Einstellungen > Datenverwaltung > Feeds auf. Wenn Sie eine reine SIEM-Plattform verwenden, rufen Sie die Einstellungen > Feeds auf.
  2. Klicken Sie auf Neuen Feed hinzufügen.
  3. Klicken Sie auf der nächsten Seite auf Einzelnen Feed konfigurieren.
  4. Geben Sie im Feld Feedname einen Namen für den Feed ein, z. B. Qualys Virtual Scanner-Logs.
  5. Wählen Sie Google Cloud Storage V2 als Quelltyp aus.
  6. Wählen Sie Qualys Virtual Scanner als Logtyp aus.
  7. Klicken Sie auf Weiter.
  8. Geben Sie Werte für die folgenden Eingabeparameter an:

    • Storage-Bucket-URI: Der Quell-URI des Google Cloud Storage-Buckets.
    • Option zum Löschen der Quelle: Wählen Sie die gewünschte Löschoption aus.
  9. Klicken Sie auf Weiter.

  10. Prüfen Sie die neue Feedkonfiguration auf dem Bildschirm Abschließen und klicken Sie dann auf Senden.

UDM-Zuordnungstabelle

Logfeld UDM-Zuordnung Logik
ASSET_ID entity.entity.asset.asset_id Direkte Zuordnung aus dem Feld ASSET_ID.
CLOUD_PROVIDER_TAGS.CLOUD_TAG.NAME entity.relations.entity.resource.attribute.labels.key Direkte Zuordnung aus dem Feld CLOUD_PROVIDER_TAGS.CLOUD_TAG.NAME.
CLOUD_PROVIDER_TAGS.CLOUD_TAG.VALUE entity.relations.entity.resource.attribute.labels.value Direkte Zuordnung aus dem Feld CLOUD_PROVIDER_TAGS.CLOUD_TAG.VALUE.
CLOUD_RESOURCE_ID entity.relations.entity.resource.id Direkte Zuordnung aus dem Feld CLOUD_RESOURCE_ID.
DETECTION_LIST.DETECTION.FIRST_FOUND_DATETIME entity.metadata.threat.first_discovered_time Direkte Zuordnung aus dem Feld DETECTION_LIST.DETECTION.FIRST_FOUND_DATETIME, in Zeitstempel konvertiert.
DETECTION_LIST.DETECTION.FIRST_REOPENED_DATETIME entity.metadata.threat.detection_fields.value Direkte Zuordnung aus dem Feld DETECTION_LIST.DETECTION.FIRST_REOPENED_DATETIME. Der Schlüssel ist als „FIRST_REOPENED_DATETIME“ hartcodiert.
DETECTION_LIST.DETECTION.IS_DISABLED entity.metadata.threat.detection_fields.value Direkte Zuordnung aus dem Feld DETECTION_LIST.DETECTION.IS_DISABLED. Der Schlüssel ist als „IS_DISABLED“ hartcodiert.
DETECTION_LIST.DETECTION.LAST_FIXED_DATETIME entity.metadata.threat.detection_fields.value Direkte Zuordnung aus dem Feld DETECTION_LIST.DETECTION.LAST_FIXED_DATETIME. Der Schlüssel ist als „LAST_FIXED_DATETIME“ hartcodiert.
DETECTION_LIST.DETECTION.LAST_FOUND_DATETIME entity.metadata.threat.detection_fields.value Direkte Zuordnung aus dem Feld DETECTION_LIST.DETECTION.LAST_FOUND_DATETIME. Der Schlüssel ist als „LAST_FOUND_DATETIME“ hartcodiert.
DETECTION_LIST.DETECTION.LAST_PROCESSED_DATETIME entity.metadata.threat.detection_fields.value Direkte Zuordnung aus dem Feld DETECTION_LIST.DETECTION.LAST_PROCESSED_DATETIME. Der Schlüssel ist als „LAST_PROCESSED_DATETIME“ hartcodiert.
DETECTION_LIST.DETECTION.LAST_REOPENED_DATETIME entity.metadata.threat.detection_fields.value Direkte Zuordnung aus dem Feld DETECTION_LIST.DETECTION.LAST_REOPENED_DATETIME. Der Schlüssel ist als „LAST_REOPENED_DATETIME“ hartcodiert.
DETECTION_LIST.DETECTION.LAST_TEST_DATETIME entity.metadata.threat.detection_fields.value Direkte Zuordnung aus dem Feld DETECTION_LIST.DETECTION.LAST_TEST_DATETIME. Der Schlüssel ist als „LAST_TEST_DATETIME“ hartcodiert.
DETECTION_LIST.DETECTION.LAST_UPDATE_DATETIME entity.metadata.threat.detection_fields.value Direkte Zuordnung aus dem Feld DETECTION_LIST.DETECTION.LAST_UPDATE_DATETIME. Der Schlüssel ist als „LAST_UPDATE_DATETIME“ hartcodiert.
DETECTION_LIST.DETECTION.PORT entity.metadata.threat.detection_fields.value Direkte Zuordnung aus dem Feld DETECTION_LIST.DETECTION.PORT. Der Schlüssel ist als „PORT“ hartcodiert.
DETECTION_LIST.DETECTION.PROTOCOL entity.metadata.threat.detection_fields.value Direkte Zuordnung aus dem Feld DETECTION_LIST.DETECTION.PROTOCOL. Der Schlüssel ist als „PROTOCOL“ hartcodiert.
DETECTION_LIST.DETECTION.QID entity.metadata.threat.detection_fields.value Direkte Zuordnung aus dem Feld DETECTION_LIST.DETECTION.QID. Der Schlüssel ist als „QID“ hartcodiert.
DETECTION_LIST.DETECTION.RESULTS entity.metadata.threat.summary Direkte Zuordnung aus dem Feld DETECTION_LIST.DETECTION.RESULTS.
DETECTION_LIST.DETECTION.SEVERITY entity.metadata.threat.severity_details Direkte Zuordnung aus dem Feld DETECTION_LIST.DETECTION.SEVERITY.
DETECTION_LIST.DETECTION.SSL entity.metadata.threat.detection_fields.value Direkte Zuordnung aus dem Feld DETECTION_LIST.DETECTION.SSL. Der Schlüssel ist als „SSL“ hartcodiert.
DETECTION_LIST.DETECTION.STATUS entity.metadata.threat.detection_fields.value Direkte Zuordnung aus dem Feld DETECTION_LIST.DETECTION.STATUS. Der Schlüssel ist als „STATUS“ hartcodiert.
DETECTION_LIST.DETECTION.TIMES_FOUND entity.metadata.threat.detection_fields.value Direkte Zuordnung aus dem Feld DETECTION_LIST.DETECTION.TIMES_FOUND. Der Schlüssel ist als „TIMES_FOUND“ hartcodiert.
DETECTION_LIST.DETECTION.TIMES_REOPENED entity.metadata.threat.detection_fields.value Direkte Zuordnung aus dem Feld DETECTION_LIST.DETECTION.TIMES_REOPENED. Der Schlüssel ist als „TIMES_REOPENED“ hartcodiert.
DETECTION_LIST.DETECTION.TYPE entity.metadata.threat.severity Aus dem Feld „DETECTION_LIST.DETECTION.TYPE“ zugeordnet. Wenn der Wert „info“ (Groß-/Kleinschreibung wird nicht berücksichtigt) ist, wird er „INFORMATIONAL“ zugeordnet. Andernfalls wird es als Erkennungsfeld mit dem Schlüssel „TYPE“ hinzugefügt.
DETECTION_LIST.DETECTION.UNIQUE_VULN_ID entity.metadata.threat.detection_fields.value Direkte Zuordnung aus dem Feld DETECTION_LIST.DETECTION.UNIQUE_VULN_ID. Der Schlüssel ist als „UNIQUE_VULN_ID“ hartcodiert.
DNS entity.entity.asset.hostname Wird aus dem Feld DNS zugeordnet, wenn DNS_DATA.HOSTNAME leer ist.
DNS_DATA.HOSTNAME entity.entity.asset.hostname Direkte Zuordnung aus dem Feld DNS_DATA.HOSTNAME.
EC2_INSTANCE_ID entity.relations.entity.resource.product_object_id Direkte Zuordnung aus dem Feld EC2_INSTANCE_ID.
ID entity.entity.asset.product_object_id Direkte Zuordnung aus dem Feld ID.
ID entity.metadata.product_entity_id Direkte Zuordnung aus dem Feld ID.
IP-Adresse entity.entity.ip Direkte Zuordnung aus dem Feld IP.
LAST_SCAN_DATETIME entity.metadata.interval.start_time Direkte Zuordnung aus dem Feld LAST_SCAN_DATETIME, in Zeitstempel konvertiert.
METADATA.AZURE.ATTRIBUTE.NAME entity.relations.entity.resource.attribute.labels.key Direkte Zuordnung aus dem Feld METADATA.AZURE.ATTRIBUTE.NAME.
METADATA.AZURE.ATTRIBUTE.VALUE entity.relations.entity.resource.attribute.labels.value Direkte Zuordnung aus dem Feld METADATA.AZURE.ATTRIBUTE.VALUE.
Betriebssystem entity.entity.asset.platform_software.platform Aus dem Feld „OS“ zugeordnet. Wenn der Wert „windows“ (Groß-/Kleinschreibung wird nicht berücksichtigt) enthält, wird er „WINDOWS“ zugeordnet. Wenn es „Linux“ (Groß-/Kleinschreibung wird nicht berücksichtigt) enthält, wird es „LINUX“ zugeordnet.
TAGS.TAG.NAME entity.relations.entity.resource.attribute.labels.key Direkte Zuordnung aus dem Feld TAGS.TAG.NAME.
TAGS.TAG.TAG_ID entity.relations.entity.resource.attribute.labels.value Aus dem Feld „TAGS.TAG.TAG_ID“ zugeordnet. Dem Wert wird „TAG_ID: “ vorangestellt.
entity.metadata.collected_timestamp Der Zeitstempel des Logeintrags.
entity.metadata.entity_type Wird anhand des Vorhandenseins des Felds IP bestimmt. Wenn IP vorhanden ist, wird es auf „IP_ADDRESS“ gesetzt. Andernfalls wird er auf „ASSET“ gesetzt.
entity.metadata.interval.end_time Auf einen sehr großen Zeitstempelwert (253.402.300.799 Sekunden) hartcodiert.
entity.metadata.product_name Hartcodiert auf „QUALYS_VIRTUAL_SCANNER“.
entity.metadata.vendor_name Hartcodiert auf „QUALYS_VIRTUAL_SCANNER“.
entity.relations.entity.resource.resource_type Wenn CLOUD_SERVICE „VM“ ist, wird es auf „VIRTUAL_MACHINE“ gesetzt.
entity.relations.entity_type Hartcodiert auf „RESOURCE“.
entity.relations.relationship Hartcodiert auf „MEMBER“.

Änderungsprotokoll

Änderungsprotokoll für diesen Parser ansehen

Benötigen Sie weitere Hilfe? Antworten von Community-Mitgliedern und Google SecOps-Experten erhalten