Usare l'integrità delle immagini per convalidare le immagini firmate prima di distribuirle nei cluster del servizio Azure Kubernetes (anteprima)

Il servizio Azure Kubernetes e il modello di contenitore sottostante offrono una maggiore scalabilità e gestibilità per le applicazioni native del cloud. Con il servizio Azure Kubernetes è possibile avviare applicazioni software flessibili in base alle esigenze di runtime del sistema. Tuttavia, questa flessibilità può introdurre nuove sfide.

In questi ambienti dell'applicazione, l'uso di immagini del contenitore firmate consente di verificare che le distribuzioni vengano compilate da un'entità attendibile e che le immagini non siano state manomesse dopo la creazione. L'integrità delle immagini è un servizio che consente di aggiungere una definizione predefinita di Criteri di Azure per verificare che solo le immagini firmate vengano distribuite nei cluster del servizio Azure Kubernetes.

Nota

L'integrità dell'immagine è una funzionalità basata sulla ratifica. In un cluster del servizio Azure Kubernetes il nome della funzionalità e il nome della proprietà sono ImageIntegrity, mentre i nomi dei pod di integrità dell'immagine pertinenti contengono Ratify.

Importante

Le funzionalità di anteprima del servizio Azure Kubernetes sono disponibili in modalità self-service e opzionale. Le anteprime vengono fornite “così come sono” e ”come disponibili” e sono escluse dai contratti di servizio e dalla garanzia limitata. Le anteprime del servizio Azure Kubernetes sono parzialmente coperte dal supporto clienti con la massima diligenza possibile. Di conseguenza, queste funzionalità non sono destinate all'uso in produzione. Per altre informazioni, vedere gli articoli di supporto seguenti:

Prerequisiti

  • Una sottoscrizione di Azure. Se non hai una sottoscrizione Azure, crea un account gratuito.

  • Interfaccia della riga di comando di Azure o Azure PowerShell.

  • aks-preview Versione estesa dell’interfaccia della riga di comando 0.5.96 o successiva.

  • Assicurarsi che il componente aggiuntivo Criteri di Azure per il servizio Azure Kubernetes sia abilitato nel cluster. Se questo componente aggiuntivo non è installato, vedere Installare il componente aggiuntivo Criteri di Azure per il servizio Azure Kubernetes.

  • Un cluster del servizio Azure Kubernetes abilitato con autorità di certificazione OIDC. Per creare un nuovo cluster o aggiornare un cluster esistente, vedere Configurare un cluster del servizio Azure Kubernetes con autorità di certificazione OIDC .

  • I flag EnableImageIntegrityPreview e AKS-AzurePolicyExternalData della funzione e registrati sulla sottoscrizione Azure. Registrare i flag di funzionalità usando i comandi seguenti:

    1. Registrare i flag EnableImageIntegrityPreview e AKS-AzurePolicyExternalData di funzionalità usando il comando az feature register.

      # Register the EnableImageIntegrityPreview feature flag
      az feature register --namespace "Microsoft.ContainerService" --name "EnableImageIntegrityPreview"
      
      # Register the AKS-AzurePolicyExternalData feature flag
      az feature register --namespace "Microsoft.ContainerService" --name "AKS-AzurePolicyExternalData"
      

      Potrebbero essere necessari alcuni minuti prima che lo stato venga visualizzato come Registrato.

    2. Verificare lo stato della registrazione usando il comando az feature show.

      # Verify the EnableImageIntegrityPreview feature flag registration status
      az feature show --namespace "Microsoft.ContainerService" --name "EnableImageIntegrityPreview"
      
      # Verify the AKS-AzurePolicyExternalData feature flag registration status
      az feature show --namespace "Microsoft.ContainerService" --name "AKS-AzurePolicyExternalData"
      
    3. Quando lo stato diventa Registrato, aggiornare la registrazione del provider di risorse Microsoft.ContainerService usando il comando az provider register.

      az provider register --namespace Microsoft.ContainerService
      

Considerazioni e limitazioni

  • I cluster del servizio Azure Kubernetes devono eseguire Kubernetes versione 1.26 o successiva.
  • Non è consigliabile usare questa funzionalità per i registri o i carichi di lavoro del Registro Azure Container di produzione.
  • L'integrità dell'immagine supporta un massimo di 200 firme univoche contemporaneamente a livello di cluster.
  • La notazione è l'unico verificatore supportato.
  • Audit è l'unico effetto dei criteri di verifica supportato.

Funzionamento dell'integrità delle immagini

Screenshot showing the basic architecture for Image Integrity.

L'integrità delle immagini usa La convalida, Criteri di Azure e Gatekeeper per convalidare le immagini firmate prima di distribuirle nei cluster del servizio Azure Kubernetes. L'abilitazione dell'integrità delle immagini nel cluster distribuisce un pod Ratify. Il pod Ratify esegue le attività seguenti:

  1. Riconcilia i certificati di Azure Key Vault in base alla configurazione configurata tramite Ratify CRL.
  2. Accede alle immagini archiviate in Registro Azure Container quando le richieste di convalida provengono da Criteri di Azure . Per abilitare questa esperienza, Criteri di Azure estende Gatekeeper, un webhook del controller di ammissione per Open Policy Agent (OPA).
  3. Determina se l'immagine di destinazione è firmata con un certificato attendibile e quindi considerata attendibile.
  4. AzurePolicy e Gatekeeper utilizzano i risultati della convalida come stato di conformità per decidere se consentire la richiesta di distribuzione.

Abilitare l'integrità delle immagini nel cluster del servizio Azure Kubernetes

Nota

La verifica della firma delle immagini è uno scenario orientato alla governance e usa Criteri di Azure per verificare le firme delle immagini nei cluster del servizio Azure Kubernetes su larga scala. È consigliabile usare l'iniziativa predefinita Di Criteri di Azure per l'integrità delle immagini del servizio Azure Kubernetes, disponibile nella libreria di definizioni predefinita di Criteri di Azure .

  • Creare un'assegnazione di criteri con l'iniziativa dei criteri del servizio Azure Kubernetes [Preview]: Use Image Integrity to ensure only trusted images are deployed usando il comando az policy assignment create.

    export SCOPE="/subscriptions/${SUBSCRIPTION}/resourceGroups/${RESOURCE_GROUP}"
    export LOCATION=$(az group show -n ${RESOURCE_GROUP} --query location -o tsv)
    
    az policy assignment create --name 'deploy-trustedimages' --policy-set-definition 'af28bf8b-c669-4dd3-9137-1e68fdc61bd6' --display-name 'Audit deployment with unsigned container images' --scope ${SCOPE} --mi-system-assigned --role Contributor --identity-scope ${SCOPE} --location ${LOCATION}
    

    Il pod Ratify viene distribuito dopo aver abilitato la funzionalità.

Nota

Il criterio distribuisce la funzionalità Integrità immagine nel cluster quando rileva qualsiasi operazione di aggiornamento nel cluster. Se si vuole abilitare immediatamente la funzionalità, è necessario creare una correzione dei criteri usando il comando az policy remediation create.

assignment_id=$(az policy assignment show -n 'deploy-trustedimages' --scope ${SCOPE} --query id -o tsv)
az policy remediation create  -a "$assignment_id" --definition-reference-id deployAKSImageIntegrity -n remediation -g ${RESOURCE_GROUP}

Configurare le configurazioni di verifica

Affinché l'integrità dell'immagine verifichi correttamente l'immagine firmata di destinazione, è necessario configurare le configurazioni Ratify tramite CDRK8s usando kubectl.

In questo articolo viene usato un certificato ca autofirmato dalla documentazione ufficiale sulla ratifica per configurare le configurazioni di verifica. Per altri esempi, vedere CrD di ratifica.

  1. Creare un VerifyConfigfile denominatoverify-config.yaml e copiarlo nel codice YAML seguente:

    apiVersion: config.ratify.deislabs.io/v1beta1
    kind: CertificateStore
    metadata:
      name: certstore-inline
    spec:
      provider: inline
      parameters:
        value: |
          -----BEGIN CERTIFICATE-----
          MIIDQzCCAiugAwIBAgIUDxHQ9JxxmnrLWTA5rAtIZCzY8mMwDQYJKoZIhvcNAQEL
          BQAwKTEPMA0GA1UECgwGUmF0aWZ5MRYwFAYDVQQDDA1SYXRpZnkgU2FtcGxlMB4X
          DTIzMDYyOTA1MjgzMloXDTMzMDYyNjA1MjgzMlowKTEPMA0GA1UECgwGUmF0aWZ5
          MRYwFAYDVQQDDA1SYXRpZnkgU2FtcGxlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
          MIIBCgKCAQEAshmsL2VM9ojhgTVUUuEsZro9jfI27VKZJ4naWSHJihmOki7IoZS8
          3/3ATpkE1lGbduJ77M9UxQbEW1PnESB0bWtMQtjIbser3mFCn15yz4nBXiTIu/K4
          FYv6HVdc6/cds3jgfEFNw/8RVMBUGNUiSEWa1lV1zDM2v/8GekUr6SNvMyqtY8oo
          ItwxfUvlhgMNlLgd96mVnnPVLmPkCmXFN9iBMhSce6sn6P9oDIB+pr1ZpE4F5bwa
          gRBg2tWN3Tz9H/z2a51Xbn7hCT5OLBRlkorHJl2HKKRoXz1hBgR8xOL+zRySH9Qo
          3yx6WvluYDNfVbCREzKJf9fFiQeVe0EJOwIDAQABo2MwYTAdBgNVHQ4EFgQUKzci
          EKCDwPBn4I1YZ+sDdnxEir4wHwYDVR0jBBgwFoAUKzciEKCDwPBn4I1YZ+sDdnxE
          ir4wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAgQwDQYJKoZIhvcNAQEL
          BQADggEBAGh6duwc1MvV+PUYvIkDfgj158KtYX+bv4PmcV/aemQUoArqM1ECYFjt
          BlBVmTRJA0lijU5I0oZje80zW7P8M8pra0BM6x3cPnh/oZGrsuMizd4h5b5TnwuJ
          hRvKFFUVeHn9kORbyQwRQ5SpL8cRGyYp+T6ncEmo0jdIOM5dgfdhwHgb+i3TejcF
          90sUs65zovUjv1wa11SqOdu12cCj/MYp+H8j2lpaLL2t0cbFJlBY6DNJgxr5qync
          cz8gbXrZmNbzC7W5QK5J7fcx6tlffOpt5cm427f9NiK2tira50HU7gC3HJkbiSTp
          Xw10iXXMZzSbQ0/Hj2BF4B40WfAkgRg=
          -----END CERTIFICATE-----
    ---
    apiVersion: config.ratify.deislabs.io/v1beta1
    kind: Store
    metadata:
      name: store-oras
    spec:
      name: oras
    # If you want to you use Workload Identity for Ratify to access Azure Container Registry,
    # uncomment the following lines, and fill the proper ClientID:
    # See more: https://ratify.dev/docs/reference/oras-auth-provider
    # parameters:
    #  authProvider:
    #    name: azureWorkloadIdentity
    #    clientID: XXX
    ---
    apiVersion: config.ratify.deislabs.io/v1beta1
    kind: Verifier
    metadata:
      name: verifier-notary-inline
    spec:
      name: notation
      artifactTypes: application/vnd.cncf.notary.signature
      parameters:
        verificationCertStores:  # certificates for validating signatures
          certs: # name of the trustStore
            - certstore-inline # name of the certificate store CRD to include in this trustStore
        trustPolicyDoc: # policy language that indicates which identities are trusted to produce artifacts
          version: "1.0"
          trustPolicies:
            - name: default
              registryScopes:
                - "*"
              signatureVerification:
                level: strict
              trustStores:
                - ca:certs
              trustedIdentities:
                - "*"
    
  2. Applicare l'oggetto VerifyConfig al cluster usando il comando kubectl apply.

    kubectl apply -f verify-config.yaml
    

Distribuire immagini di esempio nel cluster del servizio Azure Kubernetes

  • Distribuire un'immagine firmata usando il comando kubectl run demo.

    kubectl run demo-signed --image=ghcr.io/deislabs/ratify/notary-image:signed 
    

    L'output di esempio seguente mostra che Image Integrity consente la distribuzione:

    ghcr.io/deislabs/ratify/notary-image:signed
    pod/demo-signed created
    

Per usare immagini personalizzate, vedere le indicazioni per la firma delle immagini.

Disabilitare l'integrità dell'immagine

  • Disabilitare l'integrità dell'immagine nel cluster usando il comando az aks update con il flag --disable-image-integrity.

    az aks update -g myResourceGroup -n MyManagedCluster --disable-image-integrity
    

Rimuovere l'iniziativa dei criteri

  • Rimuovere l'iniziativa di criteri usando il comando az policy assignment delete.

    az policy assignment delete --name 'deploy-trustedimages'
    

Passaggi successivi

In questo articolo si è appreso come usare l'integrità delle immagini per convalidare le immagini firmate prima di distribuirle nei cluster del servizio Azure Kubernetes. Per informazioni su come firmare i propri contenitori, vedere Creare, firmare e verificare le immagini del contenitore usando Notary e Azure Key Vault (anteprima).