Raccogliere i log di contesto delle risorse Qualys
Questo parser estrae le informazioni sul contesto degli asset dai log JSON di Qualys e le trasforma nel formato UDM. Analizza vari campi come ID, IP, nome host, dettagli delle risorse cloud, sistema operativo e tag, mappandoli ai campi UDM corrispondenti e creando relazioni tra asset e risorse. Il parser gestisce anche una logica specifica per i cloud provider e i sistemi operativi, garantendo una rappresentazione accurata nell'UDM.
Prima di iniziare
Assicurati di disporre dei 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
- 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 Cloud Storage che hai 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-assets.
- Regione: seleziona una regione vicina al tuo bucket.
- 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 # Cloud Storage configuration BUCKET_NAME = "<bucket-name>" FILE_NAME = "qualys_assets.json" # Qualys API credentials QUALYS_USERNAME = "<qualys-username>" QUALYS_PASSWORD = "<qualys-password>" QUALYS_BASE_URL = "https://<qualys_base_url>" def fetch_qualys_assets(): auth = base64.b64encode(f"{QUALYS_USERNAME}:{QUALYS_PASSWORD}".encode()).decode() headers = { "Authorization": f"Basic {auth}", "Content-Type": "application/xml" } payload = """ <ServiceRequest> <filters> <Criteria field="asset.name" operator="LIKE">%</Criteria> </filters> </ServiceRequest> """ response = requests.post(f"{QUALYS_BASE_URL}/qps/rest/2.0/search/am/asset", headers=headers, data=payload) return response.json() def upload_to_gcs(data): client = storage.Client() bucket = client.get_bucket(BUCKET_NAME) blob = bucket.blob(FILE_NAME) blob.upload_from_string(json.dumps(data), content_type="application/json") def main(request): assets = fetch_qualys_assets() upload_to_gcs(assets) return "Data uploaded to Cloud Storage successfully!" ```
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-assets).
- Frequenza: utilizza la sintassi cron per specificare la pianificazione (ad esempio, 0 0 * * * per tutti i giorni a mezzanotte).
- 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
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 Asset Context Logs.
- Seleziona Google Cloud Storage V2 come Tipo di origine.
- Seleziona Qualys Asset Context come Tipo di log.
- Fai clic su Avanti.
Specifica i valori per i seguenti parametri di input:
- URI GCS: l'URI Cloud Storage.
- 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.
Tabella di mappatura UDM
Campo log | Mappatura UDM | Logic |
---|---|---|
ASSET_ID |
entity.entity.asset.asset_id |
Mappato direttamente dal campo ASSET_ID . |
CLOUD_PROVIDER |
entity.relations.entity.resource.resource_subtype |
Mappato direttamente dal campo CLOUD_PROVIDER . |
CLOUD_PROVIDER_TAGS.CLOUD_TAG[].NAME |
entity.relations.entity.resource.attribute.labels.key |
Mappato direttamente dal campo CLOUD_PROVIDER_TAGS.CLOUD_TAG[].NAME . |
CLOUD_PROVIDER_TAGS.CLOUD_TAG[].VALUE |
entity.relations.entity.resource.attribute.labels.value |
Mappato direttamente dal campo CLOUD_PROVIDER_TAGS.CLOUD_TAG[].VALUE . |
CLOUD_RESOURCE_ID |
entity.relations.entity.resource.id |
Mappato direttamente dal campo CLOUD_RESOURCE_ID . |
CLOUD_SERVICE |
entity.relations.entity.resource.resource_type |
Se CLOUD_SERVICE è "VM", il valore viene impostato su "VIRTUAL_MACHINE". |
DNS_DATA.HOSTNAME |
entity.entity.asset.hostname |
Mappato direttamente dal campo DNS_DATA.HOSTNAME . |
EC2_INSTANCE_ID |
entity.relations.entity.resource.product_object_id |
Mappato direttamente dal campo EC2_INSTANCE_ID . |
ID |
entity.entity.asset.product_object_id |
Mappato direttamente dal campo ID . |
IP |
entity.entity.asset.ip |
Mappato direttamente dal campo IP . |
METADATA.AZURE.ATTRIBUTE[].NAME |
entity.relations.entity.resource.attribute.labels.key |
Mappato direttamente dal campo METADATA.AZURE.ATTRIBUTE[].NAME . |
METADATA.AZURE.ATTRIBUTE[].VALUE |
entity.relations.entity.resource.attribute.labels.value |
Mappato direttamente dal campo METADATA.AZURE.ATTRIBUTE[].VALUE . |
OS |
entity.entity.asset.platform_software.platform |
Se OS contiene "windows" (senza distinzione tra maiuscole e minuscole), il valore viene impostato su "WINDOWS". |
TAGS.TAG[].NAME |
entity.relations.entity.resource.attribute.labels.key |
Mappato direttamente dal campo TAGS.TAG[].NAME . |
TAGS.TAG[].TAG_ID |
entity.relations.entity.resource.attribute.labels.value |
Stringa concatenata "TAG_ID: " con il valore di TAGS.TAG[].TAG_ID . Copiato dal campo create_time del log non elaborato. Codificato come "ASSET". Codificato come "QUALYS ASSET CONTEXT". Codificato come "QUALYS ASSET CONTEXT". Codificato come "RESOURCE". Codificato come "MEMBER". Copiato dal campo create_time del log non elaborato. |
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.