Creación de activos y recopilación de pruebas en DevSecOps

En el proceso DevSecOps, mantener el cumplimiento de la seguridad requiere hacer un seguimiento de lo que se construye, prueba e implanta. La creación de activos y la recopilación de pruebas proporcionan esta trazabilidad, garantizando que la seguridad se integre perfectamente en cada fase del ciclo de vida de desarrollo del software. Este planteamiento encarna el concepto de "seguridad por turnos", según el cual la seguridad no es una ocurrencia tardía, sino una parte inherente del proceso de desarrollo.

Esta guía explica cómo implantar la recopilación de pruebas basadas en activos en sus procesos de DevSecOps. Si sigues estas prácticas, podrás

  • Seguimiento de todos los artefactos producidos en sus procesos CI/CD
  • Recopilar pruebas de las exploraciones de seguridad y los controles de conformidad
  • Mantener un rastro auditable para el cumplimiento de la normativa
  • Automatice la gestión de incidencias y las solicitudes de cambio

Comprender el flujo de trabajo

El proceso de recogida de bienes y pruebas sigue tres etapas principales:

  1. Captura de información de activos- A medida que construyes artefactos (imágenes, despliegues, etc.), guarda sus metadatos
  2. Registro en el inventario- Cree entradas de inventario que realicen un seguimiento de los activos en todos los entornos
  3. Recopilación de pruebas: vincule los resultados de las exploraciones de seguridad y las pruebas a activos específicos

Este flujo de trabajo garantiza que cada artefacto de su canalización tenga un historial de cumplimiento completo, desde la compilación hasta la implantación.

¿Qué es un activo?

En DevSecOps,, un activo es cualquier artefacto o entidad que se somete a pruebas y análisis de seguridad. Piense en un activo como el "sujeto" de sus comprobaciones de cumplimiento: es lo que está comprobando, escaneando y, en última instancia, implantando.

Tipos de activos comunes

Los activos pueden adoptar muchas formas en su canal de distribución:

  • Confirmaciones de código fuente- El código que se está construyendo y probando
  • Imágenes de contenedor- Docker imágenes producidas por sus compilaciones
  • Artefactos de implantación: manifiestos Kubernetes, gráficos Helm o archivos de configuración
  • Ejecución del pip eline - La propia ejecución del pipeline

El siguiente diagrama muestra los distintos tipos de activos admitidos en DevSecOps:

Tipos de activos
' Tipos de activos.

Cómo identificar los activos

Cada activo debe identificarse de forma única e inmutable. Esto garantiza que las pruebas recopiladas para un activo siempre se refieran exactamente al mismo artefacto, aunque su canalización se ejecute varias veces.

Formatos de identificación de activos:

  • Commit Asset: Repositorio y hash del commit

    https://repo.url/org/repo#<COMMIT-SHA>
    
  • Activo de imagen: Docker image and its digest

    docker://registry.URL/name@sha256:<SHA256-DIGEST>
    
  • Pipeline Run Asset: Pipeline e ID de ejecución

    pipelinerun://<PIPELINE_ID>/<RUN_ID>
    
  • Otros activos: Ejemplos totalmente cualificados URL

    • Confirmar activo con nombre de archivo (gráfico de timón o archivo de configuración):
      https://repo.url/org/repo#<COMMIT-SHA>/<filename>
      
    • Activo artefacto:
      <artifactory-url>/artifact.<filetype>
      

Utilice identificadores inmutables (SHA de confirmaciones, compendios de imágenes) en lugar de etiquetas mutables (etiquetas, ramas) para garantizar que las pruebas siempre hagan referencia a la versión exacta del artefacto.

¿Qué son las pruebas?

Una prueba es un registro que demuestra que se ha realizado un escaneado de seguridad, una prueba o una comprobación de conformidad específicos en un activo. Las entradas de pruebas contienen:

  • El tipo de comprobación realizada (por ejemplo, exploración de vulnerabilidades, pruebas unitarias)
  • La herramienta que ha realizado la comprobación (por ejemplo, SonarQube, Jest)
  • El estado del resultado (éxito, fracaso, pendiente)
  • Enlaces a resultados detallados, cuestiones y anexos

La evidencia es un metadato que señala el activo, la herramienta que se ejecutó para recopilar y cuál es el resultado junto con los archivos adjuntos si los hubiera. Este diseño le permite realizar un seguimiento de la conformidad en varios entornos al tiempo que mantiene una única fuente de verdad para cada activo.

Normas de gestión de inventarios

El inventario sirve como registro central de todos los metadatos de activos en todos los entornos. Para garantizar la coherencia y permitir la gestión automatizada de incidencias, siga estas normas de campo al guardar activos y crear entradas de inventario:

  1. Tipo: Palabras clave reservadas para indicar el tipo de artefacto:

    • commit para comprometer activos
    • image para activos de imagen
    • generic para activos gestionados por oleoductos

    Para cualquier otro tipo de artefacto, puede elegir una cadena que indique adecuadamente su tipo inherente (por ejemplo, deployment para archivos de despliegue, tar para archivos tar).

  2. Nombre: Mantener un nombre de artefacto estático durante toda la ejecución del pipeline. Evite incorporar elementos dinámicos como hashes de commit en el nombre para garantizar la corrección de los problemas de cierre automático.

    Ejemplos:

    • us.icr.io/my-registry/my-app:20230828074614-master-commit-1@sha256:sha256-1
    • my-app-202304211845444721_IKS_deployment
  3. Procedencia: Proporcione un dominio completamente cualificado URL para establecer el origen del artefacto.

    Ejemplos:

    • us.icr.io/my-registry/my-app:20230828074614-master-commit-1@sha256:sha256-1
  4. Digerir: Siga el patrón regex: Empieza con sha256, seguido de dos puntos (:), y luego el hash SHA256 (sha256:<sha256>).

    Ejemplo:

    • sha256:sha256-1
  5. Firma: Si el artefacto está firmado, incluya la información pertinente sobre la firma.

Seguir estas directrices estandarizadas mejora el proceso de gestión de inventario, garantizando un seguimiento preciso y la recuperación de activos.

Implantación del flujo de trabajo

Ahora que entiende los conceptos, vamos a implementar el flujo de trabajo de tres etapas en su pipeline.

Etapa 1: Capturar la información sobre los activos

A medida que su pipeline construye artefactos, capture sus metadatos utilizando los comandos save_repo y save_artifact. Esta información se utilizará posteriormente para crear entradas de inventario y recoger pruebas.

Guardar información del repositorio

Cuando su pipeline comprueba el código fuente, utilice save_repo comando para registrar los detalles del repositorio. Esto asocia sus artefactos de compilación con el commit específico que los produjo.

Ejemplo:

save_repo app-repo \
  url=<app_url> \
  path=my-app \
  commit=commit1 \
  branch=master \
  buildnumber=1

Guardar información sobre artefactos

Después de crear artefactos (imágenes, archivos de despliegue, etc.), utilice save_artifact comando para registrar sus detalles. En él se recogen el nombre, el tipo, el resumen y la procedencia del artefacto.

Cuándo utilizarlo:

  • Después de crear una imagen Docker
  • Después de generar los manifiestos de despliegue
  • Después de crear cualquier artefacto que vaya a desplegarse

Ejemplo: Guardar una imagen Docker

Después de que su pipeline construye y empuja una imagen Docker:

save_artifact app-image \
  name=us.icr.io/my-registry/my-app:20230828074614-master-commit-1@sha256:sha2561 \
  type=image \
  digest=sha256:sha2561 \
  tags=mytag1 \
  source=<source_url> \
  signature=sign-1 \
  provenance=us.icr.io/my-registry/my-app:20230828074614-master-commit-1@sha256:sha2561

Ejemplo: Guardar un artefacto de despliegue

Para artefactos que no sean imágenes, como los manifiestos de Kubernetes o los gráficos de Helm:

save_artifact artifact-1 \
  name=my-app_IKS_deployment \
  type=deployment \
  signature=sign2 \
  deployment_type=IKS \
  provenance=<url>

Etapa 2: Crear entradas de inventario

Tras capturar la información de los activos, regístrelos en su inventario. El inventario realiza un seguimiento de los activos en todos los entornos y permite flujos de trabajo de promoción desde el desarrollo hasta la producción.

Comprender los parámetros de inventario

Utilice el comando cocoa inventory add con los siguientes parámetros:

Información sobre los argumentos
Argumento Descripción Necesaria/Opcional Notas
artifact Nombre de artefacto [cadena] [requerida] Utilizado para el tema en la gestión de asuntos
version La versión de la aplicación [cadena] [requerida] Versión del artefacto
repository-url El repositorio de la aplicación [cadena] [requerida] URL del repositorio donde se construye este activo
pipeline-run-id ID de la ejecución de la tubería [cadena] [requerida] Se utiliza para determinar el alcance de las pruebas en los procesos de DC y CC
commit-sha La confirmación exacta de la versión de la aplicación [cadena] [requerida] Commit SHA del repositorio URL donde se construye este activo
name El nombre de la aplicación [cadena] [requerida] Nombre de archivo o entrada de inventario del activo
build-number El número de fabricación [cadena] [requerida] Número de compilación del activo, utilizado para las actualizaciones de insights
type Tipo de artefacto: commit, image, generic, deployment, u otros tipos personalizados [cadena] [requerida] Debe coincidir con el tipo guardado mediante el comando save_artifact
app-artifacts Información adicional sobre el activo [cadena] [opcional] Formato JSON para metadatos adicionales
sha256 El hash SHA256 del artefacto [cadena] [requerida] Se utiliza para definir la ruta del activo en la taquilla
provenance La dirección URL completa donde se almacena el artefacto [cadena] [requerida] Completa URL a la ubicación del artefacto
signature La firma del artefacto [cadena] [requerida] Se utiliza para verificar la firma del activo
environment El nombre del entorno donde se debe añadir la entrada [cadena] [opcional] La rama del inventario donde se añade la entrada (por defecto es master)

Creación de entradas de inventario

Los siguientes ejemplos muestran cómo crear entradas de inventario para distintos tipos de activos. Observe cómo los parámetros coinciden con la información guardada anteriormente con save_artifact.

Ejemplo: Registro de una imagen Docker en el inventario

Este ejemplo crea una entrada de inventario para la imagen Docker que guardamos anteriormente:

cocoa inventory add \
  --artifact=us.icr.io/my-registry/my-app:20230828074614-master-commit-1@sha256:sha2561 \
  --name=my-app \
  --app-artifacts='{ "app": "my-app", "tags": "20230828074614-master-commit1" }' \
  --signature=sign1 \
  --provenance=us.icr.io/my-registry/my-app:20230828074614-master-commit-1@sha256:sha2561 \
  --sha256=sha256:sha2561 \
  --type=image \
  --repository-url=<repo_url> \
  --commit-sha=commit1 \
  --version=commit1 \
  --build-number=1 \
  --pipeline-run-id=pipeline-run-1 \
  --org=Org \
  --repo=my-inventory-20230421184544472 \
  --git-provider=github \
  --git-token-path=./inventory-token \
  --git-api-url=<api_url>

Ejemplo: Registro de un artefacto de despliegue en el inventario

Para los artefactos de despliegue, el proceso es similar pero se utiliza el tipo deployment:

cocoa inventory add \
  --artifact=my-app_IKS_deployment \
  --name=my-app_IKS_deployment \
  --app-artifacts='{ "app": "my-app", "tags": "20230828074614-master-commit1" }' \
  --signature=sign2 \
  --provenance=<provenance_url> \
  --sha256=sha256:sha2562 \
  --type=deployment \
  --repository-url=<repo_url> \
  --commit-sha=commit1 \
  --version=commit1 \
  --build-number=1 \
  --pipeline-run-id=pipeline-run-1 \
  --org=Org \
  --repo=my-inventory-20230421184544472 \
  --git-provider=github \
  --git-token-path=./inventory-token \
  --git-api-url=<api_url>

Fase 3: Recopilación de pruebas

A medida que su canal ejecuta análisis y pruebas de seguridad, recopile pruebas que relacionen los resultados con activos específicos. De este modo se crea un rastro auditable que muestra qué comprobaciones se realizaron en cada artefacto.

Recopilación de pruebas de activos

Utilice el comando collect-evidence después de cada exploración o prueba. El parámetro asset-key debe coincidir con la clave utilizada al guardar el activo con save_artifact o save_repo. Para obtener información detallada sobre el comando collect-evidence, incluidos todos los parámetros, los formatos de herramienta admitidos y el uso de la CLI, consulte el script collect-evidence.

Ejemplo: Recopilación de pruebas para ensayos sobre código fuente

Para las pruebas realizadas en el repositorio de código fuente:

collect-evidence \
  --tool-type "jest" \
  --status "success" \
  --evidence-type "com.ibm.unit_tests" \
  --asset-type "repo" \
  --asset-key "repo-1"

Ejemplo: Recopilación de pruebas unitarias de un artefacto

Tras ejecutar las pruebas de aceptación, recopile pruebas sobre el artefacto:

collect-evidence \
  --tool-type "jest" \
  --status "success" \
  --evidence-type "com.ibm.acceptance_tests" \
  --asset-type "artifact" \
  --asset-key "app-image"

Tras ejecutar las pruebas de aceptación, recopile pruebas en múltiples artefactos:

collect-evidence \
  --tool-type "jest" \
  --status "success" \
  --evidence-type "com.ibm.acceptance_tests" \
  --evidence-per-asset \
  --assets "app-image:artifact" \
  --assets "artifact-1:artifact"

Prácticas recomendadas

Utilizar identificadores inmutables

Utilice siempre los SHA de las confirmaciones y los compendios de imágenes en lugar de etiquetas o nombres de ramas. Las referencias mutables pueden cambiar, rompiendo el vínculo entre las pruebas y los activos.

Mantener una nomenclatura coherente

Mantenga los nombres de los artefactos estáticos durante toda la ejecución de la canalización. Evite incrustar valores dinámicos, como marcas de tiempo, en el campo de nombre para garantizar un seguimiento y un cierre automático adecuados de las incidencias.

Emparejar tipos de activos

Asegúrese de que el parámetro type de cocoa inventory add coincide con el tipo utilizado en save_artifact. Los tipos no coincidentes pueden provocar fallos en la recogida de pruebas.

Procedencia de referencia en las implantaciones

En los conductos de CD, utilice el campo provenance para descargar artefactos en lugar del campo artifact. La procedencia URL proporciona la ubicación completa e inmutable del artefacto.

Próximos pasos

Ahora que conoce la recopilación de pruebas basada en activos, puede:

Reutilización de pruebas para la ejecución optimizada de pipelines

Para optimizar el tiempo de ejecución del pipeline y el uso de recursos, puede activar la reutilización de pruebas. Esta función permite omitir exploraciones o pruebas cuando el activo (artefacto o repositorio) que se está explorando no ha cambiado desde la última exploración.

Para obtener más información sobre la reutilización de pruebas, incluidas las condiciones de reutilización, los periodos de validez y la configuración avanzada, consulte Reutilización de pruebas en los procesos de RP y de IC.

En la interconexión de CD, el despliegue debe hacer referencia a un campo de procedencia en lugar de a un artefacto para descargar el artefacto.