Confiança de Conteúdo do Docker

Azure DevOps Services

A DCT (Confiança de Conteúdo do Docker) permite que você use assinaturas digitais para dados enviados e recebidos de registros remotos do Docker. Essas assinaturas permitem verificar a integridade e o publicador de marcas de imagem específicas no lado do cliente ou em tempo de execução.

Observação

Para assinar uma imagem, você precisa de um Registro do Docker com um servidor notário anexado (exemplos incluem o Hub do Docker ou o Registro de Contêiner do Azure).

Assinatura de imagens no Azure Pipelines

Pré-requisitos no computador de desenvolvimento

  1. Use o gerador interno do Docker Trust ou gere manualmente o par de chaves de delegação. Se o gerador interno for usado, a chave privada de delegação será importada para o repositório de confiança local do Docker. Caso contrário, você precisará importar manualmente a chave privada para o repositório de confiança local do Docker. Consulte Manualmente Gerando Chaves para obter detalhes.
  2. Use a chave de delegação gerada na etapa anterior para carregar a primeira chave em uma delegação e iniciar o repositório.

Dica

Para exibir a lista de chaves de delegação local, use a CLI do Notário para executar o seguinte comando: $ notary key list.

Configurar o pipeline para assinatura de imagens

  1. Obtenha a chave privada de delegação do repositório de confiança local do Docker em seu computador de desenvolvimento e adicione-a como um arquivo seguro em Pipelines.

  2. Autorize esse arquivo seguro para uso em todos os pipelines.

  3. A entidade de serviço associada a containerRegistryServiceConnection deve ter a função AcrImageSigner no registro de contêiner de destino.

  4. Crie um fluxo de trabalho com base no seguinte trecho 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)
    

    No exemplo anterior, a DOCKER_CONFIG variável é definida pelo login comando na tarefa docker. Configure DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE e DOCKER_CONTENT_TRUST_ROOT_PASSPHRASE como variáveis secretas para sua pipeline.

    DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE neste exemplo, refere-se à frase secreta da chave privada (não à frase secreta do repositório). Só precisamos da frase secreta da chave privada neste exemplo porque o repositório já foi iniciado (pré-requisitos).