Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
È possibile applicare e applicare criteri di sicurezza predefiniti nei cluster Servizio Azure Kubernetes (AKS) usando Criteri di Azure. Criteri di Azure permette di imporre gli standard organizzativi e di verificare la conformità su larga scala. Dopo aver installato il componente aggiuntivo Criteri di Azure per AKS, è possibile applicare al cluster singole definizioni di criteri o gruppi di definizioni di criteri chiamati iniziative (talvolta chiamati set di criteri). Per un elenco completo delle definizioni di criteri e iniziative di AKS, vedi Definizioni predefinite di Criteri di Azure per AKS.
Questo articolo illustra come applicare le definizioni dei criteri al cluster e verificare che le assegnazioni vengano applicate.
Prerequisiti
- Questo articolo presuppone l'esistenza di un cluster AKS. Se ti serve un cluster AKS, puoi crearne uno tramite interfaccia della riga di comando di Azure, Azure PowerShell o il portale di Azure.
- È necessario che il componente aggiuntivo Criteri di Azure per AKS sia installato nel cluster AKS.
Prima di iniziare, sono necessarie le risorse seguenti installate e configurate:
- Questo articolo presuppone che si disponga già di un cluster AKS. Se hai bisogno di un cluster AKS, puoi crearne uno tramite interfaccia della riga di comando di Azure, Azure PowerShell o il portale di Azure.
- È necessario che nel cluster AKS sia installato il componente aggiuntivo Criteri di Azure per AKS.
- versione 1.6.0 di Terraform o successiva.
- Interfaccia della riga di comando di Azure versione 2.47.0 o successiva. Per installare o aggiornare l'interfaccia della riga di comando di Azure, vedere Installare l'interfaccia della riga di comando di Azure.
- Kubectl installato e configurato.
Assegnare una definizione di criteri predefinita o un'iniziativa predefinita
È possibile applicare una definizione o un'iniziativa di criteri nel portale di Azure seguendo questa procedura:
- Vai al servizio Criteri di Azure nel portale di Azure chiamato Policy.
- Nel riquadro a sinistra della pagina Criteri di Azure selezionare Definizioni.
- In Categorie, selezionare
Kubernetes. - Scegli la definizione di criteri o l'iniziativa 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 AKS con il componente aggiuntivo dei Criteri di Azure abilitato.
- Selezionare la pagina Parametri e aggiornare l'effetto da
auditadenyper bloccare le nuove distribuzioni che violano l'iniziativa di base. Puoi anche aggiungere ulteriori namespace da escludere dalla valutazione. Per questo esempio, mantenere i valori predefiniti. - Selezionare Rivedi e crea> Crea per inviare l'assegnazione dei criteri.
Creare una directory per la configurazione di Terraform.
mkdir aks-use-azure-policy
cd aks-use-azure-policy
Creare la configurazione di Terraform
Creare un file denominato main.tf.
touch main.tf
Aprire il main.tf file e aggiungere la configurazione seguente.
Configurare il provider Terraform
La configurazione seguente:
- Definisce la versione di Terraform.
- Configura il provider AzureRM.
- Abilita le funzionalità del provider di Azure necessarie per la gestione delle risorse.
terraform {
required_version = ">= 1.6.0"
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~> 4.0"
}
}
}
provider "azurerm" {
features {}
}
Definisci le variabili di input
Usare le variabili seguenti per specificare il nome del gruppo di risorse esistente e del cluster del servizio Azure Kubernetes durante la distribuzione.
variable "resource_group_name" {
description = "Name of the resource group that contains the existing AKS cluster."
type = string
}
variable "aks_cluster_name" {
description = "Name of the existing AKS cluster."
type = string
}
Fare riferimento al cluster AKS esistente
Le seguenti origini dati recuperano informazioni relative al gruppo di risorse esistente e al cluster AKS. Terraform usa questi dati per fare riferimento all'infrastruttura già esistente in Azure anziché creare nuove risorse.
data "azurerm_resource_group" "aks" {
name = var.resource_group_name
}
data "azurerm_kubernetes_cluster" "aks" {
name = var.aks_cluster_name
resource_group_name = data.azurerm_resource_group.aks.name
}
Facoltativo: creare e assegnare una definizione di criteri personalizzata
La sezione relativa alla definizione dei criteri personalizzata è informativa e non rientra nell'ambito di questo articolo. 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, ad esempio convenzioni di denominazione 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 una proprietà denominata templateInfo che è possibile usare per definire il tipo di origine per il modello di vincolo. Quando si definisce templateInfo nelle definizioni dei criteri, non è possibile usare le proprietà constraintTemplate o constraint . È comunque necessario definire apiGroup e tipi. Per altre informazioni, vedere Informazioni sugli effetti Criteri di Azure.
Dopo aver creato la definizione di criteri personalizzata, vedere Assegnare una definizione di criteri per una procedura dettagliata per assegnare i criteri al cluster.
Verificare che un criterio di Azure sia in esecuzione
Verificare che le assegnazioni dei criteri vengano applicate al cluster usando il comando seguente kubectl get .
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
Verifica cosa accade quando programmi un pod con il contesto di sicurezza di privileged: true. Questo contesto di sicurezza aumenta i privilegi del pod. L'iniziativa non consente i pod privilegiati, quindi la richiesta viene rifiutata e la distribuzione viene respinta.
Creare un file denominato
nginx-privileged.yamle 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: trueCreare il pod usando il
kubectl applycomando e specificare il nome del manifesto YAML.kubectl apply -f nginx-privileged.yamlCome previsto, il pod non viene programmato, 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 automaticamente di usare root per associare NGINX alla porta 80. L'iniziativa dei criteri rifiuta questa richiesta, quindi il pod non riesce ad avviarsi. Ora, provate a eseguire lo stesso NGINX pod senza accesso privilegiato.
Creare un file denominato
nginx-unprivileged.yamle incollarvi il 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-alpineCreare il pod usando il
kubectl applycomando e specificare il nome del manifesto YAML.kubectl apply -f nginx-unprivileged.yamlControllare lo stato del pod usando il
kubectl get podscomando .kubectl get podsL'output dovrebbe essere simile al seguente esempio, che mostra che il pod è stato assegnato correttamente e ha lo stato In Esecuzione:
NAME READY STATUS RESTARTS AGE nginx-unprivileged 1/1 Running 0 18sQuesto 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
NGINXpod senza privilegi usando ilkubectl deletecomando e specificare il nome del manifesto YAML.kubectl delete -f nginx-unprivileged.yaml
Usa i passaggi seguenti per assegnare un'iniziativa predefinita di Criteri di Azure al tuo cluster AKS tramite Terraform.
Recupera l'iniziativa di Criteri di Azure predefinita
L'origine dati seguente recupera l'iniziativa predefinita di Criteri di Azure per gli standard di base per la sicurezza dei pod Kubernetes.
data "azurerm_policy_set_definition" "aks_pod_security_baseline" {
display_name = "Kubernetes cluster pod security baseline standards for Linux-based workloads"
}
Assegnare l'iniziativa Criteri di Azure
La risorsa seguente assegna l'iniziativa di Criteri di Azure predefinita al gruppo di risorse che contiene il cluster AKS.
Impostare l'effetto dei criteri su Deny per bloccare i carichi di lavoro che violano le regole dei criteri definite.
resource "azurerm_resource_group_policy_assignment" "aks_pod_security_baseline" {
name = "aks-pod-security-baseline"
display_name = "Kubernetes cluster pod security baseline standards for Linux-based workloads"
resource_group_id = data.azurerm_resource_group.aks.id
policy_definition_id = data.azurerm_policy_set_definition.aks_pod_security_baseline.id
parameters = jsonencode({
effect = {
value = "Deny"
}
})
}
Inizializzare la configurazione di Terraform
Eseguire terraform init per inizializzare la directory di lavoro di Terraform e scaricare i plug-in del provider necessari.
terraform init
Formattare e convalidare la configurazione
Eseguire terraform fmt per formattare la configurazione di Terraform.
terraform fmt
Eseguire terraform validate per convalidare la sintassi di configurazione di Terraform.
terraform validate
Applicare la configurazione di Terraform
Prima di distribuire la configurazione, specificare i valori per le variabili seguenti:
resource_group_nameaks_cluster_name
Eseguire terraform apply per distribuire l'assegnazione di Criteri di Azure.
terraform apply
Quando richiesto, immettere yes per confermare la distribuzione.
Verificare l'installazione Criteri di Azure
Al termine della distribuzione, verificare che i componenti di Criteri di Azure siano in esecuzione nel cluster AKS.
kubectl get pods -n kube-system
Verificare che i modelli di vincolo Gatekeeper siano stati installati correttamente.
kubectl get constrainttemplates
Testare l'assegnazione di Criteri di Azure
Creare un file denominato privileged-pod.yaml.
apiVersion: v1
kind: Pod
metadata:
name: privileged-pod
spec:
containers:
- name: nginx
image: nginx
securityContext:
privileged: true
Applicare il manifesto al cluster.
kubectl apply -f privileged-pod.yaml
La distribuzione ha esito negativo perché l'assegnazione Criteri di Azure nega i contenitori con privilegi che violano gli standard di base di sicurezza dei pod configurati.
Disabilitare un criterio o un'iniziativa
Rimuovere l'iniziativa di base nel portale di Azure seguendo questa procedura:
- Passare al riquadro Criteri nel portale di Azure.
- Selezionare Assegnazioni.
- Selezionare i puntini di sospensione (
...) alla fine della riga per l'iniziativa standard di riferimento per la sicurezza dei pod del cluster Kubernetes per carichi di lavoro basati su Linux. - Selezionare Elimina assegnazione.
Per rimuovere il componente aggiuntivo Criteri di Azure dal cluster AKS, vedi Rimuovere il componente aggiuntivo.
Passaggi successivi
Per ulteriori informazioni su come funzionano i Criteri di Azure, consulta gli articoli seguenti: