Recopilar registros de vulnerabilidades de Armis
En este documento se explica cómo ingerir registros de vulnerabilidades de Armis en Google Security Operations mediante Google Cloud Functions. El analizador transforma los registros de vulnerabilidades de seguridad sin procesar en formato JSON en un formato estructurado que se ajusta al UDM de Google SecOps. Extrae varios campos del registro sin procesar, los asigna a los campos de UDM correspondientes, realiza conversiones de tipos de datos y estructura la salida para que se pueda ingerir en la plataforma de Google SecOps.
Antes de empezar
Asegúrate de que cumples los siguientes requisitos previos:
- Instancia de Google SecOps con el ID de cliente y las credenciales de la cuenta de servicio
- Acceso con privilegios a la plataforma Armis Centrix
- Clave secreta de la API de Armis y URL del servidor
- Acceso a Google Cloud con permisos para crear funciones de Cloud, secretos de Secret Manager y trabajos de Cloud Scheduler
- Licencia de Gestión de Vulnerabilidades de Recursos (AVM) de Armis o acceso al módulo
Obtener el ID de cliente de Google SecOps
- Inicia sesión en la consola de Google SecOps.
- Ve a Configuración de SIEM > Perfil.
- Copia y guarda el ID de cliente de la sección Detalles de la organización.
Obtener las credenciales de la cuenta de servicio de Google SecOps
- Inicia sesión en la consola de Google SecOps.
- Ve a Configuración de SIEM > Agentes de recogida.
- Descarga el archivo de autenticación de ingestión (archivo JSON de la cuenta de servicio).
- Guarda el archivo de forma segura, ya que tendrás que subirlo a Google Secret Manager.
Obtener la clave secreta de la API de Armis
- Inicia sesión en la plataforma Armis Centrix.
- Ve a Ajustes > Gestión de APIs.
- Haga clic en Crear si necesita generar una nueva clave secreta de API.
- Haz clic en Mostrar para ver la clave secreta.
- Copia y guarda la clave secreta de forma segura.
Configurar Google Secret Manager
En esta sección se explica cómo usar Google Secret Manager para almacenar de forma segura la clave de la cuenta de servicio necesaria para la integración.
Añadir el secreto de la cuenta de servicio de Google SecOps
- Inicia sesión en la consolaGoogle Cloud .
- Ve a Seguridad > Gestor de secretos.
- Haz clic en Crear secreto.
- Proporcione los siguientes detalles de configuración:
- Nombre: introduce un nombre para el secreto (por ejemplo,
secops-service-account). - Valor del secreto: sube el archivo JSON de la cuenta de servicio de Google SecOps que has descargado antes o pega su contenido directamente.
- Nombre: introduce un nombre para el secreto (por ejemplo,
- Haz clic en Crear secreto.
Copia el ID de recurso del secreto creado con el siguiente formato:
projects/{project_id}/secrets/{secret_id}/versions/{version_id}
Añadir el secreto de la clave secreta de la API de Armis
- En Secret Manager, haz clic en Crear secreto.
- Proporcione los siguientes detalles de configuración:
- Nombre: introduce un nombre para el secreto (por ejemplo,
armis-api-secret). - Valor secreto: pega la clave secreta de la API de Armis que has obtenido antes.
- Nombre: introduce un nombre para el secreto (por ejemplo,
- Haz clic en Crear secreto.
Copia el ID de recurso del secreto creado con el siguiente formato:
projects/{project_id}/secrets/{secret_id}/versions/{version_id}`
Descargar y preparar la secuencia de comandos de ingestión
- Accede al repositorio oficial de secuencias de comandos de ingestión de Google SecOps en https://github.com/chronicle/ingestion-scripts.
- Descarga el contenido del directorio armis del repositorio.
- Descarga el directorio common del repositorio (dependencia obligatoria).
- Crea un directorio para la implementación de la función de Cloud en tu máquina local.
- Copia el contenido de los directorios armis y common en tu directorio de implementación.
Configurar variables de entorno
- Abre el archivo
.env.ymlen un editor de texto. Edita el archivo con la siguiente configuración:
CHRONICLE_CUSTOMER_ID: <YOUR_CUSTOMER_ID> CHRONICLE_REGION: "us" CHRONICLE_SERVICE_ACCOUNT: projects/{project_id}/secrets/{chronicle-secret-id}/versions/{version_id} CHRONICLE_NAMESPACE: <YOUR_NAMESPACE> POLL_INTERVAL: "10" ARMIS_SERVER_URL: https://<your-armis-instance>.armis.com ARMIS_API_SECRET_KEY: projects/{project_id}/secrets/{armis-secret-id}/versions/{version_id} HTTPS_PROXY: CHRONICLE_DATA_TYPE: ARMIS_VULNERABILITIESSustituye los siguientes valores:
<YOUR_CUSTOMER_ID>: tu ID de cliente de Google SecOpsprojects/{project_id}/secrets/{chronicle-secret-id}/versions/{version_id}: la ruta completa del ID de recurso del secreto de tu cuenta de servicio de Google SecOps en Secret Manager<YOUR_NAMESPACE>: espacio de nombres opcional para los registros de Google Security Operations (por ejemplo,armis-vulnerabilities)<your-armis-instance>: el subdominio de tu arrendatario de Armis (por ejemplo, si tu URL es https://company.armis.com, usacompany)projects/{project_id}/secrets/{armis-secret-id}/versions/{version_id}: ruta completa del ID de recurso de tu secreto de la API de Armis en Secret Manager
Desplegar la función de Cloud
Desplegar con Cloud Functions (2.ª gen.) (recomendado)
- Abre Cloud Shell o tu terminal local con la CLI de gcloud instalada.
- Desplázate hasta el directorio que contiene los archivos de la secuencia de comandos de ingestión.
Ejecuta el siguiente comando:
gcloud functions deploy armis-vulnerabilities-ingestion \ --gen2 \ --entry-point main \ --trigger-http \ --runtime python39 \ --env-vars-file .env.yml \ --memory 512MB \ --timeout 3600s \ --region us-central1
Desplegar con Cloud Functions (1.ª gen.) (alternativa)
Ejecuta el siguiente comando:
gcloud functions deploy armis-vulnerabilities-ingestion \ --entry-point main \ --trigger-http \ --runtime python39 \ --env-vars-file .env.yml \ --memory 512MB \ --timeout 540s \ --region us-central1
Crear una tarea de Cloud Scheduler
- En la Google Cloud consola, ve a Cloud Scheduler.
- Haz clic en Crear trabajo.
- Proporcione los siguientes detalles de configuración:
- Nombre: introduce un nombre para el trabajo (por ejemplo,
armis-vulnerabilities-scheduler). - Región: selecciona la misma región que tu función de Cloud (por ejemplo,
us-central1). - Frecuencia: introduce la programación con la sintaxis cron (por ejemplo,
*/10 * * * *para que se ejecute cada 10 minutos). - Zona horaria: selecciona la zona horaria que prefieras (por ejemplo, UTC).
- Nombre: introduce un nombre para el trabajo (por ejemplo,
- Haz clic en Continuar.
- Selecciona HTTP como tipo de destino.
- Proporcione los siguientes detalles de configuración:
- URL: en la consola de Cloud Functions, ve a la pestaña ACTIVADOR de tu función y copia la URL del activador. Pégala aquí.
- Método HTTP: selecciona POST.
- Haz clic en Encabezado de autorización > Añadir token de OIDC.
- Selecciona la cuenta de servicio que usa la función de Cloud.
- Haz clic en Crear.
Tabla de asignación de UDM
| Campo de registro | Asignación de UDM | Lógica |
|---|---|---|
| affectedDevicesCount | read_only_udm.security_result.detection_fields.value | Mapeo directo, convertido en cadena. |
| attackComplexity | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | Asignación directa. |
| attackVector | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | Asignación directa. |
| availabilityImpact | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | Asignación directa. |
| avmRating | read_only_udm.security_result.detection_fields.value | Asignación directa. |
| redes de robots | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | Se concatenan en una sola cadena si existen varias botnets. |
| cisaDueDate | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | Asignación directa. |
| collection_time.nanos | read_only_udm.metadata.event_timestamp.nanos | Asignación directa. |
| collection_time.seconds | read_only_udm.metadata.event_timestamp.seconds | Asignación directa. |
| commonName | read_only_udm.extensions.vulns.vulnerabilities.name | Asignación directa. |
| confidentialityImpact | read_only_udm.security_result.detection_fields.value | Asignación directa. |
| cveUid | read_only_udm.extensions.vulns.vulnerabilities.cve_id | Asignación directa. |
| cvssScore | read_only_udm.extensions.vulns.vulnerabilities.cvss_base_score | Mapeo directo, convertido a float. |
| description | read_only_udm.metadata.description | Asignación directa. |
| epssPercentile | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | Mapeo directo, convertido en cadena. |
| epssScore | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | Mapeo directo, convertido en cadena. |
| exploitabilityScore | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | Mapeo directo, convertido en cadena. |
| firstReferencePublishDate | read_only_udm.extensions.vulns.vulnerabilities.first_found | Se analiza como marca de tiempo y admite formatos con y sin milisegundos. |
| firstWeaponizedReferencePublishDate | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | Asignación directa. |
| hasRansomware | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | Mapeo directo, convertido en cadena. |
| id | read_only_udm.metadata.product_log_id | Asignación directa. |
| impactScore | read_only_udm.security_result.detection_fields.value | Mapeo directo, convertido en cadena. |
| integrityImpact | read_only_udm.security_result.detection_fields.value | Asignación directa. |
| isWeaponized | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | Mapeo directo, convertido en cadena. |
| latestExploitUpdate | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | Asignación directa. |
| numOfExploits | read_only_udm.security_result.detection_fields.value | Mapeo directo, convertido en cadena. |
| numberOfThreatActors | read_only_udm.security_result.detection_fields.value | Mapeo directo, convertido en cadena. |
| orgPriorityManualChangeReason | read_only_udm.security_result.detection_fields.value | Asignación directa. |
| orgPriorityManualChangedBy | read_only_udm.principal.user.userid | Asignación directa. |
| orgPriorityManualUpdateTime | read_only_udm.principal.labels.value | Asignación directa. |
| privilegesRequired | read_only_udm.security_result.detection_fields.value | Asignación directa. |
| publishedDate | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | Asignación directa. |
| reportedByGoogleZeroDays | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | Mapeo directo, convertido en cadena. |
| permiso | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | Asignación directa. |
| gravedad | read_only_udm.extensions.vulns.vulnerabilities.severity | Se asigna a CRÍTICO, ALTO, MEDIO o BAJO en función del valor. El valor original también se asigna a severity_details. |
| status | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | Asignación directa. |
| threatTags | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | Se concatenan en una sola cadena si hay varias etiquetas de amenaza. |
| userInteraction | read_only_udm.about.labels.value | Asignación directa. |
| vulnerabilities_matches | read_only_udm.metadata.url_back_to_product | Asignación directa. |
| read_only_udm.metadata.event_type | Se asigna el valor "GENERIC_EVENT". | |
| read_only_udm.metadata.product_name | Selecciona "ARMIS". | |
| read_only_udm.metadata.vendor_name | Selecciona "ARMIS". | |
| read_only_udm.metadata.log_type | Se ha definido como "ARMIS_VULNERABILITIES". | |
| read_only_udm.extensions.vulns.vulnerabilities.severity_details | El valor del campo "severity" se asigna a este campo. |
¿Necesitas más ayuda? Recibe respuestas de los miembros de la comunidad y de los profesionales de Google SecOps.