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
- Erstellen oder Verwenden einer Azure Container Registry zum Speichern von Containerimages und -signaturen
- Erstellen oder Verwenden einer Azure Key Vault-Instanz
- Installieren und Konfigurieren der neuesten Azure CLI oder Ausführen von Befehlen in Azure Cloud Shell
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
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
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
Listen Sie die verfügbaren Plug-Ins auf, und vergewissern Sie sich, dass das Plug-In
azure-kv
mit der Version1.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.
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"
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 FeldCA
muss auftrue
festgelegt sein. - Die Erweiterung
keyUsage
muss vorhanden und alscritical
gekennzeichnet sein. Bitpositionen fürkeyCertSign
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.
- Für den Antragsteller müssen allgemeiner Name (
- Schlüsseleigenschaften:
- Die
exportable
-Eigenschaft muss auffalse
festgelegt werden. - Wählen Sie einen unterstützten Schlüsseltyp und eine unterstützte Größe aus der Notary Project-Spezifikation aus.
- Die
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
- Rufen Sie die Zertifikatdatei vom Zertifizierungsstellenanbieter mit vollständiger Zertifikatkette ab.
- 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.
Festlegen des Abonnements, das die ACR-Ressource enthält
az account set --subscription $ACR_SUB_ID
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
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.
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
Verwenden von Azure RBAC (empfohlen)
Legt das Abonnement fest, das die AKV-Ressource enthält.
az account set --subscription $AKV_SUB_ID
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üsselKey Vault Certificates User
zum Lesen von ZertifikatenKey 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 ZertifikatenKey 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
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)
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:
- Umgebungsanmeldeinformationen
- Anmeldeinformationen für Workloadidentität
- Anmeldeinformationen für verwaltete Identität
- Azure CLI-Anmeldeinformationen
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 aufazurecli
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
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 Typapplication/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
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
Listen SIe das Stammzertifikat auf, um zu bestätigen, dass
$ROOT_CERT
erfolgreich hinzugefügt wurde.notation cert ls
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 Namenwabbit-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.Verwenden Sie
notation policy
, um die Vertrauensrichtlinienkonfiguration austrustpolicy.json
zu importieren.notation policy import ./trustpolicy.json
Zeigen Sie die Vertrauensrichtlinienkonfiguration an, um den erfolgreichen Import zu bestätigen.
notation policy show
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:
- Signieren und Überprüfen eines Containerimages mit Notation in Azure Pipeline
- Signieren und Überprüfen eines Containerimages mit Notation in GitHub Actions-Workflow
So überprüfen Sie die signierte Imagebereitstellung in AKS oder Kubernetes: