Freigeben über


Signieren und Überprüfen eines Containerimages mit Notation in Azure Pipeline

Die Notation-Aufgabe in Azure DevOps ist eine integrierte Aufgabe zum Signieren und Überprüfen von Containerimages und anderen OCI-Artefakten (Open Container Initiative) innerhalb einer Azure-Pipeline. Die Notation-Aufgabe verwendet die Notation CLI, um diese Vorgänge auszuführen, um sicherzustellen, dass die Artefakte von einer vertrauenswürdigen Entität signiert und seit ihrer Erstellung nicht manipuliert wurden.

Der Artikel führt Sie durch das Erstellen einer Azure-Pipeline, die ein Containerimage erstellt, es an ACR pusht und Signaturen mithilfe von Notation und dem Azure Key Vault-Plug-In hinzufügt, das eine Ebene der Sicherheit und Integrität für die Artefakte bereitstellt. Das Ziel der Pipeline ist:

  1. Erstellen Sie ein Containerimage, und übertragen Sie es an die Azure Container Registry (ACR).
  2. Signieren Sie das Bild mit Notation und Notation Azure Key Vault-Plug-In. Die Signatur wird dann automatisch an ACR übertragen.

Voraussetzungen

  • Erstellen Sie einen Key Vault in Azure Key Vault, und generieren Sie einen selbstsignierten Signaturschlüssel und ein Zertifikat. Sie können dieses Dokument zum Erstellen eines selbstsignierten Schlüssels und Zertifikats zu Testzwecken verwenden. Wenn Sie über ein von der Zertifizierungsstelle ausgestelltes Zertifikat verfügen, finden Sie weitere Informationen in diesem Dokument .
  • Erstellen sie eine Registrierung in der Azure Container Registry (ACR).
  • Stellen Sie sicher, dass Sie über ein Azure DevOps-Repository oder ein GitHub-Repository verfügen.

Dienst-Verbinden erstellen

Erstellen Sie eine Dienstverbindung in Azure Pipelines, mit der Ihre Pipeline auf externe Dienste wie Azure Container Registry (ACR) zugreifen kann, können Sie die folgenden Schritte ausführen:

  • Signieren Sie ein Image in der Azure Container Registry (ACR) mit ACR-Anmeldeinformationen.

  • Verwenden Sie die Docker-Aufgabe in Azure Pipelines, um sich bei der ACR anzumelden. Die Docker-Aufgabe ist eine integrierte Aufgabe in Azure-Pipelines, mit der Sie u. a. Docker-Images erstellen, pushen und pullen können.

  • Richten Sie eine Docker-Registrierungsdienstverbindung in Azure Pipeline ein, um Notationsaufgaben zugriff auf Ihre ACR-Registrierung wie folgt zu gewähren:

    1. Melden Sie sich bei Ihrer Organisation (https://dev.azure.com/{yourorganization}), an und wählen Sie Ihr Projekt.
    2. Wählen Sie in der unteren linken Ecke die Schaltfläche Einstellungen aus.
    3. Wechseln Sie zu Pipelines, und wählen Sie dann "Dienstverbindung" aus.
    4. Wählen Sie "Neue Dienstverbindung" und dann "Docker Registry" aus.
    5. Wählen Sie als Nächstes Azure Container Registry aus.
    6. Wählen Sie "Dienstprinzipal" im Authentifizierungstyp aus, und geben Sie die Dienstprinzipaldetails einschließlich Ihrer Azure-Abonnement- und ACR-Registrierung ein.
    7. Geben Sie einen benutzerfreundlichen Verbindungsnamen ein, der beim Verweisen auf diese Dienstverbindung verwendet werden soll.
  • Erstellen Sie eine Azure Resource Manager-Dienstverbindung in Azure Pipelines, um den Zugriff auf Ihren Azure Key Vault zu autorisieren:

    1. Wählen Sie den Dienstprinzipal (automatisch) aus.
    2. Wählen Sie als Nächstes "Abonnement" aus, und suchen Sie Ihr Azure-Abonnement aus der Dropdownliste.
    3. Wählen Sie in der Dropdownliste eine verfügbare Ressourcengruppe aus.
    4. Geben Sie einen benutzerfreundlichen Dienstverbindungsnamen ein, der beim Verweisen auf diese Dienstverbindung verwendet werden soll.
    5. Speichern Sie es, um die Erstellung abzuschließen.
  • Gewähren Sie der Zugriffsrichtlinie Ihren Dienstprinzipal, indem Sie die folgenden Schritte ausführen:

    1. Öffnen Sie die erstellte Azure Resource Manager-Dienstverbindung, und klicken Sie auf " Dienstprinzipal verwalten ", um das Azure-Dienstprinzipalportal einzugeben.
    2. Kopieren Sie die Dataset-ID (Application (client) ID). Sie wird verwendet, um die Berechtigung für den Dienstprinzipal zu erteilen.
    3. Öffnen Sie das Azure Key Vault-Portal, und geben Sie die Seite "Zugriffsrichtlinien" ein.
    4. Erstellen Sie eine neue Zugriffsrichtlinie mit key sign, secret get und certificate get berechtigungen.
    5. Gewähren Sie dieser neuen Zugriffsrichtlinie ein Dienstprinzip mithilfe des Application (client) ID Einfügens aus dem vorherigen Schritt.
    6. Speichern Sie es, um die Erstellung abzuschließen.

Weitere Informationen zur Dienstverbindung finden Sie hier.

Erstellen einer Pipeline und Verwenden einer Notation-Aufgabe

Erstellen Sie eine Azure-Pipeline für Ihr Git-Repository, indem Sie die folgenden Schritte ausführen:

  1. Navigieren Sie zu dem Projekt in Ihrer AOD-Organisation.
  2. Wechseln Sie im linken Menü zu Pipelines, und wählen Sie dann "Neue Pipeline" aus.
  3. Wählen Sie Ihr Git-Repository aus. Wir verwenden das Azure DevOps-Repository für den Komfort der Demonstration.
  4. Konfigurieren Sie die Pipeline mit einer Starterpipeline , wenn Sie mit Azure DevOps noch nicht vertraut sind. Überprüfen und erstellen Sie die Pipeline, indem Sie auf " Speichern" und "Ausführen" klicken.

Hinweis

Im Beispiel wird davon ausgegangen, dass die Standardbranch istmain. Wenn dies nicht der Vorgang ist, folgen Sie bitte dem Leitfaden, um die Standardbranch zu aktualisieren.

Es gibt zwei Möglichkeiten, Notationsaufgaben hinzuzufügen, indem Sie Ihre Azure-Pipeline bearbeiten:

Verwenden Sie den ADO-Bereich (Azure DevOps): Das ADO-Panel stellt eine Benutzeroberfläche bereit, über die Sie Ihrer Pipeline Aufgaben hinzufügen können. Sie können mithilfe dieser Schnittstelle nach Notationsaufgaben suchen und sie ihrer Pipeline hinzufügen.

Kopieren Sie aus einer Azure-Pipeline-Beispieldatei: Wenn Sie über eine Beispieldatei mit Notationsaufgaben verfügen, können Sie diese Aufgaben aus der Beispieldatei kopieren und in Ihre Pipelinedatei einfügen.

Option 1: Verwenden des Azure DevOps (ADO)-Bearbeitungsbereichs

Durchsuchen Sie die Docker Aufgabe im Bearbeitungsbereich der Pipeline auf der rechten Seite. Verwenden Sie den login Befehl mit der Docker-Registrierungsdienstverbindung, um sich bei ACR zu authentifizieren.

  1. Wählen Sie die Im vorherigen Schritt erstellte Docker-Registrierungsdienstverbindung aus der Dropdownliste "Containerregistrierung " aus.
  2. Wählen Sie login aus der Dropdownliste "Befehl" aus.
  3. Klicken Sie auf "Hinzufügen ", um die Docker-Aufgabe mit login Befehl zur Pipelinedatei links hinzuzufügen.

Suchen Sie in ähnlicher Weise die Docker Aufgabe erneut im Pipelinebearbeitungsbereich. Verwenden Sie den buildAndPush Befehl, um den Quellcode automatisch in ein Image zu erstellen und an das Ziel-ACR-Repository zu übertragen. Er generiert einen Imagedigest, der für die Anmeldung im nächsten Schritt verwendet wird.

  1. Geben Sie den Repositorynamen in das Container-Repository ein.
  2. Wählen Sie "buildAndPush " aus der Dropdownliste "Befehl " aus.
  3. Geben Sie den Dateipfad von Dockerfile an. Verwenden Sie ./Dockerfile beispielsweise, wenn Ihre Dockerfile im Stammordner gespeichert ist.
  4. Klicken Sie auf "Hinzufügen ", um die Docker-Aufgabe mit buildAndPush Befehl zur Pipelinedatei links hinzuzufügen.

Durchsuchen Sie die Notation Aufgabe im Bearbeitungsbereich der Pipeline auf der rechten Seite.

  1. Wählen Sie "Installieren " aus dem Dropdownlistenbefehl aus, um den Befehl auszuführen.
  2. Klicken Sie auf "Hinzufügen ", um die notation install Aufgabe zur Pipeline hinzuzufügen.
  3. Suchen Sie in ähnlicher Weise die Notation Aufgabe erneut im Bearbeitungsbereich der Pipeline, und wählen Sie "Signieren" aus.
  4. Sie können Artefakteverweise überspringen, da wir ein Image mit dem neuesten Digest signieren, der von einer Docker-Aufgabe erstellt und an die Registrierung übertragen wird. Stattdessen können Sie einen Digest manuell mithilfe von <registry_host>/<repository>@<digest>.
  5. Füllen Sie die Plug-In-Konfiguration im Formular aus. Wir verwenden das standardmäßige AKV-Plug-In und die im vorherigen Schritt erstellte Dienstverbindung. Kopieren Sie Ihre Schlüssel-ID aus Ihrem AKV in die Schlüssel-ID.
  6. Aktivieren Sie das Kontrollkästchen "Selbstsigniertes Zertifikat ", da wir ein selbstsigniertes Zertifikat zur Vereinfachung der Demonstration verwenden. Stattdessen können Sie ihren Zertifikatdateipfad im Zertifikatbundledateipfad eingeben, wenn Sie ein ausgestelltes Zertifikat der Zertifizierungsstelle verwenden möchten.
  7. Klicken Sie auf "Hinzufügen" , um die notation sign Pipelinedatei links hinzuzufügen.

Option 2: Bearbeiten einer Azure-Pipeline-Beispieldatei

  1. Wenn Sie mit Azure Pipelines und Notation vertraut sind, ist es effizient, mit einer Vorlagenpipelinedatei zu beginnen.
  2. Kopieren Sie die im Dokument bereitgestellte Pipelinevorlage in Ihre eigene Pipelinedatei. Diese Vorlage wurde entwickelt, um Notationsaufgaben zu verwenden, die zum Signieren und Überprüfen von Containerimages verwendet werden.
  3. Füllen Sie nach dem Kopieren der Vorlage die erforderlichen Werte gemäß den unten angegebenen Verweisen und Kommentaren aus.
Weitere Informationen finden Sie in der Signaturaufgabenvorlage von Option 1 (Klicken Sie hier).
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

Hinweis

Abgesehen von der Docker-Aufgabe können Sie einen angegebenen Imagedigest signieren, indem Sie manuell einen Artefaktverweis wie artifactRefs folgt angeben.

Sehen Sie sich das Beispiel an (Klicken Sie hier).
# 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

Auslösen der Pipeline

Führen Sie die Schritte aus, um eine Pipeline in Azure DevOps auszuführen und die Ausführung zu überprüfen.

  1. Nachdem Sie die Eingaben in der Pipeline ausgefüllt haben, speichern Sie sie, und führen Sie sie aus, um die Pipeline auszulösen.
  2. Wechseln Sie zur Seite "Auftrag " der ausgeführten Pipeline. Hier sehen Sie die Ausführung der einzelnen Schritte. Diese Pipeline erstellt und signiert den neuesten Build oder den angegebenen Digest und überträgt dann das signierte Image zusammen mit der zugehörigen Signatur an die Registrierung.
  3. Nach erfolgreicher Ausführung können Sie sehen, dass das Bild, das an Ihre Azure Container Registry (ACR) übertragen wird, mit einer coSE-Formatsignatur (CBOR Object Signing and Encryption) verbunden ist.

Überprüfen des signierten Bilds

Ebenso können Sie zum Überprüfen des signierten Bilds den Bearbeitungsbereich verwenden oder die Pipelinedatei bearbeiten, um der Pipeline die Notationsaufgabe verify hinzuzufügen. Die Pipeline überprüft das signierte Bild mit der Vertrauensrichtlinie und dem von Ihnen bereitgestellten Vertrauensspeicher.

Vorbereiten der Notation-Vertrauensrichtlinie und des Vertrauensspeichers

Im Allgemeinen unterscheidet sich der Prüfer vom Signierer. Zu Demonstrationszwecken verwenden wir dasselbe Pipeline- und ADO-Repository in diesem Beispiel. Führen Sie die folgenden Schritte aus, um notation trust policy, trust store zu erstellen und die verify Aufgabe in der Pipeline hinzuzufügen:

  1. Erstellen Sie im aktuellen ADO-Repository einen Beispielordner .pipeline zum Speichern der Notation-Vertrauensrichtlinie .pipeline/trustpolicy/. Erstellen Sie eine JSON-Beispieldatei trustpolicy.jsonfür vertrauensbasierte Richtlinien. Füllen Sie die Vertrauensrichtlinienvorlage mit Ihren eigenen Werten aus, und speichern Sie sie im Ordner.

Hinweis

Beachten Sie, dass der Notation Trust Store derzeit drei Arten von Identitäten unterstützt, einschließlich Zertifizierungsstelle (Certificate Authority, CA), SigningAuthority und Time Stamping Authority (TSA)-Stammzertifikaten. Zu Demonstrationszwecken verwenden wir die Zertifizierungsstelle (Certificate Authority, CA) x509/ca in der nachstehenden Vertrauensrichtlinie und im Vertrauensspeicher. Details finden Sie im Vertrauensspeicher .

Weitere Informationen finden Sie in der Vertrauensrichtlinienvorlage (klicken Sie hier).
{
    "version": "1.0",
    "trustPolicies": [
        {
            "name": "<yourPolicyName>",
            "registryScopes": [ "<yourRegistry>.azurecr.io/<yourArtifact>" ],
            "signatureVerification": {
                "level" : "strict" 
            },
            "trustStores": [ "ca:<yourTrustStore>"],
            "trustedIdentities": [
                "*"
            ]
        }
    ]
}
  1. Erstellen Sie im aktuellen ADO-Repository einen neuen Ordner für den Notation-Vertrauensspeicher /.pipeline/truststore/x509/ca/$<yourTrustStore>/ , um das Zertifikat zu speichern. Wenn Sie die Anmeldeschritte in diesem Dokument befolgt haben, um Ihr Bild zu signieren, verwenden Sie den folgenden Befehl, um Ihr selbstsigniertes Zertifikat aus Azure Key Vault (AKV) herunterzuladen:
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
  1. Laden Sie das Zertifikat in den Vertrauensspeicherordner /.pipeline/truststore/x509/ca/$<yourTrustStore>/ hoch, den wir im letzten Schritt erstellt haben.

Aufgabe mit Notationsprüfung hinzufügen

  1. Durchsuchen Sie den Notationsvorgang erneut im Bearbeitungsbereich der Pipeline, und wählen Sie "Überprüfen" aus.
  2. Füllen Sie die Artefaktverweise mit dem Digest des signierten Bilds aus.
  3. Geben Sie den Wert .pipeline/trustpolicy/trustpolicy.json im Dateipfad der Vertrauensrichtlinie ein.
  4. Geben Sie den Wert .pipeline/truststore/ im Ordnerpfad "Trust Store" ein.
  5. Klicken Sie auf "Hinzufügen", um der Pipelinedatei links die Notationsüberprüfung hinzuzufügen.

Ihr notation verify wird wie folgt gespeichert.

Sehen Sie sich das Beispiel an (Klicken Sie hier).
# sign the artifact
- task: Notation@0
  inputs:
    command: 'verify'
    artifactRefs: '<registry_host>/<repository>@<digest>'
    trustPolicy: .pipeline/trustpolicy.json
    trustStore: .pipeline/truststore/

Auslösen der Pipeline (aktualisiert)

Sie können die Pipeline erneut auslösen, um das signierte Bild zu überprüfen. Nach erfolgreicher Ausführung können Sie die Protokolle auf der Seite "Auftrag " der ausgeführten Pipeline anzeigen. Die Pipeline überprüft das signierte Bild mit der Vertrauensrichtlinie und dem von Ihnen bereitgestellten Vertrauensspeicher.

Zusammenfassung

In diesem Artikel erfahren Sie, wie Sie ein Containerimage mit Notation in Azure Pipeline signieren und überprüfen. Sie können den Azure DevOps-Bereich verwenden oder die Pipelinedatei bearbeiten, um Ihrer Pipeline Notationsaufgaben hinzuzufügen. Die Pipeline erstellt, pusht, signieren und überprüfen das Image mit der von Ihnen bereitgestellten Vertrauensrichtlinie und dem vertrauenswürdigen Speicher. Dieser Prozess stellt sicher, dass die Artefakte von einer vertrauenswürdigen Entität signiert und seit ihrer Erstellung nicht manipuliert wurden.