Las delegaciones en Docker Content Trust (DCT) le permiten controlar quién puede y quién no puede firmar una etiqueta de imagen. Una delegación tendrá un par de claves de delegación públicas y privadas. Una delegación podría contener varios pares de claves y contribuyentes para a) permitir que varios usuarios formen parte de una delegación yb) admitir la rotación de claves.

La delegación más importante dentro de Docker Content Trust es targets/releases. Esto se ve como la fuente canónica de una etiqueta de imagen confiable, y sin la clave de un colaborador bajo esta delegación, no podrán firmar una etiqueta.

Afortunadamente al usar el $ docker trust comandos, automáticamente inicializaremos un repositorio, administraremos las claves del repositorio y agregaremos una clave de colaborador al targets/releases delegación vía docker trust signer add.

Configuración del cliente de Docker

Por defecto, el $ docker trust Los comandos esperan que la URL del servidor del notario sea la misma que la URL del registro especificada en la etiqueta de la imagen (siguiendo una lógica similar a $ docker push). Al usar Docker Hub o DTR, la URL del servidor del notario es la misma que la URL del registro. Sin embargo, para entornos autohospedados o registros de terceros, deberá especificar una URL alternativa para el servidor notarial. Esto se hace con:

export DOCKER_CONTENT_TRUST_SERVER=https://:

Si no exporta esta variable en entornos autohospedados, es posible que vea errores como:

$ docker trust signer add --key cert.pem jeff dtr.example.com/admin/demo
Adding signer "jeff" to dtr.example.com/admin/demo...
[...]
Error: trust data missing for remote repository dtr.example.com/admin/demo or remote repository not found: timestamp key trust data unavailable.  Has a notary repository been initialized?

$ docker trust inspect dtr.example.com/admin/demo --pretty
WARN[0000] Error while downloading remote metadata, using cached timestamp - this might not be the latest version available remotely
[...]

Si ha habilitado la autenticación para su servidor notarial o está utilizando DTR, deberá iniciar sesión antes de poder enviar datos al servidor notarial.

$ docker login dtr.example.com/user/repo
Username: admin
Password:

Login Succeeded

$ docker trust signer add --key cert.pem jeff dtr.example.com/user/repo
Adding signer "jeff" to dtr.example.com/user/repo...
Initializing signed repository for dtr.example.com/user/repo...
Successfully initialized "dtr.example.com/user/repo"
Successfully added signer: jeff to dtr.example.com/user/repo

Si no inicia sesión, verá:

$ docker trust signer add --key cert.pem jeff dtr.example.com/user/repo
Adding signer "jeff" to dtr.example.com/user/repo...
Initializing signed repository for dtr.example.com/user/repo...
you are not authorized to perform this operation: server returned 401.

Failed to add signer to: dtr.example.com/user/repo

Si está utilizando DTR y le gustaría trabajar con la política de firma de un UCP remoto, debe registre su instancia DTR con ese UCP remoto. Ver Uso de Docker Content Trust con un clúster UCP remoto para más detalles.

Configuración del cliente notario

Algunas de las funciones más avanzadas de DCT requieren la CLI de notario. Para instalar y configurar Notary CLI:

1) Descarga el cliente y asegúrese de que esté disponible en su camino.

2) Cree un archivo de configuración en ~/.notary/config.json con el siguiente contenido:

  "trust_dir" : "~/.docker/trust",
  "remote_server": 
    "url": "https://dtr.example.com",
    "root_ca": "../.docker/ca.pem"
  

El archivo de configuración recién creado contiene información sobre la ubicación de los datos de confianza de Docker locales y la URL del servidor del notario.

Para obtener información más detallada sobre cómo utilizar el notario fuera de los casos de uso de Docker Content Trust, consulte la documentación de la CLI del notario aquí

Creación de claves de delegación

Un requisito previo para agregar su primer colaborador es un par de claves de delegación. Estas claves se pueden generar localmente usando $ docker trust, generado por una autoridad de certificación, o puede tomarse de un paquete de cliente de Universal Control Plane.

Uso de Docker Trust para generar claves

Docker Trust tiene un generador integrado para un par de claves de delegación, $ docker trust generate . La ejecución de este comando cargará automáticamente la clave privada de delegación en el almacén de confianza local de Docker.

$ docker trust key generate jeff
Generating key for jeff...
Enter passphrase for new jeff key with ID 9deed25: 
Repeat passphrase for new jeff key with ID 9deed25: 
Successfully generated and loaded private key. Corresponding public key available: /home/ubuntu/Documents/mytrustdir/jeff.pub

Generación manual de claves

Si necesita generar manualmente una clave privada (ya sea RSA o ECDSA) y un certificado x509 que contenga la clave pública, puede utilizar herramientas locales como openssl o cfssl junto con una autoridad de certificación local o de toda la empresa.

A continuación, se muestra un ejemplo de cómo generar una clave de porción RSA de 2048 bits (todas las claves RSA deben tener al menos 2048 bits):

$ openssl genrsa -out delegation.key 2048
Generating RSA private key, 2048 bit long modulus
....................................................+++
............+++
e is 65537 (0x10001)

Deberían mantener delegation.key privado porque se utiliza para firmar etiquetas.

Luego, deben generar un certificado x509 que contenga la clave pública, que es lo que necesita de ellos. Aquí está el comando para generar una CSR (solicitud de firma de certificado):

$ openssl req -new -sha256 -key delegation.key -out delegation.csr

Luego, pueden enviarlo a cualquier CA en la que confíe para firmar certificados, o pueden autofirmar el certificado (en este ejemplo, crear un certificado que sea válido por 1 año):

$ openssl x509 -req -sha256 -days 365 -in delegation.csr -signkey delegation.key -out delegation.crt

Entonces necesitan darte delegation.crt, ya sea autofirmado o firmado por una CA.

Finalmente, deberá agregar la clave privada a su almacén de confianza local de Docker.

$ docker trust key load delegation.key --name jeff
Loading key from "delegation.key"...
Enter passphrase for new jeff key with ID 8ae710e: 
Repeat passphrase for new jeff key with ID 8ae710e: 
Successfully imported key from delegation.key

Uso de paquetes de cliente de Universal Control Plane

Universal Control Plane (UCP) administra el acceso CLI y API a sus clústeres a través de certificados generados en un paquete de cliente. Estos certificados y claves se pueden utilizar como un par de claves de delegación. Dentro de cada paquete de cliente hay una clave privada única (key.pem) y certificado x509 que contiene una clave pública (cert.pem).

1) Descargue el paquete de cliente de un usuario desde Universal Control Plane.

2) Extraiga el paquete del cliente en su directorio actual

3) Cargue la clave privada en su tienda de confianza local de Docker

$ docker trust key load key.pem --name jeff
Loading key from "key.pem"...
Enter passphrase for new jeff key with ID 9deed25: 
Repeat passphrase for new jeff key with ID 9deed25: 
Successfully imported key from key.pem

Ver claves de delegación locales

Para enumerar las claves que se han importado al almacén de confianza local de Docker, podemos usar la CLI de notario.

$ notary key list

ROLE       GUN                          KEY ID                                                              LOCATION
----       ---                          ------                                                              --------
root                                    f6c6a4b00fefd8751f86194c7d87a3bede444540eb3378c4a11ce10852ab1f96    /home/ubuntu/.docker/trust/private
jeff                                    9deed251daa1aa6f9d5f9b752847647cf8d705da0763aa5467650d0987ed5306    /home/ubuntu/.docker/trust/private

Gestión de delegaciones en un notario

Cuando se agrega la primera delegación al Notary Server usando $ docker trust, iniciamos automáticamente datos de confianza para el repositorio. Esto incluye la creación del destino del notario y las claves de instantáneas, y la rotación de la clave de instantáneas para que sea administrada por el notario. Puede encontrar más información sobre estas claves aquí

Al iniciar un repositorio, necesitará la clave y la frase de contraseña de una clave raíz canónica de notario local. Si no ha iniciado un repositorio antes y, por lo tanto, no tiene una clave raíz de notario, $ docker trust creará uno para ti.

Asegúrese de proteger y hacer una copia de seguridad de su clave raíz canónica de notario

Iniciando el repositorio

Para cargar la primera clave a una delegación, al mismo tiempo que inicia un repositorio, puede usar el $ docker trust signer add mando. Esto agregará la clave pública del colaborador a la targets/releases delegación y crear una segunda targets/ delegación.

Para DCT, el nombre de la segunda delegación, en el siguiente ejemplo jeff, está ahí para ayudarlo a realizar un seguimiento del propietario de las llaves. En casos de uso más avanzados de Notario, se utilizan delegaciones adicionales para la jerarquía.

$ docker trust signer add --key cert.pem jeff dtr.example.com/admin/demo
Adding signer "jeff" to dtr.example.com/admin/demo...
Initializing signed repository for dtr.example.com/admin/demo...
Enter passphrase for root key with ID f6c6a4b: 
Enter passphrase for new repository key with ID b0014f8: 
Repeat passphrase for new repository key with ID b0014f8: 
Successfully initialized "dtr.example.com/admin/demo"
Successfully added signer: jeff to dtr.example.com/admin/demo

Puede ver qué claves se han enviado al servidor de notarios para cada repositorio con el $ docker trust inspect mando.

$ docker trust inspect --pretty dtr.example.com/admin/demo

No signatures for dtr.example.com/admin/demo


List of signers and their keys for dtr.example.com/admin/demo

SIGNER              KEYS
jeff                1091060d7bfd

Administrative keys for dtr.example.com/admin/demo

  Repository Key:	b0014f8e4863df2d028095b74efcb05d872c3591de0af06652944e310d96598d
  Root Key:	64d147e59e44870311dd2d80b9f7840039115ef3dfa5008127d769a5f657a5d7

También puede utilizar la CLI de notario para enumerar las delegaciones y las claves. Aquí puede ver claramente que se adjuntaron las llaves targets/releases y targets/jeff.

$ notary delegation list dtr.example.com/admin/demo

ROLE                PATHS             KEY IDS                                                             THRESHOLD
----                -----             -------                                                             ---------
targets/jeff        ""     1091060d7bfd938dfa5be703fa057974f9322a4faef6f580334f3d6df44c02d1    1
                                          
targets/releases    ""     1091060d7bfd938dfa5be703fa057974f9322a4faef6f580334f3d6df44c02d1    1 

Agregar firmantes adicionales

Docker Trust le permite configurar múltiples delegaciones por repositorio, lo que le permite administrar el ciclo de vida de las delegaciones. Al agregar delegaciones adicionales con $ docker trust la clave de colaboradores se agrega una vez más a la targets/release papel.

Tenga en cuenta que necesitará la frase de contraseña para la clave del repositorio; esto se habría configurado cuando inició el repositorio por primera vez.

$ docker trust signer add --key ben.pub ben dtr.example.com/admin/demo
Adding signer "ben" to dtr.example.com/admin/demo...
Enter passphrase for repository key with ID b0014f8: 
Successfully added signer: ben to dtr.example.com/admin/demo

Compruebe para demostrar que ahora hay 2 delegaciones (firmante).

$ docker trust inspect --pretty dtr.example.com/admin/demo

No signatures for dtr.example.com/admin/demo

List of signers and their keys for dtr.example.com/admin/demo

SIGNER              KEYS
ben                 afa404703b25
jeff                1091060d7bfd

Administrative keys for dtr.example.com/admin/demo

  Repository Key:	b0014f8e4863df2d028095b74efcb05d872c3591de0af06652944e310d96598d
  Root Key:	64d147e59e44870311dd2d80b9f7840039115ef3dfa5008127d769a5f657a5d7

Agregar claves a una delegación existente

Para admitir cosas como la rotación de claves y la expiración / retirada de claves, puede publicar varias claves de colaborador por delegación. El único requisito previo aquí es asegurarse de usar el mismo nombre de delegación, en este caso jeff. Docker Trust se encargará automáticamente de agregar esta nueva clave a targets/releases.

Tenga en cuenta que necesitará la frase de contraseña para la clave del repositorio; esto se habría configurado cuando inició el repositorio por primera vez.

$ docker trust signer add --key cert2.pem jeff dtr.example.com/admin/demo
Adding signer "jeff" to dtr.example.com/admin/demo...
Enter passphrase for repository key with ID b0014f8: 
Successfully added signer: jeff to dtr.example.com/admin/demo

Compruebe para demostrar que la delegación (firmante) ahora contiene varios ID de clave.

$ docker trust inspect --pretty dtr.example.com/admin/demo

No signatures for dtr.example.com/admin/demo


List of signers and their keys for dtr.example.com/admin/demo

SIGNER              KEYS
jeff                1091060d7bfd, 5570b88df073

Administrative keys for dtr.example.com/admin/demo

  Repository Key:	b0014f8e4863df2d028095b74efcb05d872c3591de0af06652944e310d96598d
  Root Key:	64d147e59e44870311dd2d80b9f7840039115ef3dfa5008127d769a5f657a5d7

Eliminar una delegación

Si necesita eliminar una delegación, incluidas las claves de colaborador que se adjuntan a la targets/releases rol, puede utilizar el $ docker trust signer remove mando.

Tenga en cuenta que las etiquetas que fueron firmadas por la delegación eliminada deberán ser resignadas por una delegación activa

$ docker trust signer remove dtr.example.com/admin/demo
Removing signer "ben" from dtr.example.com/admin/demo...
Enter passphrase for repository key with ID b0014f8: 
Successfully removed ben from dtr.example.com/admin/demo

Solución de problemas

1) Si ve un error que indica que no hay claves utilizables en targets/releases, deberá agregar delegaciones adicionales utilizando docker trust signer add antes de renunciar a las imágenes.

WARN[0000] role targets/releases has fewer keys than its threshold of 1; it will not be usable until keys are added to it

2) Si ya ha agregado delegaciones adicionales y está viendo un mensaje de error que indica que no hay firmas válidas en targest/releases, deberás renunciar al targets/releases archivo de delegación con Notary CLI.

WARN[0000] Error getting targets/releases: valid signatures did not meet threshold for targets/releases 

La renuncia al archivo de delegación se realiza con el $ notary witness mando

$ notary witness dtr.example.com/admin/demo targets/releases --publish

Más información sobre $ notary witness se puede encontrar el comando aquí

Eliminar la clave de un colaborador de una delegación

Como parte de la rotación de claves para una delegación, es posible que desee eliminar una clave individual pero conservar la delegación. Esto se puede hacer con Notary CLI.

Recuerde que tendrá que quitar la llave tanto de la targets/releases rol y el rol específico de ese firmante targets/.

1) Necesitaremos obtener el ID de clave del Notary Server

$ notary delegation list dtr.example.com/admin/demo

ROLE                PATHS             KEY IDS                                                             THRESHOLD
----                -----             -------                                                             ---------
targets/jeff        ""     8fb597cbaf196f0781628b2f52bff6b3912e4e8075720378fda60d17232bbcf9    1
                                      1091060d7bfd938dfa5be703fa057974f9322a4faef6f580334f3d6df44c02d1    
targets/releases    ""     8fb597cbaf196f0781628b2f52bff6b3912e4e8075720378fda60d17232bbcf9    1
                                      1091060d7bfd938dfa5be703fa057974f9322a4faef6f580334f3d6df44c02d1    

2) Retirar del targets/releases delegación

$ notary delegation remove dtr.example.com/admin/demo targets/targets 1091060d7bfd938dfa5be703fa057974f9322a4faef6f580334f3d6df44c02d1 --publish
Auto-publishing changes to dtr.example.com/admin/demo
Enter username: admin
Enter password: 
Enter passphrase for targets key with ID b0014f8: 
Successfully published changes for repository dtr.example.com/admin/demo

3) Retirar del targets/ delegación

$ notary delegation remove dtr.example.com/admin/demo targets/jeff 1091060d7bfd938dfa5be703fa057974f9322a4faef6f580334f3d6df44c02d1 --publish

Removal of delegation role targets/jeff with keys [5570b88df0736c468493247a07e235e35cf3641270c944d0e9e8899922fc6f99], to repository "dtr.example.com/admin/demo" staged for next publish.

Auto-publishing changes to dtr.example.com/admin/demo
Enter username: admin    
Enter password: 
Enter passphrase for targets key with ID b0014f8: 
Successfully published changes for repository dtr.example.com/admin/demo

4) Verifique la lista de delegaciones restantes

$ notary delegation list dtr.example.com/admin/demo

ROLE                PATHS             KEY IDS                                                             THRESHOLD
----                -----             -------                                                             ---------
targets/jeff        ""     8fb597cbaf196f0781628b2f52bff6b3912e4e8075720378fda60d17232bbcf9    1    
targets/releases    ""     8fb597cbaf196f0781628b2f52bff6b3912e4e8075720378fda60d17232bbcf9    1    

Eliminar una clave privada de delegación local

Como parte de las claves de delegación rotativas, es posible que deba eliminar una clave de delegación local del almacén de confianza de Docker local. Esto se hace con Notary CLI, usando el $ notary key remove mando.

1) Necesitaremos obtener el ID de clave de la tienda local de Docker Trust.

$ notary key list

ROLE       GUN                          KEY ID                                                              LOCATION
----       ---                          ------                                                              --------
root                                    f6c6a4b00fefd8751f86194c7d87a3bede444540eb3378c4a11ce10852ab1f96    /home/ubuntu/.docker/trust/private
admin                                   8fb597cbaf196f0781628b2f52bff6b3912e4e8075720378fda60d17232bbcf9    /home/ubuntu/.docker/trust/private
jeff                                    1091060d7bfd938dfa5be703fa057974f9322a4faef6f580334f3d6df44c02d1    /home/ubuntu/.docker/trust/private
targets    ...example.com/admin/demo    c819f2eda8fba2810ec6a7f95f051c90276c87fddfc3039058856fad061c009d    /home/ubuntu/.docker/trust/private

2) Elimina la clave de la tienda local de Docker Trust.

$ notary key remove 1091060d7bfd938dfa5be703fa057974f9322a4faef6f580334f3d6df44c02d1

Are you sure you want to remove 1091060d7bfd938dfa5be703fa057974f9322a4faef6f580334f3d6df44c02d1 (role jeff) from /home/ubuntu/.docker/trust/private?  (yes/no)  y

Deleted 1091060d7bfd938dfa5be703fa057974f9322a4faef6f580334f3d6df44c02d1 (role jeff) from /home/ubuntu/.docker/trust/private.

Eliminar todos los datos de confianza de un repositorio

Puede eliminar todos los datos de confianza de un repositorio, incluido el repositorio, el destino, la instantánea y todas las claves de delegaciones mediante la CLI de Notary.

Esto suele ser requerido por un registro de contenedor antes de que se pueda eliminar un repositorio en particular.

$ notary delete dtr.example.com/admin/demo --remote
Deleting trust data for repository dtr.example.com/admin/demo
Enter username: admin
Enter password: 
Successfully deleted local and remote trust data for repository dtr.example.com/admin/demo

$ docker trust inspect --pretty dtr.example.com/admin/demo
No signatures or cannot access dtr.example.com/admin/demo

Información relacionada

confianza, seguridad, delegaciones, teclas, repositorio