Recopila registros de vulnerabilidades de Armis
En este documento, se explica cómo transferir registros de vulnerabilidades de Armis a Google Security Operations con Google Cloud Functions. El analizador transforma los registros de vulnerabilidades de seguridad sin procesar con formato JSON en un formato estructurado que cumple con el UDM de Google SecOps. Extrae varios campos del registro sin procesar, los asigna a los campos correspondientes del UDM, realiza conversiones de tipos de datos y estructura el resultado para su transferencia a la plataforma de Google SecOps.
Antes de comenzar
Asegúrate de cumplir con los siguientes requisitos previos:
- Instancia de SecOps de Google con ID de cliente y credenciales de la cuenta de servicio
- Acceso con privilegios a la plataforma de Armis Centrix
- Clave secreta y URL del servidor de la API de Armis
- Acceso a Google Cloud con permisos para crear Cloud Functions, secretos de Secret Manager y trabajos de Cloud Scheduler
- Acceso al módulo o a la licencia de Armis Asset Vulnerability Management (AVM)
Obtén el ID de cliente de Google SecOps
- Accede a 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.
Obtén las credenciales de la cuenta de servicio de Google SecOps
- Accede a la consola de Google SecOps.
- Ve a Configuración de SIEM > Agentes de recopilación.
- Descarga el archivo de autenticación de la transferencia (archivo JSON de la cuenta de servicio).
- Guarda el archivo de forma segura, ya que deberás subirlo a Google Secret Manager.
Obtén la clave secreta de la API de Armis
- Accede a la plataforma de Armis Centrix.
- Ve a Configuración > Administración de APIs.
- Haz clic en Crear si necesitas generar una nueva clave secreta de la API.
- Haz clic en Mostrar para ver la clave secreta.
- Copia y guarda la clave secreta de forma segura.
Configura 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.
Agrega el secreto de la cuenta de servicio de Google SecOps
- Accede a la consola deGoogle Cloud .
- Ve a Seguridad > Secret Manager.
- Haz clic en Crear secreto.
- Proporciona los siguientes detalles de configuración:
- Nombre: Ingresa 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 descargaste anteriormente o pega su contenido directamente.
- Nombre: Ingresa un nombre para el secreto (por ejemplo,
- Haz clic en Crear secreto.
Copia el ID de recurso del Secret creado en el siguiente formato:
projects/{project_id}/secrets/{secret_id}/versions/{version_id}
Agrega el secreto de la clave secreta de la API de Armis
- En Secret Manager, haz clic en Crear secreto.
- Proporciona los siguientes detalles de configuración:
- Nombre: Ingresa un nombre para el secreto (por ejemplo,
armis-api-secret). - Valor del secreto: Pega la clave secreta de la API de Armis que obtuviste antes.
- Nombre: Ingresa un nombre para el secreto (por ejemplo,
- Haz clic en Crear secreto.
Copia el ID de recurso del Secret creado en el siguiente formato:
projects/{project_id}/secrets/{secret_id}/versions/{version_id}`
Descarga y prepara la secuencia de comandos de transferencia
- Accede al repositorio oficial de secuencias de comandos de transferencia 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 nuevo para la implementación de Cloud Function en tu máquina local.
- Copia el contenido de los directorios armis y common en tu directorio de implementación.
Configure las 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_VULNERABILITIESReemplaza los siguientes valores:
<YOUR_CUSTOMER_ID>: Tu ID de cliente de Google SecOpsprojects/{project_id}/secrets/{chronicle-secret-id}/versions/{version_id}: Es la ruta de acceso completa del ID de recurso del secreto de tu cuenta de servicio de Google SecOps desde Secret Manager.<YOUR_NAMESPACE>: Es el espacio de nombres opcional para los registros de Google Security Operations (por ejemplo,armis-vulnerabilities).<your-armis-instance>: 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}: Es la ruta de ID de recurso completa de tu secreto de la API de Armis desde Secret Manager.
Implementa la función de Cloud Functions
Implementa con Cloud Function 2ª gen. (recomendado)
- Abre Cloud Shell o tu terminal local con gcloud CLI instalado.
- Navega al directorio que contiene los archivos de la secuencia de comandos de transferencia.
Ejecuta el comando siguiente:
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
Implementa con Cloud Function Gen1 (alternativa)
Ejecuta el comando siguiente:
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
Crea un trabajo de Cloud Scheduler
- En la consola Google Cloud , ve a Cloud Scheduler.
- Haz clic en Crear trabajo.
- Proporciona los siguientes detalles de configuración:
- Nombre: Ingresa un nombre para el trabajo (por ejemplo,
armis-vulnerabilities-scheduler). - Región: Selecciona la misma región que tu Cloud Function (por ejemplo,
us-central1). - Frecuencia: Ingresa la programación con la sintaxis cron (por ejemplo,
*/10 * * * *para cada 10 minutos). - Zona horaria: Selecciona tu zona horaria preferida (por ejemplo, UTC).
- Nombre: Ingresa un nombre para el trabajo (por ejemplo,
- Haz clic en Continuar.
- Selecciona HTTP como el tipo de destino.
- Proporciona 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égalo aquí.
- Método HTTP: Selecciona POST.
- Haz clic en Encabezado de autenticación > Agregar token de OIDC.
- Selecciona la cuenta de servicio que usa Cloud Function.
- 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 | Es el 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 |
| botnets | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | Se concatena 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 | Es la asignación directa, convertida a float. |
| descripción | read_only_udm.metadata.description | Asignación directa |
| epssPercentile | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | Es el mapeo directo, convertido en cadena. |
| epssScore | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | Es el mapeo directo, convertido en cadena. |
| exploitabilityScore | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | Es el mapeo directo, convertido en cadena. |
| firstReferencePublishDate | read_only_udm.extensions.vulns.vulnerabilities.first_found | Se analiza como marca de tiempo y controla 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 | Es el 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 | Es el 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 | Es el 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 | Es el mapeo directo, convertido en cadena. |
| numberOfThreatActors | read_only_udm.security_result.detection_fields.value | Es el 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 | Es el mapeo directo, convertido en cadena. |
| alcance | read_only_udm.extensions.vulns.vulnerabilities.about.labels.value | Asignación directa |
| gravedad, | read_only_udm.extensions.vulns.vulnerabilities.severity | Se asigna a CRITICAL, HIGH, MEDIUM o LOW según el valor. El valor original también se asigna a severity_details. |
| estado | 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 existen varias etiquetas de amenazas. |
| 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 debe establecer en "GENERIC_EVENT". | |
| read_only_udm.metadata.product_name | Se debe establecer en "ARMIS". | |
| read_only_udm.metadata.vendor_name | Se debe establecer en "ARMIS". | |
| read_only_udm.metadata.log_type | Se establece en "ARMIS_VULNERABILITIES". | |
| read_only_udm.extensions.vulns.vulnerabilities.severity_details | El valor del campo "severity" se asigna a este campo. |
¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.