Containerinstallatiekopieën ondertekenen met Notatie en Azure Key Vault met behulp van een zelfondertekend certificaat
Het ondertekenen van containerinstallatiekopieën is een proces dat de authenticiteit en integriteit ervan garandeert. Dit wordt bereikt door een digitale handtekening toe te voegen aan de containerinstallatiekopieën, die tijdens de implementatie kunnen worden gevalideerd. Met de handtekening kunt u controleren of de installatiekopieën afkomstig zijn van een vertrouwde uitgever en niet zijn gewijzigd. 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) wordt gebruikt om certificaten op te slaan met ondertekeningssleutels die kunnen worden gebruikt door Notation met de AKV-invoegtoepassing Notation (azure-kv) om containerinstallatiekopieën en andere artefacten te ondertekenen en te verifiëren. Met azure Container Registry (ACR) kunt u handtekeningen toevoegen aan containerinstallatiekopieën en andere artefacten en deze handtekeningen weergeven.
In deze zelfstudie:
- Notation CLI en AKV-invoegtoepassing installeren
- Een zelfondertekend certificaat maken in AKV
- Een containerinstallatiekopieën bouwen en pushen met ACR Tasks
- Een containerinstallatiekopie ondertekenen met de Notation CLI en de AKV-invoegtoepassing
- Een containerinstallatiekopieën valideren op basis van de handtekening met 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 voor het beheren van certificaten
- De nieuwste Azure CLI installeren en configureren of opdrachten uitvoeren in Azure Cloud Shell
Notation CLI en 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 binary 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
Voor een eenvoudige uitvoering van opdrachten in de zelfstudie geeft u waarden op voor de Azure-resources die overeenkomen met de bestaande ACR- en AKV-resources.
Configureer AKV-resourcenamen.
AKV_SUB_ID=myAkvSubscriptionId AKV_RG=myAkvResourceGroup # Name of the existing AKV used to store the signing keys AKV_NAME=myakv # Name of the certificate created in AKV CERT_NAME=wabbit-networks-io CERT_SUBJECT="CN=wabbit-networks.io,O=Notation,L=Seattle,ST=WA,C=US" CERT_PATH=./${CERT_NAME}.pem
ACR- en afbeeldingsresourcenamen configureren.
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 IMAGE=$REGISTRY/${REPO}:$TAG # 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.
Toegangsmachtigingen voor ACR en AKV beveiligen
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 autoriseren
De AcrPull
en AcrPush
rollen zijn vereist voor het 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"
Toegang tot AKV autoriseren
In deze sectie verkennen we twee opties voor het autoriseren van toegang tot AKV.
Azure RBAC gebruiken (aanbevolen)
De volgende rollen zijn vereist voor het ondertekenen met behulp van zelfondertekende certificaten:
Key Vault Certificates Officer
voor het maken en lezen van certificatenKey Vault Certificates User
voor het lezen van bestaande certificatenKey Vault Crypto User
voor ondertekeningsbewerkingen
Zie Een Azure RBAC gebruiken om toegang te beheren voor meer informatie over Key Vault-toegang met Azure RBAC.
Het abonnement instellen dat de AKV-resource bevat
az account set --subscription $AKV_SUB_ID
De rollen toewijzen
USER_ID=$(az ad signed-in-user show --query id -o tsv) az role assignment create --role "Key Vault Certificates Officer" --role "Key Vault Crypto User" --assignee $USER_ID --scope "/subscriptions/$AKV_SUB_ID/resourceGroups/$AKV_RG/providers/Microsoft.KeyVault/vaults/$AKV_NAME"
Toegangsbeleid toewijzen in AKV (verouderd)
De volgende machtigingen zijn vereist voor een identiteit:
Create
machtigingen voor het maken van een certificaatGet
machtigingen voor het lezen van bestaande certificatenSign
machtigingen voor ondertekeningsbewerkingen
Zie Toegangsbeleid toewijzen voor meer informatie over het toewijzen van beleid aan een principal.
Stel het abonnement in dat de AKV-resource bevat:
az account set --subscription $AKV_SUB_ID
Stel het toegangsbeleid in AKV in:
USER_ID=$(az ad signed-in-user show --query id -o tsv) az keyvault set-policy -n $AKV_NAME --certificate-permissions create get --key-permissions sign --object-id $USER_ID
Belangrijk
In dit voorbeeld ziet u de minimale machtigingen die nodig zijn voor het maken van een certificaat en het ondertekenen van een containerinstallatiekopieën. Afhankelijk van uw vereisten moet u mogelijk extra machtigingen verlenen.
Een zelfondertekend certificaat maken in AKV (Azure CLI)
De volgende stappen laten zien hoe u een zelfondertekend certificaat maakt voor testdoeleinden.
Maak een certificaatbeleidsbestand.
Zodra het certificaatbeleidsbestand is uitgevoerd zoals hieronder, wordt er een geldig certificaat gemaakt dat compatibel is met de certificaatvereiste notary Project in AKV. De waarde voor
ekus
is bedoeld voor ondertekening van programmacode, maar is niet vereist voor notatie om artefacten te ondertekenen. Het onderwerp wordt later gebruikt als vertrouwensidentiteit die door de gebruiker wordt vertrouwd tijdens de verificatie.cat <<EOF > ./my_policy.json { "issuerParameters": { "certificateTransparency": null, "name": "Self" }, "keyProperties": { "exportable": false, "keySize": 2048, "keyType": "RSA", "reuseKey": true }, "secretProperties": { "contentType": "application/x-pem-file" }, "x509CertificateProperties": { "ekus": [ "1.3.6.1.5.5.7.3.3" ], "keyUsage": [ "digitalSignature" ], "subject": "$CERT_SUBJECT", "validityInMonths": 12 } } EOF
Maak het certificaat.
az keyvault certificate create -n $CERT_NAME --vault-name $AKV_NAME -p @my_policy.json
Een containerinstallatiekopie ondertekenen met de Notation CLI en de AKV-invoegtoepassing
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. Gebruik altijd de digest-waarde 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
Haal de sleutel-id van de ondertekeningssleutel op. Een certificaat in AKV kan meerdere versies hebben. De volgende opdracht haalt de sleutel-id van de nieuwste versie op.
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 ondertekeningssleutel-id. Als u zich wilt aanmelden met een zelfondertekend certificaat, moet u de configuratiewaarde
self_signed=true
van de invoegtoepassing instellen.notation sign --signature-format cose --id $KEY_ID --plugin azure-kv --plugin-config self_signed=true $IMAGE
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 self_signed=true --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
Een containerinstallatiekopie controleren met de Notatie-CLI
Als u de containerinstallatiekopie wilt controleren, voegt u het basiscertificaat toe dat het certificaat ondertekent in het vertrouwensarchief en maakt u vertrouwensbeleid voor verificatie. Voor het zelfondertekende certificaat dat in deze zelfstudie wordt gebruikt, is het basiscertificaat het zelfondertekende certificaat zelf.
Download een openbaar certificaat.
az keyvault certificate download --name $CERT_NAME --vault-name $AKV_NAME --file $CERT_PATH
Voeg het gedownloade openbare certificaat toe aan het vertrouwensarchief met de naam voor handtekeningverificatie.
STORE_TYPE="ca" STORE_NAME="wabbit-networks.io" notation cert add --type $STORE_TYPE --store $STORE_NAME $CERT_PATH
Geef het certificaat weer om te bevestigen.
notation cert ls
Configureer vertrouwensbeleid vóór verificatie.
Met vertrouwensbeleid kunnen gebruikers een nauwkeurig verificatiebeleid opgeven. In het volgende voorbeeld wordt een vertrouwensbeleid geconfigureerd met de naam
wabbit-networks-images
, dat van toepassing is op alle artefacten in$REGISTRY/$REPO
en het benoemde vertrouwensarchief$STORE_NAME
van het type$STORE_TYPE
gebruikt. 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.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
Hiermee
notation policy
importeert u de configuratie van het vertrouwensbeleid uit een JSON-bestand dat u eerder hebt gemaakt.notation policy import ./trustpolicy.json notation policy show
Gebruik
notation verify
dit om te controleren of de containerinstallatiekopieën sinds de buildtijd niet zijn gewijzigd.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.
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.
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: