Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo articolo fa parte di una serie su come garantire l'integrità e l'autenticità delle immagini del contenitore e altri artefatti OCI (Open Container Initiative). Per un quadro completo, iniziare con la panoramica, che spiega perché la firma è importante e descrive i vari scenari.
La firma delle immagini del contenitore è un processo che consente di garantire l'autenticità e l'integrità. Durante la distribuzione viene verificata una firma digitale aggiunta a un'immagine del contenitore. La firma consente di verificare che l'immagine provena da un autore attendibile e non venga modificata.
Questo articolo illustra gli strumenti seguenti coinvolti nel processo di firma:
Notazione è uno strumento di sicurezza open source della supply chain sviluppato dalla community Notary Project e supportato da Microsoft. Supporta la firma e la verifica delle immagini del contenitore e di altri artefatti.
Per firmare un'immagine del contenitore usando Notation nelle pipeline di integrazione continua e recapito continuo (CI/CD), seguire le indicazioni per Azure Pipelines o GitHub Actions.
Azure Key Vault è un servizio per l'archiviazione dei certificati con chiavi di firma. Notation può usare queste chiavi tramite il plug-in Key Vault (
notation-azure-kv) per firmare e verificare le immagini del contenitore e altri artefatti.Registro Azure Container è un registro privato che è possibile usare per allegare firme alle immagini del contenitore e ad altri artefatti, oltre a visualizzare tali firme.
In questo articolo vengono illustrate le operazioni seguenti:
- Installare l'interfaccia della riga di comando Notation e il plug-in Key Vault.
- Creare un certificato autofirmato in Key Vault.
- Compilare ed eseguire il push di un'immagine del contenitore usando le attività del Registro Container.
- Firmare un'immagine del contenitore utilizzando Notation CLI e il plug-in Key Vault.
- Validare un'immagine del container contro la firma usando Notation CLI.
- Utilizzare la funzionalità di timestamping.
Prerequisiti
- Creare o usare un registro contenitori per archiviare immagini e firme del contenitore.
- Creare o usare un key vault per la gestione dei certificati.
- Installare e configurare la versione più recente dell'interfaccia della riga di comando di Azure oppure eseguire i comandi in Azure Cloud Shell.
Installare il plug-in Notation Cli e Key Vault
Installare Notation v1.3.2 in un ambiente Linux AMD64. Per scaricare il pacchetto per altri ambienti, seguire la guida all'installazione della notazione.
# Download, extract, and install curl -Lo notation.tar.gz https://github.com/notaryproject/notation/releases/download/v1.3.2/notation_1.3.2_linux_amd64.tar.gz tar xvzf notation.tar.gz # Copy the Notation binary to the desired bin directory in $PATH, for example cp ./notation /usr/local/binInstallare il plug-in Key Vault (
notation-azure-kv) v1.2.1 in un ambiente Linux AMD64.Note
È possibile trovare l'URL e il checksum SHA256 per il plug-in nella pagina di rilascio del plug-in.
notation plugin install --url https://github.com/Azure/notation-azure-kv/releases/download/v1.2.1/notation-azure-kv_1.2.1_linux_amd64.tar.gz --sha256sum 67c5ccaaf28dd44d2b6572684d84e344a02c2258af1d65ead3910b3156d3eaf5Elencare i plug-in disponibili e verificare che il
notation-azure-kvplug-in con versione1.2.1sia incluso nell'elenco:notation plugin ls
Configurare le variabili di ambiente
Per semplificare l'effettuazione dei comandi in questo articolo, fornire valori delle risorse Azure affinché corrispondano alle risorse esistenti del Registro dei container e del Key Vault.
Configurare i nomi delle risorse di Key Vault:
AKV_SUB_ID=myAkvSubscriptionId AKV_RG=myAkvResourceGroup # Name of the existing key vault used to store the signing keys AKV_NAME=myakv # Name of the certificate created in the key vault CERT_NAME=wabbit-networks-io CERT_SUBJECT="CN=wabbit-networks.io,O=Notation,L=Seattle,ST=WA,C=US" CERT_PATH=./${CERT_NAME}.pemConfigurare i nomi delle risorse del Registro Container e delle immagini:
ACR_SUB_ID=myAcrSubscriptionId ACR_RG=myAcrResourceGroup # Name of the existing registry (example: myregistry.azurecr.io) ACR_NAME=myregistry # Existing full ___domain of the container registry REGISTRY=$ACR_NAME.azurecr.io # Container name inside the container registry where the image will be stored REPO=net-monitor TAG=v1 IMAGE=$REGISTRY/${REPO}:$TAG # Source code directory that contains the Dockerfile to build IMAGE_SOURCE=https://github.com/wabbit-networks/net-monitor.git#main
Accedi utilizzando l'Azure CLI
az login
Per altre informazioni, vedere Eseguire l'autenticazione in Azure usando l'interfaccia della riga di comando di Azure.
Concedere le autorizzazioni di accesso al Registro Container e al Key Vault
Quando si usa Registro Container e Key Vault, è essenziale concedere le autorizzazioni appropriate per garantire l'accesso sicuro e controllato. È possibile autorizzare l'accesso per varie entità, ad esempio entità utente, entità servizio o identità gestite, a seconda degli scenari specifici. In questo articolo l'accesso è autorizzato per un utente di Azure connesso.
Autorizzare l'accesso al Registro dei Container
Nei registri abilitati per il controllo degli accessi in base all'attributo (ABAC) di Microsoft Entra, i ruoli Container Registry Repository Reader e Container Registry Repository Writer sono necessari per la compilazione e la firma delle immagini dei contenitori in Registro Contenitori.
Per i registri non abilitati per il controllo degli accessi basato sugli attributi (ABAC), sono richiesti i ruoli AcrPull e AcrPush.
Per ulteriori informazioni sul controllo degli accessi basato sugli attributi (ABAC), vedere controllo degli accessi basato sugli attributi di Microsoft Entra per le autorizzazioni del repository.
Configura la sottoscrizione che contiene la risorsa Container Registry.
az account set --subscription $ACR_SUB_IDAssegnare i ruoli. Il corretto ruolo da utilizzare nell'assegnazione del ruolo dipende dal fatto che il Registro di sistema sia abilitato o meno a ABAC.
USER_ID=$(az ad signed-in-user show --query id -o tsv) ROLE1="Container Registry Repository Reader" # For ABAC-enabled registries. Otherwise, use "AcrPull" for non-ABAC-enabled registries. ROLE2="Container Registry Repository Writer" # For ABAC-enabled registries. Otherwise, use "AcrPush" for non-ABAC-enabled registries. az role assignment create --role "$ROLE1" --role "$ROLE2" --assignee $USER_ID --scope "/subscriptions/$ACR_SUB_ID/resourceGroups/$ACR_RG/providers/Microsoft.ContainerRegistry/registries/$ACR_NAME"
Autorizzare l'accesso a Key Vault
Questa sezione illustra due opzioni per autorizzare l'accesso a Key Vault.
Usare il controllo degli accessi in base al ruolo di Azure (scelta consigliata)
Sono necessari i seguenti ruoli per la firma utilizzando certificati autofirmati:
-
Key Vault Certificates Officerper la creazione e la lettura di certificati -
Key Vault Certificates Userper la lettura dei certificati esistenti -
Key Vault Crypto Userper le operazioni di firma
Per altre informazioni sull'accesso a Key Vault con il controllo degli accessi in base al ruolo di Azure, vedere Fornire l'accesso a chiavi, certificati e segreti di Key Vault usando il controllo degli accessi in base al ruolo di Azure.
Impostare la sottoscrizione che contiene la risorsa Key Vault:
az account set --subscription $AKV_SUB_IDAssegnare i ruoli:
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"
Assegnare una politica di accesso in Key Vault (legacy)
Per un'identità sono necessarie le autorizzazioni seguenti:
-
Autorizzazioni
Createper la creazione di un certificato -
Autorizzazioni
Getper la lettura dei certificati esistenti -
Autorizzazioni
Signper le operazioni di firma
Per altre informazioni sull'assegnazione di criteri a un'entità di sicurezza, vedere Assegnare criteri di accesso Key Vault (legacy).
Impostare la sottoscrizione che contiene la risorsa Key Vault:
az account set --subscription $AKV_SUB_IDImpostare i criteri di accesso in Key Vault:
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 altre autorizzazioni.
Creare un certificato autofirmato in Key Vault (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.
Dopo l'esecuzione del file dei criteri di certificato tramite il codice seguente, viene creato un certificato valido compatibile con i requisiti del certificato Notary Project in Key Vault. Il valore per
ekusè per la firma del codice, ma non è necessario per la firma degli artefatti in Notation. Il soggetto viene utilizzato successivamente come identità attendibile 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 } } EOFCreare il certificato:
az keyvault certificate create -n $CERT_NAME --vault-name $AKV_NAME -p @my_policy.json
Firmare un'immagine del contenitore usando la CLI Notation e il plugin Key Vault
Eseguire l'autenticazione nel registro contenitori usando la singola identità di Azure:
az acr login --name $ACR_NAMEImportante
Se nel sistema è installato Docker e si è usato
az acr loginodocker loginper eseguire l'autenticazione nel registro dei container, le credenziali sono già archiviate e disponibili per Notation. In questo caso, non è necessario eseguirenotation logindi nuovo per eseguire l'autenticazione nel registro contenitori. Per altre informazioni sulle opzioni di autenticazione per notazione, vedere Eseguire l'autenticazione con registri conformi a OCI.Compilare ed eseguire il push di una nuova immagine usando le attività di 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}@$DIGESTIn questo articolo, se l'immagine è già compilata ed è archiviata nel Registro di sistema, il tag funge da identificatore per tale immagine per praticità:
IMAGE=$REGISTRY/${REPO}:$TAGOttenere l'ID della chiave di firma. Un certificato in Key Vault 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 CBOR Object Signing and Encryption (COSE), usando l'ID chiave di firma. Per firmare con un certificato autofirmato, è necessario impostare il valore
self_signed=truedi configurazione del plug-in .notation sign --signature-format cose --id $KEY_ID --plugin azure-kv --plugin-config self_signed=true $IMAGEPer eseguire l'autenticazione con Key Vault, per impostazione predefinita, vengono tentati i tipi di credenziali seguenti (se abilitati):
- Credenziali dell'ambiente
- Credenziali dell'identità del carico di lavoro
- Credenziali dell'identità gestita
- Credenziali dell'interfaccia della riga di comando di Azure
Se si vuole specificare un tipo di credenziale, usare una configurazione plug-in aggiuntiva denominata
credential_type. Ad esempio, è possibile impostarecredential_typein modo esplicito suazurecliper l'uso di credenziali dell'interfaccia della riga di comando di Azure, come illustrato in questo esempio:notation sign --signature-format cose --id $KEY_ID --plugin azure-kv --plugin-config self_signed=true --plugin-config credential_type=azurecli $IMAGENella tabella seguente vengono illustrati i valori di
credential_typeper vari tipi di credenziali.Tipo di credenziali Valore per credential_typeCredenziali dell'ambiente environmentCredenziali dell'identità del carico di lavoro workloadidCredenziali dell'identità gestita managedidCredenziali dell'interfaccia della riga di comando di Azure azurecliNote
A partire da Notation v1.2.0, Notation utilizza lo schema del tag dei referrer OCI per archiviare la firma nel Registro Container per impostazione predefinita. È anche possibile abilitare l'API Referrers OCI usando il flag
--force-referrers-tag false, se necessario. Le funzionalità del Registro Container supportano l'API OCI Referrers, ad eccezione del Registro di sistema crittografato tramite chiavi gestite dal cliente (CMK).Visualizzare il grafico delle immagini firmate e delle firme associate:
notation ls $IMAGE
Verificare un'immagine del container usando CLI (interfaccia a riga di comando) Notation
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 da questo articolo, il certificato radice è il certificato autofirmato stesso.
Scaricare un certificato pubblico:
az keyvault certificate download --name $CERT_NAME --vault-name $AKV_NAME --file $CERT_PATHAggiungere 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_PATHElencare il certificato da confermare:
notation cert lsConfigurare un criterio 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. Questo criterio si applica a tutti gli artefatti in$REGISTRY/$REPOe utilizza l'archivio attendibilità denominato$STORE_NAMEdi tipo$STORE_TYPE. Presuppone inoltre che l'utente consideri attendibile un'identità specifica con l'oggetto X.509$CERT_SUBJECT. Per altre informazioni, vedere Archivio attendibilità e specifica dei criteri di attendibilità.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" ] } ] } EOFUsare
notation policyper importare la configurazione dei criteri di attendibilità dal file JSON creato in precedenza:notation policy import ./trustpolicy.json notation policy showUsare
notation verifyper verificare che l'immagine del contenitore non sia stata modificata dopo la fase di compilazione:notation verify $IMAGEAl termine della verifica dell'immagine tramite i criteri di attendibilità, il digest SHA256 dell'immagine verificata viene restituito in un messaggio di output riuscito.
Utilizzare la marcatura temporale
Dalla versione Notation v1.2.0, Notation supporta il timestamp conforme a RFC 3161. Questo miglioramento estende l'attendibilità delle firme create entro il periodo di validità del certificato considerando attendibile un'autorità del timestamp (TSA). Questo trust abilita la verifica della firma con esito positivo anche dopo la scadenza dei certificati.
Come firmatario di immagini, è necessario assicurarsi di firmare immagini del contenitore con timestamp generati da una TSA attendibile. Come verificatore di immagini, è necessario assicurarsi di considerare attendibile sia il firmatario dell'immagine che il TSA associato e stabilire l'attendibilità tramite archivi di attendibilità e politiche di attendibilità.
Il timestamp riduce i costi eliminando la necessità di firmare periodicamente le immagini a causa della scadenza del certificato. Questa capacità è particolarmente critica quando si usano certificati di breve durata. Per istruzioni dettagliate su come firmare e verificare le immagini utilizzando la marcatura temporale, consultare la guida alla marcatura temporale del Progetto Notario.
Contenuti correlati
La Notation fornisce soluzioni CI/CD in Azure Pipelines e GitHub Actions.
- Per firmare e verificare le immagini del contenitore nelle pipeline di Azure DevOps, vedere Firmare e verificare un'immagine del contenitore usando Notation in una pipeline di Azure.
- Per firmare le immagini del contenitore usando GitHub Actions, vedere Firmare un'immagine del contenitore usando Notation in GitHub Actions.
- Per verificare le immagini del contenitore usando GitHub Actions, vedere Verificare un'immagine del contenitore usando notazione in GitHub Actions.
Per assicurarsi che nel servizio Azure Kubernetes vengano distribuite solo immagini di contenitori attendibili:
- Usare l'integrità delle immagini di Criteri di Azure (anteprima) seguendo la guida Usare l'integrità delle immagini per convalidare le immagini firmate prima di distribuirle nei cluster del servizio Azure Kubernetes (anteprima)
- Usare Ratify e Criteri di Azure seguendo la guida Verificare le firme dell'immagine del contenitore usando Ratify e Criteri di Azure.