Qualys Continuous Monitoring-Logs erfassen
Dieser Logstash-Parsercode extrahiert zuerst Felder wie Quell-IP, Nutzer, Methode und Anwendungsprotokoll aus Logrohdaten mithilfe von Grok-Mustern. Anschließend werden bestimmte Felder aus den Logrohdaten den entsprechenden Feldern im Unified Data Model (UDM) zugeordnet, Datentypkonvertierungen durchgeführt und die Daten mit zusätzlichen Labels und Metadaten angereichert. Zum Schluss wird die Ausgabe im gewünschten UDM-Format strukturiert.
Hinweis
Prüfen Sie, ob folgende 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)
Storage-Bucket erstellen Google Cloud
- 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-asset-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 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 eine Speicherklasse nach Bedarf aus, z. B. Standard.
Klicken Sie auf Erstellen.
Google Cloud-Dienstkonto erstellen
- In der Google Cloud Console anmelden
- Rufen Sie IAM & Verwaltung > Dienstkonten auf.
- Erstellen Sie ein neues Dienstkonto.
- Geben Sie ihm einen beschreibenden 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: Dedizierten API-Nutzer in Qualys erstellen
- Melden Sie sich in der Qualys-Konsole an.
- Rufen Sie Nutzer auf.
- Klicken Sie auf Neu > Nutzer.
- Geben Sie die für den Nutzer erforderlichen allgemeinen Informationen ein.
- Wählen Sie den Tab Nutzerrolle aus.
- Prüfen Sie, ob das Kästchen API-Zugriff für die Rolle ausgewählt ist.
- Klicken Sie auf Speichern.
Spezifische Qualys API-URL ermitteln
Option 1
Ermitteln Sie Ihre URLs wie in der Plattformidentifikation beschrieben.
Option 2
- Melden Sie sich in der Qualys-Konsole an.
- Rufen Sie Hilfe > Über auf.
- Scrollen Sie, 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.
Konfigurieren Sie die Funktion:
- 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 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_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 ```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-cm-alerts.
- Häufigkeit: Geben Sie den Zeitplan mit der Cron-Syntax an, z. B.
0 * * * *für die Ausführung jede Stunde. - 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 Einzelnen Feed konfigurieren.
- Geben Sie im Feld Feedname einen Namen für den Feed ein, z. B. Qualys Continuous Monitoring-Logs.
- 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: Die Google Cloud Quell-URI des Storage-Buckets.
- Optionen für das Löschen der Quelle: Wählen Sie die Löschoption nach Ihren Wünschen aus.
Klicken Sie auf Weiter.
Prüfen Sie die Konfiguration des neuen Feeds 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 „Alert port“ 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 von 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 von 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 von 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 von 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 von 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 von Alert.eventType zugeordnet und als Schlüssel/Wert-Paar in additional.fields mit dem Schlüssel „Event Type“ 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 von 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 von Alert.profile.title zugeordnet und als Schlüssel/Wert-Paar in additional.fields mit dem Schlüssel „Profile Title“ hinzugefügt |
| Alert.qid | vulnerability.name | Als "QID: Alert.qid |
| Alert.source | additional.fields.value.string_value | Direkt von Alert.source zugeordnet und als Schlüssel/Wert-Paar in additional.fields mit dem Schlüssel „Alert Source“ hinzugefügt |
| Alert.triggerUuid | metadata.product_log_id | Direkt von Alert.triggerUuid zugeordnet |
| Alert.vulnCategory | additional.fields.value.string_value | Direkt von Alert.vulnCategory zugeordnet und als Schlüssel/Wert-Paar in additional.fields mit dem Schlüssel „Vulnerability Category“ hinzugefügt |
| Alert.vulnSeverity | vulnerability.severity | Zuordnung basierend auf dem Wert von Alert.vulnSeverity: 1–3: LOW, 4–6: MEDIUM, 7–8: HIGH |
| Alert.vulnTitle | vulnerability.description | Direkt von Alert.vulnTitle zugeordnet |
| Alert.vulnType | additional.fields.value.string_value | Direkt von 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 Logzeile „Host: |
| edr.client.ip_addresses | Von principal.ip kopiert |
|
| edr.client.hostname | Von principal.hostname 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“ festgelegt | |
| metadata.product_name | Auf „QUALYS_CONTINUOUS_MONITORING“ festgelegt | |
| metadata.vendor_name | Auf „QUALYS_CONTINUOUS_MONITORING“ festgelegt | |
| network.application_protocol | Aus der Logzeile „ |
|
| network.http.method | Aus der Logzeile „ |
|
| 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. |
Änderungsprotokoll
Änderungsprotokoll für diesen Parser ansehen
Benötigen Sie weitere Hilfe? Antworten von Community-Mitgliedern und Google SecOps-Experten erhalten