Generación de una clave GPG

Los artefactos generados por la cadena de herramientas de integración continua de IBM Cloud DevSecOps y registrados en el inventario deben firmarse antes de su implementación en producción. El proceso de integración continua utiliza Skopeo como herramienta predeterminada para proporcionar la capacidad de firmar artefactos.

Crear y almacenar una clave GPG que es utilizada por el DevSecOps pipeline de integración continua de forma automática o manual.

Generar automáticamente una clave GPG

Utilizando este método, la plantilla genera automáticamente la clave GPG. Especifique el nombre y el correo electrónico para la generación de claves realizando estos pasos:

  1. Vaya a Firma de artefacto y pulse Nuevo.

    " Firma de imágenes
    Firma de artefactos

  2. En la ventana, los campos nombre y correo electrónico se rellenan previamente con el nombre de la cadena de herramientas y el ID de correo electrónico. Cambie el nombre y el ID de correo electrónico para que reflejen los requisitos clave de GPG. También puede almacenar las claves en el proveedor de secretos seleccionando el recuadro.

    Cambiar nombre y correo electrónico
    Cambiar nombre y correo electrónico

  3. Después de generar la clave, puede copiarla para su referencia.

    Certificado de firma de imagen
    Figura 3 Certificado de firma de artefacto

La clave copiada está en formato base64. Decodifique la llave antes de importarla a su llavero. echo <encoded_gpg_key> | base64 --decode

Generar una clave GPG manualmente

Descarga e instalación de herramientas de línea de mandatos de GPG

Descarga e instala el paquete de instalación de « Herramientas de comando de GPG » para tu sistema operativo. Ve a la sección de versiones binarias de GnuPG para descargar las herramientas para tu sistema operativo.

Mac OS X

  • Descargue e instale Mac GPG.
  • Verifique la versión del GPG instalado. Desde la línea de mandatos, ejecute el mandato siguiente:
$ gpg --version
gpg (GnuPG) 2.3.1
libgcrypt 1.9.3
Copyright (C) 2021 Free Software Foundation, Inc.
  • En las versiones de GPG anteriores a 2.3.1, es posible que no se pueda utilizar la opción --passphrase=''. En este caso, puede omitir la contraseña en el diálogo siguiente pulsando Intro cuando se le solicite.

Windows

  • Descargar e instalar GitBash (necesario para la codificación de base64 ).
  • Verifique la versión del GPG instalado. Ejecute el mandato siguiente en el indicador de mandatos de Git bash:
$ gpg --version
gpg (GnuPG) 2.2.27
libgcrypt 1.8.7
Copyright (C) 2021 g10 Code GmbH

Generación de una clave de la API

Deje la frase de contraseña y el campo vacío si el mandato generate-key abre un diálogo que solicita una frase de contraseña. Esta es una limitación de la utilidad «skopeo» para la firma de imágenes, ya que el proceso no admite claves privadas protegidas con una frase de contraseña. Si introduces la frase de contraseña durante la creación, el proceso no podrá descodificar el certificado y fallará en el paso de firma de la imagen. Tenga en cuenta que esto también es aplicable a la firma de etiquetas GIT.

Mac OS X y Linux™

Desde el indicador de shell, ejecute el mandato siguiente:

gpg --pinentry-mode loopback --passphrase='' --generate-key
  • Introduce tu nombre y tu dirección de correo electrónico.
  • Teclea «O» para iniciar la creación de la clave.
  • Una vez generada la clave, seleccione la opción O.

Windows

GPG Versión > 1.4

En el indicador de mandatos del hash de Git, ejecute el mandato siguiente:

gpg --pinentry-mode loopback --passphrase='' --generate-key
  • Escribe tu nombre en el campo « Nombre real ».
  • Especifique su dirección de correo electrónico en la Dirección de correo electrónico.
  • Teclea « O » para iniciar la creación de la clave.
  • Una vez generada la clave, seleccione la opción O.

Versión de GPG < 1.4 (o cualquier error con comando anterior)

En el indicador de mandatos del hash de Git, ejecute el mandato siguiente:

gpg --gen-key
  • tipo de clave: selecciona la opción predeterminada (1) RSA y RSA (predeterminado)
  • tamaño de la clave: mantener el valor predeterminado (2048)
  • validez de clave: mantenga el valor predeterminado como 0. Esto se debe a que la clave de valor 0 no caduca.
  • Confirma tu elección: escribe « y ».
  • Escriba su nombre en el campo Nombre real.
  • Especifique su dirección de correo electrónico en la Dirección de correo electrónico.
  • Teclea «O» para iniciar la creación de la clave.
  • Una vez generada la clave, seleccione la opción O.

Verifique la creación de claves

Verifique que se haya creado la clave gpg. En la línea comando, ejecuta el siguiente comando :

gpg --list-keys

Asegúrese de que su clave aparezca en la lista. Ejemplo de salida en Windows:

$ gpg --list-keys
/c/Users/FredSmith/.gnupg/pubring.gpg
-------------------------------------
pub   2048R/1BB354B5 2021-06-08
uid   Fred Smith <fred@company.com>
sub   2048R/F91C39A6 2021-06-08

Exportación de la clave

Este campo es opcional. Ejecute este mandato para asegurarse de que se puede exportar la clave gpg.

gpg --export-secret-key <Email Address>

La clave sin formato que se exporta no se debe copiar directamente. Se recomienda guardar de forma segura la clave generada en este paso en su instancia de Key Protect o en su instancia de Secrets Manager. Consulte las secciones siguientes para obtener más detalles.

Almacenamiento de la clave

La clave GPG se debe proporcionar a la interconexión de integración continua de una de las maneras siguientes:

  • Almacenado en IBM® Key Protect for IBM Cloud®
  • Almacenado en IBM Cloud® Secrets Manager
  • Almacenado directamente en la cadena de herramientas de integración continua

Asegúrese de que la clave se copie en el formato correcto para evitar un error de firma de interconexión de integración continua debido a un error de importación. Utiliza pbcopy ( Mac OS X ) o clip (Windows Git bash) en el siguiente comando para copiar el contenido de la clave al portapapeles.

Almacene la clave en Key Protect

Exporte y copie la clave GPG en el portapapeles.

Es necesario codificar la clave GPG con el algoritmo « base64 » antes de guardarla en tu instancia de Key Protect.

OS X

gpg --export-secret-key <Email Address> | base64 | base64 | pbcopy

Windows

gpg --export-secret-key <Email Address> | base64 -w0 | base64 -w0 | clip

Linux™

gpg --export-secret-key <Email Address> | base64 | base64
  1. En la consola de IBM Cloud, seleccione la instancia de Key Protect en la que desea almacenar la clave GPG generada a partir de los pasos anteriores.

  2. Pulse el icono Añadir + para añadir una clave nueva a la instancia.

  3. Selecciona la opción « Importar tu propia clave ».

  4. Selecciona un tipo de clave como « Clave estándar ».

  5. Introduzca el nombre adecuado en el campo « Nombre de la clave ». La clave GPG guardada se puede recuperar más tarde mediante este nombre de clave.

  6. Copia la clave tal y como se ha exportado anteriormente en el campo « Material de claves ».

    Asegúrate de que, al copiar la clave y pegarla en el campo «Material de clave», no quede ninguna línea de más al final de la clave.

  7. Selecciona la opción «Elegir un llavero» como predeterminada.

  8. Pulse Añadir clave para añadir la clave a la protección de claves.

    ' Añade la clave a la protección de claves
    Añade la clave a la protección de claves

Para obtener más información sobre Key Protect, consulte los documentos de Key Protect.

Almacene la clave en Secrets Manager

Es necesaria una única codificación base64 de la clave GPG antes de almacenarla en la instancia de Secrets Manager.

Exporte y copie la clave GPG en el portapapeles.

OS X

gpg --export-secret-key <Email Address> | base64 | pbcopy

Windows

gpg --export-secret-key <Email Address> | base64 -w0 | clip

Linux™

gpg --export-secret-key <Email Address> | base64
  1. En la consola de IBM Cloud, seleccione la instancia de Secrets Manager donde desea almacenar la clave GPG generada a partir de los pasos anteriores.

  2. Pulse el icono Añadir + para añadir una clave nueva a la instancia.

  3. Selecciona la opción « Otro tipo de clave secreta ».

    Otro tipo de secreto
    Otro tipo de secreto

  4. Seleccione el tipo Clave estándar para la opción Seleccionar un tipo de clave.

  5. Escriba un nombre adecuado en el campo « Nombre ». La clave GPG almacenada se puede recuperar más adelante con este nombre.

  6. Selecciona la opción « Valor secreto » y pega la clave que has exportado anteriormente en el campo « Valor secreto ».

    Asegúrate de que, al copiar la clave y pegarla en el campo «Valor secreto», no quede ninguna línea de más al final de la clave.

  7. Añada la clave a la instancia de Key Protect pulsando el icono Añadir.

    Añade la clave
    Añade la clave

Para obtener más información sobre Secrets Manager, consulte Cómo empezar con Secrets Manager.

Exporte la clave privada y almacénela directamente en la interconexión de integración continua

No se recomienda este enfoque y solo debe utilizarse con fines experimentales. Utiliza Key Protect o Secrets Manager para guardar las claves. Para obtener más información, consulte Configuración de los almacenes de secretos

Es necesaria una única codificación base64 de la clave GPG antes de almacenarla como una propiedad de interconexión protegida.

Almacene de forma segura la clave GPG en una instancia Key Protect o Secrets Manager.

Mac OS X / Linux™

gpg --export-secret-key <Email Address> | base64

Windows

gpg --export-secret-key <Email Address> | base64 -w0

Configuración de las credenciales del registro para la firma

Al firmar imágenes de contenedor, el proceso necesita credenciales para autenticarse en el registro de contenedores. El canal « DevSecOps » admite la resolución dinámica de credenciales en tiempo de ejecución, lo que permite configurar las credenciales de diversas formas con mecanismos de sustitución automática.

Jerarquía de resolución de credenciales

El proceso resuelve dinámicamente tanto el nombre de usuario como la clave API en tiempo de ejecución siguiendo la siguiente jerarquía.

Cuando se configura una anulación del destino de firma mediante gara-destination-registry y gara-destination-namespace, y también se proporciona gara-destination-apikey, el canal da prioridad absoluta a gara-destination-apikey para la autenticación en el registro de destino. De lo contrario, se recurre a la resolución de credenciales que se indica a continuación para la imagen de destino.

Orden de resolución de claves API:

  1. Clave API específica del espacio de nombres: signing-token-apikey-{registry}-{namespace} (secreto)
  2. Clave API específica del registro: signing-token-apikey-{registry} (secreto)
  3. Docker Configuración JSON: signing-dockerconfigjson (secreto)
  4. Soluciones alternativas específicas para ICR:
    • ciso-ibmcloud-api-key (secreto)
    • ibmcloud-api-key (secreto)

Orden de resolución de nombres de usuario:

  1. Nombre de usuario específico del espacio de nombres: signing-token-username-{registry}-{namespace} (variable de entorno)
  2. Nombre de usuario específico del Registro: signing-token-username-{registry} (variable de entorno)
  3. Por defecto: iamapikey (si no se ha configurado ningún nombre de usuario)

Donde:

  • {registry} es el nombre de host del registro (por ejemplo, us.icr.io, de.icr.io)
  • {namespace} es la ruta completa del espacio de nombres con las barras y los puntos sustituidos por guiones bajos (por ejemplo, my_namespace_path)

Configuración de credenciales específicas para cada espacio de nombres

Para un control de acceso más detallado, puede configurar credenciales específicas para un espacio de nombres del registro:

Clave API (secreta): signing-token-apikey-{registry}-{namespace}

Nombre de usuario (variable de entorno): signing-token-username-{registry}-{namespace}

Ejemplo: Para la imagen us.icr.io/my-namespace/my-app:latest

  • registry: us.icr.io
  • Espacio de nombres: my-namespace
  • Clave secreta de la API: signing-token-apikey-us.icr.io-my_namespace
  • Variable de entorno «username»: signing-token-username-us.icr.io-my_namespace
  • Si no se indica el nombre de usuario, se utilizará por defecto: iamapikey

Configuración de credenciales específicas del registro

Para un acceso más amplio a todos los espacios de nombres de un registro:

Clave API (secreta): signing-token-apikey-{registry}

Nombre de usuario (variable de entorno): signing-token-username-{registry}

Ejemplo: Para cualquier imagen en us.icr.io

  • Clave secreta de la API: signing-token-apikey-us.icr.io
  • Variable de entorno «username»: signing-token-username-us.icr.io
  • Si no se indica el nombre de usuario, se utilizará por defecto: iamapikey

Configuración del archivo JSON de configuración de « Docker »

Puedes proporcionar un archivo JSON de configuración de base64-encoded Docker que contenga las credenciales de varios registros:

Nombre secreto: signing-dockerconfigjson

Formato: Base64-encoded JSON, compatible con el formato config.json de Docker:

{
  "auths": {
    "us.icr.io": {
      "username": "iamapikey",
      "password": "your-api-key"
    },
    "us.icr.io/my-namespace": {
      "username": "iamapikey",
      "password": "namespace-specific-key"
    }
  }
}

El canal de procesamiento coincide primero con la ruta más específica, lo que permite anular la configuración a nivel de espacio de nombres dentro de Docker.

Configuración de ejemplo

Para ver una imagen us.icr.io/production/my-app:v1.0.0:

Opción 1: Específica del espacio de nombres (recomendada para entornos de producción)

  • Clave secreta de la API: signing-token-apikey-us.icr.io-production = your-namespace-api-key
  • Variable de entorno de nombre de usuario (opcional): signing-token-username-us.icr.io-production = iamapikey
  • Si no se especifica el nombre de usuario, el valor predeterminado es iamapikey

Opción 2: En todo el Registro

  • Clave secreta de la API: signing-token-apikey-us.icr.io = your-registry-api-key
  • Variable de entorno de nombre de usuario (opcional): signing-token-username-us.icr.io = iamapikey
  • Si no se especifica el nombre de usuario, el valor predeterminado es iamapikey

Opción 3: Archivo JSON de configuración de « Docker »

  • Secreto: signing-dockerconfigjson = base64-encoded-docker-config
  • El nombre de usuario se extrae del archivo JSON de configuración de Docker

Opción 4: valor predeterminado de « IBM Cloud » (automático para ICR)

  • Clave secreta de la API: ibmcloud-api-key = your-ibmcloud-api-key
  • El nombre de usuario predeterminado es iamapikey