Compartir a través de


Confianza de contenido de Docker

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 le permiten comprobar la integridad y el publicador de etiquetas de imagen específicas en el lado cliente o en tiempo de ejecución.

Nota:

Para firmar una imagen, necesita un registro de Docker con un servidor notario adjunto (por ejemplo, Docker Hub o Azure Container Registry).

Firmado de imágenes en Azure Pipelines

Requisitos previos en la máquina de desarrollo

  1. Use el generador integrado de 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, debe importar manualmente la clave privada en el almacén de confianza de Docker local. Consulte Generación manual de claves para obtener más información.
  2. Use la clave de delegación generada en el paso anterior para cargar la primera clave en una delegación e iniciar el repositorio.

Sugerencia

Para ver la lista de claves de delegación locales, use la CLI de Notary para ejecutar el siguiente comando: $ notary key list.

Configuración de la canalización para firmar imágenes

  1. Obtenga la clave privada de delegación del almacén de confianza de Docker en su máquina de desarrollo local y agréguela como un archivo seguro en Pipelines.

  2. Autorice este archivo seguro para su uso en todas las canalizaciones.

  3. La entidad de servicio asociada a containerRegistryServiceConnection debe tener el rol de AcrImageSigner en el registro de contenedores de destino.

  4. Cree una canalización basada en el siguiente fragmento de código YAML:

    pool:
      vmImage: 'ubuntu-latest'
    
    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)
    
     - task: Docker@2
       inputs:
         command: push
         containerRegistry: $(containerRegistryServiceConnection)
         repository: $(imageRepository)
         tags: |
           $(tag)
       env:
         DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE: $(DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE)
         DOCKER_CONTENT_TRUST_ROOT_PASSPHRASE: $(rootPassphrase)
    

    En el ejemplo anterior, la variable DOCKER_CONFIG es establecida por el comando login en la tarea de Docker. Configure DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE y DOCKER_CONTENT_TRUST_ROOT_PASSPHRASE como variables secretas para el flujo de trabajo.

    DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE en este ejemplo se refiere 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).