Recopila registros del escáner virtual de Qualys

Compatible con:

Este analizador transforma los registros sin procesar del escáner virtual de Qualys con formato JSON en un formato estructurado que cumple con la UDM de Google Security Operations. Extrae campos relevantes, como información de activos, detalles de análisis y vulnerabilidades detectadas, y los asigna a los campos de la UDM correspondientes para una representación y un análisis coherentes.

Antes de comenzar

  • Asegúrate de tener una instancia de Google Security Operations.
  • Asegúrate de tener acceso con privilegios a Google Cloud.
  • Asegúrate de tener acceso con privilegios a Qualys.

Habilita las APIs obligatorias:

  1. Accede a la Google Cloud consola.
  2. Ve a APIs y servicios > Biblioteca.
  3. Busca las siguientes APIs y habilítalas:
    • API de Cloud Functions
    • API de Cloud Scheduler
    • Cloud Pub/Sub (obligatorio para que Cloud Scheduler invoque funciones)

Crea un Google Cloud bucket de almacenamiento

  1. Accede a la Google Cloud consola.
  2. Ve a la página Buckets de Cloud Storage.

    Ir a Buckets

  3. Haz clic en Crear.

  4. Configura el bucket:

    • Nombre: Ingresa un nombre único que cumpla con los requisitos de nombre de bucket (por ejemplo, qualys-vscanner-bucket).
    • Elige dónde almacenar tus datos: Selecciona una ubicación.
    • Elige una clase de almacenamiento para tus datos: Selecciona una clase de almacenamiento predeterminada para el bucket o selecciona Autoclass para la administración automática de clases de almacenamiento.
    • Elige cómo controlar el acceso a los objetos: Selecciona no para aplicar la prevención del acceso público y elige un modelo de control de acceso para los objetos de tu bucket.
    • Clase de almacenamiento: Elige según tus necesidades (por ejemplo, Estándar).
  5. Haz clic en Crear.

Crea una cuenta de servicio de Google Cloud

  1. Ve a IAM y administración > Cuentas de servicio.
  2. Cree una cuenta de servicio nueva
  3. Asóciale un nombre descriptivo (por ejemplo, qualys-user).
  4. Otorga a la cuenta de servicio el rol de administrador de objetos de almacenamiento en el bucket de Cloud Storage que creaste en el paso anterior.
  5. Otorga a la cuenta de servicio el rol de Invocador de Cloud Functions.
  6. Crea una clave SSH para la cuenta de servicio.
  7. Descarga un archivo de claves JSON para la cuenta de servicio. Protege este archivo.

Opcional: Crea un usuario de API dedicado en Qualys

  1. Accede a la consola de Qualys.
  2. Ve a Usuarios.
  3. Haz clic en Nuevo > Usuario.
  4. Ingresa la información general requerida para el usuario.
  5. Selecciona la pestaña Rol del usuario.
  6. Asegúrate de que el rol tenga seleccionada la casilla de verificación Acceso a la API.
  7. Haz clic en Guardar.

Identifica tu URL específica de la API de Qualys

Opción 1

Identifica tus URLs como se menciona en la identificación de la plataforma.

Opción 2

  1. Accede a la consola de Qualys.
  2. Ve a Ayuda > Acerca de.
  3. Desplázate para ver esta información en el Centro de operaciones de seguridad (SOC).
  4. Copia la URL de la API de Qualys.

Configura la Cloud Function

  1. Ve a Cloud Functions en la Google Cloud consola.
  2. Haz clic en Crear función.
  3. Configura la función:

    • Nombre: Ingresa un nombre para la función (por ejemplo, fetch-qualys-vscanner).
    • Región: Selecciona una región cercana a tu bucket.
    • Activador: Elige el activador de HTTP si es necesario o Cloud Pub/Sub para la ejecución programada.
    • Autenticación: Usa autenticación para proteger la información.
    • Escribe el código con un editor intercalado:
    ```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. Haz clic en Implementar después de completar la configuración.

Configura Cloud Scheduler

  1. Ve a Cloud Scheduler en la Google Cloud consola.
  2. Haz clic en Crear trabajo.
  3. Configura el trabajo:

    • Nombre: Ingresa un nombre para la tarea (por ejemplo, trigger-fetch-qualys-vscanner).
    • Frecuencia: Usa la sintaxis cron para especificar el programa (por ejemplo, 0 0 * * * para todos los días a la medianoche).
    • Zona horaria: Establece tu zona horaria preferida.
    • Tipo de activador: Elige HTTP.
    • URL del activador: Ingresa la URL de Cloud Function (se encuentra en los detalles de la función después de la implementación).
    • Método: Elige POST.
  4. Crea el trabajo.

Configura un feed en Google SecOps para transferir los registros de Qualys Virtual Scanner

  1. Ve a Configuración de SIEM > Feeds.
  2. Haz clic en Agregar nueva.
  3. En el campo Nombre del feed, ingresa un nombre para el feed (por ejemplo, Registros de Qualys Virtual Scanner).
  4. Selecciona Google Cloud Storage como el Tipo de fuente.
  5. Selecciona Qualys Virtual Scanner como el Tipo de registro.
  6. Haz clic en Siguiente.
  7. Especifica valores para los siguientes parámetros de entrada:

    • URI del bucket de almacenamiento: Es el Google Cloud URI de origen del bucket de almacenamiento.
    • URI es un: selecciona Archivo único.
    • Opción de eliminación de fuentes: Selecciona la opción de eliminación según tu preferencia.
    • Espacio de nombres de recursos: Es el espacio de nombres de recursos.
    • Etiquetas de transferencia: Es la etiqueta que se aplicará a los eventos de este feed.
  8. Haz clic en Siguiente.

  9. Revisa la configuración de tu nuevo feed en la pantalla Finalizar y, luego, haz clic en Enviar.

Tabla de asignación de UDM

Campo de registro Asignación de UDM Lógica
ASSET_ID entity.entity.asset.asset_id Asignación directa desde el campo ASSET_ID.
CLOUD_PROVIDER_TAGS.CLOUD_TAG.NAME entity.relations.entity.resource.attribute.labels.key Asignación directa desde el campo CLOUD_PROVIDER_TAGS.CLOUD_TAG.NAME.
CLOUD_PROVIDER_TAGS.CLOUD_TAG.VALUE entity.relations.entity.resource.attribute.labels.value Asignación directa desde el campo CLOUD_PROVIDER_TAGS.CLOUD_TAG.VALUE.
CLOUD_RESOURCE_ID entity.relations.entity.resource.id Asignación directa desde el campo CLOUD_RESOURCE_ID.
DETECTION_LIST.DETECTION.FIRST_FOUND_DATETIME entity.metadata.threat.first_discovered_time Asignación directa del campo DETECTION_LIST.DETECTION.FIRST_FOUND_DATETIME, convertido a marca de tiempo.
DETECTION_LIST.DETECTION.FIRST_REOPENED_DATETIME entity.metadata.threat.detection_fields.value Asignación directa desde el campo DETECTION_LIST.DETECTION.FIRST_REOPENED_DATETIME. La clave está codificada como "FIRST_REOPENED_DATETIME".
DETECTION_LIST.DETECTION.IS_DISABLED entity.metadata.threat.detection_fields.value Asignación directa desde el campo DETECTION_LIST.DETECTION.IS_DISABLED. La clave está codificada como "IS_DISABLED".
DETECTION_LIST.DETECTION.LAST_FIXED_DATETIME entity.metadata.threat.detection_fields.value Asignación directa desde el campo DETECTION_LIST.DETECTION.LAST_FIXED_DATETIME. La clave está codificada como "LAST_FIXED_DATETIME".
DETECTION_LIST.DETECTION.LAST_FOUND_DATETIME entity.metadata.threat.detection_fields.value Asignación directa desde el campo DETECTION_LIST.DETECTION.LAST_FOUND_DATETIME. La clave está codificada como "LAST_FOUND_DATETIME".
DETECTION_LIST.DETECTION.LAST_PROCESSED_DATETIME entity.metadata.threat.detection_fields.value Asignación directa desde el campo DETECTION_LIST.DETECTION.LAST_PROCESSED_DATETIME. La clave está codificada como "LAST_PROCESSED_DATETIME".
DETECTION_LIST.DETECTION.LAST_REOPENED_DATETIME entity.metadata.threat.detection_fields.value Asignación directa desde el campo DETECTION_LIST.DETECTION.LAST_REOPENED_DATETIME. La clave está codificada como "LAST_REOPENED_DATETIME".
DETECTION_LIST.DETECTION.LAST_TEST_DATETIME entity.metadata.threat.detection_fields.value Asignación directa desde el campo DETECTION_LIST.DETECTION.LAST_TEST_DATETIME. La clave está codificada como "LAST_TEST_DATETIME".
DETECTION_LIST.DETECTION.LAST_UPDATE_DATETIME entity.metadata.threat.detection_fields.value Asignación directa desde el campo DETECTION_LIST.DETECTION.LAST_UPDATE_DATETIME. La clave está codificada como "LAST_UPDATE_DATETIME".
DETECTION_LIST.DETECTION.PORT entity.metadata.threat.detection_fields.value Asignación directa desde el campo DETECTION_LIST.DETECTION.PORT. La clave está codificada como "PORT".
DETECTION_LIST.DETECTION.PROTOCOL entity.metadata.threat.detection_fields.value Asignación directa desde el campo DETECTION_LIST.DETECTION.PROTOCOL. La clave está codificada como "PROTOCOL".
DETECTION_LIST.DETECTION.QID entity.metadata.threat.detection_fields.value Asignación directa desde el campo DETECTION_LIST.DETECTION.QID. La clave está codificada como "QID".
DETECTION_LIST.DETECTION.RESULTS entity.metadata.threat.summary Asignación directa desde el campo DETECTION_LIST.DETECTION.RESULTS.
DETECTION_LIST.DETECTION.SEVERITY entity.metadata.threat.severity_details Asignación directa desde el campo DETECTION_LIST.DETECTION.SEVERITY.
DETECTION_LIST.DETECTION.SSL entity.metadata.threat.detection_fields.value Asignación directa desde el campo DETECTION_LIST.DETECTION.SSL. La clave está codificada como "SSL".
DETECTION_LIST.DETECTION.STATUS entity.metadata.threat.detection_fields.value Asignación directa desde el campo DETECTION_LIST.DETECTION.STATUS. La clave está codificada como "STATUS".
DETECTION_LIST.DETECTION.TIMES_FOUND entity.metadata.threat.detection_fields.value Asignación directa desde el campo DETECTION_LIST.DETECTION.TIMES_FOUND. La clave está codificada como "TIMES_FOUND".
DETECTION_LIST.DETECTION.TIMES_REOPENED entity.metadata.threat.detection_fields.value Asignación directa desde el campo DETECTION_LIST.DETECTION.TIMES_REOPENED. La clave está codificada como "TIMES_REOPENED".
DETECTION_LIST.DETECTION.TYPE entity.metadata.threat.severity Se asignó desde el campo DETECTION_LIST.DETECTION.TYPE. Si el valor es "info" (sin distinción entre mayúsculas y minúsculas), se asigna a "INFORMATIONAL". De lo contrario, se agrega como un campo de detección con la clave "TYPE".
DETECTION_LIST.DETECTION.UNIQUE_VULN_ID entity.metadata.threat.detection_fields.value Asignación directa desde el campo DETECTION_LIST.DETECTION.UNIQUE_VULN_ID. La clave está codificada como "UNIQUE_VULN_ID".
DNS entity.entity.asset.hostname Se asigna desde el campo DNS si DNS_DATA.HOSTNAME está vacío.
DNS_DATA.HOSTNAME entity.entity.asset.hostname Asignación directa desde el campo DNS_DATA.HOSTNAME.
EC2_INSTANCE_ID entity.relations.entity.resource.product_object_id Asignación directa desde el campo EC2_INSTANCE_ID.
ID entity.entity.asset.product_object_id Asignación directa desde el campo ID.
ID entity.metadata.product_entity_id Asignación directa desde el campo ID.
IP entity.entity.ip Asignación directa desde el campo IP.
LAST_SCAN_DATETIME entity.metadata.interval.start_time Asignación directa del campo LAST_SCAN_DATETIME, convertido a marca de tiempo.
METADATA.AZURE.ATTRIBUTE.NAME entity.relations.entity.resource.attribute.labels.key Asignación directa desde el campo METADATA.AZURE.ATTRIBUTE.NAME.
METADATA.AZURE.ATTRIBUTE.VALUE entity.relations.entity.resource.attribute.labels.value Asignación directa desde el campo METADATA.AZURE.ATTRIBUTE.VALUE.
SO entity.entity.asset.platform_software.platform Se asignó desde el campo OS. Si el valor contiene "windows" (sin distinción entre mayúsculas y minúsculas), se asigna a "WINDOWS". Si contiene "Linux" (sin distinción entre mayúsculas y minúsculas), se asigna a "LINUX".
TAGS.TAG.NAME entity.relations.entity.resource.attribute.labels.key Asignación directa desde el campo TAGS.TAG.NAME.
TAGS.TAG.TAG_ID entity.relations.entity.resource.attribute.labels.value Se asignó desde el campo TAGS.TAG.TAG_ID. El valor tiene el prefijo "TAG_ID: ".
entity.metadata.collected_timestamp La marca de tiempo de la entrada de registro.
entity.metadata.entity_type Se determina en función de la presencia del campo IP. Si IP está presente, se establece en "IP_ADDRESS". De lo contrario, se establece como "ASSET".
entity.metadata.interval.end_time Se codifica de forma fija en un valor de marca de tiempo muy grande (253402300799 segundos).
entity.metadata.product_name Está codificado de forma fija en "QUALYS_VIRTUAL_SCANNER".
entity.metadata.vendor_name Está codificado de forma fija en "QUALYS_VIRTUAL_SCANNER".
entity.relations.entity.resource.resource_type Si CLOUD_SERVICE es “VM”, se establece en “VIRTUAL_MACHINE”.
entity.relations.entity_type Se codifica de forma fija en "RESOURCE".
entity.relations.relationship Está codificado de forma fija como "MEMBER".

Cambios

2023-08-21

  • Se asignó el valor "detection.UNIQUE_VULN_ID" del registro original al campo "threat.detection_fields" en la UDM.

2023-07-31

  • Sin embargo, el analizador se creó recientemente.