Partager via


Approbation du contenu Docker

Azure DevOps Services

Docker Content Trust (DCT) vous permet d’utiliser des signatures numériques pour les données envoyées et reçues à partir de registres Docker distants. Ces signatures vous permettent de vérifier l’intégrité et l’éditeur de balises d’image spécifiques côté client ou au moment de l’exécution.

Remarque

Pour signer une image, vous avez besoin d’un registre Docker avec un serveur Notary attaché (par exemple Docker Hub ou Azure Container Registry).

Signature d’images dans Azure Pipelines

Conditions préalables sur l’ordinateur de développement

  1. Utilisez le générateur intégré de Docker Trust ou générez manuellement la paire de clés de délégation. Si le générateur intégré est utilisé, la clé privée de délégation est importée dans le magasin de confiance Docker local. Sinon, vous devez importer manuellement la clé privée dans le magasin d’approbation Docker local. Pour plus d’informations, consultez Génération manuelle de clés .
  2. Utilisez la clé de délégation générée à l’étape précédente pour charger la première clé dans une délégation et lancer le référentiel.

Conseil / Astuce

Pour afficher la liste des clés de délégation locales, utilisez l’interface CLI notariée pour exécuter la commande suivante : $ notary key list.

Configurer le pipeline pour la signature d’images

  1. Obtenez la clé privée de délégation à partir du magasin d’approbation Docker local sur votre ordinateur de développement et ajoutez-la en tant que fichier sécurisé dans Pipelines.

  2. Autorisez ce fichier sécurisé à utiliser dans tous les pipelines.

  3. Le principal de service associé containerRegistryServiceConnection doit avoir le rôle AcrImageSigner dans le registre de conteneurs cible.

  4. Créez un pipeline basé sur l’extrait de code YAML suivant :

    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)
    

    Dans l’exemple précédent, la DOCKER_CONFIG variable est définie par la login commande dans la tâche Docker. Configurez DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE et DOCKER_CONTENT_TRUST_ROOT_PASSPHRASE comme variables secrètes pour votre pipeline.

    DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE dans cet exemple fait référence à la phrase secrète de la clé privée (et non à la phrase secrète du dépôt). Nous avons uniquement besoin de la phrase secrète de la clé privée dans cet exemple, car le référentiel a déjà été lancé (prérequis).