Condividi tramite


Firmare immagini del contenitore con notazione e Azure Key Vault usando un certificato rilasciato dalla CA

La firma e la verifica delle immagini del contenitore con un certificato emesso da un'autorità di certificazione (CA) attendibile è una pratica di sicurezza valida. Questa misura di sicurezza consente di identificare, autorizzare e convalidare in modo responsabile l'identità dell'autore dell'immagine del contenitore e dell'immagine del contenitore stessa. Le autorità di certificazione attendibili ,ad esempio GlobalSign, DigiCert e altri, svolgono un ruolo fondamentale nella convalida dell'identità di un utente o dell'organizzazione, mantenendo la sicurezza dei certificati digitali e revocando immediatamente il certificato in caso di rischio o uso improprio.

Ecco alcuni componenti essenziali che consentono di firmare e verificare le immagini del contenitore con un certificato rilasciato da una CA attendibile:

  • La notazione è uno strumento di sicurezza della catena di approvvigionamento open source sviluppato dalla community Notary Project e supportato da Microsoft che supporta la firma e la verifica delle immagini del contenitore e di altri artefatti.
  • Azure Key Vault (AKV), un servizio basato sul cloud per la gestione di chiavi crittografiche, segreti e certificati consente di archiviare e gestire in modo sicuro un certificato con una chiave di firma.
  • Il plug-in di notazione Azure Key Vault azure-kv, l'estensione della notazione, usa le chiavi archiviate in Azure Key Vault per firmare e verificare le firme digitali delle immagini e degli artefatti del contenitore.
  • Registro Azure Container consente di allegare queste firme all'immagine firmata e di archiviare e gestire queste immagini del contenitore.

Quando si verifica l'immagine, la firma viene usata per convalidare l'integrità dell'immagine e l'identità del firmatario. Ciò consente di garantire che le immagini del contenitore non vengano manomesse e provengono da un'origine attendibile.

Contenuto dell'articolo:

  • Installare l'interfaccia della riga di comando di notazione e il plug-in Azure Key Vault
  • Creare o importare un certificato emesso da una CA in Azure Key Vault
  • Compilare ed eseguire il push di un'immagine del contenitore con l'attività Registro Azure Container
  • Firmare un'immagine del contenitore con l'interfaccia della riga di comando notazione e il plug-in AKV
  • Verificare una firma dell'immagine del contenitore con l'interfaccia della riga di comando notazione
  • Aggiunta del timestamp

Prerequisiti

Nota

È consigliabile creare un nuovo Azure Key Vault per archiviare solo i certificati.

Installare l'interfaccia della riga di comando di notazione e il plug-in Azure Key Vault

  1. Installare Notation v1.2.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.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. Installare il plug-in di notazione di Azure Key Vault azure-kv v1.2.0 in un ambiente Linux amd64.

    Nota

    Il checksum URL e SHA256 per il plug-in di notazione 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.2.0/notation-azure-kv_1.2.0_linux_amd64.tar.gz --sha256sum 06bb5198af31ce11b08c4557ae4c2cbfb09878dfa6b637b7407ebc2d57b87b34
    
  3. Elencare i plug-in disponibili e verificare che il plug-in azure-kv con versione 1.2.0 sia incluso nell'elenco.

    notation plugin ls
    

Configurare le variabili di ambiente

Nota

Questa guida usa le variabili di ambiente per praticità durante la configurazione di Azure Key Vault e Registro Azure Container. Aggiornare i valori di queste variabili di ambiente per le risorse specifiche.

  1. Configurare le variabili di ambiente per Azure Key Vault e certificati

    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. Configurare le variabili di ambiente per Registro Azure Container e 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 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  
    

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.

Creare o importare un certificato emesso da una CA in Azure Key Vault

Requisiti del certificato

Quando si creano certificati per la firma e la verifica, i certificati devono soddisfare il requisito del certificato Notary Project.

Ecco i requisiti per i certificati radice e intermedi:

  • L'estensione basicConstraints deve essere presente e contrassegnata come critica. Il campo CA deve essere impostato su true.
  • L'estensione keyUsage deve essere presente e contrassegnata come critical. Le posizioni di bit per keyCertSign DEVONO essere impostate.

Ecco i requisiti per i certificati rilasciati da una CA:

  • Proprietà del certificato X.509:
    • L'oggetto deve contenere il nome comune (CN), il paese (C), lo stato o la provincia (ST) e l'organizzazione (O). In questa esercitazione $CERT_SUBJECT viene usato come oggetto.
    • Il flag di utilizzo delle chiavi X.509 deve essere solo DigitalSignature.
    • Gli utilizzi chiavi avanzati (EKU) devono essere vuoti o 1.3.6.1.5.5.7.3.3 (per il Codesigning).
  • Proprietà della chiave:
    • Per poter utilizzare questa proprietà, exportablela proprietà deve essere impostata su false
    • Selezionare un tipo di chiave e una dimensione supportati nella specifica Notary Project.

Importante

Per garantire la corretta integrazione con Integrità immagine, il tipo di contenuto del certificato deve essere impostato su PEM.

Nota

Questa guida usa la versione 1.0.1 del plug-in Azure Key Vault. Le versioni precedenti del plug-in presentavano una limitazione che richiedeva un ordine di certificato specifico in una catena di certificati. La versione 1.0.1 del plug-in non ha questa limitazione, pertanto è consigliabile usare la versione 1.0.1 o successiva.

Creare un certificato rilasciato da una CA

Creare una richiesta di firma del certificato seguendo le istruzioni riportate in Creare una richiesta di firma del certificato.

Importante

Quando si unisce la richiesta di firma del certificato, assicurarsi di unire l'intera catena che ha restituito dal fornitore della CA.

Importare il certificato in AKV

Per importare il certificato:

  1. Ottenere il file del certificato dal fornitore della CA con l'intera catena di certificati.
  2. Importare il certificato in Azure Key Vault seguendo le istruzioni riportate in Importare un certificato.

Nota

Se il certificato non contiene una catena di certificati dopo la creazione o l'importazione, è possibile ottenere i certificati intermedi e radice dal fornitore della CA. È possibile chiedere al fornitore di fornire un file PEM contenente i certificati intermedi (se presenti) e il certificato radice. Questo file può quindi essere usato al passaggio 5 della firma delle immagini del contenitore.

Firmare un'immagine del contenitore con l'interfaccia della riga di comando notazione e il plug-in AKV

Quando si lavora con Registro Azure Container e Azure Key Vault, è essenziale concedere le autorizzazioni appropriate per garantire l'accesso sicuro e controllato. È possibile autorizzare l'accesso per entità diverse, ad esempio entità utente, entità servizio o identità gestite, a seconda degli scenari specifici. In questa esercitazione l'accesso è autorizzato a un utente di Azure connesso.

Creazione dell'accesso a Registro Azure Container

I ruoli AcrPull e AcrPush sono necessari per la compilazione e la firma di immagini del contenitore in Registro Azure Container.

  1. Impostare la sottoscrizione che contiene la risorsa registro Azure Container

    az account set --subscription $ACR_SUB_ID
    
  2. Assegnare i ruoli

    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"
    

Compilare ed eseguire il push di immagini del contenitore nel Registro Azure Container

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

  1. Compilare ed eseguire il push di una nuova immagine con Attività del Registro Azure Container. Usare digest sempre per identificare l'immagine per la firma poiché 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

Creazione dell'accesso a Azure Key Vault

  1. Impostare la sottoscrizione che contiene la risorsa Azure Key Vault

    az account set --subscription $AKV_SUB_ID
    
  2. Assegnare i ruoli

    Se il certificato contiene l'intera catena di certificati, l'entità deve essere assegnata con i ruoli seguenti:

    • Key Vault Secrets User per la lettura dei segreti
    • Key Vault Certificates User per la lettura dei certificati
    • Key Vault Crypto User per le operazioni di firma
    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"
    

    Se il certificato non contiene la catena, l'entità deve essere assegnata con i ruoli seguenti:

    • Key Vault Certificates User per la lettura dei certificati
    • Key Vault Crypto User per le operazioni di firma
    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"
    

Per altre informazioni sull'accesso a Key Vault con il controllo degli accessi in base al ruolo di Azure, vedere Usare un controllo degli accessi in base al ruolo di Azure per la gestione dell'accesso.

Usare i criteri di accesso (legacy)

Per impostare la sottoscrizione contenente le risorse Azure Key Vault, eseguire il comando seguente:

az account set --subscription $AKV_SUB_ID

Se il certificato contiene l'intera catena di certificati, all'entità deve essere concessa l'autorizzazione della chiave Sign, l'autorizzazione del segreto Get e le autorizzazioni del certificato Get. Per concedere queste autorizzazioni all'entità di sicurezza:

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

Se il certificato non contiene la catena, all'entità deve essere concessa l'autorizzazione della chiave Sign e le autorizzazioni del certificato Get. Per concedere queste autorizzazioni all'entità di sicurezza:

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

Per altre informazioni sull'assegnazione di criteri a un'entità di sicurezza, vedere Assegnare criteri di accesso.

Firmare immagini del contenitore usando il certificato in Azure Key Vault

  1. Ottenere l'ID chiave per un certificato. Un certificato in Azure Key Vault può avere più versioni; il comando seguente ottiene l'ID chiave per l'ultima versione del certificato $CERT_NAME.

    KEY_ID=$(az keyvault certificate show -n $CERT_NAME --vault-name $AKV_NAME --query 'kid' -o tsv) 
    
  2. Firmare l'immagine del contenitore con il formato di firma COSE usando l'ID chiave.

    Se il certificato contiene l'intera catena di certificati, eseguire il comando seguente:

    notation sign --signature-format cose $IMAGE --id $KEY_ID --plugin azure-kv 
    

    Se il certificato non contiene la catena, usare il parametro --plugin-config ca_certs=<ca_bundle_file> per passare i certificati CA in un file PEM al plug-in Azure Key Vault, eseguire il comando seguente:

    notation sign --signature-format cose $IMAGE --id $KEY_ID --plugin azure-kv --plugin-config ca_certs=<ca_bundle_file> 
    

    Per eseguire l'autenticazione con Azure Key Vault, per impostazione predefinita, i tipi di credenziali seguenti, se abilitati, verranno provati in ordine:

    Se si vuole specificare un tipo di credenziale, usare una configurazione aggiuntiva del plug-in denominata credential_type. Ad esempio, è possibile impostare in modo esplicito credential_type su azurecli per l'uso delle credenziali dell'interfaccia della riga di comando di Azure, come illustrato di seguito:

    notation sign --signature-format cose --id $KEY_ID --plugin azure-kv --plugin-config credential_type=azurecli $IMAGE
    

    Vedere la tabella seguente per i valori di credential_type per vari tipi di credenziali.

    Tipo di credenziali Valore per credential_type
    Credenziali dell'ambiente environment
    Credenziali dell'identità del carico di lavoro workloadid
    Credenziali dell'identità gestita managedid
    Credenziali dell'interfaccia della riga di comando di Azure azurecli
  3. Visualizzare il grafico delle immagini firmate e delle firme associate.

    notation ls $IMAGE
    

    Nell'esempio di output seguente una firma di tipo application/vnd.cncf.notary.signature identificata dal digest sha256:d7258166ca820f5ab7190247663464f2dcb149df4d1b6c4943dcaac59157de8e è associata all'oggetto $IMAGE.

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

Verificare un'immagine del contenitore con l'interfaccia della riga di comando notazione

  1. Aggiungere il certificato radice a un archivio trust denominato per la verifica della firma. Se il certificato radice non è disponibile, è possibile ottenerlo dalla CA. Nell'esempio seguente viene aggiunto il certificato radice $ROOT_CERT all'archivio attendibilità $STORE_NAME.

    STORE_TYPE="ca" 
    STORE_NAME="wabbit-networks.io" 
    notation cert add --type $STORE_TYPE --store $STORE_NAME $ROOT_CERT  
    
  2. Elencare il certificato radice per verificare che $ROOT_CERT sia stato aggiunto correttamente.

    notation cert ls 
    
  3. Configurare i criteri di attendibilità prima della verifica.

    I criteri di attendibilità consentono agli utenti di specificare criteri di verifica ottimizzati. Usare il comando seguente per configurare i 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"
                ]
            }
        ]
    }
    EOF
    

    Il file precedente trustpolicy.json definisce un criterio di attendibilità denominato wabbit-networks-images. Questo criterio di attendibilità si applica a tutti gli artefatti archiviati nei repository $REGISTRY/$REPO. L'archivio attendibilità $STORE_NAME di tipo $STORE_TYPE con nome contiene i certificati radice. 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à.

  4. Usare notation policy per importare la configurazione dei criteri di attendibilità da trustpolicy.json.

    notation policy import ./trustpolicy.json
    
  5. Visualizzare la configurazione dei criteri di attendibilità per confermare la corretta importazione.

    notation policy show
    
  6. Usare notation verify per verificare l'integrità dell'immagine:

    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. Esempio di output:

    Successfully verified signature for myregistry.azurecr.io/net-monitor@sha256:17cc5dd7dfb8739e19e33e43680e43071f07497ed716814f3ac80bd4aac1b58f

Aggiunta del timestamp

A partire dal rilascio di Notation v1.2.0, Notation supporta timestamping con conformità RFC 3161. Questo miglioramento estende l'attendibilità delle firme create all'interno del periodo di validità del certificato considerando attendibile l'Autorità di timestamp (TSA), abilitando la verifica della firma corretta anche dopo la scadenza del certificato. Come firmatario di immagini, è necessario assicurarsi di firmare immagini del contenitore con timestamp generati da una TSA attendibile. Come verificatore di immagini, per verificare i timestamp, è necessario assicurarsi di considerare attendibile sia il firmatario dell'immagine che la TSA associata e stabilire l'attendibilità tramite archivi e criteri di attendibilità. Il timestamping riduce i costi eliminando la necessità di firmare periodicamente le immagini a causa della scadenza del certificato, un aspetto particolarmente critico quando si usano certificati di breve durata. Per istruzioni dettagliate su come firmare e verificare l'uso del timestamping, fare riferimento alla Guida al timestamping di Notary Project.

Domande frequenti

  • Cosa devo fare se il certificato è scaduto?

    Se il certificato è scaduto, è necessario ottenerne uno nuovo da un fornitore CA attendibile insieme a una nuova chiave privata. Non è possibile usare un certificato scaduto per firmare le immagini del contenitore. Per le immagini firmate prima della scadenza del certificato, potrebbero comunque essere convalidate correttamente se sono state firmate con timestamp. Senza timestamp, la verifica della firma avrà esito negativo e sarà necessario firmare nuovamente tali immagini con il nuovo certificato perché la verifica sia eseguita correttamente.

  • Cosa devo fare se il certificato viene revocato?

    Se il certificato viene revocato, invalida la firma. Ciò può verificarsi per diversi motivi, ad esempio la chiave privata compromessa o le modifiche nell'affiliazione del titolare del certificato. Per risolvere questo problema, è innanzitutto necessario assicurarsi che il codice sorgente e l'ambiente di compilazione siano aggiornati e sicuri. Compilare quindi immagini del contenitore dal codice sorgente, ottenere un nuovo certificato da un fornitore di CA attendibile insieme a una nuova chiave privata e firmare nuove immagini del contenitore con il nuovo certificato seguendo questa guida.

Passaggi successivi

La notazione fornisce anche soluzioni CI/CD nel flusso di lavoro di Azure Pipeline e GitHub Actions:

Per convalidare la distribuzione di immagini firmate nel servizio Azure Kubernetes o in Kubernetes: