Raccogliere i log di monitoraggio continuo di Qualys

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. Successivamente, mappa campi specifici dei dati di log non elaborati ai campi corrispondenti in Unified Data Model (UDM), esegue 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 privilegiato a Google Cloud.
  • Accesso con privilegi 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 attivale:
    • API Cloud Functions
    • API Cloud Scheduler
    • Cloud Pub/Sub (necessario 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 seleziona Autoclass per la gestione automatica della classe 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.

Crea un service account Google Cloud

  1. Accedi alla Google Cloud console.
  2. Vai a IAM e amministrazione > Service Accounts.
  3. Crea un nuovo account di servizio.
  4. Assegna un nome descrittivo (ad esempio qualys-user).
  5. Concedi al account di servizio il ruolo Storage Object Admin 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. Conserva questo file in modo 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 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 i tuoi URL come indicato nell'identificazione della piattaforma.

Opzione 2

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

Configura la Cloud Function

  1. Vai a Cloud Functions nella console Google Cloud .
  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 il trigger HTTP, se necessario, o Cloud Pub/Sub per l'esecuzione pianificata.
    • Autenticazione: protetto 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. Fai clic su Esegui il deployment dopo aver completato la configurazione.

Configura Cloud Scheduler

  1. Vai a Cloud Scheduler nella console Google Cloud .
  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 di Cloud Function (disponibile nei dettagli della funzione dopo il deployment).
    • Metodo: scegli POST.
  4. Crea il job.

Configurare i feed

Esistono due diversi punti di accesso per configurare i feed nella piattaforma Google SecOps:

  • Impostazioni SIEM > Feed
  • Hub dei contenuti > Pacchetti di contenuti

Configura i feed da Impostazioni SIEM > 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 Qualys Continuous Monitoring Logs.
  5. Seleziona Google Cloud Storage 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'URI di origine del bucket di archiviazione. Google Cloud
    • URI è un: seleziona Singolo file.
    • Opzioni di eliminazione dell'origine: seleziona l'opzione di eliminazione in base alle tue preferenze.
  9. Fai clic su Avanti.

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

Configurare i feed dall'hub dei contenuti

Specifica i valori per i seguenti campi:

  • URI bucket di archiviazione: l'URI di origine del bucket di archiviazione. Google Cloud
  • URI è un: seleziona Singolo file.
  • Opzioni di eliminazione dell'origine: seleziona l'opzione di eliminazione in base alle tue preferenze.

Opzioni avanzate

  • Nome feed:un valore precompilato che identifica il feed.
  • Tipo di origine:metodo utilizzato per raccogliere i log in Google SecOps.
  • Spazio dei nomi dell'asset:lo spazio dei nomi associato al feed.
  • Etichette di importazione:etichette applicate a tutti gli eventi di questo feed.

Tabella di mappatura UDM

Campo log Mappatura UDM Logic
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 "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 ticket"
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 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 "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 del 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 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 "Categoria vulnerabilità"
Alert.vulnSeverity vulnerability.severity Mappatura eseguita in base al valore di Alert.vulnSeverity: 1-3: BASSO, 4-6: MEDIO, 7-8: ALTO
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 "Tipo di vulnerabilità"
Host principal.ip Analizzato dalla riga di log "Host: "
edr.client.ip_addresses Copiati da principal.ip
edr.client.hostname Copiati 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 in UTC.
metadata.event_type Stessa logica di edr.raw_event_name
metadata.log_type Imposta su "QUALYS_CONTINUOUS_MONITORING"
metadata.product_name Imposta su "QUALYS_CONTINUOUS_MONITORING"
metadata.vendor_name Imposta 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 in UTC.

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