Condividi tramite


Firmare le immagini di container con Notation e Trusted Signing (anteprima)

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.

Questo articolo è incentrato sulla firma usando gli strumenti Notary Project, Notation e Trusted Signing:

  • Cosa si apprenderà qui: Come usare l'interfaccia della riga di comando Notation per firmare gli artefatti tramite Trusted Signing.
  • Dove si adatta: la firma attendibile è un'alternativa ad Azure Key Vault. Anche se Key Vault offre alle organizzazioni il controllo completo della gestione del ciclo di vita dei certificati, la firma attendibile offre un'esperienza di firma semplificata con la gestione del ciclo di vita dei certificati zero-touch e i certificati di breve durata.
  • Perché è importante: la firma attendibile semplifica l'esperienza di sviluppo offrendo al tempo stesso un'elevata garanzia di identità. Aiuta i team a ridurre la complessità operativa senza compromettere la sicurezza.

Prerequisiti

Prima di poter firmare e verificare le immagini del contenitore usando notazione e firma attendibile, è necessario configurare le risorse di Azure necessarie e installare gli strumenti necessari. Questa sezione illustra come preparare Registro Azure Container, configurare la firma attendibile e configurare l'interfaccia della riga di comando di Azure come ambiente di sviluppo.

Annotazioni

Attualmente, la firma attendibile è disponibile solo per le organizzazioni che si trovano negli Stati Uniti e in Canada che hanno una cronologia verificabile di tre anni o più.

Preparare le immagini del contenitore in Registro Azure Container

  1. Creare o utilizzare un registro di contenitori per archiviare immagini di contenitori, artefatti OCI e firme.
  2. Eseguire il push o utilizzare un'immagine del contenitore nel registro contenitori.

Configurare la firma attendibile

Configurare un account di firma attendibile e un profilo certificato nella sottoscrizione di Azure.

Il profilo certificato deve includere paese/area geografica (C), stato o provincia (ST o S) e organizzazione (O) nell'oggetto del certificato. La specificazione Notary Project richiede questi campi.

Configurare l'interfaccia della riga di comando di Azure

Installare l'interfaccia della riga di comando di Azure o usare Azure Cloud Shell.

Installare il CLI di Notation e il plug-in di firma attendibile

Questa guida esegue comandi in Linux AMD64 e Windows come esempi.

  1. Installare Notation CLI v1.3.2:

    curl -Lo notation.tar.gz https://github.com/notaryproject/notation/releases/download/v1.3.2/notation_1.3.2_linux_amd64.tar.gz
    # Validate the checksum
    EXPECTED_SHA256SUM="e1a0f060308086bf8020b2d31defb7c5348f133ca0dba6a1a7820ef3cbb6dfe5"
    echo "$EXPECTED_SHA256SUM  notation.tar.gz" | sha256sum -c -
    # Continue if sha256sum matches
    tar xvzf notation.tar.gz
    cp ./notation /usr/local/bin
    

    Per altre piattaforme, vedere la guida all'installazione della notazione.

  2. Installare il plug-in di firma affidabile:

    notation plugin install --url "https://github.com/Azure/trustedsigning-notation-plugin/releases/download/v1.0.0-beta.1/notation-azure-trustedsigning_1.0.0-beta.1_linux_amd64.tar.gz" --sha256sum 538b497be0f0b4c6ced99eceb2be16f1c4b8e3d7c451357a52aeeca6751ccb44
    

    Per trovare l'URL del plug-in più recente e il checksum, visita la pagina di rilascio.

  3. Verificare l'installazione del plug-in:

    notation plugin ls
    

    Output di esempio:

    NAME                   DESCRIPTION                                            VERSION   CAPABILITIES                ERROR
    azure-trustedsigning   Sign OCI artifacts using the Trusted Signing Service   0.3.0     [SIGNATURE_GENERATOR.RAW]   <nil>
    

Configurare le variabili di ambiente

Impostare le variabili di ambiente seguenti da usare nei comandi successivi. Sostituisci i segnaposto con i valori effettivi.

È possibile trovare i valori obbligatori nel portale di Azure:

  • Per Informazioni sull'account di Firma attendibile, accedere all'account, quindi selezionare Panoramica.
  • Per informazioni sul profilo certificati, passare all'account e quindi selezionare Oggetti>Profili certificato.
# Trusted Signing environment variables
TS_SUB_ID="<subscription-id>"
TS_ACCT_RG=<ts-account-resource-group>
TS_ACCT_NAME=<ts-account-name>
TS_ACCT_URL=<ts-account-url>
TS_CERT_PROFILE=<ts-cert-profile>
TS_CERT_SUBJECT=<ts-cert-subject>
TS_SIGNING_ROOT_CERT="https://www.microsoft.com/pkiops/certs/Microsoft%20Enterprise%20Identity%20Verification%20Root%20Certificate%20Authority%202020.crt"
TS_TSA_URL="http://timestamp.acs.microsoft.com/"
TS_TSA_ROOT_CERT="http://www.microsoft.com/pkiops/certs/microsoft%20identity%20verification%20root%20certificate%20authority%202020.crt"

# Azure Container Registry and image environment variables
ACR_SUB_ID="<acr-subscription-id>"
ACR_RG=<acr-resource-group>
ACR_NAME=<registry-name>
ACR_LOGIN_SERVER=$ACR_NAME.azurecr.io
REPOSITORY=<repository>
TAG=<tag>
IMAGE=$ACR_LOGIN_SERVER/${REPOSITORY}:$TAG

Accedere ad Azure

Usare l'interfaccia della riga di comando di Azure per accedere con l'identità utente:

az login
USER_ID=$(az ad signed-in-user show --query id -o tsv)

Annotazioni

Questa guida illustra l'accesso con un account utente. Per altre opzioni di identità, tra cui un'identità gestita, vedere Eseguire l'autenticazione ad Azure usando l'interfaccia della riga di comando di Azure.

Assegnare le autorizzazioni per Registro Azure Container e firma attendibile

Assegnare all'identità i ruoli necessari per accedere al Registro Container:

  • Per i registri abilitati con il controllo degli accessi in base all'attributo assegnare:
    • Container Registry Repository Reader
    • Container Registry Repository Writer
  • Per i registri non ABAC, assegnare:
    • AcrPull
    • AcrPush
az role assignment create --role "Container Registry Repository Reader" --assignee $USER_ID --scope "/subscriptions/$ACR_SUB_ID/resourceGroups/$ACR_RG/providers/Microsoft.ContainerRegistry/registries/$ACR_NAME"
az role assignment create --role "Container Registry Repository Writer" --assignee $USER_ID --scope "/subscriptions/$ACR_SUB_ID/resourceGroups/$ACR_RG/providers/Microsoft.ContainerRegistry/registries/$ACR_NAME"

Assegnare il ruolo Trusted Signing Certificate Profile Signer all'identità per poter firmare usando Firma attendibile:

az role assignment create --assignee $USER_ID --role "Trusted Signing Certificate Profile Signer" --scope "/subscriptions/$TS_SUB_ID/resourceGroups/$TS_ACCT_RG/providers/Microsoft.CodeSigning/codeSigningAccounts/$TS_ACCT_NAME/certificateProfiles/$TS_CERT_PROFILE"

Firmare un'immagine del contenitore

# Authenticate to Azure Container Registry
az acr login --name $ACR_NAME

# Download the timestamping root certificate
curl -o msft-tsa-root-certificate-authority-2020.crt $TS_TSA_ROOT_CERT

# Sign the image
notation sign --signature-format cose --timestamp-url $TS_TSA_URL --timestamp-root-cert "msft-tsa-root-certificate-authority-2020.crt" --id $TS_CERT_PROFILE --plugin azure-trustedsigning --plugin-config accountName=$TS_ACCT_NAME --plugin-config baseUrl=$TS_ACCT_URL --plugin-config certProfile=$TS_CERT_PROFILE $IMAGE

Spiegazione dei flag chiave:

  • --signature-format cose: usa il formato CBOR Object Signing and Encryption (COSE) per le firme.
  • --timestamp-url: usa il server di timestamp supportato dalla firma attendibile.
  • --plugin-config: passa la configurazione al plug-in Firma attendibile.

Elencare immagini e firme firmate:

notation ls $IMAGE

Output di esempio:

myregistry.azurecr.io/myrepo@sha256:5d0bf1e8f5a0c74a4c22d8c0f962a7cfa06a4f9d8423b196e482df8af23b5d55
└── application/vnd.cncf.notary.signature
    └── sha256:d3a4c9fbc17e27b19a0b28e7b6a33f2c0f541dbdf8d2e5e8d0d79a835e8a76f2a

Verificare un'immagine del contenitore

  1. Scaricare e aggiungere i certificati radice:

    curl -o msft-root-certificate-authority-2020.crt $TS_SIGNING_ROOT_CERT
    SIGNING_TRUST_STORE="myRootCerts"
    notation cert add --type ca --store $SIGNING_TRUST_STORE msft-root-certificate-authority-2020.crt
    
    curl -o msft-tsa-root-certificate-authority-2020.crt $TS_TSA_ROOT_CERT
    TSA_TRUST_STORE="myTsaRootCerts"
    notation cert add -t tsa -s $TSA_TRUST_STORE msft-tsa-root-certificate-authority-2020.crt
    notation cert ls
    

  1. Creare un file JSON dei criteri di attendibilità:

    cat <<EOF > trustpolicy.json
    {
        "version": "1.0",
        "trustPolicies": [
            {
                "name": "myPolicy",
                "registryScopes": [ "$ACR_LOGIN_SERVER/$REPOSITORY" ],
                "signatureVerification": {
                    "level" : "strict"
                },
                "trustStores": [ "ca:$SIGNING_TRUST_STORE", "tsa:$TSA_TRUST_STORE" ],
                "trustedIdentities": [
                    "x509.subject: $TS_CERT_SUBJECT"
                ]
            }
        ]
    }
    EOF
    

    Importare e controllare la politica:

    notation policy import trustpolicy.json
    notation policy show
    

  1. Verificare l'immagine:

    notation verify $IMAGE
    

    Output di esempio:

    Successfully verified signature for myregistry.azurecr.io/myrepo@sha256:5d0bf1e8f5a0c74a4c22d8c0f962a7cfa06a4f9d8423b196e482df8af23b5d55
    

    Se la verifica ha esito negativo, assicurarsi che i criteri di attendibilità e i certificati siano configurati correttamente.