En esta página, se explica cómo codificar una definición de módulo personalizado con Common Expression Language (CEL) y YAML.
Usa Google Cloud CLI para subir tus definiciones de módulos personalizados a Security Health Analytics.
En el archivo YAML, una definición de módulo personalizado consta de un conjunto estructurado de propiedades que usas para definir los siguientes elementos de un módulo personalizado de Security Health Analytics:
- Los recursos que se deben analizar
- La lógica de detección que se debe usar
- La información que se debe proporcionar a tus equipos de seguridad para que puedan comprender, priorizar y resolver rápidamente el problema detectado
Las propiedades específicas obligatorias y opcionales que componen una definición de YAML se tratan en Pasos de codificación.
Evita crear detectores redundantes
Para controlar el volumen de hallazgos, evita crear y ejecutar módulos que contengan funciones redundantes.
Por ejemplo, si creas un módulo personalizado que verifica las claves de encriptación que no se rotan después de 30 días, considera inhabilitar el detector integrado de Security Health Analytics KMS_KEY_NOT_ROTATED, ya que su verificación, que usa un valor de 90 días, sería superflua.
Para obtener más información sobre cómo inhabilitar detectores, consulta Habilita e inhabilita los detectores.
Pasos de codificación
Codificas la definición de un módulo personalizado para Security Health Analytics como una serie de propiedades de YAML, algunas de las cuales contienen expresiones CEL.
Para codificar un módulo de definición personalizado, sigue estos pasos:
Crea un archivo de texto con la extensión de nombre de archivo
yaml.En el archivo de texto, crea una propiedad
resource_selectory especifica de uno a cinco tipos de recursos para que el módulo personalizado los analice. Un tipo de recurso no se puede especificar más de una vez en una definición de módulo personalizado. Por ejemplo:resource_selector: resource_types: ‐ cloudkms.googleapis.com/CryptoKey
Los tipos de recursos que especifiques deben ser compatibles con Security Command Center. Para obtener una lista de los tipos de recursos admitidos, consulta Tipos de recursos admitidos.
Crea una propiedad
predicatey especifica una o más expresiones CEL que verifiquen las propiedades de los tipos de recursos que se analizarán. Cualquier propiedad a la que hagas referencia en las expresiones CEL debe existir en la Google Cloud definición de API de cada tipo de recurso que especifiques enresource_selector. Para activar un hallazgo, la expresión debe resolverse comoTRUE. Por ejemplo, en la siguiente expresión, solo los valoresrotationPeriodmayores que2592000sactivan un hallazgo.predicate: expression: resource.rotationPeriod > duration("2592000s")Para obtener ayuda para escribir expresiones CEL, consulta los siguientes recursos:
- Tipos de recursos admitidos. (haz clic en cada recurso para ver las propiedades que puedes usar en tus expresiones CEL)
- Escribe expresiones CEL
- Haz referencia a las propiedades de recursos y políticas en módulos personalizados.
Crea una propiedad
descriptionque explique la vulnerabilidad o la configuración incorrecta que detecta el módulo personalizado. Esta explicación aparece en cada instancia de hallazgo para ayudar a los investigadores a comprender el problema detectado. El texto debe estar entre comillas. Por ejemplo:description: "The rotation period of the identified cryptokey resource exceeds 30 days, the maximum rotation period that our security guidelines allow."
Crea una propiedad
recommendationque explique cómo corregir el problema detectado. Gcloud CLI requiere un carácter de escape antes de ciertos caracteres, como las comillas. En el siguiente ejemplo, se muestra el uso de la barra inversa para escapar cada conjunto de comillas:recommendation: "To fix this issue go to https://console.cloud.google.com/security/kms. Click the key-ring that contains the key. Click the key. Click \"Edit rotation period\". Then set the rotation period to at most 30 days."Si creas o actualizas un módulo personalizado con la Google Cloud consola, no se requieren caracteres de escape.
Crea una propiedad
severityy especifica la gravedad predeterminada para los hallazgos que crea este módulo. Los valores de uso frecuente para la propiedadseveritysonLOW,MEDIUM,HIGHyCRITICAL. Por ejemplo:severity: MEDIUM
De manera opcional, crea una propiedad
custom_outputy especifica información adicional para mostrar con cada hallazgo. Especifica la información que se mostrará como uno o más pares nombre-valor. Puedes mostrar el valor de una propiedad del recurso analizado o una cadena literal. Las propiedades deben especificarse comoresource.PROPERTY_NAME. Las cadenas literales deben estar entre comillas. En el siguiente ejemplo, se muestra unacustom_outputdefinición que muestra un valor de propiedad, el valor derotationPerioden el recursoCryptoKeyanalizado y una cadena de texto,"Excessive rotation period for CryptoKey":custom_output: properties: - name: duration value_expression: expression: resource.rotationPeriod - name: note value_expression: expression: "'Excessive rotation period for CryptoKey'"Guarda el archivo en una ubicación a la que pueda acceder tu gcloud CLI.
Sube la definición a Security Health Analytics con el siguiente comando:
gcloud scc custom-modules sha create \ --organization=organizations/ORGANIZATION_ID \ --display-name="MODULE_DISPLAY_NAME" \ --enablement-state="ENABLED" \ --custom-config-from-file=DEFINITION_FILE_NAME.yamlReemplaza los siguientes valores:
ORGANIZATION_IDpor el ID de la organización superior del módulo personalizado o reemplaza la marca--organizationpor--folderso--projecty especifica el ID de la carpeta o el proyecto superior.MODULE_DISPLAY_NAMEpor un nombre que se mostrará como la categoría de hallazgo cuando el módulo personalizado muestre hallazgos. El nombre debe tener entre 1 y 128 caracteres, comenzar con una letra minúscula y contener solo caracteres alfanuméricos o guiones bajos.DEFINITION_FILE_NAMEpor la ruta de acceso y el nombre de archivo del archivo YAML que contiene la definición del módulo personalizado.
Para obtener más información sobre cómo trabajar con módulos personalizados de Security Health Analytics, consulta Usa módulos personalizados para Security Health Analytics.
Latencias de análisis para módulos personalizados nuevos
La creación de un módulo personalizado no activa un análisis nuevo.
Security Health Analytics no comienza a usar un módulo personalizado nuevo hasta que sucede una de las siguientes situaciones:
- El primer análisis por lotes después de crear el módulo personalizado. Según cuándo crees un módulo personalizado en tu programación de análisis por lotes, es posible que debas esperar hasta 24 horas antes de que Security Health Analytics comience a usar el módulo personalizado.
- Un cambio en un recurso de destino activa un análisis en tiempo real.
Ejemplo de definición de módulo personalizado
En el siguiente ejemplo, se muestra una definición de módulo personalizado completa que activa un hallazgo si el valor de la propiedad rotationPeriod de un recurso cloudkms.googleapis.com/CryptoKey es mayor que 2,592,000 segundos (30 días). En el ejemplo, se muestran dos valores opcionales en la sección custom_output: el valor de resource.rotationPeriod y una nota como una cadena de texto.
En el ejemplo, ten en cuenta los siguientes elementos:
- El tipo de elemento o recurso que se debe verificar aparece en la sección
resource_selectorenresource_types. - La verificación que realiza el módulo en los recursos, su lógica de detección,
se define en la
predicatesección precedida porexpression. - En la sección
custom_output, se definen dos propiedades de origen personalizadas,durationyviolation. - La explicación del problema detectado se especifica en la propiedad
description. - La guía para solucionar el problema detectado se especifica en la propiedad
recommendation. Debido a que las comillas aparecen en la guía, se requiere un carácter de escape de barra inversa antes de cada comilla.
severity: HIGH
description: "Regular key rotation helps provide protection against
compromised keys, and limits the number of encrypted messages available
to cryptanalysis for a specific key version."
recommendation: "To fix this issue go to
https://console.cloud.google.com/security/kms. Click the key-ring that
contains the key. Click the key. Click \"Edit rotation period\". Then
set the rotation period to at most 30 days."
resource_selector:
resource_types:
- cloudkms.googleapis.com/CryptoKey
predicate:
expression: resource.rotationPeriod > duration("2592000s")
custom_output:
properties:
- name: duration
value_expression:
expression: resource.rotationPeriod
- name: violation
value_expression:
expression:
"'Excessive rotation period for CryptoKey'"
Haz referencia a las propiedades de recursos y políticas en módulos personalizados
Independientemente del método que uses para crear un módulo personalizado (con la Google Cloud consola o escribiendo la definición tú mismo), debes poder buscar las propiedades que puedes evaluar en el módulo personalizado. También debes saber cómo hacer referencia a esas propiedades en una definición de módulo personalizado.
Busca las propiedades de un recurso o una política
Las propiedades de un Google Cloud recurso se definen en la definición de API del recurso. Para encontrar esta definición, haz clic en el nombre del recurso en Tipos de recursos admitidos.
Puedes encontrar las propiedades de una política en la documentación de referencia de la API de IAM. Para obtener información sobre las propiedades de una política, consulta Política.
Haz referencia a una propiedad de recurso en una definición de módulo personalizado
Cuando creas un módulo personalizado, todas las referencias directas a la propiedad de un recurso analizado deben comenzar con resource, seguidas de las propiedades superiores y, por último, la propiedad de destino. Las propiedades se separan con un punto, con una notación de puntos de estilo JSON.
Los siguientes son ejemplos de propiedades de recursos y cómo se pueden recuperar:
resourceName: Almacena el nombre completo de un recurso en Cloud Asset Inventory, por ejemplo,//cloudresourcemanager.googleapis.com/projects/296605646631.resource.rotationPeriod: En el querotationPeriodes una propiedad deresource.resource.metadata.name: En el quenamees una subpropiedad demetadata, que es una subpropiedad deresource.
Haz referencia a las propiedades de la política de IAM
Puedes crear expresiones CEL que evalúen la política de IAM de un recurso haciendo referencia a las propiedades de la política de IAM del recurso. Las únicas propiedades disponibles son las vinculaciones y las funciones dentro de las vinculaciones.
Cuando se hace referencia a las propiedades de la política de IAM, policy es la propiedad de nivel superior.
Los siguientes son ejemplos de propiedades de la política de IAM y cómo se pueden recuperar:
policy.bindings, en el quebindingses una propiedad depolicy.policy.version, en el queversiones una propiedad depolicy.
Para obtener más ejemplos, consulta Expresiones de CEL de ejemplo.
Para obtener información sobre las propiedades de una política, consulta Política.
Escribe expresiones CEL
Cuando creas un módulo personalizado, usas expresiones CEL para evaluar las propiedades del recurso analizado. De manera opcional, también puedes usar expresiones CEL para definir pares name-value personalizados que muestren información adicional con tus hallazgos.
Ya sea que crees un módulo personalizado en la Google Cloud consola o escribas tú mismo la definición del módulo personalizado en un archivo YAML, las expresiones CEL que definas serán las mismas.
Expresiones CEL para la lógica de detección
Codificas la lógica de detección de un módulo personalizado con expresiones CEL con operadores CEL estándar para evaluar las propiedades de los recursos analizados.
Tus expresiones pueden ser verificaciones simples de un solo valor o expresiones compuestas más complejas que verifican varios valores o condiciones. De cualquier manera, la expresión debe resolverse como un valor booleano true para activar un hallazgo.
Si creas un módulo personalizado en la Google Cloud consola, escribes estas expresiones en el Editor de expresiones de la página Configurar módulo.
Si codificas un módulo personalizado en un archivo YAML, agregas estas expresiones en la propiedad predicate.
Independientemente de si usas la Google Cloud consola o un archivo YAML , las expresiones CEL que evalúan las propiedades de los recursos deben cumplir con las siguientes reglas:
- Las propiedades que especifiques en una expresión CEL deben ser propiedades del recurso analizado, como se define en la definición de API del tipo de recurso.
Si un módulo personalizado evalúa varios tipos de recursos, las propiedades que especifiques en las expresiones CEL deben ser comunes a cada tipo de recurso que evalúe el módulo personalizado.
Por ejemplo, si defines un módulo personalizado llamado
invalid_cryptokeyque verifica dos tipos de recursos:cloudkms.googleapis.com/CryptoKeyycloudkms.googleapis.com/CryptoKeyVersion, puedes escribir la siguiente expresión, ya que los tipos de recursosCryptoKeyyCryptoKeyVersionincluyen la propiedadname:predicate: resource.name.matches("projects/project1/locations/us-central1/keyRings/keyring1/cryptoKeys/.*")Sin embargo, no puedes especificar la siguiente expresión en el módulo personalizado
invalid_cryptokey, ya que las propiedadesimportTimeyrotationPeriodque evalúa la expresión no se comparten entre ambos tipos de recursos:predicate: resource.importTime >= timestamp("2022-10-02T15:01:23Z") || resource.rotationPeriod > duration("2592000s")Todos los enums de una expresión CEL deben representarse como cadenas. Por ejemplo, la siguiente es una expresión válida para el tipo de recurso
cloudkms.googleapis.com/CryptoKeyVersion:resource.state = "PENDING_GENERATION"
El resultado de las expresiones CEL que definas en la propiedad
predicatedebe ser un valor booleano. Un hallazgo se activa solo si el resultado estrue.
Para obtener más información sobre CEL, consulta lo siguiente:
Expresiones de CEL de ejemplo
En la siguiente tabla, se enumeran algunas expresiones CEL que se pueden usar para evaluar las propiedades de los recursos. Puedes usarlas en la Google Cloud consola y en las definiciones de módulos personalizados de YAML.
| Tipo de recurso | Explicación | Expresión CEL |
|---|---|---|
| Cualquier recurso con una política de IAM | Verificación de la política de IAM para identificar miembros de fuera del dominio | !policy.bindings.all(binding, binding.members.all(m ,!m.endsWith('@gmail.com'))) |
cloudkms.googleapis.com/CryptoKey |
Verificación del período de rotación de claves de Cloud KMS | has(resource.rotationPeriod) && resource.rotationPeriod > duration('60h') |
| Varios tipos de recursos con una sola política | Verifica si el nombre del recurso comienza con dev o devAccess
según el tipo de recurso |
(resource.type == 'compute.googleapis.com/Disk' &&
resource.name.startsWith('projects/PROJECT_ID/regions/
REGION/disks/devAccess')) || (resource.type ==
'compute.googleapis.com/Instance ' &&
resource.name.startsWith('projects/PROJECT_ID/zones/REGION/instances/dev-')) |
compute.googleapis.com/Network |
Regla de intercambio de tráfico de nube privada virtual para hacer coincidir las redes | resource.selfLink.matches('https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/default') || resource.peerings.exists(p, p.network.matches('https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/shared$')) |
cloudfunctions.googleapis.com/CloudFunction |
Permite solo el tráfico de entrada interno para la función de Cloud Run | has(resource.ingressSettings) && resource.ingressSettings.matches('ALLOW_INTERNAL_ONLY') |
compute.googleapis.com/Instance |
El nombre del recurso coincide con el patrón | resource.name.matches('^gcp-vm-(linux|windows)-v\\d+$') |
serviceusage.googleapis.com/Service |
Permite que solo se habiliten las APIs relacionadas con el almacenamiento | resource.state == 'ENABLED' && !( resource.name.matches('storage-api.googleapis.com') || resource.name.matches('bigquery-json.googleapis.com') || resource.name.matches('bigquery.googleapis.com') || resource.name.matches('sql-component.googleapis.com') || resource.name.matches('spanner.googleapis.com'))
|
sqladmin.googleapis.com/Instance
|
Solo se permiten las IPs públicas incluidas en la lista de entidades permitidas | (resource.instanceType == 'CLOUD_SQL_INSTANCE' && resource.backendType == 'SECOND_GEN' && resource.settings.ipConfiguration.ipv4Enabled ) && !(resource.ipAddresses.all(ip, ip.type != 'PRIMARY' || ip.ipAddress.matches('IP_ADDRESS'))))
|
dataproc.googleapis.com/Cluster |
Verifica si los IDs de proyecto en un clúster de Managed Service para Apache Spark contienen las subcadenas testing o development | has(resource.projectId) && resource.projectId.contains('testing') || resource.projectId.contains('development') |
Expresiones CEL para propiedades de hallazgos personalizados
De manera opcional, para mostrar información adicional con cada hallazgo que se pueda usar en las consultas de hallazgos, puedes definir hasta diez propiedades personalizadas para mostrar con los hallazgos que generan tus módulos personalizados.
Las propiedades personalizadas aparecen en las propiedades de origen del hallazgo en el su JSON y en la pestaña Propiedades de origen de los detalles del hallazgo en la Google Cloud consola.
Defines las propiedades personalizadas como pares name-value.
Si creas un módulo personalizado en la Google Cloud consola,
defines los pares name-value en la sección Propiedades de hallazgos personalizados
de la página Define los detalles del hallazgo.
Si codificas un módulo personalizado en un archivo YAML, enumeras los pares name-value como properties en la propiedad custom_output.
Independientemente de si usas la Google Cloud consola o un archivo YAML, se aplican las siguientes reglas:
- Especifica
namecomo una cadena de texto sin comillas. Especifica
valuecomo una de las siguientes opciones:Para mostrar el valor de una propiedad, especifica la propiedad en el siguiente formato:
RESOURCE_TYPE.PROPERTY.PROPERTY_TO_RETURN
En el ejemplo:
RESOURCE_TYPEpuede serresourceopolicy.PROPERTYuna o más propiedades superiores de la propiedad que contiene el valor que se mostrará.PROPERTY_TO_RETURNes la propiedad que contiene el valor que se mostrará.Para mostrar una cadena de texto, enciérrala entre comillas.
En el siguiente ejemplo, se muestran dos pares name-value definidos correctamente en custom_output en un archivo YAML:
custom_output:
properties:
- name: duration
value_expression:
expression: resource.name
- name: property_with_text
value_expression:
expression: "'Note content'"¿Qué sigue?
Para probar, enviar, ver y actualizar módulos personalizados, consulta las siguientes páginas:
- Para probar módulos personalizados, consulta Prueba módulos personalizados para Security Health Analytics.
- Para subir, ver y actualizar módulos personalizados, consulta Crea y administra módulos personalizados para Security Health Analytics.