Confiança de Conteúdo do Docker

Azure DevOps Services

Com o DCT (Docker Content Trust, Confiança de Conteúdo do Docker), você pode usar assinaturas digitais para dados enviados para registros remotos do Docker e recebidos deles. Com essas assinaturas, o cliente ou o runtime pode fazer a verificação da integridade e do editor de tags de imagem específicas.

Observação

Um pré-requisito para assinar uma imagem é um Registro do Docker com um servidor Notary anexado (exemplos incluem Docker Hub ou Registro de Contêiner do Azure).

Assinatura de imagens no Azure Pipelines

Pré-requisitos no computador de desenvolvimento

  1. Use o gerador interno de confiança do Docker 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, ela precisará ser importada manualmente para lá. Confira Gerando chaves manualmente para obter detalhes.
  2. Usando a chave de delegação gerada da etapa acima, carregue a primeira chave em uma delegação e inicie o repositório.

Dica

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

Configurar o pipeline para assinatura de imagens

  1. Pegue a chave privada de delegação, que está no repositório confiável local do Docker no computador de desenvolvimento usado anteriormente, 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 do contêiner de destino.

  4. Crie um pipeline com base no seguinte snippet 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)
    

    No exemplo anterior, a variável DOCKER_CONFIG é definida pelo comando login na tarefa Docker. Recomendamos que você configure DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE como uma variável secreta para seu pipeline. A abordagem alternativa para uma variável de pipeline no YAML expõe a frase secreta em texto sem formatação. 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 deste exemplo, pois o repositório já foi iniciado (pré-requisitos).