Proteggere i cluster del servizio Azure Kubernetes con Criteri di Azure
È possibile applicare e far rispettare i criteri di sicurezza predefiniti nei cluster del servizio Azure Kubernetes usando Criteri di Azure. Criteri di Azure consente di applicare gli standard dell'organizzazione e valutare la conformità su larga scala. Dopo aver installato il componente aggiuntivo Criteri di Azure per il servizio Azure Kubernetes, è possibile applicare al cluster singole definizioni di criteri o gruppi di definizioni di criteri denominati iniziative (talvolta denominati criteri). Per un elenco completo delle definizioni di criteri e delle iniziative del servizio Azure Kubernetes, vedere Definizioni predefinite di Criteri di Azure Kubernetes.
Questo articolo illustra come applicare le definizioni dei criteri al cluster e verificare che tali assegnazioni vengano applicate.
Prerequisiti
- Questo articolo presuppone che sia presente un cluster del servizio Azure Kubernetes esistente. Se è necessario un cluster del servizio Azure Kubernetes, è possibile crearne uno usando l'interfaccia della riga di comando di Azure, Azure PowerShell o il portale di Azure.
- È necessario il componente aggiuntivo Criteri di Azure per il servizio Azure Kubernetes installato nel cluster del servizio Azure Kubernetes.
Assegnare una definizione o un'iniziativa di criteri predefiniti
È possibile applicare una definizione o un'iniziativa di criteri nel portale di Azure seguendo questa procedura:
- Passare al servizio Criteri di Azure nel portale di Azure denominato Criteri.
- Nel riquadro a sinistra della pagina Criteri di Azure selezionare Definizioni.
- In Categorie, selezionare
Kubernetes
. - Scegliere la definizione o l'iniziativa di criteri da applicare. Per questo esempio, selezionare l'iniziativa standard di base per la sicurezza dei pod del cluster Kubernetes per i carichi di lavoro basati su Linux.
- Seleziona Assegna.
- Impostare l’Ambito sul gruppo di risorse del cluster del servizio Azure Kubernetes con il componente aggiuntivo Criteri di Azure abilitato.
- Selezionare la pagina Parametri e aggiornare l’effetto da
audit
adeny
per bloccare le nuove distribuzioni violando l'iniziativa di base. È anche possibile aggiungere spazi dei nomi aggiuntivi da escludere dalla valutazione. Per questo esempio, mantenere i valori predefiniti. - Selezionare Rivedi e crea> Crea per inviare l'assegnazione dei criteri.
Creare e assegnare una definizione di criteri personalizzata
I criteri personalizzati consentono di definire regole per l'uso di Azure. Ad esempio, è possibile applicare i tipi di regole seguenti:
- Procedure di sicurezza
- Gestione dei costi
- Regole specifiche dell'organizzazione (come denominazioni o posizioni)
Prima di creare un criterio personalizzato, controllare l'elenco di modelli ed esempi comuni per verificare se il caso è già trattato.
Le definizioni di criteri personalizzate vengono scritte in JSON. Per altre informazioni sulla creazione di un criterio personalizzato, vedere Struttura delle definizioni di Criteri di Azure e Creare una definizione di criteri personalizzata.
Nota
Criteri di Azure usa ora una nuova proprietà nota come templateInfo che consente di definire il tipo di origine per il modello di vincolo. Quando si definisce templateInfo nelle definizioni dei criteri, non è necessario definire le proprietà constraintTemplate o constraint. È comunque necessario definire apiGroup e tipi. Per altre informazioni su questo argomento, vedere Informazioni sugli effetti di Criteri di Azure.
Dopo aver creato la definizione dei criteri personalizzata, vedere Assegnare una definizione di criteri per una procedura dettagliata sull'assegnazione dei criteri al cluster Kubernetes.
Verificare che criteri di Azure sia in esecuzione
Verificare che le assegnazioni dei criteri vengano applicate al cluster usando il comando
kubectl get
seguente.kubectl get constrainttemplates
Nota
Le assegnazioni di criteri possono richiedere fino a 20 minuti per la sincronizzazione in ogni cluster.
L'output dovrebbe essere simile all'output di esempio seguente:
NAME AGE k8sazureallowedcapabilities 23m k8sazureallowedusersgroups 23m k8sazureblockhostnamespace 23m k8sazurecontainerallowedimages 23m k8sazurecontainerallowedports 23m k8sazurecontainerlimits 23m k8sazurecontainernoprivilege 23m k8sazurecontainernoprivilegeescalation 23m k8sazureenforceapparmor 23m k8sazurehostfilesystem 23m k8sazurehostnetworkingports 23m k8sazurereadonlyrootfilesystem 23m k8sazureserviceallowedports 23m
Convalidare il rifiuto di un pod con privilegi
Si esaminerà prima di tutto cosa accade quando si pianifica un pod con il contesto di sicurezza di privileged: true
. Questo contesto di sicurezza esegue l'escalation dei privilegi del pod. L'iniziativa non consente pod con privilegi, quindi la richiesta viene negata, il che comporta il rifiuto della distribuzione.
Creare un file denominato
nginx-privileged.yaml
e incollarlo nel manifesto YAML seguente.apiVersion: v1 kind: Pod metadata: name: nginx-privileged spec: containers: - name: nginx-privileged image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine securityContext: privileged: true
Creare il pod usando il comando
kubectl apply
e specificare il nome del manifesto YAML.kubectl apply -f nginx-privileged.yaml
Come previsto, non è possibile pianificare il pod, come illustrato nell'output di esempio seguente:
Error from server ([denied by azurepolicy-container-no-privilege-00edd87bf80f443fa51d10910255adbc4013d590bec3d290b4f48725d4dfbdf9] Privileged container is not allowed: nginx-privileged, securityContext: {"privileged": true}): error when creating "privileged.yaml": admission webhook "validation.gatekeeper.sh" denied the request: [denied by azurepolicy-container-no-privilege-00edd87bf80f443fa51d10910255adbc4013d590bec3d290b4f48725d4dfbdf9] Privileged container is not allowed: nginx-privileged, securityContext: {"privileged": true}
Il pod non raggiunge la fase di pianificazione, quindi non ci sono risorse da eliminare prima di procedere.
Testare la creazione di un pod senza privilegi
Nell'esempio precedente l'immagine del contenitore ha tentato di usare automaticamente la radice per associare NGINX alla porta 80. L'iniziativa dei criteri nega questa richiesta, quindi l'avvio del pod non riesce. A questo punto, provare a eseguire lo stesso pod NGINX senza accesso con privilegi.
Creare un file denominato
nginx-unprivileged.yaml
e incollarlo nel manifesto YAML seguente.apiVersion: v1 kind: Pod metadata: name: nginx-unprivileged spec: containers: - name: nginx-unprivileged image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
Creare il pod usando il comando
kubectl apply
e specificare il nome del manifesto YAML.kubectl apply -f nginx-unprivileged.yaml
Controllare lo stato del pod usando il comando
kubectl get pods
.kubectl get pods
L'output dovrebbe essere simile all'output di esempio seguente, che mostra che il pod è stato pianificato correttamente e ha lo stato In esecuzione:
NAME READY STATUS RESTARTS AGE nginx-unprivileged 1/1 Running 0 18s
Questo esempio mostra l'iniziativa di base che interessa solo le distribuzioni che violano i criteri nella raccolta. Le distribuzioni consentite continuano a funzionare.
Eliminare il pod non privilegiato NGINX usando il comando
kubectl delete
e specificare il nome del manifesto YAML.kubectl delete -f nginx-unprivileged.yaml
Disabilitare un criterio o un'iniziativa
È possibile rimuovere l'iniziativa di base nel portale di Azure seguendo questa procedura:
- Passare al riquadro Criteri nel portale di Azure.
- Selezionare Assegnazioni.
- Selezionare il pulsante ... accanto all'iniziativa standard di base di sicurezza dei pod del cluster Kubernetes per i carichi di lavoro basati su Linux.
- Selezionare Elimina assegnazione.
Passaggi successivi
Per altre informazioni sul funzionamento di Criteri di Azure, vedere gli articoli seguenti:
Azure Kubernetes Service