Containerinstallatiekopieën ondertekenen met Notatie en Azure Key Vault met behulp van een door een CA uitgegeven certificaat
Het ondertekenen en verifiëren van containerinstallatiekopieën met een certificaat dat is uitgegeven door een vertrouwde certificeringsinstantie (CA) is een waardevolle beveiligingspraktijk. Deze beveiligingsmaatregel helpt u bij het op verantwoorde wijze identificeren, autoriseren en valideren van de identiteit van zowel de uitgever van de containerinstallatiekopie als de containerinstallatiekopie zelf. De vertrouwde certificeringsinstanties (CA's), zoals GlobalSign, DigiCert en anderen, spelen een cruciale rol bij de validatie van de identiteit van een gebruiker of organisatie, het handhaven van de beveiliging van digitale certificaten en het intrekken van het certificaat onmiddellijk na elk risico of misbruik.
Hier volgen enkele essentiële onderdelen waarmee u containerinstallatiekopieën kunt ondertekenen en verifiëren met een certificaat dat is uitgegeven door een vertrouwde CERTIFICERINGsinstantie:
- De notatie is een opensource-toeleveringsketenbeveiligingsprogramma dat is ontwikkeld door de Notary Project-community en wordt ondersteund door Microsoft, dat ondersteuning biedt voor het ondertekenen en verifiëren van containerinstallatiekopieën en andere artefacten.
- De Azure Key Vault (AKV), een cloudservice voor het beheren van cryptografische sleutels, geheimen en certificaten, helpt u ervoor te zorgen dat u een certificaat veilig opslaat en beheert met een ondertekeningssleutel.
- De AKV-invoegtoepassing Notation azure-kv, de extensie van Notation gebruikt de sleutels die zijn opgeslagen in Azure Key Vault voor het ondertekenen en verifiëren van de digitale handtekeningen van containerinstallatiekopieën en artefacten.
- Met azure Container Registry (ACR) kunt u deze handtekeningen toevoegen aan de ondertekende installatiekopieën en kunt u deze containerinstallatiekopieën opslaan en beheren.
Wanneer u de afbeelding verifieert, wordt de handtekening gebruikt om de integriteit van de afbeelding en de identiteit van de ondertekenaar te valideren. Dit helpt ervoor te zorgen dat de containerinstallatiekopieën niet worden gemanipuleerd en afkomstig zijn van een vertrouwde bron.
In dit artikel:
- De notatie-CLI en DE AKV-invoegtoepassing installeren
- Een certificaat maken of importeren dat is uitgegeven door een CA in AKV
- Een containerinstallatiekopieën bouwen en pushen met ACR-taak
- Een containerinstallatiekopie ondertekenen met de Notation CLI en de AKV-invoegtoepassing
- Een handtekening voor een containerinstallatiekopieën controleren met de Notatie-CLI
- Tijdstempel
Vereisten
- Een Azure Container Registry maken of gebruiken voor het opslaan van containerinstallatiekopieën en handtekeningen
- Een Azure Key Vault maken of gebruiken .
- De nieuwste Azure CLI installeren en configureren of opdrachten uitvoeren in Azure Cloud Shell
Notitie
U wordt aangeraden alleen een nieuwe Azure Key Vault te maken voor het opslaan van certificaten.
De notatie-CLI en DE AKV-invoegtoepassing installeren
Installeer Notation v1.2.0 in een Linux amd64-omgeving. Volg de installatiehandleiding voor notatie om het pakket voor andere omgevingen te downloaden.
# 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
Installeer de invoegtoepassing
azure-kv
Notation Azure Key Vault v1.2.0 in een Linux amd64-omgeving.Notitie
De URL en SHA256-controlesom voor de Azure Key Vault-invoegtoepassing notatie vindt u op de releasepagina van de invoegtoepassing.
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
Vermeld de beschikbare invoegtoepassingen en controleer of de
azure-kv
invoegtoepassing met versie1.2.0
is opgenomen in de lijst.notation plugin ls
Omgevingsvariabelen configureren
Notitie
In deze handleiding worden omgevingsvariabelen gebruikt voor het gemak bij het configureren van de AKV en ACR. Werk de waarden van deze omgevingsvariabelen voor uw specifieke resources bij.
Omgevingsvariabelen configureren voor AKV en certificaten
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"
Configureer omgevingsvariabelen voor ACR en installatiekopieën.
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
Aanmelden met Azure CLI
az login
Zie Aanmelden met Azure CLI voor meer informatie over Azure CLI en hoe u zich hiermee kunt aanmelden.
Een certificaat maken of importeren dat is uitgegeven door een CA in AKV
Certificaatvereisten
Bij het maken van certificaten voor ondertekening en verificatie moeten de certificaten voldoen aan de certificaatvereiste voor notarisproject.
Dit zijn de vereisten voor basis- en tussencertificaten:
- De
basicConstraints
extensie moet aanwezig zijn en als kritiek zijn gemarkeerd. HetCA
veld moet worden ingesteldtrue
. - De
keyUsage
extensie moet aanwezig en gemarkeerdcritical
zijn. Bitposities voorkeyCertSign
MUST moeten worden ingesteld.
Dit zijn de vereisten voor certificaten die zijn uitgegeven door een CA:
- X.509-certificaateigenschappen:
- Onderwerp moet algemene naam (), land (
CN
C
), staat of provincie (ST
) en organisatie (O
) bevatten. In deze zelfstudie$CERT_SUBJECT
wordt het onderwerp gebruikt. - De vlag voor het gebruik van X.509-sleutels mag alleen zijn
DigitalSignature
. - Uitgebreide-sleutelgebruiken (EKU's) moeten leeg zijn of
1.3.6.1.5.5.7.3.3
(voor codesigning).
- Onderwerp moet algemene naam (), land (
- Belangrijkste eigenschappen:
- De
exportable
eigenschap moet worden ingesteld opfalse
. - Selecteer een ondersteund sleuteltype en een ondersteunde grootte in de specificatie van het Notary Project.
- De
Belangrijk
Om ervoor te zorgen dat de integratie met afbeeldingsintegriteit is geslaagd, moet het inhoudstype van het certificaat worden ingesteld op PEM.
Notitie
In deze handleiding wordt versie 1.0.1 van de AKV-invoegtoepassing gebruikt. Eerdere versies van de invoegtoepassing hadden een beperking die een specifieke certificaatvolgorde in een certificaatketen vereist. Versie 1.0.1 van de invoegtoepassing heeft deze beperking niet. Het is daarom raadzaam om versie 1.0.1 of hoger te gebruiken.
Een certificaat maken dat is uitgegeven door een CA
Maak een aanvraag voor certificaatondertekening (CSR) door de instructies in het maken van een aanvraag voor certificaatondertekening te volgen.
Belangrijk
Wanneer u de CSR samenvoegt, moet u ervoor zorgen dat u de hele keten die terug is gebracht van de CA-leverancier, samenvoegt.
Het certificaat importeren in AKV
Het certificaat importeren:
- Haal het certificaatbestand op van de CA-leverancier met volledige certificaatketen.
- Importeer het certificaat in Azure Key Vault door de instructies in het importeren van een certificaat te volgen.
Notitie
Als het certificaat geen certificaatketen bevat na het maken of importeren, kunt u de tussenliggende en basiscertificaten van uw CA-leverancier verkrijgen. U kunt uw leverancier vragen u een PEM-bestand te verstrekken dat de tussenliggende certificaten (indien van toepassing) en het basiscertificaat bevat. Dit bestand kan vervolgens worden gebruikt bij stap 5 van het ondertekenen van containerinstallatiekopieën.
Een containerinstallatiekopie ondertekenen met de Notation CLI en de AKV-invoegtoepassing
Wanneer u met ACR en AKV werkt, is het essentieel om de juiste machtigingen te verlenen om veilige en gecontroleerde toegang te garanderen. U kunt toegang verlenen voor verschillende entiteiten, zoals gebruikers-principals, service-principals of beheerde identiteiten, afhankelijk van uw specifieke scenario's. In deze zelfstudie is de toegang gemachtigd voor een aangemelde Azure-gebruiker.
Toegang tot ACR ontwerpen
De AcrPull
en AcrPush
rollen zijn vereist voor het bouwen en ondertekenen van containerinstallatiekopieën in ACR.
Het abonnement instellen dat de ACR-resource bevat
az account set --subscription $ACR_SUB_ID
De rollen toewijzen
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"
Containerinstallatiekopieën bouwen en pushen naar ACR
Verifieer bij uw ACR met behulp van uw afzonderlijke Azure-identiteit.
az acr login --name $ACR_NAME
Belangrijk
Als Docker op uw systeem is geïnstalleerd en gebruikt az acr login
of docker login
om te verifiëren bij uw ACR, worden uw referenties al opgeslagen en beschikbaar voor notatie. In dit geval hoeft u niet opnieuw uit te voeren notation login
om te verifiëren bij uw ACR. Zie Verifiëren met OCI-compatibele registers voor meer informatie over verificatieopties voor notatie.
Bouw en push een nieuwe installatiekopieën met ACR Tasks.
digest
Gebruik altijd om de afbeelding te identificeren voor ondertekening, omdat tags veranderlijk zijn en kunnen worden overschreven.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
In deze zelfstudie, als de installatiekopie al is gemaakt en is opgeslagen in het register, fungeert de tag als een id voor die installatiekopie voor het gemak.
IMAGE=$REGISTRY/${REPO}@$TAG
Toegang tot AKV ontwerpen
Azure RBAC gebruiken (aanbevolen)
Het abonnement instellen dat de AKV-resource bevat
az account set --subscription $AKV_SUB_ID
De rollen toewijzen
Als het certificaat de volledige certificaatketen bevat, moet de principal worden toegewezen met de volgende rollen:
Key Vault Secrets User
voor het lezen van geheimenKey Vault Certificates User
voor het lezen van certificatenKey Vault Crypto User
voor ondertekeningsbewerkingen
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"
Als het certificaat de keten niet bevat, moet de principal worden toegewezen met de volgende rollen:
Key Vault Certificates User
voor het lezen van certificatenKey Vault Crypto User
voor ondertekeningsbewerkingen
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"
Zie Een Azure RBAC gebruiken om toegang te beheren voor meer informatie over Key Vault-toegang met Azure RBAC.
Toegangsbeleid gebruiken (verouderd)
Voer de volgende opdracht uit om het abonnement in te stellen dat de AKV-resources bevat:
az account set --subscription $AKV_SUB_ID
Als het certificaat de hele certificaatketen bevat, moet de principal sleutelmachtigingen, geheime machtigingen Sign
Get
en certificaatmachtigingen Get
worden verleend. Ga als volgt te werk om deze machtigingen aan de principal te verlenen:
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
Als het certificaat de keten niet bevat, moet de principal sleutelmachtigingen en certificaatmachtigingen Sign
Get
worden verleend. Ga als volgt te werk om deze machtigingen aan de principal te verlenen:
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
Zie Toegangsbeleid toewijzen voor meer informatie over het toewijzen van beleid aan een principal.
Containerinstallatiekopieën ondertekenen met behulp van het certificaat in AKV
Haal de sleutel-id voor een certificaat op. Een certificaat in AKV kan meerdere versies hebben. De volgende opdracht haalt de sleutel-id op voor de nieuwste versie van het
$CERT_NAME
certificaat.KEY_ID=$(az keyvault certificate show -n $CERT_NAME --vault-name $AKV_NAME --query 'kid' -o tsv)
Onderteken de containerinstallatiekopieën met de COSE-handtekeningindeling met behulp van de sleutel-id.
Als het certificaat de hele certificaatketen bevat, voert u de volgende opdracht uit:
notation sign --signature-format cose $IMAGE --id $KEY_ID --plugin azure-kv
Als het certificaat de keten niet bevat, gebruikt u de
--plugin-config ca_certs=<ca_bundle_file>
parameter om de CA-certificaten in een PEM-bestand door te geven aan de AKV-invoegtoepassing, voert u de volgende opdracht uit:notation sign --signature-format cose $IMAGE --id $KEY_ID --plugin azure-kv --plugin-config ca_certs=<ca_bundle_file>
Voor verificatie met AKV worden standaard de volgende referentietypen geprobeerd als deze optie is ingeschakeld:
- Omgevingsreferenties
- Referentie voor workloadidentiteit
- Referenties voor beheerde identiteit
- Azure CLI-referentie
Als u een referentietype wilt opgeven, gebruikt u een extra configuratie van de invoegtoepassing met de naam
credential_type
. U kunt bijvoorbeeld expliciet instellencredential_type
opazurecli
het gebruik van Azure CLI-referenties, zoals hieronder wordt weergegeven:notation sign --signature-format cose --id $KEY_ID --plugin azure-kv --plugin-config credential_type=azurecli $IMAGE
Zie de onderstaande tabel voor de waarden voor
credential_type
verschillende referentietypen.Referentietype Waarde voor credential_type
Omgevingsreferenties environment
Referentie voor workloadidentiteit workloadid
Referenties voor beheerde identiteit managedid
Azure CLI-referentie azurecli
Bekijk de grafiek met ondertekende afbeeldingen en bijbehorende handtekeningen.
notation ls $IMAGE
In het volgende voorbeeld van uitvoer wordt een handtekening van het type
application/vnd.cncf.notary.signature
geïdentificeerd door digestsha256:d7258166ca820f5ab7190247663464f2dcb149df4d1b6c4943dcaac59157de8e
gekoppeld aan de$IMAGE
.myregistry.azurecr.io/net-monitor@sha256:17cc5dd7dfb8739e19e33e43680e43071f07497ed716814f3ac80bd4aac1b58f └── application/vnd.cncf.notary.signature └── sha256:d7258166ca820f5ab7190247663464f2dcb149df4d1b6c4943dcaac59157de8e
Een containerinstallatiekopie controleren met de Notatie-CLI
Voeg het basiscertificaat toe aan een benoemd vertrouwensarchief voor handtekeningverificatie. Als u het basiscertificaat niet hebt, kunt u het verkrijgen via uw CA. In het volgende voorbeeld wordt het basiscertificaat
$ROOT_CERT
toegevoegd aan het$STORE_NAME
vertrouwensarchief.STORE_TYPE="ca" STORE_NAME="wabbit-networks.io" notation cert add --type $STORE_TYPE --store $STORE_NAME $ROOT_CERT
Geef het basiscertificaat weer om te bevestigen dat het
$ROOT_CERT
is toegevoegd.notation cert ls
Configureer vertrouwensbeleid vóór verificatie.
Met vertrouwensbeleid kunnen gebruikers een nauwkeurig verificatiebeleid opgeven. Gebruik de volgende opdracht om vertrouwensbeleid te configureren.
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
Het bovenstaande
trustpolicy.json
bestand definieert één vertrouwensbeleid met de naamwabbit-networks-images
. Dit vertrouwensbeleid is van toepassing op alle artefacten die zijn opgeslagen in de$REGISTRY/$REPO
opslagplaatsen. Het benoemde vertrouwensarchief$STORE_NAME
van het type$STORE_TYPE
bevat de basiscertificaten. Ook wordt ervan uitgegaan dat de gebruiker een specifieke identiteit vertrouwt met het onderwerp$CERT_SUBJECT
X.509. Zie De specificatie van het vertrouwensarchief en het vertrouwensbeleid voor meer informatie.Hiermee
notation policy
importeert u de configuratie van het vertrouwensbeleid uittrustpolicy.json
.notation policy import ./trustpolicy.json
Geef de configuratie van het vertrouwensbeleid weer om te bevestigen dat het importeren is geslaagd.
notation policy show
Gebruik
notation verify
dit om de integriteit van de afbeelding te controleren:notation verify $IMAGE
Na een geslaagde verificatie van de installatiekopie met behulp van het vertrouwensbeleid wordt de sha256-samenvatting van de geverifieerde installatiekopie geretourneerd in een geslaagd uitvoerbericht. Een voorbeeld van uitvoer:
Successfully verified signature for myregistry.azurecr.io/net-monitor@sha256:17cc5dd7dfb8739e19e33e43680e43071f07497ed716814f3ac80bd4aac1b58f
Tijdstempel
Sinds de release van Notation v1.2.0 ondersteunt Notation RFC 3161-compatibele tijdstempels. Deze verbetering breidt het vertrouwen uit van handtekeningen die zijn gemaakt binnen de geldigheidsperiode van het certificaat door een TSA (Timestamping Authority) te vertrouwen, waardoor een geslaagde handtekeningverificatie mogelijk is, zelfs nadat de certificaten zijn verlopen. Als ondertekenaar van een installatiekopie moet u ervoor zorgen dat u containerinstallatiekopieën ondertekent met tijdstempels die zijn gegenereerd door een vertrouwde TSA. Als afbeeldingscontrole moet u ervoor zorgen dat u zowel de ondertekenaar van de installatiekopie als de bijbehorende TSA vertrouwt en een vertrouwensrelatie tot stand brengt via vertrouwensarchieven en vertrouwensbeleid. Tijdstempel vermindert de kosten door het periodiek opnieuw ondertekenen van installatiekopieën vanwege het verlopen van certificaten, wat met name essentieel is bij het gebruik van kortstondige certificaten. Raadpleeg de handleiding voor tijdstempels van Notary Project voor gedetailleerde instructies voor het ondertekenen en verifiëren van tijdstempels.
Veelgestelde vragen
Wat moet ik doen als het certificaat is verlopen?
Als uw certificaat is verlopen, moet u een nieuwe verkrijgen van een vertrouwde CA-leverancier, samen met een nieuwe persoonlijke sleutel. Een verlopen certificaat kan niet worden gebruikt om containerinstallatiekopieën te ondertekenen. Voor installatiekopieën die zijn ondertekend voordat het certificaat is verlopen, kunnen ze nog steeds worden gevalideerd als ze zijn ondertekend met tijdstempel. Zonder tijdstempel mislukt de verificatie van de handtekening en moet u deze installatiekopieën opnieuw ondertekenen met het nieuwe certificaat voor een geslaagde verificatie.
Wat moet ik doen als het certificaat is ingetrokken?
Als uw certificaat is ingetrokken, wordt de handtekening ongeldig gemaakt. Dit kan om verschillende redenen gebeuren, zoals de persoonlijke sleutel die wordt aangetast of wijzigingen in de lidmaatschap van de certificaathouder. U kunt dit probleem oplossen door ervoor te zorgen dat uw broncode en buildomgeving up-to-date en veilig zijn. Bouw vervolgens containerinstallatiekopieën van de broncode, haal een nieuw certificaat op bij een vertrouwde CA-leverancier, samen met een nieuwe persoonlijke sleutel en onderteken nieuwe containerinstallatiekopieën met het nieuwe certificaat door deze handleiding te volgen.
Volgende stappen
Notatie biedt ook CI/CD-oplossingen in Azure Pipeline en GitHub Actions Workflow:
- Een containerinstallatiekopieën ondertekenen en verifiëren met notatie in Azure Pipeline
- Een containerinstallatiekopieën ondertekenen en verifiëren met notatie in GitHub Actions Workflow
De implementatie van ondertekende installatiekopieën valideren in AKS of Kubernetes: