Raccogliere i log di Qualys Virtual Scanner

Supportato in:

Questo parser trasforma i log non elaborati di Qualys Virtual Scanner formattati in JSON in un formato strutturato conforme a 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 disporre dei 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-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 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. Vai a IAM e amministrazione > Service Accounts.
  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 che hai creato nel passaggio precedente.
  5. Concedi al account di servizio il ruolo Invoker di Cloud Functions.
  6. Crea una chiave SSH per il account di servizio.
  7. 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-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: 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_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 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.
  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 Qualys Virtual Scanner Logs.
  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 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 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 รจ hardcoded come "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 รจ codificata come "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 รจ codificata come "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 รจ codificata come "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 รจ hardcoded come "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 รจ codificata come "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 รจ codificata come "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 รจ codificata come "LAST_UPDATE_DATETIME".
DETECTION_LIST.DETECTION.PORT entity.metadata.threat.detection_fields.value Mappatura diretta dal campo DETECTION_LIST.DETECTION.PORT. La chiave รจ codificata come "PORT".
DETECTION_LIST.DETECTION.PROTOCOL entity.metadata.threat.detection_fields.value Mappatura diretta dal campo DETECTION_LIST.DETECTION.PROTOCOL. La chiave รจ codificata come "PROTOCOL".
DETECTION_LIST.DETECTION.QID entity.metadata.threat.detection_fields.value Mappatura diretta dal campo DETECTION_LIST.DETECTION.QID. La chiave รจ codificata come "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 รจ codificata come "SSL".
DETECTION_LIST.DETECTION.STATUS entity.metadata.threat.detection_fields.value Mappatura diretta dal campo DETECTION_LIST.DETECTION.STATUS. La chiave รจ codificata come "STATUS".
DETECTION_LIST.DETECTION.TIMES_FOUND entity.metadata.threat.detection_fields.value Mappatura diretta dal campo DETECTION_LIST.DETECTION.TIMES_FOUND. La chiave รจ codificata come "TIMES_FOUND".
DETECTION_LIST.DETECTION.TIMES_REOPENED entity.metadata.threat.detection_fields.value Mappatura diretta dal campo DETECTION_LIST.DETECTION.TIMES_REOPENED. La chiave รจ codificata come "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 su "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 รจ codificata come "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 su "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 da "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, รจ impostato su "ASSET".
entity.metadata.interval.end_time Codificato in modo permanente con un valore timestamp molto grande (253402300799 secondi).
entity.metadata.product_name Codificato in modo permanente su "QUALYS_VIRTUAL_SCANNER".
entity.metadata.vendor_name Codificato in modo permanente su "QUALYS_VIRTUAL_SCANNER".
entity.relations.entity.resource.resource_type Se CLOUD_SERVICE รจ "VM", รจ impostato su "VIRTUAL_MACHINE".
entity.relations.entity_type Codificato come "RESOURCE".
entity.relations.relationship Codificato come "MEMBER".

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