Raccogliere i log di Qualys Continuous Monitoring

Supportato in:

Questo codice del parser Logstash estrae innanzitutto i campi, come IP di origine, utente, metodo e protocollo dell'applicazione, dai messaggi di log non elaborati utilizzando i pattern grok. Quindi, esegue il mapping di campi specifici dai dati di log non elaborati ai campi corrispondenti in Unified Data Model (UDM), esegue le conversioni dei tipi 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 soddisfare i seguenti prerequisiti:

  • Istanza Google Security Operations.
  • Accesso con privilegi a Google Cloud.
  • Accesso con privilegi a Qualys.

Abilitare 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)

Creare un bucket di archiviazione Google Cloud

  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 del nome del bucket (ad esempio, qualys-asset-bucket).
    • Scegli dove archiviare i dati: seleziona una località.
    • Scegli una classe di archiviazione per i tuoi dati: seleziona una classe di archiviazione predefinita per il bucket oppure seleziona Autoclass per la gestione automatica della classe di archiviazione.
    • Scegli come controllare l'accesso agli oggetti: seleziona non 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 > Service account.
  3. Crea un nuovo account di servizio.
  4. Assegna un nome descrittivo (ad esempio, qualys-user).
  5. Concedi al account di servizio il ruolo Amministratore oggetti Storage sul bucket GCS creato nel passaggio precedente.
  6. Concedi al account di servizio il ruolo Invoker di Cloud Functions.
  7. Crea una chiave SSH per il account di servizio.
  8. Scarica un file della chiave JSON per il account di servizio. Mantieni questo file al sicuro.

(Facoltativo) Creare 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 la casella di controllo Accesso API sia selezionata per il ruolo.
  7. Fai clic su Salva.

Identificare l'URL API Qualys specifico

Opzione 1

Identifica gli 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.

Configurare 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 bucket.
    • Runtime: Python 3.10 (o il runtime che preferisci).
    • Trigger: scegli il trigger HTTP, se necessario, o Cloud Pub/Sub per l'esecuzione pianificata.
    • Autenticazione: proteggi con l'autenticazione.
    • Scrivi il codice con un editor incorporato:
    ```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. Al termine della configurazione, fai clic su Esegui il deployment.

Configurare 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 trigger: inserisci l'URL della Cloud Function (che si trova nei dettagli della funzione dopo il deployment).
    • Metodo: scegli POST.
  4. Crea il job.

Configurare i feed

Per configurare un feed:

  1. Vai a Impostazioni SIEM > Feed.
  2. Fai clic su Aggiungi nuovo feed.
  3. Nella pagina successiva, fai clic su Configura un singolo feed.
  4. Nel campo Nome feed, inserisci un nome per il feed, ad esempio Log di Qualys Continuous Monitoring.
  5. Seleziona Google Cloud Storage V2 come Tipo di origine.
  6. Seleziona Qualys Continuous Monitoring come Tipo di log.
  7. Fai clic su Avanti.
  8. Specifica i valori per i seguenti parametri di input:

    • URI bucket di archiviazione: l' Google Cloud URI di origine del bucket di archiviazione.
    • Opzioni di eliminazione dell'origine: seleziona l'opzione di eliminazione in base alle tue preferenze.
  9. Fai clic su Avanti.

  10. Esamina la nuova configurazione del feed nella schermata Finalizza e poi fai clic su Invia.

Tabella di mapping UDM

Campo log Mapping UDM Funzione logica
Alert.alertInfo.appVersion metadata.product_version Mappato direttamente da Alert.alertInfo.appVersion
Alert.alertInfo.operatingSystem principal.platform_version Mappato 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 "Alert port"
Alert.alertInfo.protocol network.ip_protocol Mappato direttamente da Alert.alertInfo.protocol
Alert.alertInfo.sslIssuer network.tls.client.certificate.issuer Mappato 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 "SSL Name"
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 "Ticket Id"
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 "Event Type"
Alert.hostname principal.hostname Mappato direttamente da Alert.hostname
Alert.id security_result.threat_id Mappato direttamente da Alert.id
Alert.ipAddress principal.ip Mappato 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 "Profile Id"
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 "Profile Title"
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 "Alert Source"
Alert.triggerUuid metadata.product_log_id Mappato 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 Mappato in base al valore di Alert.vulnSeverity: 1-3: LOW, 4-6: MEDIUM, 7-8: HIGH
Alert.vulnTitle vulnerability.description Mappato 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 "Vulnerability Type"
Host principal.ip Analizzato dalla riga di log "Host: "
edr.client.ip_addresses Copiato da principal.ip
edr.client.hostname Copiato da principal.hostname
edr.raw_event_name Impostato su "STATUS_UPDATE" se sono presenti Alert.ipAddress, Alert.hostname o src_ip, altrimenti impostato su "GENERIC_EVENT"
metadata.event_timestamp Estratto dai campi Alert.eventDate o timestamp. Se esiste, viene data la priorità a Alert.eventDate, altrimenti viene utilizzato timestamp. Il timestamp viene convertito nel fuso orario 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 Analizzato dalla riga di log " /user HTTP"
network.http.method Analizzato dalla riga di log " /user HTTP"
timestamp event.timestamp Estratto dai campi Alert.eventDate o timestamp. Se esiste, viene data la priorità a Alert.eventDate, altrimenti viene utilizzato timestamp. Il timestamp viene convertito nel fuso orario UTC.

Log delle modifiche

Visualizza il log delle modifiche per questo parser

Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.