Signera containeravbildningar med Notation och Azure Key Vault med hjälp av ett CA-utfärdat certifikat
Att signera och verifiera containeravbildningar med ett certifikat som utfärdats av en betrodd certifikatutfärdare (CA) är en värdefull säkerhetspraxis. Det här säkerhetsmåttet hjälper dig att på ett ansvarsfullt sätt identifiera, auktorisera och verifiera identiteten för både containeravbildningens utgivare och själva containeravbildningen. Betrodda certifikatutfärdare (CA: er) som GlobalSign, DigiCert och andra spelar en avgörande roll vid valideringen av en användares eller organisations identitet, upprätthålla säkerheten för digitala certifikat och återkalla certifikatet omedelbart vid risk eller missbruk.
Här följer några viktiga komponenter som hjälper dig att signera och verifiera containeravbildningar med ett certifikat som utfärdats av en betrodd certifikatutfärdare:
- Notation är ett säkerhetsverktyg för leveranskedjan med öppen källkod som utvecklats av Notary Project-communityn och som stöds av Microsoft, som stöder signering och verifiering av containeravbildningar och andra artefakter.
- Azure Key Vault (AKV), en molnbaserad tjänst för hantering av kryptografiska nycklar, hemligheter och certifikat, hjälper dig att på ett säkert sätt lagra och hantera ett certifikat med en signeringsnyckel.
- Notation AKV-plugin-programmet azure-kv, tillägget notation använder nycklarna som lagras i Azure Key Vault för signering och verifiering av digitala signaturer för containeravbildningar och artefakter.
- Med Azure Container Registry (ACR) kan du koppla dessa signaturer till den signerade avbildningen och hjälper dig att lagra och hantera dessa containeravbildningar.
När du verifierar avbildningen används signaturen för att verifiera bildens integritet och undertecknarens identitet. Detta hjälper till att säkerställa att containeravbildningarna inte manipuleras och kommer från en betrodd källa.
I den här artikeln:
- Installera cli- och AKV-plugin-programmet för notation
- Skapa eller importera ett certifikat som utfärdats av en certifikatutfärdare i AKV
- Skapa och push-överföra en containeravbildning med ACR-uppgift
- Signera en containeravbildning med plugin-programmet Notation CLI och AKV
- Verifiera en containeravbildningssignatur med Notation CLI
- Tidsstämpling
Förutsättningar
- Skapa eller använda ett Azure Container Registry för att lagra containeravbildningar och signaturer
- Skapa eller använda ett Azure Key Vault.
- Installera och konfigurera de senaste Azure CLI eller kör kommandon i Azure Cloud Shell
Kommentar
Vi rekommenderar att du skapar ett nytt Azure Key Vault för att endast lagra certifikat.
Installera cli- och AKV-plugin-programmet för notation
Installera Notation v1.2.0 i en Linux amd64-miljö. Följ installationsguiden för Notation för att ladda ned paketet för andra miljöer.
# 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
Installera plugin-programmet
azure-kv
Notation Azure Key Vault v1.2.0 i en Linux amd64-miljö.Kommentar
URL:en och SHA256-kontrollsumman för plugin-programmet Notation Azure Key Vault finns på plugin-programmets versionssida.
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
Visa en lista över tillgängliga plugin-program och bekräfta att
azure-kv
plugin-programmet med version1.2.0
ingår i listan.notation plugin ls
Konfigurera miljövariabler
Kommentar
Den här guiden använder miljövariabler för enkelhetens skull när du konfigurerar AKV och ACR. Uppdatera värdena för dessa miljövariabler för dina specifika resurser.
Konfigurera miljövariabler för AKV och certifikat
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"
Konfigurera miljövariabler för ACR och avbildningar.
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
Logga in med Azure CLI
az login
Mer information om Azure CLI och hur du loggar in med det finns i Logga in med Azure CLI.
Skapa eller importera ett certifikat som utfärdats av en certifikatutfärdare i AKV
Certifikatkrav
När du skapar certifikat för signering och verifiering måste certifikaten uppfylla kravet på Notary Project-certifikat.
Här följer kraven för rotcertifikat och mellanliggande certifikat:
- Tillägget
basicConstraints
måste vara närvarande och markerat som kritiskt. FältetCA
måste angestrue
. - Tillägget
keyUsage
måste vara närvarande och markeratcritical
. Bitpositioner förkeyCertSign
MÅSTE anges.
Här följer kraven för certifikat som utfärdats av en certifikatutfärdare:
- X.509-certifikategenskaper:
- Ämnet måste innehålla eget namn (
CN
), land (C
), delstat eller provins (ST
) och organisation (O
). I den här självstudien$CERT_SUBJECT
används som ämne. - X.509-nyckelanvändningsflaggan får endast vara
DigitalSignature
. - Utökade nyckelanvändningar (EKUs) måste vara tomma eller
1.3.6.1.5.5.7.3.3
(för codesigning).
- Ämnet måste innehålla eget namn (
- Viktiga egenskaper:
Viktigt!
För att säkerställa en lyckad integrering med bildintegritet bör innehållstypen för certifikatet anges till PEM.
Kommentar
Den här guiden använder version 1.0.1 av AKV-plugin-programmet. Tidigare versioner av plugin-programmet hade en begränsning som krävde en specifik certifikatordning i en certifikatkedja. Version 1.0.1 av plugin-programmet har inte den här begränsningen, så vi rekommenderar att du använder version 1.0.1 eller senare.
Skapa ett certifikat som utfärdats av en certifikatutfärdare
Skapa en certifikatsigneringsbegäran (CSR) genom att följa anvisningarna i skapa certifikatsigneringsbegäran.
Viktigt!
När du slår samman csr-filen måste du slå samman hela kedjan som hämtades från CA-leverantören.
Importera certifikatet i AKV
Så här importerar du certifikatet:
- Hämta certifikatfilen från CA-leverantören med hela certifikatkedjan.
- Importera certifikatet till Azure Key Vault genom att följa anvisningarna i importera ett certifikat.
Kommentar
Om certifikatet inte innehåller en certifikatkedja efter att du har skapat eller importerat kan du hämta mellanliggande certifikat och rotcertifikat från ca-leverantören. Du kan be leverantören att ge dig en PEM-fil som innehåller mellanliggande certifikat (om några) och rotcertifikat. Den här filen kan sedan användas i steg 5 för att signera containeravbildningar.
Signera en containeravbildning med plugin-programmet Notation CLI och AKV
När du arbetar med ACR och AKV är det viktigt att bevilja lämpliga behörigheter för att säkerställa säker och kontrollerad åtkomst. Du kan auktorisera åtkomst för olika entiteter, till exempel användarhuvudnamn, tjänstens huvudnamn eller hanterade identiteter, beroende på dina specifika scenarier. I den här självstudien har åtkomsten behörighet till en inloggad Azure-användare.
Redigering av åtkomst till ACR
Rollerna AcrPull
och AcrPush
krävs för att skapa och signera containeravbildningar i ACR.
Ange den prenumeration som innehåller ACR-resursen
az account set --subscription $ACR_SUB_ID
Tilldela rollerna
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"
Skapa och skicka containeravbildningar till ACR
Autentisera till din ACR med hjälp av din enskilda Azure-identitet.
az acr login --name $ACR_NAME
Viktigt!
Om du har Docker installerat på systemet och använt az acr login
eller docker login
för att autentisera till din ACR, är dina autentiseringsuppgifter redan lagrade och tillgängliga för notation. I det här fallet behöver du inte köra notation login
igen för att autentisera till din ACR. Mer information om autentiseringsalternativ för notation finns i Autentisera med OCI-kompatibla register.
Skapa och push-överföra en ny avbildning med ACR Tasks. Använd
digest
alltid för att identifiera avbildningen för signering, eftersom taggar är föränderliga och kan skrivas över.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
I den här självstudien, om avbildningen redan har skapats och lagras i registret, fungerar taggen som en identifierare för avbildningen för enkelhetens skull.
IMAGE=$REGISTRY/${REPO}@$TAG
Redigering av åtkomst till AKV
Använda Azure RBAC (rekommenderas)
Ange den prenumeration som innehåller AKV-resursen
az account set --subscription $AKV_SUB_ID
Tilldela rollerna
Om certifikatet innehåller hela certifikatkedjan måste huvudkontot tilldelas följande roller:
Key Vault Secrets User
för att läsa hemligheterKey Vault Certificates User
för att läsa certifikatKey Vault Crypto User
för signeringsåtgärder
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"
Om certifikatet inte innehåller kedjan måste huvudkontot tilldelas följande roller:
Key Vault Certificates User
för att läsa certifikatKey Vault Crypto User
för signeringsåtgärder
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"
Mer information om Key Vault-åtkomst med Azure RBAC finns i Använda en Azure RBAC för att hantera åtkomst.
Använda åtkomstprincip (äldre)
Om du vill ange den prenumeration som innehåller AKV-resurserna kör du följande kommando:
az account set --subscription $AKV_SUB_ID
Om certifikatet innehåller hela certifikatkedjan måste huvudkontot beviljas nyckelbehörighet Sign
, hemlig behörighet Get
och certifikatbehörigheter Get
. Så här beviljar du dessa behörigheter till huvudkontot:
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
Om certifikatet inte innehåller kedjan måste huvudkontot beviljas nyckelbehörighet Sign
och certifikatbehörigheter Get
. Så här beviljar du dessa behörigheter till huvudkontot:
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
Mer information om hur du tilldelar principer till ett huvudnamn finns i Tilldela åtkomstprincip.
Signera containeravbildningar med certifikatet i AKV
Hämta nyckel-ID:t för ett certifikat. Ett certifikat i AKV kan ha flera versioner. Följande kommando hämtar nyckel-ID:t för den senaste versionen av certifikatet
$CERT_NAME
.KEY_ID=$(az keyvault certificate show -n $CERT_NAME --vault-name $AKV_NAME --query 'kid' -o tsv)
Signera containeravbildningen med COSE-signaturformatet med hjälp av nyckel-ID:t.
Om certifikatet innehåller hela certifikatkedjan kör du följande kommando:
notation sign --signature-format cose $IMAGE --id $KEY_ID --plugin azure-kv
Om certifikatet inte innehåller kedjan använder du parametern
--plugin-config ca_certs=<ca_bundle_file>
för att skicka CA-certifikaten i en PEM-fil till AKV-plugin-programmet och kör följande kommando:notation sign --signature-format cose $IMAGE --id $KEY_ID --plugin azure-kv --plugin-config ca_certs=<ca_bundle_file>
För att autentisera med AKV provas som standard följande typer av autentiseringsuppgifter om det är aktiverat i ordning:
- Miljöautentiseringsuppgifter
- Autentiseringsuppgifter för arbetsbelastningsidentitet
- Autentiseringsuppgifter för hanterad identitet
- Azure CLI-autentiseringsuppgifter
Om du vill ange en typ av autentiseringsuppgifter använder du ytterligare en plugin-konfiguration med namnet
credential_type
. Du kan till exempel uttryckligen angecredential_type
till för attazurecli
använda Azure CLI-autentiseringsuppgifter, vilket visas nedan:notation sign --signature-format cose --id $KEY_ID --plugin azure-kv --plugin-config credential_type=azurecli $IMAGE
Se tabellen nedan för värdena för för olika typer av
credential_type
autentiseringsuppgifter.Typ av autentiseringsuppgifter Värde för credential_type
Miljöautentiseringsuppgifter environment
Autentiseringsuppgifter för arbetsbelastningsidentitet workloadid
Autentiseringsuppgifter för hanterad identitet managedid
Azure CLI-autentiseringsuppgifter azurecli
Visa grafen över signerade bilder och associerade signaturer.
notation ls $IMAGE
I följande exempel på utdata associeras en signatur av typen
application/vnd.cncf.notary.signature
som identifieras av sammandragsha256:d7258166ca820f5ab7190247663464f2dcb149df4d1b6c4943dcaac59157de8e
till$IMAGE
.myregistry.azurecr.io/net-monitor@sha256:17cc5dd7dfb8739e19e33e43680e43071f07497ed716814f3ac80bd4aac1b58f └── application/vnd.cncf.notary.signature └── sha256:d7258166ca820f5ab7190247663464f2dcb149df4d1b6c4943dcaac59157de8e
Verifiera en containeravbildning med Notation CLI
Lägg till rotcertifikatet i ett namngivet förtroendearkiv för signaturverifiering. Om du inte har rotcertifikatet kan du hämta det från din certifikatutfärdare. I följande exempel läggs rotcertifikatet
$ROOT_CERT
till i förtroendearkivet$STORE_NAME
.STORE_TYPE="ca" STORE_NAME="wabbit-networks.io" notation cert add --type $STORE_TYPE --store $STORE_NAME $ROOT_CERT
Visa en lista över rotcertifikatet för att bekräfta att har
$ROOT_CERT
lagts till.notation cert ls
Konfigurera förtroendeprincip före verifiering.
Med förtroendeprinciper kan användare ange finjusterade verifieringsprinciper. Använd följande kommando för att konfigurera förtroendeprincip.
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
Filen ovan
trustpolicy.json
definierar en förtroendeprincip med namnetwabbit-networks-images
. Den här förtroendeprincipen gäller för alla artefakter som lagras på lagringsplatserna$REGISTRY/$REPO
. Det namngivna förtroendearkivet$STORE_NAME
av typen$STORE_TYPE
innehåller rotcertifikaten. Det förutsätter också att användaren litar på en specifik identitet med X.509-ämnet$CERT_SUBJECT
. Mer information finns i Specifikation för förtroendelagring och förtroendeprincip.Använd
notation policy
för att importera förtroendeprincipkonfigurationen fråntrustpolicy.json
.notation policy import ./trustpolicy.json
Visa konfigurationen av förtroendeprincipen för att bekräfta att den har importerats.
notation policy show
Använd
notation verify
för att verifiera avbildningens integritet:notation verify $IMAGE
När avbildningen har verifierats med hjälp av förtroendeprincipen returneras sha256-sammanfattningen av den verifierade avbildningen i ett lyckat utdatameddelande. Ett exempel på utdata:
Successfully verified signature for myregistry.azurecr.io/net-monitor@sha256:17cc5dd7dfb8739e19e33e43680e43071f07497ed716814f3ac80bd4aac1b58f
Tidsstämpling
Sedan Notation v1.2.0-versionen stöder Notation RFC 3161-kompatibel tidsstämpling. Den här förbättringen utökar förtroendet för signaturer som skapats inom certifikatets giltighetsperiod genom att lita på en tidsstämplingsutfärdare (TSA), vilket möjliggör lyckad signaturverifiering även efter att certifikaten har upphört att gälla. Som bildsignerare bör du se till att du signerar containeravbildningar med tidsstämplar som genereras av en betrodd TSA. För att verifiera tidsstämplar bör du som bildverifierare se till att du litar på både bildsigneraren och tillhörande TSA och upprättar förtroende via förtroendelager och förtroendeprinciper. Tidsstämpling minskar kostnaderna genom att eliminera behovet av att regelbundet signera om bilder på grund av certifikatets upphörande, vilket är särskilt viktigt när du använder kortlivade certifikat. Detaljerade anvisningar om hur du signerar och verifierar med tidsstämpling finns i tidsstämplingsguiden för notarieprojekt.
Vanliga frågor
Vad ska jag göra om certifikatet har upphört att gälla?
Om certifikatet har upphört att gälla måste du skaffa ett nytt från en betrodd CA-leverantör tillsammans med en ny privat nyckel. Ett utgånget certifikat kan inte användas för att signera containeravbildningar. För avbildningar som signerades innan certifikatet upphörde att gälla kan de fortfarande valideras om de har signerats med tidsstämpling. Utan tidsstämpling misslyckas signaturverifieringen och du måste signera om avbildningarna med det nya certifikatet för att verifieringen ska lyckas.
Vad ska jag göra om certifikatet återkallas?
Om certifikatet återkallas ogiltigförklaras signaturen. Detta kan inträffa av flera orsaker, till exempel att den privata nyckeln komprometteras eller ändringar i certifikatinnehavarens anknytning. För att lösa det här problemet bör du först se till att källkoden och byggmiljön är uppdaterade och säkra. Skapa sedan containeravbildningar från källkoden, hämta ett nytt certifikat från en betrodd CA-leverantör tillsammans med en ny privat nyckel och signera nya containeravbildningar med det nya certifikatet genom att följa den här guiden.
Nästa steg
Notation tillhandahåller även CI/CD-lösningar i Azure Pipeline och GitHub Actions Workflow:
- Signera och verifiera en containeravbildning med Notation i Azure Pipeline
- Signera och verifiera en containeravbildning med Notation i GitHub Actions-arbetsflödet
Verifiera signerad avbildningsdistribution i AKS eller Kubernetes: