Raccogliere i log di monitoraggio continuo di Qualys
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:
- Accedi alla Google Cloud console.
- Vai ad API e servizi > Libreria.
- 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
- Accedi alla Google Cloud console.
Vai alla pagina Bucket Cloud Storage.
Fai clic su Crea.
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).
Fai clic su Crea.
Crea un service account Google Cloud
- Accedi alla Google Cloud console.
- Vai a IAM e amministrazione > Service Accounts.
- Crea un nuovo account di servizio.
- Assegna un nome descrittivo (ad esempio qualys-user).
- Concedi al account di servizio il ruolo Storage Object Admin sul bucket GCS creato nel passaggio precedente.
- Concedi al account di servizio il ruolo Invoker di Cloud Functions.
- Crea una chiave SSH per il account di servizio.
- 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
- Accedi alla console Qualys.
- Vai a Utenti.
- Fai clic su Nuovo > Utente.
- Inserisci le informazioni generali richieste per l'utente.
- Seleziona la scheda Ruolo utente.
- Assicurati che la casella di controllo Accesso API sia selezionata per il ruolo.
- Fai clic su Salva.
Identificare l'URL API Qualys specifico
Opzione 1
Identifica i tuoi URL come indicato nell'identificazione della piattaforma.
Opzione 2
- Accedi alla console Qualys.
- Vai ad Aiuto > Informazioni.
- Scorri per visualizzare queste informazioni nella sezione Security Operations Center (SOC).
- Copia l'URL dell'API Qualys.
Configura la Cloud Function
- Vai a Cloud Functions nella console Google Cloud .
- Fai clic su Crea funzione.
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 ```
Fai clic su Esegui il deployment dopo aver completato la configurazione.
Configura Cloud Scheduler
- Vai a Cloud Scheduler nella console Google Cloud .
- Fai clic su Crea job.
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.
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:
- Vai a Impostazioni SIEM > Feed.
- Fai clic su Aggiungi nuovo feed.
- Nella pagina successiva, fai clic su Configura un singolo feed.
- Nel campo Nome feed, inserisci un nome per il feed, ad esempio Qualys Continuous Monitoring Logs.
- Seleziona Google Cloud Storage come Tipo di origine.
- Seleziona Qualys Continuous Monitoring come Tipo di log.
- Fai clic su Avanti.
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.
Fai clic su Avanti.
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: 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 " |
|
network.http.method | Analizzato dalla riga di log " |
|
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.