Signer et vérifier une image conteneur avec notation dans Azure Pipeline
La tâche notation dans Azure DevOps est une tâche intégrée pour signer et vérifier des images conteneur et d’autres artefacts Open Container Initiative (OCI) au sein d’un pipeline Azure. La tâche notation utilise l’interface CLI notation pour exécuter ces opérations, ce qui garantit que les artefacts sont signés par une entité approuvée et n’ont pas été falsifiés depuis leur création.
L’article vous guide tout au long de la création d’un pipeline Azure qui génère une image conteneur, l’envoie (push) à ACR et ajoute des signatures à l’aide de notation et du plug-in Azure Key Vault fournissant une couche de sécurité et d’intégrité pour les artefacts. L’objectif du pipeline est de :
- Générez une image conteneur et envoyez-la à Azure Container Registry (ACR).
- Signez l’image avec le plug-in Notation et Notation Azure Key Vault. La signature est ensuite envoyée automatiquement à ACR.
Prérequis
- Créez un coffre de clés dans Azure Key Vault et générez une clé et un certificat de signature auto-signés. Vous pouvez utiliser ce document pour créer une clé auto-signée et un certificat à des fins de test. Si vous disposez d’un certificat émis par l’autorité de certification, reportez-vous à ce document pour plus d’informations.
- Créez un registre dans Azure Container Registry (ACR).
- Vérifiez que vous disposez d’un dépôt Azure DevOps ou d’un dépôt GitHub.
Créer un service Connecter ion
Créez une connexion de service dans Azure Pipelines, ce qui permet à votre pipeline d’accéder à des services externes comme Azure Container Registry (ACR), vous pouvez suivre les étapes suivantes :
Signez une image dans Azure Container Registry (ACR) à l’aide des informations d’identification ACR.
Utilisez la tâche Docker dans Azure Pipelines pour vous connecter à l’ACR. La tâche Docker est une tâche intégrée dans Azure Pipelines qui vous permet de générer, d’envoyer (push) et d’extraire des images Docker, entre autres.
Établissez une connexion de service Docker Registry dans Azure Pipeline pour accorder aux tâches de notation l’accès à votre registre ACR, comme suit :
- Connectez-vous à votre organisation (
https://dev.azure.com/{yourorganization}
) et sélectionnez votre projet. - Sélectionnez le bouton Paramètres dans le coin inférieur gauche.
- Accédez à Pipelines, puis sélectionnez Connexion de service.
- Choisissez Nouvelle connexion de service et sélectionnez Registre Docker.
- Choisissez ensuite Azure Container Registry.
- Choisissez le principe de service dans le type d’authentification et entrez les détails du principal de service, y compris votre abonnement Azure et votre registre ACR.
- Entrez un nom de connexion convivial à utiliser pour faire référence à cette connexion de service.
- Connectez-vous à votre organisation (
Créez une connexion de service Azure Resource Manager dans Azure Pipelines pour autoriser l’accès à votre azure Key Vault :
- Choisissez principal de service (automatique).
- Ensuite, choisissez Abonnement et recherchez votre abonnement Azure dans la liste déroulante.
- Choisissez un groupe de ressources disponible dans la liste déroulante.
- Entrez un nom de connexion de service convivial à utiliser lors de la référence à cette connexion de service.
- Enregistrez-le pour terminer la création.
Accordez la stratégie d’accès à votre principal de service en procédant comme suit :
- Ouvrez la connexion de service Azure Resource Manager créée, puis cliquez sur Gérer le principal de service pour entrer dans le portail du principal du service Azure.
- Copiez la valeur
Application (client) ID
. Il sera utilisé pour accorder l’autorisation pour le principal de service. - Ouvrez le portail Azure Key Vault et entrez la page Stratégies d’accès.
- Créez une stratégie d’accès avec
key sign
etsecret get
certificate get
une autorisation. - Accordez cette nouvelle stratégie d’accès à un principe de service à l’aide du
Application (client) ID
collage de l’étape précédente. - Enregistrez-le pour terminer la création.
En savoir plus sur la connexion de service ici.
Créer un pipeline et utiliser une tâche notation
Créez un pipeline Azure pour votre dépôt Git en procédant comme suit :
- Accédez au projet dans votre organisation AOD.
- Accédez à Pipelines dans le menu de gauche, puis sélectionnez Nouveau pipeline.
- Choisissez votre dépôt Git. Nous utilisons le référentiel Azure DevOps pour des raisons pratiques de démonstration.
- Configurez le pipeline avec un pipeline de démarrage si vous débutez avec Azure DevOps. Passez en revue et créez le pipeline en cliquant sur Enregistrer et exécuter.
Remarque
L’exemple suppose que le branche par défaut est main
. Si ce n’est pas le cas, suivez le guide pour mettre à jour le branche par défaut.
Il existe deux façons d’ajouter des tâches de notation en modifiant votre pipeline Azure :
Utilisez le panneau Azure DevOps (ADO) : le panneau ADO fournit une interface utilisateur dans laquelle vous pouvez ajouter des tâches à votre pipeline. Vous pouvez rechercher des tâches de notation et les ajouter à votre pipeline à l’aide de cette interface.
Copier à partir d’un exemple de fichier Azure Pipeline : si vous avez un exemple de fichier Azure Pipeline qui inclut déjà des tâches de notation, vous pouvez copier ces tâches à partir de l’exemple de fichier et les coller dans votre fichier de pipeline.
Option 1 : Utiliser le panneau d’édition Azure DevOps (ADO)
Recherchez la Docker
tâche à partir du panneau d’édition du pipeline sur le côté droit. Utilisez sa login
commande avec la connexion du service Docker Registry pour vous authentifier auprès d’ACR.
- Choisissez la connexion du service Docker Registry créée à l’étape précédente dans la liste déroulante Registre de conteneurs.
- Choisissez
login
dans la liste déroulante Commandes . - Cliquez sur Ajouter pour ajouter la tâche Docker avec
login
la commande à gauche du fichier de pipeline.
De même, recherchez à nouveau la Docker
tâche à partir du panneau d’édition du pipeline. Utilisez sa buildAndPush
commande pour générer automatiquement le code source vers une image et l’envoyer au référentiel ACR cible. Elle génère une synthèse d’image qui sera utilisée pour la connexion à l’étape suivante.
- Entrez le nom du référentiel dans le référentiel conteneur.
- Choisissez buildAndPush dans la liste déroulante Commandes .
- Spécifiez le chemin d’accès au fichier de Dockerfile. Par exemple, utilisez
./Dockerfile
si votre fichier Dockerfile est stocké dans le dossier racine. - Cliquez sur Ajouter pour ajouter la tâche Docker avec
buildAndPush
la commande à gauche du fichier de pipeline.
Recherchez la Notation
tâche à partir du panneau d’édition du pipeline sur le côté droit.
- Choisissez Installer dans la commande de liste déroulante à exécuter.
- Cliquez sur Ajouter pour ajouter la
notation install
tâche au pipeline. - De même, recherchez à nouveau la
Notation
tâche dans le panneau d’édition du pipeline et choisissez Signer. - Vous pouvez ignorer les références d’artefact, car nous signons une image à l’aide de sa dernière synthèse générée et envoyée (push) au Registre par une tâche Docker. Au lieu de cela, vous pouvez spécifier manuellement un digest à l’aide
<registry_host>/<repository>@<digest>
de . - Renseignez la configuration du plug-in dans le formulaire. Nous allons utiliser le plug-in AKV par défaut et la connexion de service créée à l’étape précédente. Copiez votre ID de clé à partir de votre AKV dans l’ID de clé.
- Cochez la case Certificat auto-signé, car nous utilisons un certificat auto-signé pour des raisons pratiques de démonstration. Au lieu de cela, vous pouvez entrer votre chemin d’accès au fichier de certificat dans le chemin d’accès au fichier groupé de certificats si vous souhaitez utiliser un certificat émis par l’autorité de certification.
- Cliquez sur Ajouter pour ajouter le
notation sign
fichier de pipeline à gauche.
Option 2 : Modifier un exemple de fichier Azure Pipeline
- Si vous connaissez Azure Pipelines et notation, il est efficace de commencer par un fichier de pipeline de modèle.
- Copiez le modèle de pipeline fourni dans le document dans votre propre fichier de pipeline. Ce modèle est conçu pour utiliser des tâches de notation, qui sont utilisées pour signer et vérifier des images conteneur.
- Après avoir copié le modèle, renseignez les valeurs requises en fonction des références et des commentaires fournis ci-dessous.
Consultez le modèle de tâche de signature de l’option 1 (cliquez ici).
trigger:
- main
pool:
vmImage: 'ubuntu-latest'
steps:
# log in to registry
- task: Docker@2
inputs:
containerRegistry: <your_docker_registry_service_connection>
command: 'login'
# build and push artifact to registry
- task: Docker@2
inputs:
repository: <your_repository_name>
command: 'buildAndPush'
Dockerfile: './Dockerfile'
# install notation
- task: Notation@0
inputs:
command: 'install'
version: '1.1.0'
# automatically detect the artifact pushed by Docker task and sign the artifact.
- task: Notation@0
inputs:
command: 'sign'
plugin: 'azureKeyVault'
akvPluginVersion: <azure_key_vault_plugin_version>
azurekvServiceConection: <your_akv_service_connection>
keyid: <your_key_id>
selfSigned: true
Remarque
Outre l’utilisation de la tâche Docker, vous pouvez signer une synthèse d’image spécifiée en spécifiant manuellement une référence d’artefact comme artifactRefs
suit.
Consultez l’exemple (cliquez ici).
# sign the artifact
- task: Notation@0
inputs:
artifactRefs: '<registry_host>/<repository>@<digest>'
command: 'sign'
plugin: 'azureKeyVault'
akvPluginVersion: <azure_key_vault_plugin_version>
azurekvServiceConection: <akv_service_connection>
keyid: <key_id>
selfSigned: true
Déclencher le pipeline
Suivez les étapes pour exécuter un pipeline dans Azure DevOps et vérifier son exécution.
- Après avoir rempli les entrées dans le pipeline, enregistrez et exécutez-la pour déclencher le pipeline.
- Accédez à la page Travail du pipeline en cours d’exécution. Ici, vous pouvez voir l’exécution de chaque étape. Ce pipeline génère et signe la dernière build ou le digest spécifié, puis envoie (push) l’image signée avec sa signature associée au Registre.
- Une fois l’exécution réussie, vous pouvez voir l’image envoyée à votre instance Azure Container Registry (ACR) avec une signature de format CBOR Object Signing and Encryption (COSE) attachée.
Vérifier l’image signée
De même, pour vérifier l’image signée, vous pouvez utiliser le panneau d’édition ou modifier le fichier de pipeline pour ajouter la tâche de notation verify
à votre pipeline. Le pipeline vérifie l’image signée avec la stratégie d’approbation et le magasin d’approbation que vous avez fournis.
Préparer la stratégie d’approbation de notation et le magasin d’approbations
En général, le vérificateur est différent du signataire. À des fins de démonstration, nous utilisons le même pipeline et le même référentiel ADO dans cet exemple. Suivez les étapes ci-dessous pour créer une stratégie d’approbation de notation, un magasin d’approbations et ajouter la verify
tâche dans le pipeline :
- Dans le référentiel ADO actuel, créez un exemple de dossier
.pipeline
pour stocker la stratégie.pipeline/trustpolicy/
d’approbation notation. Créez un exemple de fichiertrustpolicy.json
JSON de stratégie d’approbation. Renseignez le modèle de stratégie d’approbation avec vos propres valeurs et enregistrez-le dans le dossier.
Remarque
Notez que le magasin d’approbations de notation prend actuellement en charge trois types d’identités, notamment l’autorité de certification, la signatureAuthority et les certificats racine TSA (Time Stamping Authority). À des fins de démonstration, nous utilisons l’autorité de certification dans x509/ca
la stratégie d’approbation et le magasin d’approbations ci-dessous. Pour plus d’informations, consultez le magasin d’approbations .
Consultez le modèle de stratégie d’approbation (cliquez ici).
{
"version": "1.0",
"trustPolicies": [
{
"name": "<yourPolicyName>",
"registryScopes": [ "<yourRegistry>.azurecr.io/<yourArtifact>" ],
"signatureVerification": {
"level" : "strict"
},
"trustStores": [ "ca:<yourTrustStore>"],
"trustedIdentities": [
"*"
]
}
]
}
- Dans le référentiel ADO actuel, créez un dossier pour le magasin
/.pipeline/truststore/x509/ca/$<yourTrustStore>/
d’approbations notation pour stocker le certificat. Si vous avez suivi les étapes de signature de ce document pour signer votre image, utilisez la commande ci-dessous pour télécharger votre certificat auto-signé à partir d’Azure Key Vault (AKV) :
KEY_NAME=<key_name_you_picked_when_creating_the_key>
AKV_NAME=<akv_name_where_certificate_is_stored>
CERT_ID=$(az keyvault certificate show -n $KEY_NAME --vault-name $AKV_NAME --query 'id' -o tsv)
CERT_PATH=./${KEY_NAME}.pem
az keyvault certificate download --file $CERT_PATH --id $CERT_ID --encoding PEM
- Chargez le certificat dans le dossier
/.pipeline/truststore/x509/ca/$<yourTrustStore>/
du magasin d’approbations que nous avons créé à la dernière étape.
Ajouter une tâche de vérification de notation
- Recherchez à nouveau la tâche notation dans le panneau d’édition du pipeline, puis choisissez Vérifier.
- Renseignez les références Artifact avec le résumé de l’image signée.
- Entrez la valeur
.pipeline/trustpolicy/trustpolicy.json
dans le chemin du fichier de stratégie de confiance. - Entrez la valeur
.pipeline/truststore/
dans le chemin du dossier du magasin d’approbations. - Cliquez sur Ajouter pour ajouter la vérification de notation au fichier de pipeline à gauche.
Vous notation verify
serez enregistré comme suit.
Consultez l’exemple (cliquez ici).
# sign the artifact
- task: Notation@0
inputs:
command: 'verify'
artifactRefs: '<registry_host>/<repository>@<digest>'
trustPolicy: .pipeline/trustpolicy.json
trustStore: .pipeline/truststore/
Déclencher le pipeline (mis à jour)
Vous pouvez réactiver le pipeline pour vérifier l’image signée. Une fois l’exécution réussie, vous pouvez voir les journaux à partir de la page Travail du pipeline en cours d’exécution. Le pipeline vérifie l’image signée avec la stratégie d’approbation et le magasin d’approbation que vous avez fournis.
Conclusion
Cet article vous montre comment signer et vérifier une image conteneur avec notation dans Azure Pipeline. Vous pouvez utiliser le panneau Azure DevOps ou modifier le fichier de pipeline pour ajouter des tâches de notation à votre pipeline. Le pipeline génère, envoie, signe et vérifie l’image avec la stratégie d’approbation et le magasin d’approbations que vous avez fournis. Ce processus garantit que les artefacts sont signés par une entité approuvée et n’ont pas été falsifiés depuis leur création.