Control de la implementación mediante OPA
En la arquitectura « DevSecOps », las pruebas recopiladas durante el proceso de CI deben validarse antes de su implementación para garantizar que los activos cumplan los requisitos de cumplimiento normativo. Este proceso de validación actúa como un filtro de calidad, impidiendo que los activos que no cumplen los requisitos se implementen en entornos de prueba o de producción.
Para obtener más información sobre la selección de pruebas, consulta « Validación de pruebas ».
Presentamos Open Policy Agent (OPA)
Para ofrecer una mayor flexibilidad, el proceso de implementación admite ahora el control de la fase de implementación mediante Open Policy Agent (OPA). OPA es un motor de políticas de código abierto y de uso general que separa la toma de decisiones sobre las políticas de la ejecución del proceso. Te permite definir reglas de cumplimiento en forma de código, lo que hace que las evaluaciones sean altamente personalizables y totalmente transparentes. OPA utiliza Rego como lenguaje de consulta, lo que facilita la redacción y el mantenimiento de las políticas.
Para obtener más información sobre Open Policy Agent, consulta Open Policy Agent.
¿Qué es Rego?
Rego es el lenguaje de consulta nativo y declarativo que utiliza OPA. Te permite escribir tu «política como código» En lugar de basarte en una lógica de proceso predefinida, evalúas la información de la fase del proceso y devuelves una decisión.
En el contexto de los controles de implementación, puedes considerar a Rego como el filtro entre las pruebas recopiladas y tu entorno de destino. En lugar de basarse en una lógica rígida del proceso, Rego toma los datos de evidencia del proceso (en formato JSON) y los evalúa según tus reglas personalizadas para ofrecer una decisión definitiva sobre la implementación.
Para obtener más información sobre Rego, consulta el documento « The Rego Policy Language ».
La norma « allow »
Por norma general, el expediente de su póliza de Rego debe incluir una cláusula de « allow ». En el contexto de este proceso, esto no es solo una sugerencia, sino un requisito imprescindible.
El motor del pipeline consulta específicamente el valor booleano « allow » para tomar la decisión final sobre si se lleva a cabo o no la implementación. Si vas a proporcionar una política Rego personalizada, debes definir esta
regla de forma explícita. Si falta la regla « allow » o si su resultado es « false », el proceso se detiene inmediatamente, bloquea la implementación y muestra los mensajes de denegación que hayas definido.
Para garantizar la máxima seguridad, OPA funciona según un estricto modelo de «cierre en caso de fallo». Tu política siempre debería establecer por defecto el valor « false » y solo evaluarse como « true » si se cumplen
todas las condiciones de cumplimiento requeridas.
package one_pipeline.config
# Default deny
default allow := false
# Allow only if your custom checks pass
allow {
check_sast_scans_passed
check_secrets_scans_passed
}
Cómo habilitar OPA en tu proceso de trabajo
Para empezar a utilizar OPA para el control de la implementación, debes configurar unas propiedades específicas (variables de entorno) en la configuración de tu pipeline. Utiliza la tabla siguiente para determinar qué propiedades son necesarias para tu tipo específico de proceso:
| Requisito | Propiedad de la tubería | Finalidad |
|---|---|---|
| Activar la función «Gating» (Promoción) | opt-in-evidence-checks |
Activa la puerta de cumplimiento en los flujos de trabajo de validación de promociones. |
| Habilitar OPA (CD y CC) | opt-in-rego-translation |
Indica a los flujos de trabajo de implementación continua (CD) y cumplimiento continuo (CC) que utilicen la nueva lógica de OPA. |
| Definir la lógica (las reglas) | policy-path |
Indica al motor de pipeline dónde se encuentran tus archivos de políticas personalizados de « .rego ». |
| Aportar datos (los hechos) | evidence-checks-config-path |
Apunta a tus archivos de validación de datos estáticos .json. |
Archivos de políticas y archivos de validación de datos
El archivo de políticas (.rego): la lógica
Aquí es donde debes escribir tus reglas y condiciones concretas. Por ejemplo, tu política podría establecer lo siguiente: «No autorices esta implementación a menos que se haya realizado un análisis de vulnerabilidades y los resultados indiquen que no hay ningún problema crítico». Puedes proporcionar tu archivo de políticas personalizado utilizando la propiedad de entorno del pipeline « policy-path ». Si no se proporciona ningún archivo de políticas, el proceso utiliza el archivo de políticas predeterminado.
El archivo de validación de datos (.json): los datos
Este archivo sirve como lista de referencia estática. En lugar de introducir los datos directamente en las reglas de Rego, este archivo sirve para mantener listas de variables aprobadas, como los registros de imágenes permitidos (us.icr.io o eu.icr.io) o repositorios específicos que están exentos de determinadas comprobaciones. Puedes proporcionar tu archivo de validación de datos utilizando la propiedad de entorno del canal « evidence-checks-config-path ». Si no se proporciona ningún archivo de validación de datos, el proceso utiliza el archivo de validación de datos predeterminado.
Archivo de ejemplo de validación de datos:
package one_pipeline.config
pre_deployment := {
"com.ibm.prod_change_request": {
"asset_type": [
"*",
"image"
],
"source": [
"prod",
"stage"
],
"target": [
"prod",
"stage"
],
"recommended": [
"*"
]
}
}
post_deployment := {
"com.ibm.prod_change_request": {
"asset_type": [
"*",
"image"
],
"source": [
"prod",
"stage"
],
"target": [
"prod",
"stage"
],
"recommended": [
"*"
]
}
}
Cada bloque de la configuración define exactamente qué pruebas se esperan, de dónde proceden y con qué rigor deben aplicarse.
- El identificador del tipo de prueba (
com.ibm.prod_change_request): la clave de nivel superior determina la categoría específica de la prueba que se está evaluando. Algunos ejemplos habituales soncom.ibm.static-scan,com.ibm.unit-testsocom.ibm.image_signing. asset_type: Define el tipo de artefacto al que se aplica esta regla. Por ejemplo, podría aplicarse únicamente aimageo arepo. Al utilizar «["*"]», la regla se aplica a todos los tipos de activos.source(Entornos de origen): Define de dónde proceden las pruebas. Podría tratarse de una rama concreta o de un entorno de pipeline (por ejemplo,ci-pipeline,stage,prod).target(Entornos de destino): Define el entorno de destino en el que se está validando esta prueba para su implementación (por ejemplo,stage,prod). Aquí se puede encontrar más información sobre el origen y el destino.gating mode: Los últimos campos indican qué modo de filtrado deseas aplicar al tipo de prueba. Aquí puedes encontrar más información sobre los modos de sincronización compatibles.
Nota: Todas las comprobaciones previas a la implementación deben definirse en el array pre_deployment :{}, y todas las comprobaciones posteriores a la implementación deben definirse en el array post_deployment :{}.
Además, si utilizas la ruta de política predeterminada, debes incluir la importación del paquete « one_pipeline.config » en tu archivo de registro de validación de datos.
Migración fluida para la validación de datos JSON existentes
Para los equipos que ya utilizan el proceso de trabajo, la pregunta más habitual suele ser: «¿Tengo que reescribir manualmente todos mis archivos de configuración JSON existentes en Rego?».
La respuesta es no. Para que la migración se realice sin ningún tipo de contratiempo, puedes integrar directamente en el proceso tus archivos de validación de datos JSON actuales. El proceso de integración reconoce de forma nativa tus archivos JSON heredados y los evaluará sin problemas junto con las nuevas funciones de OPA.
Nota: Esta compatibilidad con versiones anteriores se aplica específicamente a los archivos de validación de datos. Si deseas implementar una lógica de evaluación personalizada, debes crear un archivo de política Rego.
El script del conversor de JSON a Rego
Aunque el proceso admite de forma nativa los archivos heredados de validación de datos JSON, es posible que, con el tiempo, desees modernizar tus configuraciones y pasarte a Rego nativo para adoptar plenamente el estándar «política como código».
Para facilitar esta tarea, ponemos a tu disposición un script de utilidad independiente que convierte automáticamente tus archivos de validación de datos JSON existentes al nuevo formato Rego.
Ubicación del script:
/opt/one-pipeline/polyglot/polyglot/translate-pipeline-config.sh
Cómo utilizar el script de conversión
Puedes ejecutar este script de forma local o dentro de una ejecución de pipeline. Al ejecutar el script de forma local, debes indicar explícitamente los entornos de destino y de origen.
Parámetros del script
| Parámetro | ¿Obligatorio? | Descripción |
|---|---|---|
--input |
Sí | La ruta de acceso a tu archivo de configuración JSON heredado ya existente. |
--target-env |
Sí | El entorno de destino para la validación (por ejemplo, prod, stage). Nota: Si se ejecuta dentro del pipeline, se resuelve automáticamente mediante get_env. |
--source-env |
Sí | El entorno de origen de la evidencia (p. ej., master, stage). Nota: Si se ejecuta dentro del proceso, se resuelve automáticamente a través de get_env. |
--output |
No | La ruta de destino en la que se guardará el archivo « .rego » generado. Si se omite, la salida se enviará a la salida estándar o se generará junto al archivo de entrada, dependiendo de la lógica del script de Python. |
Uso de ejemplo
# Convert a JSON config to Rego using named parameters
/opt/one-pipeline/polyglot/polyglot/translate-pipeline-config.sh \
--input ./legacy-evidence-config.json \
--output ./new-evidence-config.rego \
--target-env prod \
--source-env master
Nota: También tendrás que especificar las propiedades del entorno de pipeline
source-environmentytarget-environmenten caso de que indiques directamente el archivo.jsonen la propiedad--config-path.
Proceso de validación de promociones: controles de cumplimiento «shift-left»
La integración de Open Policy Agent (OPA) en el proceso de validación de promociones permite realizar comprobaciones de cumplimiento directamente en la fase de solicitud de incorporación de cambios (PR). Este enfoque de «shift-left» permite a los desarrolladores validar su carga útil de pruebas y detectar deficiencias de cumplimiento antes de que se fusione el código. Al detectar a tiempo, en las primeras fases del ciclo de vida del desarrollo, las pruebas que faltan o que no superan los controles, los equipos pueden evitar obstáculos en la implementación en fases avanzadas y reducir considerablemente el trabajo de corrección.
Configuración flexible: varios archivos de validación
Los entornos complejos suelen requerir conjuntos de reglas modulares. Para facilitar esto, el proceso de validación de promociones te permite evaluar tus datos comparándolos con varias configuraciones al mismo tiempo.
Puedes proporcionar varios archivos de validación de datos indicando sus rutas como una lista separada por comas en el parámetro « evidence-checks-config-path ». En este caso, el proceso evaluará la carga útil de pruebas en función
de cada archivo de configuración y generará una tabla de evaluación independiente para cada archivo. Además, en la sección de comentarios de PR verás las tablas de evaluación de cada archivo como comentarios independientes.
Comentarios automatizados sobre relaciones públicas
Para garantizar la máxima visibilidad, el proceso evalúa la información de evidencia actual en función de cada archivo de configuración que facilites. Una vez finalizada la evaluación, el proceso genera automáticamente tablas detalladas de resumen y evaluación, y las adjunta directamente a la solicitud de incorporación de cambios.
Si configuras varios archivos de validación de datos, el pipeline publica los resultados de cada archivo en un comentario independiente de la solicitud de incorporación de cambios. Esto ofrece a los revisores un desglose claro y exhaustivo del estado de cumplimiento en distintos contextos, sin mezclar los resultados.
Dentro de cada comentario de relaciones públicas, encontrarás:
- Tres tablas de evaluación: un desglose completo de los resultados de la validación. Para obtener más información sobre cómo interpretar estas tablas, consulta la sección « Cómo interpretar la tabla de verificación de pruebas ».
- Enlaces de configuración: Enlaces directos al archivo de validación de datos y al archivo de políticas específicos que se utilizaron para realizar esa evaluación concreta, lo que facilita la auditoría y la resolución de problemas de tus reglas.
Durante la fase de validación de la promoción, esta comprobación del cumplimiento de la OPA está diseñada para ofrecer visibilidad y recabar opiniones. Si se detectan problemas de cumplimiento con respecto a tus reglas, el proceso no se detiene ni falla. En cambio, el proceso completa su ejecución y publica los resultados detallados en el PR. De este modo, se garantiza que los desarrolladores reciban un informe completo de todas las deficiencias de cumplimiento y puedan subsanarlas sin que la compilación se interrumpa a mitad del proceso.
El contrato de datos de la OPA: comunicación con el oleoducto
Cuando escribes una política personalizada, OPA evalúa tus reglas a la perfección en segundo plano. Sin embargo, el proceso necesita una forma estandarizada de interpretar esos resultados para poder mostrar a los desarrolladores exactamente qué ha ocurrido. Aquí es donde entra en juego el contrato de datos.
Piensa en este contrato como un apretón de manos entre tu archivo Rego personalizado y el motor de la canalización. Tienes total libertad para escribir cualquier lógica compleja que necesites para tomar una decisión. Sin embargo, al final de
tu política, debes asignar tus resultados a dos elementos concretos: el objeto « table_results » y la regla « allow ».
El objeto « table_results » (para comentarios sobre relaciones públicas)
Para generar las tablas detalladas de Markdown en los comentarios de tu PR, el proceso busca una estructura de datos específica denominada table_results.
Si tu política devuelve un objeto res dentro de table_results que contenga exactamente estos ocho campos, el proceso de canalización se encarga a partir de ahí. Analiza de forma segura
tu salida y la transforma automáticamente en la tabla « Markdown », clara y detallada, que ves en la solicitud de incorporación de cambios:
table_results contains res if {
# ... your custom evaluation logic goes here ...
# Map your findings to the contract structure
res := {
"RuleType": "Required",
"AssetType": "image",
"AssetId": "12345678",
"EvidenceTypeId": "com.ibm.scan",
"Tool": "zap",
"Status": "failure",
"Source": "ci-pipeline",
"Target": "prod",
}
}
La regla « allow » (para la ejecución en pipeline)
Como se ha mencionado anteriormente, la segunda parte obligatoria de este contrato es la norma « allow ».
¿Por qué es necesario?
Aunque « table_results » se encarga de generar los informes de tus comprobaciones de cumplimiento, la regla « allow » es el verdadero «kill switch» de la canalización. El motor del proceso está programado de forma
fija para consultar el valor booleano « allow » con el fin de determinar la decisión final de seguir adelante o no.
Si proporcionas un archivo de políticas personalizado pero te olvidas de incluir la regla « allow », el proceso no sabrá cómo continuar. Al funcionar según un modelo de seguridad estricto de «fallo cerrado», por defecto hace que
la ejecución del pipeline falle y bloquea la implementación.
Pipelines de implementación continua (CD) y cumplimiento continuo (CC)
Aunque el proceso de validación de promociones se centra en comprobaciones a nivel de relaciones públicas, también puedes utilizar OPA para controlar los pasos de implementación dentro de tus procesos de implementación continua (CD) y cumplimiento continuo (CC).
Activación de OPA
Para habilitar el control de cumplimiento basado en OPA en tus pipelines de CD y CC, debes activar explícitamente el indicador « opt-in-rego-translation » (estableciéndolo en « true » o « 1 »).
Restricciones de configuración
Al igual que en el proceso de promoción, puedes proporcionar tanto un archivo de políticas (tu lógica) como un archivo de validación de datos (tus datos). Sin embargo, hay una diferencia fundamental: los procesos CD y CC solo aceptan actualmente un archivo de validación de datos cada vez, en lugar de una lista separada por comas.
Archivos adjuntos de las solicitudes de cambio (CR) y pasos finales del proceso
Cuando ejecutas el proceso de CD, el motor procesa tu archivo de validación de datos y lo adjunta a tu solicitud de cambio con fines de auditoría. El comportamiento de los archivos adjuntos depende totalmente del formato que se utilice:
- Si proporcionas un archivo de validación de datos JSON heredado: el proceso lo convierte automáticamente en segundo plano. Tanto el archivo JSON original como el archivo de configuración Rego generado se adjuntan al paso «Solicitud de cambio».
- Si proporcionas un archivo de validación de datos Rego nativo: el proceso solo adjunta directamente el archivo Rego que hayas proporcionado.
Este mismo comportamiento de adjuntado se aplica también al proceso de reconstrucción de la configuración que tiene lugar durante la etapa «CD Finish», al final del proceso.