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
eAKS-AzurePolicyExternalData
della funzione e registrati sulla sottoscrizione Azure. Registrare i flag di funzionalità usando i comandi seguenti:Registrare i flag
EnableImageIntegrityPreview
eAKS-AzurePolicyExternalData
di funzionalità usando il comandoaz 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.
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"
Quando lo stato diventa Registrato, aggiornare la registrazione del provider di risorse
Microsoft.ContainerService
usando il comandoaz 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
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:
- Riconcilia i certificati di Azure Key Vault in base alla configurazione configurata tramite
Ratify
CRL. - 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).
- Determina se l'immagine di destinazione è firmata con un certificato attendibile e quindi considerata attendibile.
AzurePolicy
eGatekeeper
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 comandoaz policy assignment create
.export SCOPE="/subscriptions/${SUBSCRIPTION}/resourceGroups/${RESOURCE_GROUP}" export LOCATION=$(az group show --name ${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 --name 'deploy-trustedimages' --scope ${SCOPE} --query id -o tsv)
az policy remediation create --policy-assignment "$assignment_id" --definition-reference-id deployAKSImageIntegrity --name remediation --resource-group ${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.
Creare un
VerifyConfig
file 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: - "*"
Applicare l'oggetto
VerifyConfig
al cluster usando il comandokubectl 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 --resource-group myResourceGroup --name 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).
Azure Kubernetes Service