Proteggere i cluster del servizio Azure Kubernetes con Criteri di Azure

È 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

Prima di iniziare, sono necessarie le risorse seguenti installate e configurate:

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:

  1. Vai al servizio Criteri di Azure nel portale di Azure chiamato Policy.
  2. Nel riquadro a sinistra della pagina Criteri di Azure selezionare Definizioni.
  3. In Categorie, selezionare Kubernetes.
  4. 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.
  5. Seleziona Assegna.
  6. Impostare l’Ambito sul gruppo di risorse del cluster AKS con il componente aggiuntivo dei Criteri di Azure abilitato.
  7. Selezionare la pagina Parametri e aggiornare l'effetto da audit a deny per 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.
  8. 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.

  1. 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
    
  2. Creare il pod usando il kubectl apply comando e specificare il nome del manifesto YAML.

    kubectl apply -f nginx-privileged.yaml
    

    Come 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.

  1. Creare un file denominato nginx-unprivileged.yaml e 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-alpine
    
  2. Creare il pod usando il kubectl apply comando e specificare il nome del manifesto YAML.

    kubectl apply -f nginx-unprivileged.yaml
    
  3. Controllare lo stato del pod usando il kubectl get pods comando .

    kubectl get pods
    

    L'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          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.

  4. Eliminare il NGINX pod senza privilegi usando il kubectl delete comando 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_name
  • aks_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:

  1. Passare al riquadro Criteri nel portale di Azure.
  2. Selezionare Assegnazioni.
  3. 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.
  4. 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: