Recopila registros de la supervisión continua de Qualys
Este código del analizador de Logstash primero extrae campos como la IP de origen, el usuario, el método y el protocolo de la 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 tipos de datos y enriquece los datos con etiquetas y metadatos adicionales antes de estructurar el resultado en el formato UDM deseado.
Antes de comenzar
Asegúrate de cumplir con los siguientes requisitos previos:
- Es la instancia de Google Security Operations.
- Acceso con privilegios a Google Cloud.
- Acceso privilegiado a Qualys.
Habilita las APIs obligatorias:
- Accede a la consola de Google Cloud .
- Ve a APIs y servicios > Biblioteca.
- 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 Storage
- Accede a la consola de Google Cloud .
Ve a la página Buckets de Cloud Storage.
Haz clic en Crear.
Configura el bucket:
- Nombre: Ingresa un nombre único que cumpla con los requisitos de nombres de 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 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 selecciona un modelo de control de acceso para los objetos del bucket.
- Clase de almacenamiento: Elige según tus necesidades (por ejemplo, Estándar).
Haz clic en Crear.
Crea una cuenta de servicio de Google Cloud
- Accede a la consola de Google Cloud .
- Ve a IAM y administración > Cuentas de servicio.
- Cree una cuenta de servicio nueva
- Asigna un nombre descriptivo (por ejemplo, qualys-user).
- Otorga a la cuenta de servicio el rol de administrador de objetos de almacenamiento en el bucket de GCS que creaste en el paso anterior.
- Otorga a la cuenta de servicio el rol de Invocador de Cloud Functions.
- Crea una clave SSH para la cuenta de servicio.
- Descarga un archivo de claves JSON para la cuenta de servicio. Protege este archivo.
Opcional: Crea un usuario de API dedicado en Qualys
- Accede a la consola de Qualys.
- Ve a Usuarios.
- Haz clic en Nuevo > Usuario.
- Ingresa la información general requerida para el usuario.
- Selecciona la pestaña Rol del usuario.
- Asegúrate de que el rol tenga seleccionada la casilla de verificación API Access.
- Haz clic en Guardar.
Identifica la 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
- Accede a la consola de Qualys.
- Ve a Ayuda > Acerca de.
- Desplázate para ver esta información en Centro de operaciones de seguridad (SOC).
- Copia la URL de la API de Qualys.
Configura la Cloud Function
- Ve a Cloud Functions en la Google Cloud consola.
- Haz clic en Crear función.
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 directo:
```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 ```
Haz clic en Implementar después de completar la configuración.
Configura Cloud Scheduler
- Ve a Cloud Scheduler en la consola de Google Cloud .
- Haz clic en Crear trabajo.
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.
Crea el trabajo.
Configura feeds
Existen dos puntos de entrada diferentes para configurar feeds en la plataforma de Google SecOps:
- Configuración de SIEM > Feeds
- Centro de contenido > Paquetes de contenido
Configura feeds en Configuración del SIEM > Feeds
Para configurar un feed, sigue estos pasos:
- Ve a Configuración del SIEM > Feeds.
- Haz clic en Agregar feed nuevo.
- En la siguiente página, haz clic en Configurar un solo feed.
- En el campo Nombre del feed, ingresa un nombre para el feed, por ejemplo, Registros de supervisión continua de Qualys.
- Selecciona Google Cloud Storage como el Tipo de fuente.
- Selecciona Supervisión continua de Qualys como el Tipo de registro.
- Haz clic en Siguiente.
Especifica valores para los siguientes parámetros de entrada:
- URI del bucket de almacenamiento: Es la URI de origen del bucket de almacenamiento Google Cloud .
- URI is a: Selecciona Single file.
- Opciones de borrado de la fuente: Selecciona la opción de borrado según tu preferencia.
Haz clic en Siguiente.
Revisa la nueva configuración del feed en la pantalla Finalizar y, luego, haz clic en Enviar.
Configura feeds desde el Centro de contenido
Especifica valores para los siguientes campos:
- URI del bucket de almacenamiento: Es la URI de origen del bucket de almacenamiento Google Cloud .
- URI is a: Selecciona Single file.
- Opciones de borrado de la fuente: Selecciona la opción de borrado según tu preferencia.
Opciones avanzadas
- Nombre del feed: Es un valor predeterminado que identifica el feed.
- Tipo de fuente: Es el método que se usa para recopilar registros en Google SecOps.
- Espacio de nombres del activo: Es el espacio de nombres asociado con el feed.
- Etiquetas de transferencia: Son las etiquetas que se aplican a todos los eventos de este feed.
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 "Tipo de evento". |
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 "ID de perfil". |
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 "Título del perfil". |
Alert.qid | vulnerability.name | Se asignó como "QID: 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 "Fuente de alerta". |
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 en función del 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 analizó a partir de la línea de registro "Host: |
edr.client.ip_addresses | Se copió desde principal.ip |
|
edr.client.hostname | Se copió 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 analizó a partir de la línea de registro " |
|
network.http.method | Se analizó a partir de la línea de registro " |
|
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. |
¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.