Firmare immagini del contenitore con notazione e Azure Key Vault usando un certificato autofirmato
La firma delle immagini del contenitore è un processo che garantisce l'autenticità e l'integrità. A tale scopo, è possibile aggiungere una firma digitale all'immagine del contenitore, che può essere convalidata durante la distribuzione. La firma consente di verificare che l'immagine provenda da un autore attendibile e non sia stata modificata. La notazione è uno strumento open source della supply chain sviluppato dal progetto notario, che supporta la firma e la verifica delle immagini del contenitore e di altri artefatti. Azure Key Vault (AKV) viene usato per archiviare i certificati con chiavi di firma che possono essere usate dalla notazione con il plug-in Notation AKV (azure-kv) per firmare e verificare le immagini del contenitore e altri artefatti. Il Registro Azure Container (ACR) consente di allegare firme alle immagini del contenitore e ad altri artefatti, nonché di visualizzare tali firme.
Contenuto dell'esercitazione:
- Installare l'interfaccia della riga di comando di notazione e il plug-in AKV
- Creare un certificato autofirmato in AKV
- Compilare ed eseguire il push di un'immagine del contenitore con Attività registro Azure Container
- Firmare un'immagine del contenitore con l'interfaccia della riga di comando notazione e il plug-in AKV
- Convalidare un'immagine del contenitore rispetto alla firma con l'interfaccia della riga di comando notazione
Prerequisiti
- Creare o usare un Registro Azure Container per archiviare immagini e firme del contenitore
- Creare o usare un insieme di credenziali delle chiavi di Azure per la gestione dei certificati
- Installare e configurare i comandi più recenti dell'interfaccia della riga di comando di Azure o Esegui in Azure Cloud Shell
Installare l'interfaccia della riga di comando di notazione e il plug-in AKV
Installare Notation v1.1.0 in un ambiente Linux amd64. Seguire la guida all'installazione della notazione per scaricare il pacchetto per altri ambienti.
# Download, extract and install curl -Lo notation.tar.gz https://github.com/notaryproject/notation/releases/download/v1.1.0/notation_1.1.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
Installare il plug-in
azure-kv
Notation di Azure Key Vault v1.0.2 in un ambiente Linux amd64.Nota
Il checksum URL e SHA256 per il plug-in Notation di Azure Key Vault sono disponibili nella pagina della versione del plug-in.
notation plugin install --url https://github.com/Azure/notation-azure-kv/releases/download/v1.0.2/notation-azure-kv_1.0.2_linux_amd64.tar.gz --sha256sum f2b2e131a435b6a9742c202237b9aceda81859e6d4bd6242c2568ba556cee20e
Elencare i plug-in disponibili e verificare che il
azure-kv
plug-in con versione1.0.2
sia incluso nell'elenco.notation plugin ls
Configurare le variabili di ambiente
Nota
Per semplificare l'esecuzione dei comandi nell'esercitazione, fornire valori per le risorse di Azure in modo che corrispondano alle risorse ACR e AKV esistenti.
Configurare i nomi delle risorse AKV.
# 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
Configurare il registro Azure Container e i nomi delle risorse immagine.
# 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
Accedere tramite l'interfaccia della riga di comando di Azure
az login
Per altre informazioni sull'interfaccia della riga di comando di Azure e su come accedervi, vedere Accedere con l'interfaccia della riga di comando di Azure.
Assegnare i criteri di accesso in AKV (interfaccia della riga di comando di Azure)
Un'entità utente con le autorizzazioni corrette per i criteri di accesso è necessaria per creare un certificato autofirmato e firmare gli artefatti. Questa entità può essere un'entità utente, un'entità servizio o un'identità gestita. Come minimo, questa entità richiede le autorizzazioni seguenti:
Create
autorizzazioni per i certificatiGet
autorizzazioni per i certificatiSign
autorizzazioni per le chiavi
In questa esercitazione i criteri di accesso vengono assegnati a un utente di Azure connesso. Per altre informazioni sull'assegnazione di criteri a un'entità di sicurezza, vedere Assegnare criteri di accesso.
Impostare la sottoscrizione che contiene la risorsa AKV
az account set --subscription <your_subscription_id>
Impostare i criteri di accesso in AKV
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
Importante
Questo esempio mostra le autorizzazioni minime necessarie per la creazione di un certificato e la firma di un'immagine del contenitore. A seconda dei requisiti, potrebbe essere necessario concedere autorizzazioni aggiuntive.
Creare un certificato autofirmato in AKV (interfaccia della riga di comando di Azure)
I passaggi seguenti illustrano come creare un certificato autofirmato a scopo di test.
Creare un file di criteri del certificato.
Una volta eseguito il file dei criteri di certificato come indicato di seguito, viene creato un certificato valido compatibile con il requisito del certificato Notary Project in AKV. Il valore per
ekus
è relativo alla firma del codice, ma non è necessario per la notazione per firmare gli artefatti. L'oggetto viene usato in un secondo momento come identità attendibile dell'utente durante la verifica.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
Creare il certificato.
az keyvault certificate create -n $CERT_NAME --vault-name $AKV_NAME -p @my_policy.json
Firmare un'immagine del contenitore con l'interfaccia della riga di comando notazione e il plug-in AKV
Eseguire l'autenticazione nel Registro Azure Container usando la singola identità di Azure.
az acr login --name $ACR_NAME
Importante
Se Docker è installato nel sistema e usato az acr login
o docker login
per l'autenticazione nel Registro Azure Container, le credenziali sono già archiviate e disponibili per la notazione. In questo caso, non è necessario eseguire notation login
di nuovo per eseguire l'autenticazione nel Registro Azure Container. Per altre informazioni sulle opzioni di autenticazione per la notazione, vedere Eseguire l'autenticazione con registri conformi a OCI.
Compilare ed eseguire il push di una nuova immagine con Attività registro Azure Container. Usare sempre il valore digest per identificare l'immagine per la firma perché i tag sono modificabili e possono essere sovrascritti.
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 questa esercitazione, se l'immagine è già stata compilata e archiviata nel Registro di sistema, il tag funge da identificatore per tale immagine per praticità.
IMAGE=$REGISTRY/${REPO}:$TAG
Ottenere l'ID chiave della chiave di firma. Un certificato in AKV può avere più versioni, il comando seguente ottiene l'ID chiave della versione più recente.
KEY_ID=$(az keyvault certificate show -n $CERT_NAME --vault-name $AKV_NAME --query 'kid' -o tsv)
Firmare l'immagine del contenitore con il formato di firma CO edizione Standard usando l'ID chiave di firma. Per firmare con un certificato autofirmato, è necessario impostare il valore
self_signed=true
di configurazione del plug-in .notation sign --signature-format cose --id $KEY_ID --plugin azure-kv --plugin-config self_signed=true $IMAGE
Visualizzare il grafico delle immagini firmate e delle firme associate.
notation ls $IMAGE
Verificare un'immagine del contenitore con l'interfaccia della riga di comando notazione
Per verificare l'immagine del contenitore, aggiungere il certificato radice che firma il certificato foglia all'archivio attendibilità e creare criteri di attendibilità per la verifica. Per il certificato autofirmato usato in questa esercitazione, il certificato radice è il certificato autofirmato stesso.
Scaricare il certificato pubblico.
az keyvault certificate download --name $CERT_NAME --vault-name $AKV_NAME --file $CERT_PATH
Aggiungere il certificato pubblico scaricato all'archivio attendibilità denominato per la verifica della firma.
STORE_TYPE="ca" STORE_NAME="wabbit-networks.io" notation cert add --type $STORE_TYPE --store $STORE_NAME $CERT_PATH
Elencare il certificato da confermare.
notation cert ls
Configurare i criteri di attendibilità prima della verifica.
I criteri di attendibilità consentono agli utenti di specificare criteri di verifica ottimizzati. Nell'esempio seguente viene configurato un criterio di attendibilità denominato
wabbit-networks-images
, che si applica a tutti gli artefatti in$REGISTRY/$REPO
e usa l'archivio$STORE_NAME
trust denominato di tipo$STORE_TYPE
. Presuppone inoltre che l'utente consideri attendibile un'identità specifica con l'oggetto$CERT_SUBJECT
X.509 . Per altri dettagli, vedere Trust store and trust policy specification .For more details, see Trust store and trust policy specification.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
Usare
notation policy
per importare la configurazione dei criteri di attendibilità da un file JSON creato in precedenza.notation policy import ./trustpolicy.json notation policy show
Usare
notation verify
per verificare che l'immagine del contenitore non sia stata modificata dopo la fase di compilazione.notation verify $IMAGE
Al termine della verifica dell'immagine usando i criteri di attendibilità, il digest sha256 dell'immagine verificata viene restituito in un messaggio di output riuscito.
Passaggi successivi
Vedere Usare l'integrità dell'immagine per convalidare le immagini firmate prima di distribuirle nei cluster servizio Azure Kubernetes del servizio Azure Kubernetes (anteprima) e ratificare in Azure per iniziare a verificare e controllare le immagini firmate prima di distribuirle nel servizio Azure Kubernetes.