Raccogliere i log di Qualys Continuous Monitoring

Supportato in:

Questo codice del parser Logstash estrae innanzitutto campi come IP di origine, utente, metodo e protocollo dell'applicazione dai messaggi di log non elaborati utilizzando i pattern Grok. Poi mappa campi specifici dai dati non elaborati dei log ai campi corrispondenti nel modello di dati unificato (UDM), esegue conversioni di tipo di dati e arricchisce i dati con etichette e metadati aggiuntivi prima di strutturare l'output nel formato UDM desiderato.

Prima di iniziare

  • Assicurati di avere un'istanza Google Security Operations.
  • Assicurati di disporre dell'accesso con privilegi a Google Cloud.
  • Assicurati di disporre dell'accesso privilegiato a Qualys.

Abilita le API richieste:

  1. Accedi alla Google Cloud console.
  2. Vai ad API e servizi > Libreria.
  3. Cerca le seguenti API e abilitale:
    • API Cloud Functions
    • API Cloud Scheduler
    • Cloud Pub/Sub (obbligatorio per Cloud Scheduler per richiamare le funzioni)

Crea un Google Cloud bucket di archiviazione

  1. Accedi alla Google Cloud console.
  2. Vai alla pagina Bucket Cloud Storage.

    Vai a Bucket

  3. Fai clic su Crea.

  4. Configura il bucket:

    • Nome: inserisci un nome univoco che soddisfi i requisiti per i nomi dei bucket (ad esempio qualys-asset-bucket).
    • Scegli dove archiviare i tuoi dati: seleziona una località.
    • Scegli una classe di archiviazione per i tuoi dati: seleziona una classe di archiviazione predefinita per il bucket oppure Autoclass per la gestione automatica delle classi di archiviazione.
    • Scegli come controllare l'accesso agli oggetti: seleziona No per applicare la prevenzione dell'accesso pubblico e seleziona un modello di controllo dell'accesso per gli oggetti del bucket.
    • Classe di archiviazione: scegli in base alle tue esigenze (ad esempio Standard).
  5. Fai clic su Crea.

Creare un account di servizio Google Cloud

  1. Accedi alla Google Cloud console.
  2. Vai a IAM e amministrazione > Account di servizio.
  3. Crea un nuovo account di servizio.
  4. Assegna un nome descrittivo (ad esempio qualys-user).
  5. Concedi all'account di servizio il ruolo Amministratore oggetti archiviazione nel bucket GCS creato nel passaggio precedente.
  6. Concedi all'account di servizio il ruolo Invoker di Cloud Functions.
  7. Crea una chiave SSH per l'account di servizio.
  8. Scarica un file della chiave JSON per l'account di servizio. Tieni questo file al sicuro.

(Facoltativo) Crea un utente API dedicato in Qualys

  1. Accedi alla console Qualys.
  2. Vai a Utenti.
  3. Fai clic su Nuovo > Utente.
  4. Inserisci le Informazioni generali richieste per l'utente.
  5. Seleziona la scheda Ruolo utente.
  6. Assicurati che per il ruolo sia selezionata la casella di controllo Accesso API.
  7. Fai clic su Salva.

Identifica l'URL API Qualys specifico

Opzione 1

Identifica i tuoi URL come indicato nell'identificazione della piattaforma.

Opzione 2

  1. Accedi alla console Qualys.
  2. Vai a Guida > Informazioni.
  3. Scorri per visualizzare queste informazioni in Security Operations Center (SOC).
  4. Copia l'URL dell'API Qualys.

Configura la Cloud Function

  1. Vai a Cloud Functions nella Google Cloud console.
  2. Fai clic su Crea funzione.
  3. Configura la funzione:

    • Nome: inserisci un nome per la funzione (ad esempio fetch-qualys-cm-alerts).
    • Regione: seleziona una regione vicina al tuo bucket.
    • Runtime: Python 3.10 (o il runtime che preferisci).
    • Trigger: scegli l'attivatore HTTP, se necessario, o Cloud Pub/Sub per l'esecuzione pianificata.
    • Autenticazione: per la sicurezza, utilizza l'autenticazione.
    • Scrivi il codice con un editor in linea:
    ```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. Fai clic su Esegui il deployment dopo aver completato la configurazione.

Configura Cloud Scheduler

  1. Vai a Cloud Scheduler nella Google Cloud console.
  2. Fai clic su Crea job.
  3. Configura il job:

    • Nome: inserisci un nome per il job (ad esempio trigger-fetch-qualys-cm-alerts).
    • Frequenza: utilizza la sintassi cron per specificare la pianificazione (ad esempio 0 * * * * per l'esecuzione ogni ora).
    • Fuso orario: imposta il fuso orario che preferisci.
    • Tipo di trigger: scegli HTTP.
    • URL attivatore: inserisci l'URL della Cloud Function (che puoi trovare nei dettagli della funzione dopo il deployment).
    • Metodo: scegli POST.
  4. Crea il job.

Configura un feed in Google SecOps per importare i log di Qualys Continuous Monitoring

  1. Vai a Impostazioni SIEM > Feed.
  2. Fai clic su Aggiungi nuova.
  3. Nel campo Nome feed, inserisci un nome per il feed (ad esempio Log di monitoraggio continuo Qualys).
  4. Seleziona Google Cloud Storage come Tipo di origine.
  5. Seleziona Monitoraggio continuo Qualys come Tipo di log.
  6. Fai clic su Avanti.
  7. Specifica i valori per i seguenti parametri di input:

    • URI bucket di archiviazione: l' Google Cloud URI di origine del bucket di archiviazione.
    • L'URI è un: seleziona File singolo.
    • Opzioni di eliminazione dell'origine: seleziona l'opzione di eliminazione in base alle tue preferenze.
    • Spazio dei nomi degli asset: lo spazio dei nomi degli asset.
    • Etichette di importazione: l'etichetta da applicare agli eventi di questo feed.
  8. Fai clic su Avanti.

  9. Rivedi la configurazione del nuovo feed nella schermata Concludi e poi fai clic su Invia.

Tabella di mappatura UDM

Campo log Mappatura UDM Logica
Alert.alertInfo.appVersion metadata.product_version Mappata direttamente da Alert.alertInfo.appVersion
Alert.alertInfo.operatingSystem principal.platform_version Mappata direttamente da Alert.alertInfo.operatingSystem
Alert.alertInfo.port additional.fields.value.string_value Mappato direttamente da Alert.alertInfo.port e aggiunto come coppia chiave-valore in additional.fields con la chiave "Porta avviso"
Alert.alertInfo.protocol network.ip_protocol Mappata direttamente da Alert.alertInfo.protocol
Alert.alertInfo.sslIssuer network.tls.client.certificate.issuer Mappata direttamente da Alert.alertInfo.sslIssuer
Alert.alertInfo.sslName additional.fields.value.string_value Mappato direttamente da Alert.alertInfo.sslName e aggiunto come coppia chiave-valore in additional.fields con la chiave "Nome SSL"
Alert.alertInfo.sslOrg additional.fields.value.string_value Mappato direttamente da Alert.alertInfo.sslOrg e aggiunto come coppia chiave-valore in additional.fields con la chiave "SSL Org"
Alert.alertInfo.ticketId additional.fields.value.string_value Mappato direttamente da Alert.alertInfo.ticketId e aggiunto come coppia chiave-valore in additional.fields con la chiave "ID richiesta"
Alert.alertInfo.vpeConfidence additional.fields.value.string_value Mappato direttamente da Alert.alertInfo.vpeConfidence e aggiunto come coppia chiave-valore in additional.fields con la chiave "VPE Confidence"
Alert.alertInfo.vpeStatus additional.fields.value.string_value Mappato direttamente da Alert.alertInfo.vpeStatus e aggiunto come coppia chiave-valore in additional.fields con la chiave "VPE Confidence"
Alert.eventType additional.fields.value.string_value Mappato direttamente da Alert.eventType e aggiunto come coppia chiave-valore in additional.fields con la chiave "Tipo di evento"
Alert.hostname principal.hostname Mappata direttamente da Alert.hostname
Alert.id security_result.threat_id Mappata direttamente da Alert.id
Alert.ipAddress principal.ip Mappata direttamente da Alert.ipAddress
Alert.profile.id additional.fields.value.string_value Mappato direttamente da Alert.profile.id e aggiunto come coppia chiave-valore in additional.fields con la chiave "ID profilo"
Alert.profile.title additional.fields.value.string_value Mappato direttamente da Alert.profile.title e aggiunto come coppia chiave-valore in additional.fields con la chiave "Titolo profilo"
Alert.qid vulnerability.name Mappato come "QID: " da Alert.qid
Alert.source additional.fields.value.string_value Mappato direttamente da Alert.source e aggiunto come coppia chiave-valore in additional.fields con la chiave "Origine avviso"
Alert.triggerUuid metadata.product_log_id Mappata direttamente da Alert.triggerUuid
Alert.vulnCategory additional.fields.value.string_value Mappato direttamente da Alert.vulnCategory e aggiunto come coppia chiave-valore in additional.fields con la chiave "Vulnerability Category"
Alert.vulnSeverity vulnerability.severity Mappatura in base al valore di Alert.vulnSeverity: 1-3: BASSO, 4-6: MEDIO, 7-8: ALTO
Alert.vulnTitle vulnerability.description Mappata direttamente da Alert.vulnTitle
Alert.vulnType additional.fields.value.string_value Mappato direttamente da Alert.vulnType e aggiunto come coppia chiave-valore in additional.fields con la chiave "Tipo di vulnerabilità"
Host principal.ip Analizzata dalla riga di log "Host: "
edr.client.ip_addresses Copiati da principal.ip
edr.client.hostname Copiati da principal.hostname
edr.raw_event_name Imposta su "STATUS_UPDATE" se sono presenti Alert.ipAddress, Alert.hostname o src_ip, altrimenti imposta su "GENERIC_EVENT"
metadata.event_timestamp Estratte dai campi Alert.eventDate o timestamp. Viene data la priorità a Alert.eventDate se esiste, altrimenti viene utilizzato timestamp. Il timestamp viene convertito in UTC.
metadata.event_type Stessa logica di edr.raw_event_name
metadata.log_type Impostato su "QUALYS_CONTINUOUS_MONITORING"
metadata.product_name Impostato su "QUALYS_CONTINUOUS_MONITORING"
metadata.vendor_name Impostato su "QUALYS_CONTINUOUS_MONITORING"
network.application_protocol Analizzata dalla riga di log " /user HTTP"
network.http.method Analizzata dalla riga di log " /user HTTP"
timestamp event.timestamp Estratte dai campi Alert.eventDate o timestamp. Viene data la priorità a Alert.eventDate se esiste, altrimenti viene utilizzato timestamp. Il timestamp viene convertito in UTC.

Modifiche

2022-08-30

  • Parser appena creato.