Freigeben über


Signieren von Containerimages mit Notation und Azure Key Vault mithilfe eines von einer Zertifizierungsstelle ausgestellten Zertifikats

Das Signieren und Überprüfen von Containerimages mit einem Zertifikat, das von einer vertrauenswürdigen Zertifizierungsstelle ausgestellt wurde, ist eine wertvolle Sicherheitsmaßnahme. Diese Sicherheitsmaßnahme hilft Ihnen, die Identität des Herausgebers des Containerimages und des Containerimages selbst auf verantwortungsvolle Weise zu identifizieren, zu autorisieren und zu überprüfen. Die vertrauenswürdigen Zertifizierungsstellen wie GlobalSign, DigiCert usw. spielen eine entscheidende Rolle bei der Überprüfung einer Benutzer- oder Organisationsidentität, da die Sicherheit digitaler Zertifikate gewährleistet und das Zertifikat im Falle eines Risikos oder Missbrauchs umgehend widerrufen wird.

Hier sind einige wichtige Komponenten, mit denen Sie Containerimages mit einem Zertifikat signieren und überprüfen können, das von einer vertrauenswürdigen Zertifizierungsstelle ausgestellt wurde:

  • Notation ist ein von der Notary Project-Community entwickeltes und von Microsoft unterstütztes Open Source-Tool für die Lieferkettensicherheit, das das Signieren und Überprüfen von Containerimages und anderen Artefakten unterstützt.
  • Azure Key Vault (AKV), ein cloudbasierter Dienst zum Verwalten von kryptografischen Schlüsseln, Geheimnissen und Zertifikaten, hilft Ihnen dabei, ein Zertifikat mit einem Signaturschlüssel sicher zu speichern und zu verwalten.
  • Das Notation-AKV-Plug-In „azure-kv“, die Erweiterung von Notation, verwendet die in Azure Key Vault gespeicherten Schlüssel zum Signieren und Überprüfen der digitalen Signaturen von Containerimages und Artefakten.
  • Mit Azure Container Registry (ACR) können Sie diese Signaturen an das signierte Image anfügen. Außerdem unterstützt ACR Sie beim Speichern und Verwalten dieser Containerimages.

Wenn Sie das Image überprüfen, wird die Signatur verwendet, um die Integrität des Images und die Identität des Signaturgebers zu überprüfen. Dadurch wird sichergestellt, dass die Containerimages nicht manipuliert werden und aus einer vertrauenswürdigen Quelle stammen.

In diesem Artikel:

  • Installieren des Notation-Plug-Ins für CLI und AKV
  • Erstellen oder Importieren eines von einer Zertifizierungsstelle ausgestellten Zertifikats in AKV
  • Erstellen und Pushen eines Containerimages mit einer ACR-Aufgabe
  • Signieren eines Containerimages mit Notation-Plug-Ins für CLI und AKV
  • Überprüfen einer Containerimagesignatur mit der Notation CLI
  • Verwendung von Zeitstempeln

Voraussetzungen

Hinweis

Es wird empfohlen, eine neue Azure Key Vault-Instanz nur zum Speichern von Zertifikaten zu erstellen.

Installieren des Notation-Plug-Ins für CLI und AKV

  1. Installieren von Notation v1.2.0 in einer Linux amd64-Umgebung Befolgen Sie die Notation-Installationsanleitung, um das Paket für andere Umgebungen herunterzuladen.

    # Download, extract and install
    curl -Lo notation.tar.gz https://github.com/notaryproject/notation/releases/download/v1.2.0/notation_1.2.0_linux_amd64.tar.gz
    tar xvzf notation.tar.gz
    
    # Copy the notation cli to the desired bin directory in your PATH, for example
    cp ./notation /usr/local/bin
    
  2. Installieren Sie das Notation-Plug-In für Azure Key Vault (azure-kv) V1.2.0 in einer Linux-amd64-Umgebung.

    Hinweis

    Die URL und die SHA-256-Prüfsumme für das Notation-Plug-In für Azure Key Vault finden Sie auf der Releaseseite des Plug-Ins.

    notation plugin install --url https://github.com/Azure/notation-azure-kv/releases/download/v1.2.0/notation-azure-kv_1.2.0_linux_amd64.tar.gz --sha256sum 06bb5198af31ce11b08c4557ae4c2cbfb09878dfa6b637b7407ebc2d57b87b34
    
  3. Listen Sie die verfügbaren Plug-Ins auf, und vergewissern Sie sich, dass das Plug-In azure-kv mit der Version 1.2.0 in der Liste enthalten ist.

    notation plugin ls
    

Konfigurieren von Umgebungsvariablen

Hinweis

In diesem Leitfaden werden zur Vereinfachung der Konfiguration von AKV und ACR Umgebungsvariablen verwendet. Aktualisieren Sie die Werte dieser Umgebungsvariablen für Ihre spezifischen Ressourcen.

  1. Konfigurieren von Umgebungsvariablen für AKV und Zertifikate

    AKV_SUB_ID=myAkvSubscriptionId
    AKV_RG=myAkvResourceGroup
    AKV_NAME=myakv 
    
    # Name of the certificate created or imported in AKV 
    CERT_NAME=wabbit-networks-io 
    
    # X.509 certificate subject
    CERT_SUBJECT="CN=wabbit-networks.io,O=Notation,L=Seattle,ST=WA,C=US"
    
  2. Konfigurieren von Umgebungsvariablen für ACR und Images

    ACR_SUB_ID=myAcrSubscriptionId
    ACR_RG=myAcrResourceGroup
    # Name of the existing registry example: myregistry.azurecr.io 
    ACR_NAME=myregistry 
    # Existing full domain of the ACR 
    REGISTRY=$ACR_NAME.azurecr.io 
    # Container name inside ACR where image will be stored 
    REPO=net-monitor 
    TAG=v1 
    # Source code directory containing Dockerfile to build 
    IMAGE_SOURCE=https://github.com/wabbit-networks/net-monitor.git#main  
    

Anmelden mit der Azure CLI

az login

Weitere Informationen zur Azure CLI und zur Anmeldung mit der Azure CLI finden Sie unter Anmelden mit der Azure CLI.

Erstellen oder Importieren eines von einer Zertifizierungsstelle ausgestellten Zertifikats in AKV

Zertifikatanforderungen

Beim Erstellen von Zertifikaten zum Signieren und Überprüfen müssen die Zertifikate die Notary Project-Zertifikatanforderung erfüllen.

Im Anschluss sind die Anforderungen für Stamm- und Zwischenzertifikate aufgeführt:

  • Die Erweiterung basicConstraints muss vorhanden und als kritisch gekennzeichnet sein. Das Feld CA muss auf true festgelegt sein.
  • Die Erweiterung keyUsage muss vorhanden und als critical gekennzeichnet sein. Bitpositionen für keyCertSign MÜSSEN festgelegt werden.

Im Anschluss sind die Anforderungen für Zertifikate aufgeführt, die von einer Zertifizierungsstelle ausgestellt wurden:

  • X.509-Zertifikateigenschaften:
    • Für den Antragsteller müssen allgemeiner Name (CN), Land (C), Bundesland oder Provinz (ST) und Organisation (O) angegeben werden. In diesem Tutorial wird $CERT_SUBJECT als Antragsteller verwendet.
    • Als Flag für die X.509-Schlüsselverwendung darf nur DigitalSignature verwendet werden.
    • EKUs (Extended Key Usages, erweiterte Schlüsselverwendungen) müssen leer oder 1.3.6.1.5.5.7.3.3 (für Codesignatur) sein.
  • Schlüsseleigenschaften:
    • Die exportable-Eigenschaft muss auf false festgelegt werden.
    • Wählen Sie einen unterstützten Schlüsseltyp und eine unterstützte Größe aus der Notary Project-Spezifikation aus.

Wichtig

Um eine erfolgreiche Integration mit Imageintegrität sicherzustellen, sollte der Inhaltstyp des Zertifikats auf PEM festgelegt werden.

Hinweis

In diesem Leitfaden wird Version 1.0.1 des AKV-Plug-Ins verwendet. Für frühere Versionen des Plug-Ins galt eine Einschränkung, die eine bestimmte Zertifikatreihenfolge in einer Zertifikatkette erforderte. In Version 1.0.1 des Plug-Ins gilt diese Einschränkung nicht, daher wird empfohlen, Version 1.0.1 oder höher zu verwenden.

Erstellen eines von einer Zertifizierungsstelle ausgestellten Zertifikats

Erstellen Sie eine Zertifikatsignieranforderung (Certificate Signing Request, CSR), indem Sie die Anweisungen zum Erstellen einer Zertifikatsignieranforderung befolgen.

Wichtig

Stellen Sie beim Zusammenführen der CSR sicher, dass Sie die gesamte Kette zusammenführen, die vom Zertifizierungsstellenanbieter zurückgegeben wurde.

Importieren des Zertifikats in AKV

So importieren Sie das Zertifikat

  1. Rufen Sie die Zertifikatdatei vom Zertifizierungsstellenanbieter mit vollständiger Zertifikatkette ab.
  2. Importieren Sie das Zertifikat in Azure Key Vault, indem Sie die Anweisungen unter Importieren eines Zertifikats befolgen.

Hinweis

Wenn das Zertifikat nach dem Erstellen oder Importieren keine Zertifikatkette enthält, können Sie die Zwischen- und Stammzertifikate von Ihrem Zertifizierungsstellenanbieter abrufen. Sie können Ihren Anbieter bitten, Ihnen eine PEM-Datei bereitzustellen, die die Zwischenzertifikate (falls vorhanden) und Stammzertifikate enthält. Diese Datei kann dann in Schritt 5 von Signieren von Containerimages verwendet werden.

Signieren eines Containerimages mit Notation-Plug-Ins für CLI und AKV

Bei der Arbeit mit ACR und AKV ist es wichtig, die entsprechenden Berechtigungen zu erteilen, um einen sicheren und kontrollierten Zugriff zu gewährleisten. Sie können den Zugriff für verschiedene Entitäten autorisieren, z. B. Benutzerprinzipale, Dienstprinzipale oder verwaltete Identitäten, je nach Ihren spezifischen Szenarien. In diesem Tutorial wird der Zugriff für ein angemeldetes Azure-Benutzerkonto autorisiert.

Erstellen des Zugriffs auf ACR

Die Rollen AcrPull und AcrPush sind für das Erstellen und Signieren von Containerimages in ACR erforderlich.

  1. Festlegen des Abonnements, das die ACR-Ressource enthält

    az account set --subscription $ACR_SUB_ID
    
  2. Zuweisen der Rollen

    USER_ID=$(az ad signed-in-user show --query id -o tsv)
    az role assignment create --role "AcrPull" --role "AcrPush" --assignee $USER_ID --scope "/subscriptions/$ACR_SUB_ID/resourceGroups/$ACR_RG/providers/Microsoft.ContainerRegistry/registries/$ACR_NAME"
    

Erstellen und Pushen des Containerimage an ACR

  1. Authentifizieren Sie sich bei Ihrer ACR-Instanz mithilfe Ihrer individuellen Azure-Identität.

    az acr login --name $ACR_NAME
    

Wichtig

Wenn Sie Docker auf Ihrem System installiert haben und az acr login oder docker login zur Authentifizierung bei Ihrem ACR verwendet haben, sind Ihre Anmeldeinformationen bereits gespeichert und für die Notation verfügbar. In diesem Fall müssen Sie notation login nicht erneut ausführen, um sich bei Ihrem ACR zu authentifizieren. Weitere Informationen zu Authentifizierungsoptionen für Notation finden Sie unter Authentifizieren mit OCI-konformen Registrierungen.

  1. Erstellen und Pushen eines neuen Images mit ACR Tasks: Verwenden Sie immer digest, um das Image für die Signatur zu identifizieren, da Tags veränderlich sind und überschrieben werden können.

    DIGEST=$(az acr build -r $ACR_NAME -t $REGISTRY/${REPO}:$TAG $IMAGE_SOURCE --no-logs --query "outputImages[0].digest" -o tsv)
    IMAGE=$REGISTRY/${REPO}@$DIGEST
    

Wenn das Image in diesem Tutorial bereits erstellt wurde und in der Registrierung gespeichert ist, dient das Tag der Einfachheit halber als Bezeichner für dieses Image.

IMAGE=$REGISTRY/${REPO}@$TAG

Erstellen des Zugriffs auf AKV

  1. Legt das Abonnement fest, das die AKV-Ressource enthält.

    az account set --subscription $AKV_SUB_ID
    
  2. Zuweisen der Rollen

    Wenn das Zertifikat die gesamte Zertifikatkette enthält, muss der Prinzipal mit den folgenden Rollen zugewiesen werden:

    • Key Vault Secrets User zum Lesen geheimer Schlüssel
    • Key Vault Certificates User zum Lesen von Zertifikaten
    • Key Vault Crypto User für Signaturvorgänge
    USER_ID=$(az ad signed-in-user show --query id -o tsv)
    az role assignment create --role "Key Vault Secrets User" --role "Key Vault Certificates User" --role "Key Vault Crypto User" --assignee $USER_ID --scope "/subscriptions/$AKV_SUB_ID/resourceGroups/$AKV_RG/providers/Microsoft.KeyVault/vaults/$AKV_NAME"
    

    Wenn das Zertifikat nicht die Kette enthält, müssen dem Prinzipal die folgenden Rollen zugewiesen werden:

    • Key Vault Certificates User zum Lesen von Zertifikaten
    • Key Vault Crypto User für Signaturvorgänge
    USER_ID=$(az ad signed-in-user show --query id -o tsv)
    az role assignment create --role "Key Vault Certificates User" --role "Key Vault Crypto User" --assignee $USER_ID --scope "/subscriptions/$AKV_SUB_ID/resourceGroups/$AKV_RG/providers/Microsoft.KeyVault/vaults/$AKV_NAME"
    

Weitere Informationen zum Key Vault-Zugriff mit Azure RBAC finden Sie unter Verwenden einer Azure RBAC zum Verwalten des Zugriffs.

Verwenden von Zugriffsrichtlinien (Legacy)

Führen Sie zum Festlegen des Abonnements, das die AKV-Ressourcen enthält, den folgenden Befehl aus:.

az account set --subscription $AKV_SUB_ID

Wenn das Zertifikat die gesamte Zertifikatkette enthält, müssen dem Prinzipal die Schlüsselberechtigung Sign, die Geheimnisberechtigung Get und die Zertifikatberechtigungen Get zugewiesen werden. So weisen Sie dem Prinzipal diese Berechtigungen zu

USER_ID=$(az ad signed-in-user show --query id -o tsv)
az keyvault set-policy -n $AKV_NAME --key-permissions sign --secret-permissions get --certificate-permissions get --object-id $USER_ID

Wenn das Zertifikat die Kette nicht enthält, müssen dem Prinzipal die Schlüsselberechtigung Sign und die Zertifikatberechtigungen Get zugewiesen werden. So weisen Sie dem Prinzipal diese Berechtigungen zu

USER_ID=$(az ad signed-in-user show --query id -o tsv)
az keyvault set-policy -n $AKV_NAME --key-permissions sign --certificate-permissions get --object-id $USER_ID

Weitere Informationen zum Zuweisen von Richtlinien zu einem Prinzipal finden Sie unter Zuweisen einer Zugriffsrichtlinie.

Signieren von Containerimages mithilfe des Zertifikats in AKV

  1. Rufen Sie die Schlüssel-ID für ein Zertifikat ab. Ein Zertifikat in AKV kann mehrere Versionen aufweisen. Der folgende Befehl ruft die Schlüssel-ID der neuesten Version des $CERT_NAME-Zertifikats ab:

    KEY_ID=$(az keyvault certificate show -n $CERT_NAME --vault-name $AKV_NAME --query 'kid' -o tsv) 
    
  2. Signieren Sie das Containerimage mit dem COSE-Signaturformat mit der Schlüssel-ID.

    Wenn das Zertifikat die gesamte Zertifikatkette enthält, führen Sie den folgenden Befehl aus:

    notation sign --signature-format cose $IMAGE --id $KEY_ID --plugin azure-kv 
    

    Wenn das Zertifikat die Kette nicht enthält, verwenden Sie den Parameter --plugin-config ca_certs=<ca_bundle_file>, um die Zertifizierungsstellenzertifikate in einer PEM-Datei an das AKV-Plug-In zu übergeben. Führen Sie den folgenden Befehl aus:

    notation sign --signature-format cose $IMAGE --id $KEY_ID --plugin azure-kv --plugin-config ca_certs=<ca_bundle_file> 
    

    Um sich bei AKV zu authentifizieren, werden standardmäßig die folgenden Anmeldeinformationstypen in der angegebenen Reihenfolge versucht, sofern sie aktiviert sind:

    Wenn Sie einen Anmeldeinformationstyp angeben möchten, verwenden Sie eine zusätzliche Plug-In-Konfiguration mit dem Namen credential_type. Sie können z. B. credential_type explizit auf azurecli festlegen, um die Azure CLI-Anmeldeinformationen zu verwenden, wie weiter unten gezeigt:

    notation sign --signature-format cose --id $KEY_ID --plugin azure-kv --plugin-config credential_type=azurecli $IMAGE
    

    In der nachstehenden Tabelle finden Sie die Werte von credential_type für verschiedene Anmeldeinformationstypen.

    Anmeldeinformationstyp Wert für credential_type
    Umgebungsanmeldeinformationen environment
    Anmeldeinformationen für Workloadidentität workloadid
    Anmeldeinformationen für verwaltete Identität managedid
    Azure CLI-Anmeldeinformationen azurecli
  3. Zeigen Sie das Diagramm der signierten Images und der zugehörigen Signaturen an.

    notation ls $IMAGE
    

    Im folgenden Beispiel einer Ausgabe wird eine von Digest sha256:d7258166ca820f5ab7190247663464f2dcb149df4d1b6c4943dcaac59157de8e identifizierte Signatur vom Typ application/vnd.cncf.notary.signature $IMAGE zugeordnet.

    myregistry.azurecr.io/net-monitor@sha256:17cc5dd7dfb8739e19e33e43680e43071f07497ed716814f3ac80bd4aac1b58f
    └── application/vnd.cncf.notary.signature
        └── sha256:d7258166ca820f5ab7190247663464f2dcb149df4d1b6c4943dcaac59157de8e
    

Überprüfen eines Containerimages mit Notation-CLI

  1. Fügen Sie das Stammzertifikat einem benannten Vertrauensspeicher zur Signaturüberprüfung hinzu. Wenn Sie nicht über das Stammzertifikat verfügen, können Sie es von Ihrer Zertifizierungsstelle abrufen. Im folgenden Beispiel wird dem Vertrauensspeicher $STORE_NAME das Stammzertifikat $ROOT_CERT hinzugefügt.

    STORE_TYPE="ca" 
    STORE_NAME="wabbit-networks.io" 
    notation cert add --type $STORE_TYPE --store $STORE_NAME $ROOT_CERT  
    
  2. Listen SIe das Stammzertifikat auf, um zu bestätigen, dass $ROOT_CERT erfolgreich hinzugefügt wurde.

    notation cert ls 
    
  3. Konfigurieren Sie die Vertrauensrichtlinie vor der Überprüfung.

    Vertrauensrichtlinien ermöglichen es Benutzern, präzise abgestimmte Überprüfungsrichtlinien anzugeben. Verwenden Sie den folgenden Befehl, um die Vertrauensrichtlinie zu konfigurieren.

    cat <<EOF > ./trustpolicy.json
    {
        "version": "1.0",
        "trustPolicies": [
            {
                "name": "wabbit-networks-images",
                "registryScopes": [ "$REGISTRY/$REPO" ],
                "signatureVerification": {
                    "level" : "strict" 
                },
                "trustStores": [ "$STORE_TYPE:$STORE_NAME" ],
                "trustedIdentities": [
                    "x509.subject: $CERT_SUBJECT"
                ]
            }
        ]
    }
    EOF
    

    Die obige Datei trustpolicy.json definiert eine Vertrauensrichtlinie mit dem Namen wabbit-networks-images. Diese Vertrauensrichtlinie gilt für alle Artefakte, die in den in $REGISTRY/$REPO-Repositorys gespeichert sind. Der benannte Vertrauensspeicher $STORE_NAME vom Typ $STORE_TYPE enthält die Stammzertifikate. Außerdem wird davon ausgegangen, dass der Benutzer einer bestimmten Identität mit dem X.509-Thema $CERT_SUBJECT vertraut. Weitere Informationen finden Sie in der Spezifikation des Vertrauensspeichers und der Vertrauensrichtlinie.

  4. Verwenden Sie notation policy, um die Vertrauensrichtlinienkonfiguration aus trustpolicy.json zu importieren.

    notation policy import ./trustpolicy.json
    
  5. Zeigen Sie die Vertrauensrichtlinienkonfiguration an, um den erfolgreichen Import zu bestätigen.

    notation policy show
    
  6. Verwenden Sie notation verify, um die Integrität des Images zu überprüfen:

    notation verify $IMAGE
    

    Nach erfolgreicher Überprüfung des Images mithilfe der Vertrauensrichtlinie wird der SHA-256-Digest des überprüften Images in einer Ausgabemeldung zum Erfolg zurückgegeben. Beispiel einer Ausgabe:

    Successfully verified signature for myregistry.azurecr.io/net-monitor@sha256:17cc5dd7dfb8739e19e33e43680e43071f07497ed716814f3ac80bd4aac1b58f

Verwendung von Zeitstempeln

Seit Notation v1.2.0 unterstützt Notation RFC 3161-konforme Zeitstempel. Diese Erweiterung erweitert die Vertrauensstellung von Signaturen, die innerhalb der Gültigkeit von Zertifikaten durch eine Vertrauensstellung mit einer TSA (Timestamping Authority) erstellt wurden, und ermöglicht eine erfolgreiche Signaturüberprüfung auch nach Ablauf von Zertifikaten. Als Imagesignierer sollten Sie sicherstellen, dass Sie Containerimages mit Zeitstempeln signieren, die von einer vertrauenswürdigen TSA generiert wurden. Als Imageprüfer sollten Sie zum Überprüfen von Zeitstempeln sicherstellen, dass Sie sowohl dem Imagesignierer als auch der zugehörigen TSA vertrauen und die Vertrauensstellung über Vertrauensspeicher und Vertrauensrichtlinien einrichten. Durch Zeitstempel werden die Kosten reduziert, da aufgrund des Ablaufs von Zertifikaten regelmäßig Bilder neu signiert werden müssen, was besonders bei der Verwendung von kurzlebigen Zertifikaten von entscheidender Bedeutung ist. Ausführliche Anweisungen zum Signieren und Überprüfen der Verwendung von Zeitstempeln finden Sie im Zeitstempelleitfaden für Notary Project.

Häufig gestellte Fragen

  • Was soll ich tun, wenn das Zertifikat abgelaufen ist?

    Wenn Ihr Zertifikat abgelaufen ist, müssen Sie ein neues zusammen mit einem neuen privaten Schlüssel von einem vertrauenswürdigen Zertifizierungsstellenanbieter abrufen. Ein abgelaufenes Zertifikat kann nicht zum Signieren von Containerimages verwendet werden. Images, die vor Ablauf des Zertifikats signiert wurden, werden möglicherweise weiterhin erfolgreich überprüft, wenn sie mit einem Zeitstempel signiert wurden. Ohne Zeitstempel schlägt die Signaturüberprüfung fehl, und Sie müssen diese Images für eine erfolgreiche Überprüfung erneut mit dem neuen Zertifikat signieren.

  • Was soll ich tun, wenn das Zertifikat widerrufen wird?

    Wenn Ihr Zertifikat widerrufen wurde, wird die Signatur damit ungültig. Dies kann aus mehreren Gründen eintreten, z. B. wenn der private Schlüssel kompromittiert wurde oder wenn sich die Zugehörigkeit des Zertifikatinhabers geändert hat. Um dieses Problem zu beheben, sollten Sie zuerst sicherstellen, dass der Quellcode und die Buildumgebung auf dem neuesten Stand und sicher sind. Erstellen Sie dann Containerimages aus dem Quellcode, rufen Sie ein neues Zertifikat zusammen mit einem neuen privaten Schlüssel von einem vertrauenswürdigen Zertifizierungsstellenanbieter ab, und signieren Sie neue Containerimages mit dem neuen Zertifikat, indem Sie diesen Leitfaden befolgen.

Nächste Schritte

Notation bietet auch CI/CD-Lösungen für Azure Pipeline und GitHub Actions-Workflows:

So überprüfen Sie die signierte Imagebereitstellung in AKS oder Kubernetes: