Qualys Virtual Scanner-Protokolle erfassen
Dieser Parser wandelt Roh-JSON-formatierte Qualys Virtual Scanner-Protokolle in ein strukturiertes Format um, das dem UDM von Google Security Operations 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
- 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:
- Melden Sie sich in der Google Cloud Konsole an.
- Gehen Sie zu APIs und Dienste > Bibliothek.
- 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
- Melden Sie sich in der Google Cloud Konsole an.
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 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.
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 im vorherigen Schritt erstellten Cloud Storage-Bucket zu.
- 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 speziellen 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 für den Nutzer erforderlichen Allgemeinen Informationen ein.
- Wählen Sie den Tab Nutzerrolle aus.
- Das Kästchen API-Zugriff muss für die Rolle ausgewählt sein.
- Klicken Sie auf Speichern.
Spezifische Qualys API-URL angeben
Option 1
Geben Sie Ihre URLs wie in der Plattformidentifikation angegeben an.
Option 2
- Melden Sie sich in der Qualys-Konsole an.
- Gehen Sie zu Hilfe > Info.
- Scrollen Sie nach unten zu „Security Operations Center (SOC)“.
- Kopieren Sie die URL der Qualys API.
Cloud Function 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: 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_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 Function ein, die Sie nach der Bereitstellung in den Funktionsdetails finden.
- Methode: Wählen Sie POST aus.
Erstellen Sie den Job.
Feed in Google SecOps konfigurieren, um Qualys Virtual Scanner-Logs aufzunehmen
- Gehen Sie zu SIEM-Einstellungen > Feeds.
- Klicken Sie auf Neu hinzufügen.
- Geben Sie im Feld Feedname einen Namen für den Feed ein, z. B. „Qualys Virtual Scanner Logs“.
- Wählen Sie Google Cloud Storage als Quelltyp aus.
- Wählen Sie als Logtyp Qualys Virtual Scanner aus.
- Klicken Sie auf Weiter.
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.
- Option zum Löschen der Quelle: Wählen Sie die gewünschte Option aus.
- Asset-Namespace: der Asset-Namespace.
- Aufnahmelabels: Das Label, das auf die Ereignisse aus diesem Feed angewendet werden soll.
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 einen Zeitstempel umgewandelt. |
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 „MALS_GEFUNDEN“ 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 „MALS_WIEDERHERÖFFNET“ hartcodiert. |
DETECTION_LIST.DETECTION.TYPE | entity.metadata.threat.severity | Aus dem Feld DETECTION_LIST.DETECTION.TYPE zugeordnet. Wenn der Wert „info“ ist (Groß- und Kleinschreibung wird nicht berücksichtigt), wird er „INFORMATIONSWEISEND“ 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 einen Zeitstempel umgewandelt. |
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“ enthält (Groß- und Kleinschreibung wird nicht berücksichtigt), wird er „WINDOWS“ zugeordnet. Wenn der String „Linux“ enthält (Groß-/Kleinschreibung wird nicht berücksichtigt), wird ihm „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 das Präfix „TAG_ID: " vorangestellt. |
entity.metadata.collected_timestamp | Der Zeitstempel des Logeintrags. | |
entity.metadata.entity_type | Wird anhand des Vorhandenseins des Felds IP ermittelt. Wenn IP vorhanden ist, wird es auf „IP_ADDRESS“ festgelegt. Andernfalls ist es auf „ASSET“ gesetzt. |
|
entity.metadata.interval.end_time | Hartcodiert auf einen sehr großen Zeitstempelwert (253402300799 Sekunden). | |
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“ festgelegt. |
|
entity.relations.entity_type | Hartcodiert auf „RESOURCE“. | |
entity.relations.relationship | Hartcodiert auf „MEMBER“. |
Änderungen
2023-08-21
- Der Wert „detection.UNIQUE_VULN_ID“ aus dem ursprünglichen Log wurde dem Feld „threat.detection_fields“ im UDM zugeordnet.
2023-07-31
- Neu erstellter Parser.