Raccogliere i log del contesto delle risorse Qualys

Supportato in:

Questo parser estrae le informazioni sul contesto della risorsa dai log JSON di Qualys e le trasforma nel formato UDM. Analizza vari campi, come ID, IP, nome host, dettagli della risorsa 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 provider cloud e i sistemi operativi, garantendo una rappresentazione accurata nell'UDM.

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-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 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-assets).
    • 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
    
    # 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!"
    
    ```
    
  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-assets).
    • 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 del contesto degli asset Qualys

  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, Qualys Asset Context Logs).
  4. Seleziona Google Cloud Storage come Tipo di origine.
  5. Seleziona Qualys Asset Context come Tipo di log.
  6. Fai clic su Avanti.
  7. Specifica i valori per i seguenti parametri di input:

    • URI GCS: l'URI Cloud Storage.
    • L'URI è un: seleziona File singolo.
    • Opzioni 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 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 TAGS.TAG[].TAG_ID. Copiato dal campo create_time del log non elaborato. Hardcoded su "ASSET". Hardcoded to "QUALYS ASSET CONTEXT". Hardcoded to "QUALYS ASSET CONTEXT". Hardcoded su "RESOURCE". Hardcoded to "MEMBER". Copiato dal campo create_time del log non elaborato.

Modifiche

2023-08-01

  • "DNS_DATA.HOSTNAME" è stato mappato a "entity.entity.asset.hostname".

2023-07-18

  • Parser appena creato.