Condividi tramite


Firmare e verificare un'immagine del contenitore con notazione in Azure Pipeline

L'attività Notation in Azure DevOps è un'attività predefinita per firmare e verificare le immagini del contenitore e altri artefatti OCI (Open Container Initiative) all'interno di una pipeline di Azure. L'attività Notation usa l'interfaccia della riga di comando notazione per eseguire queste operazioni, assicurandosi che gli artefatti siano firmati da un'entità attendibile e non siano stati manomessi dopo la creazione.

L'articolo illustra la creazione di una pipeline di Azure che compila un'immagine del contenitore, lo inserisce in Registro Azure Container e aggiunge firme usando Notation e il plug-in Azure Key Vault che fornisce un livello di sicurezza e integrità per gli artefatti. L'obiettivo della pipeline è:

  1. Compilare un'immagine del contenitore ed eseguirne il push in Registro Azure Container (Registro Azure Container).
  2. Firmare l'immagine con il plug-in Notation e Notation di Azure Key Vault. La firma viene quindi inserita automaticamente in Registro Azure Container.

Prerequisiti

  • Creare un insieme di credenziali delle chiavi in Azure Key Vault e generare una chiave e un certificato di firma autofirmato. È possibile usare questo documento per creare una chiave autofirmato e un certificato a scopo di test. Se si dispone di un certificato rilasciato dalla CA, fare riferimento a questo documento per informazioni dettagliate.
  • Creare un Registro di sistema in Registro Azure Container (Registro Azure Container).
  • Assicurarsi di avere un repository Azure DevOps o un repository GitHub.

Creare Connessione del servizio

Creare una connessione al servizio in Azure Pipelines, che consente alla pipeline di accedere a servizi esterni come Registro Azure Container (Registro Azure Container), è possibile seguire questa procedura:

  • Accedere a un'immagine in Registro Azure Container (Registro Azure Container) usando le credenziali del Registro Azure Container.

  • Usare l'attività Docker in Azure Pipelines per accedere al Registro Azure Container. L'attività Docker è un'attività predefinita in Azure Pipelines che consente di compilare, eseguire il push e il pull di immagini Docker, tra le altre cose.

  • Stabilire una connessione al servizio Registro Docker in Azure Pipeline per concedere alle attività di notazione l'accesso al Registro Azure Container, come indicato di seguito:

    1. Accedere all'organizzazione (https://dev.azure.com/{yourorganization}) e selezionare il progetto.
    2. Selezionare il pulsante Impostazioni nell'angolo inferiore sinistro.
    3. Passare a Pipeline e quindi selezionare Connessione al servizio.
    4. Scegliere Nuova connessione al servizio e selezionare Registro Docker.
    5. Scegliere quindi Registro Azure Container.
    6. Scegliere Entità servizio nel tipo di autenticazione e immettere i dettagli dell'entità servizio, tra cui la sottoscrizione di Azure e il Registro Azure Container.
    7. Immettere un nome di Connessione descrittivo da usare quando si fa riferimento a questa connessione al servizio.
  • Creare una connessione al servizio Azure Resource Manager in Azure Pipelines per autorizzare l'accesso ad Azure Key Vault:

    1. Scegliere Entità servizio (automatico).
    2. Scegliere quindi Sottoscrizione e trovare la sottoscrizione di Azure dall'elenco a discesa.
    3. Scegliere un gruppo di risorse disponibile nell'elenco a discesa.
    4. Immettere un nome di connessione del servizio descrittivo da usare quando si fa riferimento a questa connessione al servizio.
    5. Salvarlo per completare la creazione.
  • Concedere i criteri di accesso all'entità servizio seguendo questa procedura:

    1. Aprire la connessione al servizio Azure Resource Manager creata e fare clic su Gestisci entità servizio per immettere il portale dell'entità servizio di Azure.
    2. Copiare Application (client) ID. Verrà usato per concedere l'autorizzazione per l'entità servizio.
    3. Aprire il portale di Azure Key Vault e immettere la pagina Criteri di accesso.
    4. Creare un nuovo criterio di accesso con key signl'autorizzazione e secret getcertificate get .
    5. Concedere questo nuovo criterio di accesso a un'entità servizio usando il Application (client) ID comando Incolla del passaggio precedente.
    6. Salvarlo per completare la creazione.

Altre informazioni sulla connessione al servizio sono disponibili qui.

Creare una pipeline e usare l'attività Notation

Creare una pipeline di Azure per il repository Git seguendo questa procedura:

  1. Passare al progetto nell'organizzazione AOD.
  2. Passare a Pipeline dal menu a sinistra e quindi selezionare Nuova pipeline.
  3. Scegliere il repository Git. Per praticità, viene usato il repository Di Azure DevOps.
  4. Configurare la pipeline con una pipeline di avvio se non si ha una novità di Azure DevOps. Esaminare e creare la pipeline facendo clic su Salva ed esegui.

Nota

Nell'esempio si presuppone che il ramo predefinito sia main. In caso contrario, seguire la guida per aggiornare il ramo predefinito.

Esistono due modi per aggiungere attività di notazione modificando la pipeline di Azure:

Usare il pannello Azure DevOps (ADO): il pannello ADO fornisce un'interfaccia utente in cui è possibile aggiungere attività alla pipeline. È possibile cercare le attività notazione e aggiungerle alla pipeline usando questa interfaccia.

Copiare da un file di Azure Pipeline di esempio: se si dispone di un file di Azure Pipeline di esempio che include già attività di notazione, è possibile copiare queste attività dal file di esempio e incollarle nel file della pipeline.

Opzione 1: Usare il pannello di modifica di Azure DevOps (ADO)

Cercare l'attività Docker nel pannello di modifica della pipeline sul lato destro. Usare il login comando con la connessione al servizio Registro Docker per eseguire l'autenticazione con Registro Azure Container.

  1. Scegliere la connessione al servizio Registro Docker creata nel passaggio precedente dall'elenco a discesa Registro Contenitori.
  2. Scegliere login dall'elenco a discesa Comando .
  3. Fare clic su Aggiungi per aggiungere l'attività Docker con login il comando al file della pipeline a sinistra.

Analogamente, cercare di nuovo l'attività Docker dal pannello di modifica della pipeline. Usare il buildAndPush comando per compilare automaticamente il codice sorgente in un'immagine ed eseguirne il push nel repository del Registro Azure Container di destinazione. Verrà generato un digest immagine che verrà usato per l'accesso nel passaggio successivo.

  1. Immettere il nome del repository nel repository container.
  2. Scegliere buildAndPush dall'elenco a discesa Comando .
  3. Specificare il percorso del file Dockerfile. Ad esempio, usare ./Dockerfile se il Dockerfile viene archiviato nella cartella radice.
  4. Fare clic su Aggiungi per aggiungere l'attività Docker con buildAndPush il comando al file della pipeline a sinistra.

Cercare l'attività Notation nel pannello di modifica della pipeline sul lato destro.

  1. Scegliere Installa dal comando elenco a discesa da eseguire.
  2. Fare clic su Aggiungi per aggiungere l'attività notation install alla pipeline.
  3. Analogamente, cercare di nuovo l'attività Notation dal pannello di modifica della pipeline e scegliere Firma.
  4. È possibile ignorare i riferimenti a Artifact poiché si firma un'immagine usando il digest più recente compilato ed eseguito il push nel Registro di sistema da un'attività Docker. È invece possibile specificare manualmente un digest usando <registry_host>/<repository>@<digest>.
  5. Compilare la configurazione del plug-in nel modulo. Useremo il plug-in AKV predefinito e la connessione al servizio creata nel passaggio precedente. Copiare l'ID chiave da AKV nell'ID chiave.
  6. Selezionare la casella Certificato autofirmato perché viene usato un certificato autofirmato per praticità. È invece possibile immettere il percorso del file del certificato nel percorso del file del bundle di certificati se si vuole usare un certificato rilasciato da una CA.
  7. Fare clic su Aggiungi per aggiungere l'oggetto notation sign al file della pipeline a sinistra.

Opzione 2: Modificare un file di Azure Pipeline di esempio

  1. Se si ha familiarità con Azure Pipelines e notazione, è consigliabile iniziare con un file di pipeline modello.
  2. Copiare il modello di pipeline fornito nel documento nel file della pipeline. Questo modello è progettato per usare le attività notazione, usate per firmare e verificare le immagini del contenitore.
  3. Dopo aver copiato il modello, compilare i valori richiesti in base ai riferimenti e ai commenti forniti di seguito.
Vedere il modello di attività di firma dell'opzione 1 (Fare clic qui).
trigger:
 - main
pool: 
  vmImage: 'ubuntu-latest'

steps:
# log in to registry
- task: Docker@2
  inputs:
    containerRegistry: <your_docker_registry_service_connection>
    command: 'login'
# build and push artifact to registry
- task: Docker@2
  inputs:
    repository: <your_repository_name>
    command: 'buildAndPush'
    Dockerfile: './Dockerfile'
# install notation
- task: Notation@0
  inputs:
    command: 'install'
    version: '1.1.0'
# automatically detect the artifact pushed by Docker task and sign the artifact.
- task: Notation@0
  inputs:
    command: 'sign'
    plugin: 'azureKeyVault'
    akvPluginVersion: <azure_key_vault_plugin_version>
    azurekvServiceConection: <your_akv_service_connection>
    keyid: <your_key_id>
    selfSigned: true

Nota

Oltre a usare l'attività Docker, è possibile firmare un digest immagine specificato specificando manualmente un riferimento all'artefatto in artifactRefs come indicato di seguito.

Vedere l'esempio (fare clic qui).
# sign the artifact
- task: Notation@0
  inputs:
    artifactRefs: '<registry_host>/<repository>@<digest>'
    command: 'sign'
    plugin: 'azureKeyVault'
    akvPluginVersion: <azure_key_vault_plugin_version>
    azurekvServiceConection: <akv_service_connection>
    keyid: <key_id>
    selfSigned: true

Attivare la pipeline

Seguire la procedura per eseguire una pipeline in Azure DevOps e verificarne l'esecuzione.

  1. Dopo aver compilato gli input nella pipeline, salvarlo ed eseguirlo per attivare la pipeline.
  2. Passare alla pagina Processo della pipeline in esecuzione. Qui è possibile visualizzare l'esecuzione di ogni passaggio. Questa pipeline creerà e firmerà la build più recente o il digest specificato, quindi eseguirà il push dell'immagine firmata insieme alla firma associata al Registro di sistema.
  3. Al termine dell'esecuzione, è possibile visualizzare l'immagine inserita nel Registro Azure Container (ACR) con una firma di formato CBOR Object Signing and Encryption (CO edizione Standard) collegata.

Verificare l'immagine firmata

Analogamente, per verificare l'immagine firmata, è possibile usare il pannello di modifica o modificare il file della pipeline per aggiungere l'attività di notazione verify alla pipeline. La pipeline verificherà l'immagine firmata con i criteri di attendibilità e l'archivio attendibilità specificati.

Preparare i criteri di attendibilità della notazione e l'archivio attendibilità

In generale, il verificatore è diverso dal firmatario. A scopo dimostrativo, viene usata la stessa pipeline e lo stesso repository ADO in questo esempio. Seguire questa procedura per creare criteri di attendibilità notazione, archivio attendibilità e aggiungere l'attività verify nella pipeline:

  1. Nel repository ADO corrente creare una cartella .pipeline di esempio per archiviare i criteri di attendibilità .pipeline/trustpolicy/della notazione. Creare un file trustpolicy.jsonJSON dei criteri di attendibilità di esempio. Compilare il modello di criteri di attendibilità con i propri valori e salvarlo nella cartella .

Nota

Si noti che l'archivio attendibilità della notazione supporta attualmente tre tipi di identità, tra cui autorità di certificazione (CA), SigningAuthority e certificati radice TSA .Notation Trust Store supporta attualmente tre tipi di identità, tra cui Autorità di certificazione (CA), SigningAuthority e TimeStamping Authority (TSA). A scopo dimostrativo, viene usata l'autorità di certificazione (CA) x509/ca nei criteri di attendibilità e nell'archivio attendibilità riportato di seguito. Per informazioni dettagliate, vedere Archivio attendibilità .

Vedere il modello di criteri di attendibilità (fare clic qui).
{
    "version": "1.0",
    "trustPolicies": [
        {
            "name": "<yourPolicyName>",
            "registryScopes": [ "<yourRegistry>.azurecr.io/<yourArtifact>" ],
            "signatureVerification": {
                "level" : "strict" 
            },
            "trustStores": [ "ca:<yourTrustStore>"],
            "trustedIdentities": [
                "*"
            ]
        }
    ]
}
  1. Nel repository ADO corrente creare una nuova cartella per l'archivio /.pipeline/truststore/x509/ca/$<yourTrustStore>/ attendibilità notazione per archiviare il certificato. Se sono stati seguiti i passaggi di firma in questo documento per firmare l'immagine, usare il comando seguente per scaricare il certificato autofirmato da Azure Key Vault (AKV):
KEY_NAME=<key_name_you_picked_when_creating_the_key>
AKV_NAME=<akv_name_where_certificate_is_stored>
CERT_ID=$(az keyvault certificate show -n $KEY_NAME --vault-name $AKV_NAME --query 'id' -o tsv)
CERT_PATH=./${KEY_NAME}.pem
az keyvault certificate download --file $CERT_PATH --id $CERT_ID --encoding PEM
  1. Caricare il certificato nella cartella dell'archivio attendibilità /.pipeline/truststore/x509/ca/$<yourTrustStore>/ creata nell'ultimo passaggio.

Aggiungere un'attività di verifica della notazione

  1. Cercare di nuovo l'attività Notation dal pannello di modifica della pipeline e scegliere Verifica.
  2. Compilare i riferimenti all'elemento con il digest dell'immagine firmata.
  3. Immettere il valore .pipeline/trustpolicy/trustpolicy.json nel percorso del file dei criteri di attendibilità.
  4. Immettere il valore .pipeline/truststore/ nel percorso della cartella dell'archivio attendibilità.
  5. Fare clic su Aggiungi per aggiungere la verifica della notazione al file della pipeline a sinistra.

L'oggetto notation verify verrà salvato nel modo seguente.

Vedere l'esempio (fare clic qui).
# sign the artifact
- task: Notation@0
  inputs:
    command: 'verify'
    artifactRefs: '<registry_host>/<repository>@<digest>'
    trustPolicy: .pipeline/trustpolicy.json
    trustStore: .pipeline/truststore/

Attivare la pipeline (aggiornata)

È possibile attivare di nuovo la pipeline per verificare l'immagine firmata. Al termine dell'esecuzione, è possibile visualizzare i log dalla pagina Processo della pipeline in esecuzione. La pipeline verificherà l'immagine firmata con i criteri di attendibilità e l'archivio attendibilità specificati.

Conclusione

Questo articolo illustra come firmare e verificare un'immagine del contenitore con notazione in Azure Pipeline. È possibile usare il pannello Azure DevOps o modificare il file della pipeline per aggiungere attività di notazione alla pipeline. La pipeline creerà, eseguirà il push, firma e verificherà l'immagine con i criteri di attendibilità e l'archivio attendibilità forniti. Questo processo garantisce che gli artefatti siano firmati da un'entità attendibile e non siano stati manomessi dopo la creazione.