Raccogli i log di Qualys Virtual Scanner

Supportata in:

Questo parser trasforma i log di Qualys Virtual Scanner non elaborati in formato JSON in un formato strutturato conforme all'UDM di Google Security Operations. Estrae i campi pertinenti, come le informazioni sugli asset, i dettagli della scansione e le vulnerabilità rilevate, mappandoli ai campi UDM corrispondenti per una rappresentazione e un'analisi coerenti.

Prima di iniziare

Assicurati di soddisfare i seguenti prerequisiti:

  • Istanza Google Security Operations.
  • Accesso privilegiato a Google Cloud.
  • Accesso privilegiato a Qualys.

Abilita le API richieste:

  1. Accedi alla console Google Cloud .
  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 consentire a Cloud Scheduler di richiamare le funzioni)

Crea un bucket di archiviazione Google Cloud

  1. Accedi alla console Google Cloud .
  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-vscanner-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 o 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. Vai a IAM e amministrazione > Service account.
  2. Crea un nuovo account di servizio.
  3. Assegna un nome descrittivo (ad esempio qualys-user).
  4. Concedi al account di servizio il ruolo Storage Object Admin sul bucket Cloud Storage creato nel passaggio precedente.
  5. Concedi al account di servizio il ruolo Cloud Functions Invoker.
  6. Crea una chiave SSH per il account di servizio.
  7. Scarica un file della chiave JSON per il account di servizio. Mantieni questo file 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 specifico dell'API Qualys

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.

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-vscanner).
    • Regione: seleziona una regione vicina al tuo bucket.
    • 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 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_virtual_scanners.json"
    
    # Qualys API Credentials
    QUALYS_USERNAME = "qualys-username"
    QUALYS_PASSWORD = "<qualys-password>"
    QUALYS_BASE_URL = "https://<qualys_base_url>"  # for example, https://qualysapi.qualys.com
    
    def fetch_virtual_scanners():
        """Fetch Virtual Scanner details from Qualys."""
        auth = base64.b64encode(f"{QUALYS_USERNAME}:{QUALYS_PASSWORD}".encode()).decode()
        headers = {
            "Authorization": f"Basic {auth}",
            "Content-Type": "application/xml"
        }
        url = f"{QUALYS_BASE_URL}/api/2.0/fo/scanner/"
        payload = {
            "action": "list",
            "scanner_type": "virtual"
        }
        response = requests.post(url, headers=headers, data=payload)
        response.raise_for_status()
        return response.text  # Qualys API returns XML data
    
    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(data, content_type="application/xml")
    
    def main(request):
        """Cloud Function entry point."""
        try:
            scanners = fetch_virtual_scanners()
            upload_to_gcs(scanners)
            return "Qualys Virtual Scanners data 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-vscanner).
    • Frequenza: utilizza la sintassi cron per specificare la pianificazione (ad esempio, 0 0 * * * per ogni giorno a mezzanotte).
    • Fuso orario: imposta il fuso orario che preferisci.
    • Tipo di trigger: scegli HTTP.
    • URL trigger: inserisci l'URL della funzione Cloud Function (disponibile nei dettagli della funzione dopo il deployment).
    • Metodo: scegli POST.
  4. Crea il job.

Configura i feed

Per configurare un feed:

  1. Vai a Impostazioni > Gestione dei dati > Feed. Se utilizzi una piattaforma solo SIEM, vai a Impostazioni > 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 Virtual Scanner.
  5. Seleziona Google Cloud Storage V2 come Tipo di origine.
  6. Seleziona Qualys Virtual Scanner 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 .
    • Opzione 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 di notizie nella schermata Finalizza e poi fai clic su Invia.

Tabella di mappatura UDM

Campo log Mappatura UDM Logica
ASSET_ID entity.entity.asset.asset_id Mappatura diretta dal campo ASSET_ID.
CLOUD_PROVIDER_TAGS.CLOUD_TAG.NAME entity.relations.entity.resource.attribute.labels.key Mappatura diretta dal campo CLOUD_PROVIDER_TAGS.CLOUD_TAG.NAME.
CLOUD_PROVIDER_TAGS.CLOUD_TAG.VALUE entity.relations.entity.resource.attribute.labels.value Mappatura diretta dal campo CLOUD_PROVIDER_TAGS.CLOUD_TAG.VALUE.
CLOUD_RESOURCE_ID entity.relations.entity.resource.id Mappatura diretta dal campo CLOUD_RESOURCE_ID.
DETECTION_LIST.DETECTION.FIRST_FOUND_DATETIME entity.metadata.threat.first_discovered_time Mappatura diretta dal campo DETECTION_LIST.DETECTION.FIRST_FOUND_DATETIME, convertito in timestamp.
DETECTION_LIST.DETECTION.FIRST_REOPENED_DATETIME entity.metadata.threat.detection_fields.value Mappatura diretta dal campo DETECTION_LIST.DETECTION.FIRST_REOPENED_DATETIME. La chiave è impostata come hardcoded su "FIRST_REOPENED_DATETIME".
DETECTION_LIST.DETECTION.IS_DISABLED entity.metadata.threat.detection_fields.value Mappatura diretta dal campo DETECTION_LIST.DETECTION.IS_DISABLED. La chiave è impostata come hardcoded su "IS_DISABLED".
DETECTION_LIST.DETECTION.LAST_FIXED_DATETIME entity.metadata.threat.detection_fields.value Mappatura diretta dal campo DETECTION_LIST.DETECTION.LAST_FIXED_DATETIME. La chiave è impostata come hardcoded su "LAST_FIXED_DATETIME".
DETECTION_LIST.DETECTION.LAST_FOUND_DATETIME entity.metadata.threat.detection_fields.value Mappatura diretta dal campo DETECTION_LIST.DETECTION.LAST_FOUND_DATETIME. La chiave è impostata come hardcoded su "LAST_FOUND_DATETIME".
DETECTION_LIST.DETECTION.LAST_PROCESSED_DATETIME entity.metadata.threat.detection_fields.value Mappatura diretta dal campo DETECTION_LIST.DETECTION.LAST_PROCESSED_DATETIME. La chiave è impostata come hardcoded su "LAST_PROCESSED_DATETIME".
DETECTION_LIST.DETECTION.LAST_REOPENED_DATETIME entity.metadata.threat.detection_fields.value Mappatura diretta dal campo DETECTION_LIST.DETECTION.LAST_REOPENED_DATETIME. La chiave è impostata come hardcoded su "LAST_REOPENED_DATETIME".
DETECTION_LIST.DETECTION.LAST_TEST_DATETIME entity.metadata.threat.detection_fields.value Mappatura diretta dal campo DETECTION_LIST.DETECTION.LAST_TEST_DATETIME. La chiave è impostata come hardcoded su "LAST_TEST_DATETIME".
DETECTION_LIST.DETECTION.LAST_UPDATE_DATETIME entity.metadata.threat.detection_fields.value Mappatura diretta dal campo DETECTION_LIST.DETECTION.LAST_UPDATE_DATETIME. La chiave è impostata come hardcoded su "LAST_UPDATE_DATETIME".
DETECTION_LIST.DETECTION.PORT entity.metadata.threat.detection_fields.value Mappatura diretta dal campo DETECTION_LIST.DETECTION.PORT. La chiave è impostata come hardcoded su "PORT".
DETECTION_LIST.DETECTION.PROTOCOL entity.metadata.threat.detection_fields.value Mappatura diretta dal campo DETECTION_LIST.DETECTION.PROTOCOL. La chiave è impostata come hardcoded su "PROTOCOL".
DETECTION_LIST.DETECTION.QID entity.metadata.threat.detection_fields.value Mappatura diretta dal campo DETECTION_LIST.DETECTION.QID. La chiave è impostata come hardcoded su "QID".
DETECTION_LIST.DETECTION.RESULTS entity.metadata.threat.summary Mappatura diretta dal campo DETECTION_LIST.DETECTION.RESULTS.
DETECTION_LIST.DETECTION.SEVERITY entity.metadata.threat.severity_details Mappatura diretta dal campo DETECTION_LIST.DETECTION.SEVERITY.
DETECTION_LIST.DETECTION.SSL entity.metadata.threat.detection_fields.value Mappatura diretta dal campo DETECTION_LIST.DETECTION.SSL. La chiave è impostata come hardcoded su "SSL".
DETECTION_LIST.DETECTION.STATUS entity.metadata.threat.detection_fields.value Mappatura diretta dal campo DETECTION_LIST.DETECTION.STATUS. La chiave è impostata come hardcoded su "STATUS".
DETECTION_LIST.DETECTION.TIMES_FOUND entity.metadata.threat.detection_fields.value Mappatura diretta dal campo DETECTION_LIST.DETECTION.TIMES_FOUND. La chiave è impostata come hardcoded su "TIMES_FOUND".
DETECTION_LIST.DETECTION.TIMES_REOPENED entity.metadata.threat.detection_fields.value Mappatura diretta dal campo DETECTION_LIST.DETECTION.TIMES_REOPENED. La chiave è impostata come hardcoded su "TIMES_REOPENED".
DETECTION_LIST.DETECTION.TYPE entity.metadata.threat.severity Mappato dal campo DETECTION_LIST.DETECTION.TYPE. Se il valore è "info" (senza distinzione tra maiuscole e minuscole), viene mappato a "INFORMATIONAL". In caso contrario, viene aggiunto come campo di rilevamento con la chiave "TYPE".
DETECTION_LIST.DETECTION.UNIQUE_VULN_ID entity.metadata.threat.detection_fields.value Mappatura diretta dal campo DETECTION_LIST.DETECTION.UNIQUE_VULN_ID. La chiave è impostata come hardcoded su "UNIQUE_VULN_ID".
DNS entity.entity.asset.hostname Mappato dal campo DNS se DNS_DATA.HOSTNAME è vuoto.
DNS_DATA.HOSTNAME entity.entity.asset.hostname Mappatura diretta dal campo DNS_DATA.HOSTNAME.
EC2_INSTANCE_ID entity.relations.entity.resource.product_object_id Mappatura diretta dal campo EC2_INSTANCE_ID.
ID entity.entity.asset.product_object_id Mappatura diretta dal campo ID.
ID entity.metadata.product_entity_id Mappatura diretta dal campo ID.
IP entity.entity.ip Mappatura diretta dal campo IP.
LAST_SCAN_DATETIME entity.metadata.interval.start_time Mappatura diretta dal campo LAST_SCAN_DATETIME, convertito in timestamp.
METADATA.AZURE.ATTRIBUTE.NAME entity.relations.entity.resource.attribute.labels.key Mappatura diretta dal campo METADATA.AZURE.ATTRIBUTE.NAME.
METADATA.AZURE.ATTRIBUTE.VALUE entity.relations.entity.resource.attribute.labels.value Mappatura diretta dal campo METADATA.AZURE.ATTRIBUTE.VALUE.
Sistema operativo entity.entity.asset.platform_software.platform Mappato dal campo OS. Se il valore contiene "windows" (senza distinzione tra maiuscole e minuscole), viene mappato a "WINDOWS". Se contiene "Linux" (senza distinzione tra maiuscole e minuscole), viene mappato a "LINUX".
TAGS.TAG.NAME entity.relations.entity.resource.attribute.labels.key Mappatura diretta dal campo TAGS.TAG.NAME.
TAGS.TAG.TAG_ID entity.relations.entity.resource.attribute.labels.value Mappato dal campo TAGS.TAG.TAG_ID. Il valore è preceduto dal prefisso "TAG_ID: ".
entity.metadata.collected_timestamp Il timestamp della voce di log.
entity.metadata.entity_type Determinato in base alla presenza del campo IP. Se IP è presente, è impostato su "IP_ADDRESS". In caso contrario, viene impostato su "ASSET".
entity.metadata.interval.end_time Impostato come hardcoded su un valore di timestamp molto elevato (253.402.300.799 secondi).
entity.metadata.product_name Impostato come hardcoded su "QUALYS_VIRTUAL_SCANNER".
entity.metadata.vendor_name Impostato come hardcoded su "QUALYS_VIRTUAL_SCANNER".
entity.relations.entity.resource.resource_type Se CLOUD_SERVICE è "VM", viene impostato su "VIRTUAL_MACHINE".
entity.relations.entity_type Impostato come hardcoded su "RESOURCE".
entity.relations.relationship Impostato come hardcoded su "MEMBER".

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.