Dela via


Docker-innehållsförtroende

Azure DevOps Services

Med Docker Content Trust (DCT) kan du använda digitala signaturer för data som skickas till och tas emot från fjärranslutna Docker-register. Dessa signaturer tillåter verifiering på klientsidan eller körning av integriteten och utgivaren av specifika avbildningstaggar.

Anteckning

En förutsättning för att signera en avbildning är ett Docker-register med en notarieserver ansluten (exempel är Docker Hub eller Azure Container Registry)

Signera avbildningar i Azure Pipelines

Förutsättningar för utvecklingsdatorn

  1. Använd Docker Trusts inbyggda generator eller generera delegeringsnyckelpar manuellt. Om den inbyggda generatorn används importeras den privata delegeringsnyckeln till det lokala Docker-förtroendearkivet. Annars måste den privata nyckeln importeras manuellt till det lokala Docker-förtroendearkivet. Mer information finns i Generera nycklar manuellt .
  2. Med hjälp av delegeringsnyckeln som genererades från steget ovan laddar du upp den första nyckeln till en delegering och initierar lagringsplatsen

Tips

Om du vill visa listan över lokala delegeringsnycklar använder du Notary CLI för att köra följande kommando: $ notary key list.

Konfigurera pipeline för signering av avbildningar

  1. Hämta den privata delegeringsnyckeln, som finns i det lokala Docker-förtroendearkivet för utvecklingsdatorn som användes tidigare, och lägg till samma som en säker fil i Pipelines.

  2. Auktorisera den här säkra filen för användning i alla pipelines.

  3. Tjänstens huvudnamn som är associerat med containerRegistryServiceConnection måste ha rollen AcrImageSigner i målcontainerregistret.

  4. Skapa en pipeline baserat på följande YAML-kodfragment:

    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)
    

    I föregående exempel anges variabeln DOCKER_CONFIG av login kommandot i Docker-aktiviteten. Vi rekommenderar att du konfigurerar DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE som en hemlig variabel för din pipeline. Den alternativa metoden för att använda en pipelinevariabel i YAML exponerar lösenfrasen i oformaterad text. DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE i det här exemplet refererar till den privata nyckelns lösenfras (inte lagringsplatsens lösenfras). Vi behöver bara den privata nyckelns lösenfras i det här exemplet eftersom lagringsplatsen redan har initierats (förutsättningar).