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 son com.ibm.static-scan, com.ibm.unit-tests o com.ibm.image_signing.
  • asset_type: Define el tipo de artefacto al que se aplica esta regla. Por ejemplo, podría aplicarse únicamente a image o a repo. 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-environment y target-environment en caso de que indiques directamente el archivo .json en 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.