Docker Content Trust
Azure DevOps Services
La confianza de contenido de Docker (DCT) permite usar firmas digitales para los datos enviados y recibidos de registros remotos de Docker. Estas firmas permiten la comprobación en tiempo de ejecución o del lado cliente de la integridad y el publicador de etiquetas de imagen específicas.
Nota:
Un requisito previo para firmar una imagen es un registro de Docker con un servidor notario asociado (por ejemplo, Docker Hub o Azure Container Registry)
Firma de imágenes en Azure Pipelines
Requisitos previos en la máquina de desarrollo
- Use el generador integrado de la confianza de Docker o genere manualmente el par de claves de delegación. Si se usa el generador integrado, la clave privada de delegación se importa en el almacén de confianza local de Docker. De lo contrario, la clave privada deberá importarse manualmente en el almacén de confianza local de Docker. Consulte Generación manual de claves para obtener más información.
- Con la clave de delegación generada a partir del paso anterior, cargue la primera clave en una delegación e inicie el repositorio.
Sugerencia
Para ver la lista de claves de delegación local, use la CLI de Notary para ejecutar el siguiente comando: $ notary key list
.
Configuración de la canalización para la firma de imágenes
Tome la clave privada de delegación, que se encuentra en el almacén de confianza local de Docker de la máquina de desarrollo usada anteriormente y agregue lo mismo que un archivo seguro en Canalizaciones.
Autorice este archivo seguro para su uso en todas las canalizaciones.
La entidad de servicio asociada a
containerRegistryServiceConnection
debe tener el rol AcrImageSigner en el registro de contenedor de destino.Cree una canalización basada en el siguiente fragmento de código YAML:
pool: vmImage: 'Ubuntu 16.04' variables: system.debug: true containerRegistryServiceConnection: serviceConnectionName imageRepository: foobar/content-trust tag: test steps: - task: Docker@2 inputs: command: login containerRegistry: $(containerRegistryServiceConnection) - task: DownloadSecureFile@1 name: privateKey inputs: secureFile: cc8f3c6f998bee63fefaaabc5a2202eab06867b83f491813326481f56a95466f.key - script: | mkdir -p $(DOCKER_CONFIG)/trust/private cp $(privateKey.secureFilePath) $(DOCKER_CONFIG)/trust/private - task: Docker@2 inputs: command: build Dockerfile: '**/Dockerfile' containerRegistry: $(containerRegistryServiceConnection) repository: $(imageRepository) tags: | $(tag) arguments: '--disable-content-trust=false' - task: Docker@2 inputs: command: push containerRegistry: $(containerRegistryServiceConnection) repository: $(imageRepository) tags: | $(tag) arguments: '--disable-content-trust=false' env: DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE: $(DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE)
En el ejemplo anterior, el comando
DOCKER_CONFIG
establece la variablelogin
en la tarea Docker. Se recomienda configurarDOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE
como una variable secreta para la canalización. El enfoque alternativo de usar una variable de canalización en YAML expone la frase de contraseña en texto sin formato.DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE
en este ejemplo se hace referencia a la frase de contraseña de la clave privada (no a la frase de contraseña del repositorio). Solo necesitamos la frase de contraseña de la clave privada en este ejemplo porque el repositorio ya se ha iniciado (requisitos previos).