Raccogliere i log di Qualys Virtual Scanner

Supportato in:

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

Prima di iniziare

  • Assicurati di avere un'istanza Google Security Operations.
  • Assicurati di disporre dell'accesso con privilegi a Google Cloud.
  • Assicurati di disporre dell'accesso privilegiato 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 abilitale:
    • API Cloud Functions
    • API Cloud Scheduler
    • Cloud Pub/Sub (obbligatorio 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 Autoclass per la gestione automatica delle classi 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.

Creare un account di servizio Google Cloud

  1. Vai a IAM e amministrazione > Account di servizio.
  2. Crea un nuovo account di servizio.
  3. Assegna un nome descrittivo (ad esempio qualys-user).
  4. Concedi all'account di servizio il ruolo Amministratore oggetti archiviati per il bucket Cloud Storage creato nel passaggio precedente.
  5. Concedi all'account di servizio il ruolo Invoker di Cloud Functions.
  6. Crea una chiave SSH per l'account di servizio.
  7. Scarica un file della chiave JSON per l'account di servizio. Tieni questo file al 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 API Qualys specifico

Opzione 1

Identifica i tuoi 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 Google Cloud console.
  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 l'attivatore HTTP, se necessario, o Cloud Pub/Sub per l'esecuzione pianificata.
    • Autenticazione: per la sicurezza, utilizza 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 Google Cloud console.
  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 attivatore: inserisci l'URL della Cloud Function (che puoi trovare nei dettagli della funzione dopo il deployment).
    • Metodo: scegli POST.
  4. Crea il job.

Configura un feed in Google SecOps per importare i log di Qualys Virtual Scanner

  1. Vai a Impostazioni SIEM > Feed.
  2. Fai clic su Aggiungi nuova.
  3. Nel campo Nome feed, inserisci un nome per il feed (ad esempio, Log dello scanner virtuale Qualys).
  4. Seleziona Google Cloud Storage come Tipo di origine.
  5. Seleziona Qualys Virtual Scanner come Tipo di log.
  6. Fai clic su Avanti.
  7. Specifica i valori per i seguenti parametri di input:

    • URI del bucket di archiviazione: l' Google Cloud URI di origine del bucket di archiviazione.
    • L'URI è un: seleziona File singolo.
    • Opzione di eliminazione dell'origine: seleziona l'opzione di eliminazione in base alle tue preferenze.
    • Spazio dei nomi degli asset: lo spazio dei nomi degli asset.
    • Etichette di importazione: l'etichetta da applicare agli eventi di questo feed.
  8. Fai clic su Avanti.

  9. Rivedi la configurazione del nuovo feed nella schermata Concludi 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 è 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 è hardcoded 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 è hardcoded 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 è hardcoded 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 è hardcoded 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 è hardcoded 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 è hardcoded come "LAST_UPDATE_DATETIME".
DETECTION_LIST.DETECTION.PORT entity.metadata.threat.detection_fields.value Mappatura diretta dal campo DETECTION_LIST.DETECTION.PORT. La chiave è hardcoded come "PORT".
DETECTION_LIST.DETECTION.PROTOCOL entity.metadata.threat.detection_fields.value Mappatura diretta dal campo DETECTION_LIST.DETECTION.PROTOCOL. La chiave è hardcoded come "PROTOCOL".
DETECTION_LIST.DETECTION.QID entity.metadata.threat.detection_fields.value Mappatura diretta dal campo DETECTION_LIST.DETECTION.QID. La chiave è hardcoded 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 è 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 è hardcoded come "STATUS".
DETECTION_LIST.DETECTION.TIMES_FOUND entity.metadata.threat.detection_fields.value Mappatura diretta dal campo DETECTION_LIST.DETECTION.TIMES_FOUND. La chiave è hardcoded 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 è hardcoded come "TIMES_REOPENED".
DETECTION_LIST.DETECTION.TYPE entity.metadata.threat.severity Mappato dal campo DETECTION_LIST.DETECTION.TYPE. Se il valore è "info" (non è sensibile alle maiuscole), viene mappato a "INFORMATIONAL". In caso contrario, viene aggiunto come campo di rilevamento con 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 è hardcoded 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 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, viene impostato su "IP_ADDRESS". In caso contrario, viene impostato su "ASSET".
entity.metadata.interval.end_time Hardcoded a un valore timestamp molto grande (253402300799 secondi).
entity.metadata.product_name Hardcoded su "QUALYS_VIRTUAL_SCANNER".
entity.metadata.vendor_name Hardcoded su "QUALYS_VIRTUAL_SCANNER".
entity.relations.entity.resource.resource_type Se CLOUD_SERVICE è "VM", viene impostato su "VIRTUAL_MACHINE".
entity.relations.entity_type Hardcoded su "RESOURCE".
entity.relations.relationship Hardcoded to "MEMBER".

Modifiche

2023-08-21

  • È stato mappato il valore "detection.UNIQUE_VULN_ID" dal log originale al campo "threat.detection_fields" nell'UDM.

2023-07-31

  • Parser appena creato.