Share via


Confiança de Conteúdo do Docker

Azure DevOps Services

O Docker Content Trust (DCT) permite-lhe utilizar assinaturas digitais para dados enviados e recebidos de registos remotos do Docker. Estas assinaturas permitem a verificação do lado do cliente ou do runtime da integridade e do publicador de etiquetas de imagem específicas.

Nota

Um pré-requisito para assinar uma imagem é um Registo do Docker com um servidor notário anexado (os exemplos incluem Docker Hub ou Azure Container Registry)

Assinar imagens nos Pipelines do Azure

Pré-requisitos no computador de desenvolvimento

  1. Utilize o gerador incorporado do Docker Trust ou gere manualmente o par de chaves de delegação. Se o gerador incorporado for utilizado, a chave privada de delegação é importada para o arquivo de fidedignidade do Docker local. Caso contrário, a chave privada terá de ser importada manualmente para o arquivo de fidedignidade do Docker local. Veja Manualmente Gerar Chaves para obter detalhes.
  2. Com a chave de delegação gerada a partir do passo acima, carregue a primeira chave para uma delegação e inicie o repositório

Dica

Para ver a lista de chaves de Delegação local, utilize a CLI do Notary para executar o seguinte comando: $ notary key list.

Configurar o pipeline para assinar imagens

  1. Pegue na chave privada de delegação, que se encontra no arquivo de confiança local do Docker do seu computador de desenvolvimento utilizado anteriormente, e adicione o mesmo que um ficheiro seguro em Pipelines.

  2. Autorize este ficheiro seguro para utilização em todos os pipelines.

  3. O principal de serviço associado containerRegistryServiceConnection tem de ter a função AcrImageSigner no registo de contentor de destino.

  4. Crie um pipeline com base no seguinte fragmento 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 DOCKER_CONFIG variável é definida pelo login comando na tarefa do Docker. Recomendamos que configure DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE como uma variável secreta para o pipeline. A abordagem alternativa da utilização de uma variável de pipeline no YAML expõe a frase de acesso em texto simples. DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE neste exemplo, refere-se à frase de acesso da chave privada (não à frase de acesso do repositório). Neste exemplo, só precisamos da frase de acesso da chave privada porque o repositório já foi iniciado (pré-requisitos).