Dela via


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

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

  1. 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
    
  2. 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
    
  3. Visa en lista över tillgängliga plugin-program och bekräfta att azure-kv plugin-programmet med version 1.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.

  1. 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"
    
  2. 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 kravetNotary 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ältet CA måste anges true.
  • Tillägget keyUsage måste vara närvarande och markerat critical. Bitpositioner för keyCertSign 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).
  • Viktiga egenskaper:
    • Egenskapen exportable måste vara inställd på false.
    • Välj en nyckeltyp och storlek som stöds från Notary Project-specifikationen.

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:

  1. Hämta certifikatfilen från CA-leverantören med hela certifikatkedjan.
  2. 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.

  1. Ange den prenumeration som innehåller ACR-resursen

    az account set --subscription $ACR_SUB_ID
    
  2. 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

  1. 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.

  1. 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

  1. Ange den prenumeration som innehåller AKV-resursen

    az account set --subscription $AKV_SUB_ID
    
  2. Tilldela rollerna

    Om certifikatet innehåller hela certifikatkedjan måste huvudkontot tilldelas följande roller:

    • Key Vault Secrets User för att läsa hemligheter
    • Key Vault Certificates Userför att läsa certifikat
    • Key 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 Userför att läsa certifikat
    • Key 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 Getoch 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 Signoch 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

  1. 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) 
    
  2. 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:

    Om du vill ange en typ av autentiseringsuppgifter använder du ytterligare en plugin-konfiguration med namnet credential_type. Du kan till exempel uttryckligen ange credential_type till för att azurecli 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
  3. 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 sammandrag sha256:d7258166ca820f5ab7190247663464f2dcb149df4d1b6c4943dcaac59157de8e till $IMAGE.

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

Verifiera en containeravbildning med Notation CLI

  1. 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  
    
  2. Visa en lista över rotcertifikatet för att bekräfta att har $ROOT_CERT lagts till.

    notation cert ls 
    
  3. 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 namnet wabbit-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.

  4. Använd notation policy för att importera förtroendeprincipkonfigurationen från trustpolicy.json.

    notation policy import ./trustpolicy.json
    
  5. Visa konfigurationen av förtroendeprincipen för att bekräfta att den har importerats.

    notation policy show
    
  6. 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:

Verifiera signerad avbildningsdistribution i AKS eller Kubernetes: