Recopila registros de supervisión continua de Qualys

Compatible con:

Este código de analizador de Logstash primero extrae campos como la IP de origen, el usuario, el método y el protocolo de aplicación de los mensajes de registro sin procesar con patrones de Grok. Luego, asigna campos específicos de los datos de registro sin procesar a sus campos correspondientes en el Modelo de datos unificado (UDM), realiza conversiones de tipo de datos y enriquece los datos con etiquetas y metadatos adicionales antes de estructurar finalmente el resultado en el formato UDM deseado.

Antes de comenzar

Asegúrate de cumplir con los siguientes requisitos previos:

  • Instancia de Google Security Operations
  • Acceso con privilegios a Google Cloud.
  • Acceso con privilegios a Qualys

Habilita las APIs obligatorias:

  1. Accede a la Google Cloud consola de.
  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 bucket de Storage Google Cloud

  1. Accede a la Google Cloud consola de.
  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 los buckets (por ejemplo, qualys-asset-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 Clase automática 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 del 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. Accede a la Google Cloud consola de.
  2. Ve a IAM y administración > Cuentas de servicio.
  3. Cree una cuenta de servicio nueva
  4. Ponle un nombre descriptivo (por ejemplo, qualys-user).
  5. Otorga a la cuenta de servicio la función Administrador de objetos de Storage en el bucket de GCS que creaste en el paso anterior.
  6. Otorga a la cuenta de servicio la función Invocador de Cloud Functions.
  7. Crea una clave SSH para la cuenta de servicio.
  8. Descarga un archivo de claves JSON para la cuenta de servicio. Mantén este archivo seguro.

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 Función 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 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 tu función (por ejemplo, fetch-qualys-cm-alerts).
    • Región: Selecciona una región cercana a tu bucket.
    • Entorno de ejecución: Python 3.10 (o el entorno de ejecución que prefieras)
    • Activador: Elige el activador de HTTP si es necesario o Cloud Pub/Sub para la ejecución programada.
    • Autenticación: Protege con autenticació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_cm_alerts.json"
    
    # Qualys API Credentials
    QUALYS_USERNAME = "<qualys-username>"
    QUALYS_PASSWORD = "<qualys-password>"
    QUALYS_BASE_URL = "https://<qualys_base_url>"
    
    def fetch_cm_alerts():
        """Fetch alerts from Qualys Continuous Monitoring."""
        auth = base64.b64encode(f"{QUALYS_USERNAME}:{QUALYS_PASSWORD}".encode()).decode()
        headers = {
            "Authorization": f"Basic {auth}",
            "Content-Type": "application/xml"
        }
        payload = """
        <ServiceRequest>
            <filters>
                <Criteria field="alert.date" operator="GREATER">2024-01-01</Criteria>
            </filters>
        </ServiceRequest>
        """
        response = requests.post(f"{QUALYS_BASE_URL}/qps/rest/2.0/search/cm/alert", headers=headers, data=payload)
        response.raise_for_status()
        return response.json()
    
    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(json.dumps(data, indent=2), content_type="application/json")
    
    def main(request):
        """Cloud Function entry point."""
        try:
            alerts = fetch_cm_alerts()
            upload_to_gcs(alerts)
            return "Qualys CM alerts 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 de.
  2. Haz clic en Crear trabajo.
  3. Configura el trabajo:

    • Nombre: Ingresa un nombre para tu trabajo (por ejemplo, trigger-fetch-qualys-cm-alerts).
    • Frecuencia: Usa la sintaxis cron para especificar la programación (por ejemplo, 0 * * * * para ejecutar cada hora).
    • Zona horaria: Establece tu zona horaria preferida.
    • Tipo de activador: Elige HTTP.
    • URL del activador: Ingresa la URL de Cloud Function (que se encuentra en los detalles de la función después de la implementación).
    • Método: Elige POST.
  4. Crea el trabajo.

Configura feeds

Para configurar un feed, sigue estos pasos:

  1. Ve a Configuración de SIEM > Feeds.
  2. Haz clic en Agregar feed nuevo.
  3. En la página siguiente, haz clic en Configurar un solo feed.
  4. En el campo Nombre del feed, ingresa un nombre para el feed; por ejemplo, Registros de supervisión continua de Qualys.
  5. Selecciona Google Cloud Storage V2 como el Tipo de fuente.
  6. Selecciona Supervisión continua de Qualys como el Tipo de registro.
  7. Haz clic en Siguiente.
  8. Especifica valores para los siguientes parámetros de entrada:

    • URI del bucket de Storage: Es la URI de origen del bucket de Google Cloud Storage.
    • Opciones de eliminación del código fuente: Selecciona la opción de eliminación según tu preferencia.
  9. Haz clic en Siguiente.

  10. 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
Alert.alertInfo.appVersion metadata.product_version Se asigna directamente desde Alert.alertInfo.appVersion
Alert.alertInfo.operatingSystem principal.platform_version Se asigna directamente desde Alert.alertInfo.operatingSystem
Alert.alertInfo.port additional.fields.value.string_value Se asigna directamente desde Alert.alertInfo.port y se agrega como un par clave-valor en additional.fields con la clave "Alert port"
Alert.alertInfo.protocol network.ip_protocol Se asigna directamente desde Alert.alertInfo.protocol
Alert.alertInfo.sslIssuer network.tls.client.certificate.issuer Se asigna directamente desde Alert.alertInfo.sslIssuer
Alert.alertInfo.sslName additional.fields.value.string_value Se asigna directamente desde Alert.alertInfo.sslName y se agrega como un par clave-valor en additional.fields con la clave "SSL Name"
Alert.alertInfo.sslOrg additional.fields.value.string_value Se asigna directamente desde Alert.alertInfo.sslOrg y se agrega como un par clave-valor en additional.fields con la clave "SSL Org"
Alert.alertInfo.ticketId additional.fields.value.string_value Se asigna directamente desde Alert.alertInfo.ticketId y se agrega como un par clave-valor en additional.fields con la clave "Ticket Id"
Alert.alertInfo.vpeConfidence additional.fields.value.string_value Se asigna directamente desde Alert.alertInfo.vpeConfidence y se agrega como un par clave-valor en additional.fields con la clave "VPE Confidence"
Alert.alertInfo.vpeStatus additional.fields.value.string_value Se asigna directamente desde Alert.alertInfo.vpeStatus y se agrega como un par clave-valor en additional.fields con la clave "VPE Confidence"
Alert.eventType additional.fields.value.string_value Se asigna directamente desde Alert.eventType y se agrega como un par clave-valor en additional.fields con la clave "Event Type"
Alert.hostname principal.hostname Se asigna directamente desde Alert.hostname
Alert.id security_result.threat_id Se asigna directamente desde Alert.id
Alert.ipAddress principal.ip Se asigna directamente desde Alert.ipAddress
Alert.profile.id additional.fields.value.string_value Se asigna directamente desde Alert.profile.id y se agrega como un par clave-valor en additional.fields con la clave "Profile Id"
Alert.profile.title additional.fields.value.string_value Se asigna directamente desde Alert.profile.title y se agrega como un par clave-valor en additional.fields con la clave "Profile Title"
Alert.qid vulnerability.name Se asigna como "QID: " desde Alert.qid
Alert.source additional.fields.value.string_value Se asigna directamente desde Alert.source y se agrega como un par clave-valor en additional.fields con la clave "Alert Source"
Alert.triggerUuid metadata.product_log_id Se asigna directamente desde Alert.triggerUuid
Alert.vulnCategory additional.fields.value.string_value Se asigna directamente desde Alert.vulnCategory y se agrega como un par clave-valor en additional.fields con la clave "Vulnerability Category"
Alert.vulnSeverity vulnerability.severity Se asigna según el valor de Alert.vulnSeverity: 1-3: LOW, 4-6: MEDIUM, 7-8: HIGH
Alert.vulnTitle vulnerability.description Se asigna directamente desde Alert.vulnTitle
Alert.vulnType additional.fields.value.string_value Se asigna directamente desde Alert.vulnType y se agrega como un par clave-valor en additional.fields con la clave "Vulnerability Type"
Host principal.ip Se analiza desde la línea de registro "Host: "
edr.client.ip_addresses Se copia desde principal.ip
edr.client.hostname Se copia desde principal.hostname
edr.raw_event_name Se establece en "STATUS_UPDATE" si están presentes Alert.ipAddress, Alert.hostname o src_ip; de lo contrario, se establece en "GENERIC_EVENT"
metadata.event_timestamp Se extrae de los campos Alert.eventDate o timestamp. Se prioriza Alert.eventDate si existe; de lo contrario, se usa timestamp. La marca de tiempo se convierte a UTC.
metadata.event_type La misma lógica que edr.raw_event_name
metadata.log_type Se establece en "QUALYS_CONTINUOUS_MONITORING"
metadata.product_name Se establece en "QUALYS_CONTINUOUS_MONITORING"
metadata.vendor_name Se establece en "QUALYS_CONTINUOUS_MONITORING"
network.application_protocol Se analiza desde la línea de registro " /user HTTP"
network.http.method Se analiza desde la línea de registro " /user HTTP"
timestamp event.timestamp Se extrae de los campos Alert.eventDate o timestamp. Se prioriza Alert.eventDate si existe; de lo contrario, se usa timestamp. La marca de tiempo se convierte a UTC.

Registro de cambios

Consulta el registro de cambios de este analizador

¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.