Personalización de DevSecOps pipelines para principiantes
Conozca los conceptos básicos para adoptar DevSecOps e incorporar su primera aplicación o microservicio.
Acerca de las cadenas de herramientas de DevSecops
Ha descubierto y probado las cadenas de herramientas IBM Cloud DevSecOps Continuous Integration (CI), Continuous Deployment (CD) y Continuous Compliance (CC) que implementan las mejores prácticas y herramientas de seguridad de DevSecOps.
Ahora, está preparado para incorporar su propia aplicación o microservicio y adoptar DevSecOps.
Antes de empezar
Necesita los recursos siguientes para incorporar una aplicación en una cadena de herramientas DevSecOps:
- Un repositorio de código fuente de aplicación Git que contiene el código de la aplicación, a menudo denominado "app repo".
- Un archivo
.pipeline-config.yaml
. Este archivo es el archivo de configuración principal que utilizan las interconexiones CI, CD y CC para personalizar cualquiera de las etapas del proceso de ejecución de interconexión. Empiece con un archivo.pipeline-config.yaml
de ejemplo, que puede descargar y personalizar para que se ajuste a sus necesidades. Todas las etapas excepto la etapa de inicio se pueden personalizar utilizando el archivo.pipeline-config.yaml
. El archivo desencadena y ejecuta los scripts personalizados para crear, probar y desplegar la aplicación. Puede cambiar el nombre del archivo.pipeline-config.yaml
o utilizar archivos diferentes para distintas interconexiones o desencadenantes. Asegúrese de que los valores de parámetro en la interconexión o desencadenante coinciden con el archivo de configuración. Para obtener más información, consulte Parámetros de interconexión.
IBM Cloud tiene las plantillas de operaciones DevSecsiguientes para empezar:
- Aplicación de ejemploNode
- Aplicación de ejemplo de conformidadCodeEngine
- Aplicación de ejemplo de conformidad Go
- Aplicación de ejemplo de conformidadPython
- Aplicación de ejemplo de conformidad conNode / Cloudant
Cómo DevSecOps pipelines utilizan repositorios
Para crear, probar y desplegar la aplicación, los conductos de DevSecOps utilizan dos repositorios:
app-repo
: el repositorio de aplicaciones, que contiene el código fuente de la aplicación.config-repo
: el repositorio de configuración, que contiene los archivos y scripts YAML de configuración de interconexión.
En la app de ejemplo deDevSecOps, estos dos repositorios son iguales. La mayoría de los usuarios que adoptan DevSecOps empiezan con este patrón. Pero, a medida que incorpore más microservicios, es posible que sea necesario un repositorio de configuración de interconexión dedicado y separado. Puesto que el repositorio de aplicaciones y el repositorio de configuración son los mismos en la app de ejemplo, el repositorio se clona dos veces cuando se ejecutan las interconexiones, lo que puede provocar errores. Por lo tanto, se recomienda tener un repositorio de configuración independiente para alojar archivos de configuración y scripts que se pueden compartir y reutilizar entre distintas cadenas de herramientas y pipelines de DevSecOps. Para obtener más información sobre cómo personalizar el repositorio de configuración, consulte los pasos de personalización avanzados.
Los scripts de operaciones de DevSecconsideran que app-repo
y config-repo
son dos repositorios independientes. Los scripts clonan los repositorios dos veces durante la etapa de inicio de la interconexión. Estos clones
se conocen como app-repo
y one-pipeline-config-repo
. Cada etapa se ejecuta en el contexto de config repo
.
Incorporación de una aplicación
Para mayor simplicidad, cree y pruebe una cadena de herramientas DevSecOps CI con la aplicación Node de ejemplo antes de continuar.
Existen tres formas principales de incorporar la primera aplicación en una cadena de herramientas de Ops CI DevSecexistente:
- Opción 1: añada el repositorio de aplicaciones a la cadena de herramientas y utilice el repositorio de aplicaciones de ejemplo como repositorio de configuración.
- Opción 2: Sustituya el repositorio de la aplicación de ejemplo por el repositorio de la aplicación.
- Opción 3: Añada el repositorio de aplicaciones a la cadena de herramientas y utilice un repositorio de configuración dedicado. Para obtener más información sobre esta opción, consulte los pasos de personalización avanzada.
Las cadenas de herramientas de DevSecOps utilizan repositorios Gitlab gestionados por IBM, también conocido como GRIT. En su lugar, se pueden utilizar otros proveedores de Git. El repositorio de la app puede estar alojado en GitHub o Gitlab, por ejemplo.
Opción 1: Añadir el repositorio de aplicaciones y utilizar el repositorio de aplicaciones de ejemplo como repositorio de configuración
Para añadir el repositorio de aplicaciones a la cadena de herramientas y utilizar el repositorio de aplicaciones de ejemplo como repositorio de configuración, realice los pasos siguientes:
- En la consola de IBM Cloud, pulse el icono Menú > DevOps > Cadenas de herramientas y seleccione la cadena de herramientas que desea editar.
- Pulse Añadir.
- Seleccione dónde se aloja el repositorio de la app, ya sea
Gitlab
oGitHub
. - Utilice el servidor predeterminado o añada uno nuevo.
- Especifique el URL del servidor personalizado y la señal de acceso personal.
- Pulse Crear integración.
- Especifique el URL del repositorio de código fuente de la aplicación.
- Pulse Crear integración.
A continuación, especifique el repositorio de aplicación de ejemplo como repositorio de configuración completando los pasos siguientes:
- En la consola de IBM Cloud, pulse el icono Menú > DevOps > Cadenas de herramientas y seleccione la cadena de herramientas que desea editar.
- Pulse pr-pipeline.
- Pulse Valores y vaya a la pestaña Propiedades de entorno.
- Edite el valor de la propiedad
pipeline-config-repo
para que apunte al URL del repositorio de aplicaciones de ejemplo. - Vuelva a la cadena de herramientas de AC.
- Pulse ci-pipeline.
- Pulse Valores y vaya a la pestaña Propiedades de entorno.
- Edite el valor de la propiedad
pipeline-config-repo
para que apunte al URL del repositorio de aplicaciones de ejemplo.
Las interconexiones de AC ahora utilizan el repositorio de apps de ejemplo pipeline-config
como repositorio de configuración.
Opción 2: Sustituir el repositorio de aplicaciones de ejemplo por su propio repositorio de aplicaciones
Para sustituir el repositorio de apps de ejemplo por su propio repositorio de apps, realice los pasos siguientes:
- En la consola de IBM Cloud, pulse el icono Menú > DevOps > Cadenas de herramientas y seleccione la cadena de herramientas de AC que desea editar.
- Busque el repositorio de código fuente de aplicación de ejemplo y seleccione Configurar.
- Sustituya el URL del repositorio por el URL del repositorio de código fuente de la aplicación.
- Pulse Guardar integración.
Después de sustituir el repositorio de la app de ejemplo, asegúrese de que el nuevo repositorio de la app contiene un archivo .pipeline-config.yaml
y los scripts correspondientes. Copie el archivo .pipeline-config.yaml
y los scripts del repositorio de aplicaciones de ejemplo en el repositorio de aplicaciones o utilice este archivo de configuración de ejemplo.
Configuración de las interconexiones de AC
Después de añadir el repositorio de aplicaciones, debe configurar las interconexiones de AC para que funcionen con el nuevo repositorio.
Configuración de los desencadenantes de interconexión
Los desencadenantes predeterminados utilizan el repositorio de aplicaciones de ejemplo, por lo que debe actualizarlos para utilizar el repositorio de apps. Verifique los valores del desencadenante y modifíquelos si es necesario para asegurarse de que todos los desencadenantes apuntan al repositorio de la app. Complete los pasossiguientes:
- En la consola de IBM Cloud, pulse el icono Menú > DevOps > Cadenas de herramientas y seleccione la cadena de herramientas de AC que desea editar.
- Pulse pr-pipeline.
- Edite el Git PR Trigger y proporcione el URL y la rama del repositorio de aplicaciones.
- Pulse Guardar.
- Vuelva a la cadena de herramientas de AC y pulse ci-pipeline.
- Edite el desencadenante de ACGit y proporcione el URL y la rama del repositorio de aplicaciones. Asegúrese de que el nombre de la aplicación sea correcto en la sección Propiedades.
- Pulse Guardar.
- Edite el Desencadenante manual. En la sección Propiedades, asegúrese de que el nombre de la aplicación sea correcto.
- Asegúrese de que las propiedades del repositorio y de la rama sean correctas y apunten al repositorio de la app.
Configuración del archivo .pipeline-config.yaml
Copie el archivo .pipeline-config.yaml
del repositorio de aplicaciones de ejemplo en el repositorio de aplicaciones o utilice este archivo de configuración de ejemplo.
Tanto para pr-pipeline
como para ci-pipeline
, asegúrese de que los parámetros pipeline-config
, pipeline-config-branch
y pipeline-config-repo
se han establecido correctamente
y coinciden con la configuración. Si estos parámetros no se establecen correctamente, es posible que confirme los cambios en la rama incorrecta, lo que genera un error en la interconexión.
Si la variable pipeline-config-repo
no está establecida, las interconexiones de DevSecOps presuponen que es el mismo repositorio que el repositorio de código fuente de la aplicación.
Utilización de scripts personalizados con DevSecOps
El archivo pipeline-config.yaml
es el componente clave que orquesta y personaliza el comportamiento de la interconexión de DevSecOps. El archivo utiliza scripts para crear, probar y desplegar la aplicación. El archivo define cómo
se configuran las etapas y qué scripts se ejecutan. Para obtener más información, consulte scripts personalizados.
Hay dos categorías principales de scripts que utilizan las interconexiones de DevSecOps:
- Scripts relacionados con la aplicación que se utilizan para crear, probar y desplegar la aplicación. Estos scripts son de su propia responsabilidad y están fuera del ámbito para el soporte de DevSecOps. Puesto que estos scripts no tienen una implementación predeterminada, debe añadirlos a la aplicación o al repositorio de configuración. Es posible que tenga que extraer los scripts de Jenkins u otro origen.
- Scripts de seguridad y conformidad que ejecutan exploraciones de seguridad y conformidad. La mayoría se proporcionan con scripts predeterminados que puede alterar temporalmente para utilizar su propia implementación personalizada.
Excepto para la etapa de inicio, cada etapa de una interconexión de AC, CD o CC se puede personalizar con sus propios scripts para alterar temporalmente la implementación predeterminada de la etapa. La etapa de inicio no se puede personalizar con sus propios scripts.
Aunque los scripts Bash se proporcionan como ejemplos, puede crear, probar y desplegar la aplicación utilizando otros lenguajes como Python o Go. Asegúrese de que está utilizando el image
correcto para cada etapa. Consulte las
imágenes de Docker en la sección DevSecOps pipelines.
Consulte la tabla Etapas y tareas que resumen diversas etapas del conducto de AC. La tabla también proporciona una información consolidada sobre si la etapa tiene una implementación de referencia predeterminada, si se puede personalizar o omitir, o si hay una recopilación de pruebas explícita necesaria para la ejecución de la etapa.
Migración de Jenkins o Travis a DevSecOps
La mayoría de los adoptantes de Ops de DevSecno empiezan de la nada. La mayoría de los adoptantes ya cuentan con procesos continuos de integración y entrega continua, junto con una biblioteca de scripts correspondiente. Estos procesos normalmente se implementan utilizando Jenkins, Travis o alguna otra plataforma.
Puntos clave para migrar a DevSecOps:
- El archivo de configuración
pipeline-config.yaml
debe reflejar cómo están orquestadas actualmente las interconexiones CI y CD. Las etapas y los pasos se deben correlacionar con DevSecetapas de conducto Ops. - Debe utilizar los mismos scripts, imágenes base y variables que ya están en su lugar.
- Las propiedades de secreto deben migrarse a un almacén de secretos.
- Es necesario añadir propiedades no secretas como propiedades de conducto o desencadenante.
Trabajo en modalidad de desarrollo
Puede utilizar la modalidad de desarrollo para interconexiones CI y CD para probar la implementación del archivo .pipeline-config.yaml
y los scripts. La interconexión en modalidad de desarrollo no ejecuta ninguna tarea relacionada
con la seguridad o la conformidad, lo que reduce el tiempo de ejecución para la interconexión. Para obtener más información, consulte ejecución de pipelines en modalidad de desarrollo.
Utilice la modalidad de desarrollo sólo para fines de desarrollo. La modalidad de desarrollo no sustituye a las interconexiones oficiales de CI y CD de DevSecOps, que siguen siendo las implementaciones de referencia.
Configuración de la interconexión de CD
En DevSecOps continuous integration, continuous deployment workflow, el conducto de AC envía actualizaciones al repositorio de inventario durante la etapa
deploy-release
del conducto de AC. Para obtener más información, consulte el script release.sh de ejemplo.
En este flujo de trabajo, varios desencadenantes de AC y distintas cadenas de herramientas de AC DevSecOps pueden contribuir al mismo repositorio de inventario.
Al contrario que la interconexión de AC, el script de despliegue que utiliza la interconexión de CD debe adaptarse de los scripts actuales en Jenkins, Travis o alguna otra plataforma para utilizar las entradas del repositorio de inventario.
Este código de ejemplo muestra cómo recuperar información del inventario y utilizarla para ejecutar un despliegue de Kubernetes.
Ubicación de los scripts de DevSecOps
Las interconexiones de DevSecOps se proporcionan con herramientas de seguridad y exploración predeterminadas y scripts asociados.
Por ejemplo, el inicio de un registro de etapa hace referencia al script predeterminado:
scan-artifact:
image: icr.io/continuous-delivery/pipeline/pipeline-base-ubi:3.24
dind: true
dind_image: icr.io/continuous-delivery/toolchains/devsecops/docker:20.10.21-dind
abort_on_failure: false
image_pull_policy: IfNotPresent
script: |
#!/bin/sh
"/opt/commons/scan-artifact/scan.sh"
/opt/commons/scan-artifact/scan.sh
es el script predeterminado.
La interconexión Ops DevSecproporciona la vía de acceso a la carpeta raíz de la biblioteca commons en una variable de entorno denominada COMMONS_PATH
,
que está disponible en todas las tareas y pasos. Para acceder a un script que está incorporado en la imagen base de conformidad, utilice la variable COMMONS_PATH
con la carpeta de script que necesita:
source "${COMMONS_PATH}/<script folder in commons>/<script file name>
Consulte la tabla Etapas y tareas que resume varias etapas de la interconexión de CD. La tabla también proporciona una información consolidada sobre si la etapa tiene una implementación de referencia predeterminada, si se puede personalizar o omitir, o si hay una recopilación de pruebas explícita necesaria para la ejecución de la etapa.
Propiedades de entorno
Las interconexiones de DevSecOps se proporcionan con propiedades de entorno predefinidas, pero puede añadir tantas propiedades personalizadas como sea necesario. Puede
acceder a estos valores de propiedades en los scripts utilizando Mandato get_env
.
Después de añadir la propiedad y su valor predeterminado opcional al conducto o desencadenante, utilice el mandato get_env
en el script para recuperar el valor de la propiedad. El ejemplo siguiente recupera el valor de la propiedad
my-variable
:
MY_VARIABLE=$(get_env my-variable "")
También puede alterar dinámicamente el valor de una propiedad en un script utilizando Mandato set_env
. El ejemplo siguiente altera temporalmente el valor
de la propiedad my-variable
:
set_env my-variable new-value
Omitir etapas
Algunas etapas pueden ser irrelevantes. Por ejemplo, es posible que no esté creando ninguna imagen de Docker o que todavía no haya implementado pruebas de aceptación. Si desea omitir una etapa, puede editar el archivo .pipeline-config.yaml
para incluir exit 0
o establecer la variable skip
en true
.
El ejemplo siguiente añade exit 0
para omitir una etapa:
scan-artifact:
image: icr.io/continuous-delivery/pipeline/pipeline-base-ubi:3.24
dind: true
dind_image: icr.io/continuous-delivery/toolchains/devsecops/docker:20.10.21-dind
abort_on_failure: false
image_pull_policy: IfNotPresent
skip: false
runAfter: null
script: |
#!/bin/sh
exit 0
"/opt/commons/scan-artifact/scan.sh"
Imágenes de Docker en interconexiones de DevSecOps
De forma predeterminada, las interconexiones de DevSecOps utilizan imágenes de IBM Continuous Delivery. Estas imágenes contienen algunas de las herramientas más comunes como, por ejemplo, Node y Java para ejecutar los scripts. También puede utilizar imágenes de otros proveedores o sus propias imágenes personalizadas que contengan las herramientas que prefiera.
Las imágenes de Docker que utilizan las interconexiones de DevSecOps se especifican en el archivo .pipeline-config.yaml
. Cada etapa puede utilizar
una imagen diferente.
Cambio de la versión de la imagen
En función de sus requisitos, es posible que tenga que utilizar una versión diferente de una imagen. Para cambiar la versión de la imagen, edite el archivo .pipeline-config.yaml
. Por ejemplo, si ha hecho referencia a la siguiente
imagen en el archivo YAML icr.io/continuous-delivery/pipeline/pipeline-base-ubi
:3.24
, si la cambia a icr.io/continuous-delivery/pipeline/pipeline-base-ubi
:3.27
se utiliza la versión 3.27
de la imagen.
De la misma forma, cambie dind_image
para la etapa:
scan-artifact:
image: icr.io/continuous-delivery/pipeline/pipeline-base-ubi:3.24
dind: true
dind_image: icr.io/continuous-delivery/toolchains/devsecops/docker:20.10.21-dind
(...)
Obtención de soporte
A medida que personaliza los conductos de DevSecOps, obtenga ayuda directamente de los equipos de desarrollo de IBM Cloud uniéndose a nosotros en Slack.