Usare Image Cleaner per pulire le immagini non aggiornate vulnerabili nel cluster del servizio Azure Kubernetes
È comune usare le pipeline per compilare e distribuire immagini nei cluster del servizio Azure Kubernetes. Sebbene sia ideale per la creazione di immagini, questo processo spesso non tiene conto delle immagini non aggiornate lasciate indietro e può causare un aumento delle dimensioni delle immagini nei nodi del cluster. Queste immagini potrebbero contenere vulnerabilità che potrebbero creare problemi di sicurezza. Per rimuovere i rischi di sicurezza nei cluster, è possibile pulire queste immagini senza riferimenti. La pulizia manuale delle immagini può richiedere molto tempo. Image Cleaner esegue l'identificazione e la rimozione automatica delle immagini, riducendo il rischio di immagini non aggiornate e il tempo necessario per pulirle.
Nota
Image Cleaner è una funzionalità basata sullo strumento gomma.
In un cluster del servizio Azure Kubernetes il nome della funzionalità e il nome della proprietà sono Image Cleaner
, mentre i nomi dei pod di Image Cleaner pertinenti contengono Eraser
.
Prerequisiti
- Una sottoscrizione di Azure. Se non hai una sottoscrizione Azure, crea un account gratuito.
- Interfaccia della riga di comando di Azure 2.49.0 o versione successiva. Eseguire
az --version
per trovare la versione in uso. Se è necessario eseguire l'installazione o l'aggiornamento, vedere Installare l'interfaccia della riga di comando di Azure.
Limiti
Image Cleaner non supporta ancora pool di nodi Windows o nodi virtuali del servizio Azure Kubernetes.
Funzionamento di Image Cleaner
Dopo aver abilitato Image Cleaner, verrà distribuito nel cluster un pod di gestione controller denominato eraser-controller-manager
.
Con Image Cleaner è possibile scegliere tra la modalità manuale e automatica e le opzioni di configurazione seguenti:
Opzioni di configurazione
Nome | Descrizione | Richiesto |
---|---|---|
--enable-image-cleaner |
Abilitare la funzionalità Image Cleaner per un cluster del servizio Azure Kubernetes | Sì, a meno che non venga specificata la disabilitazione |
--disable-image-cleaner |
Disabilitare la funzionalità Image Cleaner per un cluster del servizio Azure Kubernetes | Sì, a meno che non venga specificata l'abilitazione |
--image-cleaner-interval-hours |
Questo parametro determina l'intervallo di tempo (in ore) necessario per l’esecuzione di Image Cleaner. Il valore predefinito per l'interfaccia della riga di comando di Azure è una settimana, il valore minimo è 24 ore e il massimo è tre mesi. | Non necessario per l'interfaccia della riga di comando di Azure, obbligatorio per il modello di ARM o altri client |
Modalità automatica
Dopo la distribuzione di eraser-controller-manager
, verranno eseguiti automaticamente i passaggi seguenti:
- Avvia immediatamente il processo di pulizia e crea pod del ruolo di lavoro
eraser-aks-xxxxx
per ogni nodo. - In ogni pod del ruolo di lavoro sono presenti tre contenitori:
- Un agente di raccolta, che raccoglie immagini inutilizzate.
- Uno scanner trivy, che sfrutta trivy per analizzare le vulnerabilità delle immagini.
- Un agente di rimozione che rimuove le immagini con vulnerabilità inutilizzate.
- Al termine del processo di pulizia, il pod del ruolo di lavoro viene eliminato e la successiva pulizia pianificata viene eseguita in base alla
--image-cleaner-interval-hours
definito.
Modalità manuale
È possibile attivare manualmente la pulizia definendo un oggetto CRDImageList
. Viene attivata la eraser-contoller-manager
creazioneeraser-aks-xxxxx
dei pod del ruolo di lavoro per ogni nodo e completato il processo di rimozione manuale.
Nota
La disabilitazione di Image Cleaner non rimuove la configurazione precedente. Ciò significa che se si abilita nuovamente la funzionalità senza passare in modo esplicito la configurazione, viene usato il valore esistente anziché il valore predefinito.
Abilitare Image Cleaner nel cluster del servizio Azure Kubernetes
Abilitare Image Cleaner in un nuovo cluster
Abilitare Image Cleaner in un nuovo cluster del servizio Azure Kubernetes usando il comando
az aks create
con il parametro--enable-image-cleaner
.az aks create \ --resource-group myResourceGroup \ --name myManagedCluster \ --enable-image-cleaner \ --generate-ssh-keys
Abilitare Image Cleaner in un cluster esistente
Abilitare Image Cleaner in un cluster del servizio Azure Kubernetes esistente usando il comando
az aks update
.az aks update \ --resource-group myResourceGroup \ --name myManagedCluster \ --enable-image-cleaner
Aggiornare l'intervallo di Image Cleaner in un cluster nuovo o esistente
Aggiornare l'intervallo di Image Cleaner in un cluster del servizio Azure Kubernetes nuovo o esistente usando il parametro
--image-cleaner-interval-hours
.# Create a new cluster with specifying the interval az aks create \ --resource-group myResourceGroup \ --name myManagedCluster \ --enable-image-cleaner \ --image-cleaner-interval-hours 48 \ --generate-ssh-keys # Update the interval on an existing cluster az aks update \ --resource-group myResourceGroup \ --name myManagedCluster \ --enable-image-cleaner \ --image-cleaner-interval-hours 48
Rimuovere manualmente le immagini con Image Cleaner
Importante
Il name
deve essere impostato su imagelist
.
Rimuovere manualmente un'immagine usando il comando
kubectl apply
seguente. In questo esempio viene rimossa l'immaginedocker.io/library/alpine:3.7.3
se non in uso.cat <<EOF | kubectl apply -f - apiVersion: eraser.sh/v1 kind: ImageList metadata: name: imagelist spec: images: - docker.io/library/alpine:3.7.3 EOF
La pulizia manuale è un'operazione eseguita una sola volta e viene attivata solo quando viene creato un nuovo oggetto imagelist
o vengono apportate modifiche all'oggetto imagelist
esistente. Dopo l'eliminazione dell'immagine, l'oggetto imagelist
non verrà eliminato automaticamente.
Se è necessario attivare un'altra pulizia manuale, è necessario creare un nuovo oggetto imagelist
o apportare modifiche a uno esistente. Se si vuole rimuovere di nuovo la stessa immagine, è necessario creare un nuovo oggetto imagelist
.
Eliminare un oggetto ImageList esistente e crearne uno nuovo
Eliminare l’oggetto
imagelist
esistente usando il comandokubectl delete
.kubectl delete ImageList imagelist
Creare un nuovo oggetto
imagelist
con lo stesso nome di immagine. Nell'esempio seguente viene usata la stessa immagine dell'esempio precedente.cat <<EOF | kubectl apply -f - apiVersion: eraser.sh/v1 kind: ImageList metadata: name: imagelist spec: images: - docker.io/library/alpine:3.7.3 EOF
Modificare un oggetto ImageList esistente
Modificare l'oggetto
imagelist
esistente usando il comandokubectl edit
.kubectl edit ImageList imagelist # Add a new image to the list apiVersion: eraser.sh/v1 kind: ImageList metadata: name: imagelist spec: images: docker.io/library/python:alpine3.18
Quando si usa la modalità manuale, il pod eraser-aks-xxxxx
viene eliminato entro 10 minuti dal completamento del lavoro.
Elenco di esclusione delle immagini
Le immagini specificate nell'elenco di esclusione non vengono rimosse dal cluster. Image Cleaner supporta elenchi di esclusione definiti dall'utente e di sistema. La modifica dell'elenco di esclusione di sistema non è supportata.
Controllare l'elenco di esclusione di sistema
Controllare l'elenco di esclusione di sistema usando il comando
kubectl get
seguente.kubectl get -n kube-system configmap eraser-system-exclusion -o yaml
Creare un elenco di esclusione definito dall'utente
Creare un file JSON di esempio che includa le immagini escluse.
cat > sample.json <<EOF {"excluded": ["excluded-image-name"]} EOF
Creare un oggetto
configmap
usando il file JSON di esempio e il comandokubectl create
ekubectl label
seguente.kubectl create configmap excluded --from-file=sample.json --namespace=kube-system kubectl label configmap excluded eraser.sh/exclude.list=true -n kube-system
Disabilitare Image Cleaner
Disabilitare Image Cleaner nel cluster usando il comando
az aks update
con il parametro--disable-image-cleaner
.az aks update \ --resource-group myResourceGroup \ --name myManagedCluster \ --disable-image-cleaner
Domande frequenti
Come è possibile controllare la versione usata da Image Cleaner?
kubectl describe configmap -n kube-system eraser-manager-config | grep tag -C 3
Image Cleaner supporta altri strumenti di analisi delle vulnerabilità oltre a trivy-scanner?
No.
È possibile specificare i livelli di vulnerabilità per le immagini da pulire?
No. Le impostazioni predefinite per i livelli di vulnerabilità includono:
LOW
,MEDIUM
,HIGH
eCRITICAL
Non è possibile personalizzare le impostazioni predefinite.
Come esaminare le immagini che sono state pulite da Image Cleaner?
I log delle immagini vengono archiviati nel pod del ruolo di lavoro eraser-aks-xxxxx
. Quando eraser-aks-xxxxx
è attivo, è possibile eseguire i comandi seguenti per visualizzare i log di eliminazione:
kubectl logs -n kube-system <worker-pod-name> -c collector
kubectl logs -n kube-system <worker-pod-name> -c trivy-scanner
kubectl logs -n kube-system <worker-pod-name> -c remover
Il pod eraser-aks-xxxxx
viene eliminato entro 10 minuti dal completamento del lavoro. È possibile seguire questa procedura per abilitare il componente aggiuntivo Monitoraggio di Azure e usare la tabella dei log dei pod di Informazioni dettagliate sui contenitori. Successivamente, i log cronologici verranno archiviati e sarà possibile esaminarli anche quando viene eliminato eraser-aks-xxxxx
.
Assicurarsi che Monitoraggio di Azure sia abilitato nel cluster. Per i passaggi dettagliati, vedere Abilitare Informazioni dettagliate sui contenitori nei cluster del servizio Azure Kubernetes.
I log per i contenitori in esecuzione nello
kube-system
spazio dei nomi non vengono raccolti per impostazione predefinita. Rimuovere lokube-system
spazio dei nomi daexclude_namespaces
nella mappa di configurazione e applicare la mappa di configurazione per abilitare la raccolta di questi log. Per informazioni dettagliate, vedere Configurare la raccolta dei dati di Informazioni dettagliate sui contenitori.Ottenere l'ID risorsa di Log Analytics usando il comando
az aks show
.az aks show --resource-group myResourceGroup --name myManagedCluster
Dopo alcuni minuti, il comando restituisce informazioni in formato JSON sulla soluzione, incluso l'ID risorsa dell'area di lavoro:
"addonProfiles": { "omsagent": { "config": { "logAnalyticsWorkspaceResourceID": "/subscriptions/<WorkspaceSubscription>/resourceGroups/<DefaultWorkspaceRG>/providers/Microsoft.OperationalInsights/workspaces/<defaultWorkspaceName>" }, "enabled": true } }
Nel portale di Azure cercare l'ID risorsa dell'area di lavoro e quindi selezionare Log.
Copiare una delle query seguenti e incollarla nella finestra di query.
Usare la query seguente se il cluster usa lo schema ContainerLogV2. Se si usa
ContainerLog
ancora , è consigliabile eseguire l'aggiornamento a ContainerlogV2.ContainerLogV2 | where PodName startswith "eraser-aks-" and PodNamespace == "kube-system" | project TimeGenerated, PodName, LogMessage, LogSource
Se si vuole continuare a usare
ContainerLog
, usare invece la query seguente:let startTimestamp = ago(1h); KubePodInventory | where TimeGenerated > startTimestamp | project ContainerID, PodName=Name, Namespace | where PodName startswith "eraser-aks-" and Namespace == "kube-system" | distinct ContainerID, PodName | join ( ContainerLog | where TimeGenerated > startTimestamp ) on ContainerID // at this point before the next pipe, columns from both tables are available to be "projected". Due to both // tables having a "Name" column, we assign an alias as PodName to one column which we actually want | project TimeGenerated, PodName, LogEntry, LogEntrySource | summarize by TimeGenerated, LogEntry | order by TimeGenerated desc
Selezionare Esegui. Tutti i log delle immagini eliminati vengono visualizzati nell'area Risultati.
Azure Kubernetes Service