Qualys Virtual Scanner-Logs erfassen
Dieser Parser wandelt im JSON-Format formatierte Qualys Virtual Scanner-Rohlogs 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.
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)
Google Cloud Storage-Bucket erstellen
- In der Google Cloud Console anmelden
Rufen Sie die Seite Cloud Storage-Buckets auf.
Klicken Sie auf Erstellen.
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 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
- 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 Cloud Storage-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.
- Klicken Sie auf den Tab Nutzerrolle.
- Das Kästchen API-Zugriff muss angeklickt sein.
- Klicken Sie auf Speichern.
Spezifische Qualys API-URL ermitteln
Option 1
Geben Sie Ihre URLs wie unter Plattformerfassung beschrieben an.
Option 2
- Melden Sie sich in der Qualys-Konsole an.
- Gehen Sie zu Hilfe > Info.
- 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-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 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_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 ```
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.
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 (nach der Bereitstellung in den Funktionsdetails zu finden).
- 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 Virtual Scanner Logs (Qualys-Protokolle für virtuelle Scanner).
- Wählen Sie Google Cloud Storage V2 als Quelltyp aus.
- Wählen Sie Qualys Virtual Scanner 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.
- Option 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 |
---|---|---|
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 | Zugeordnet aus dem Feld „DETECTION_LIST.DETECTION.TYPE “. 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 | Zugeordnet aus dem Feld „OS “. Wenn der Wert „windows“ (unabhängig von der Groß- und Kleinschreibung) enthält, wird er „WINDOWS“ zugeordnet. Wenn der String „Linux“ (Groß-/Kleinschreibung wird nicht berücksichtigt) enthalten ist, wird er „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 | Zugeordnet aus dem Feld „TAGS.TAG.TAG_ID “. Dem Wert wird „TAG_ID: “ vorangestellt. |
entity.metadata.collected_timestamp | Der Zeitstempel des Logeintrags. | |
entity.metadata.entity_type | Wird anhand des Felds IP ermittelt. Wenn IP vorhanden ist, wird es auf „IP_ADDRESS“ gesetzt. Andernfalls wird es auf „ASSET“ gesetzt. |
|
entity.metadata.interval.end_time | Hartcodiert auf einen sehr großen Zeitstempelwert (253402300799 Sekunden). | |
entity.metadata.product_name | Fest codiert auf „QUALYS_VIRTUAL_SCANNER“. | |
entity.metadata.vendor_name | Fest codiert auf „QUALYS_VIRTUAL_SCANNER“. | |
entity.relations.entity.resource.resource_type | Wenn CLOUD_SERVICE „VM“ ist, wird „VIRTUAL_MACHINE“ festgelegt. |
|
entity.relations.entity_type | Fest codiert auf „RESOURCE“. | |
entity.relations.relationship | Fest codiert auf „MEMBER“. |
Benötigen Sie weitere Hilfe? Antworten von Community-Mitgliedern und Google SecOps-Experten erhalten