Utilizzo della libreria dei modelli di vincolo

Questa pagina mostra come definire i vincoli di Policy Controller utilizzando i modelli di vincolo preesistenti forniti da Google.

Questa pagina è rivolta agli amministratori IT e agli operatori che vogliono assicurarsi che tutte le risorse in esecuzione nella piattaforma cloud soddisfino i requisiti di conformità dell'organizzazione fornendo e mantenendo l'automazione per l'audit o l'applicazione e utilizzando i modelli di configurazione dichiarativa. Per saperne di più sui ruoli comuni e sulle attività di esempio a cui facciamo riferimento nei Google Cloud contenuti, consulta Ruoli e attività comuni degli utenti GKE.

Policy Controller consente di applicare le policy a un cluster Kubernetes definendo uno o più oggetti vincolo. Dopo l'installazione di un vincolo, le richieste al server API vengono confrontate con il vincolo e vengono rifiutate se non sono conformi. Le risorse non conformi preesistenti vengono segnalate al momento dell'audit.

Ogni vincolo è supportato da un modello di vincolo che definisce lo schema e la logica del vincolo. I modelli di vincolo possono provenire da Google e da terze parti oppure puoi scriverne di tuoi. Per saperne di più sulla creazione di nuovi modelli, consulta Scrivere un modello di vincolo.

Prima di iniziare

Esaminare la libreria dei modelli di vincolo

Quando definisci un vincolo, specifichi il modello di vincolo che estende. Per impostazione predefinita viene installata una libreria di modelli di vincolo comuni sviluppati da Google e molte organizzazioni non hanno bisogno di creare modelli di vincolo personalizzati direttamente in Rego. I modelli di vincolo forniti da Google hanno l'etichetta configmanagement.gke.io/configmanagement.

Per elencare i vincoli, utilizza il seguente comando:

kubectl get constrainttemplates \
    -l="configmanagement.gke.io/configmanagement=config-management"

Per descrivere un modello di vincolo e verificarne i parametri obbligatori, utilizza il seguente comando:

kubectl describe constrainttemplate CONSTRAINT_TEMPLATE_NAME

Puoi anche visualizzare tutti i modelli di vincolo nella libreria.

Definire un vincolo

Definisci un vincolo utilizzando YAML e non devi comprendere o scrivere Rego. Un vincolo richiama invece un modello di vincolo e gli fornisce parametri specifici per il vincolo.

Se utilizzi Config Sync con un repository gerarchico, ti consigliamo di creare i vincoli nella directory cluster/.

I vincoli hanno i seguenti campi:

  • kind in minuscolo corrisponde al nome di un modello di vincolo.
  • metadata.name è il nome del vincolo.
  • Il campo match definisce gli oggetti a cui si applica il vincolo. Tutte le condizioni specificate devono corrispondere prima che un oggetto sia nell'ambito di un vincolo. match Le condizioni sono definite dai seguenti sottocampi:
    • kinds sono i tipi di risorse a cui si applica il vincolo, determinati da due campi: apiGroups è un elenco di gruppi API Kubernetes che corrispondono e kinds è un elenco di tipi che corrispondono. "*" corrisponde a tutto. Se corrispondono almeno una voce apiGroup e una voce kind, la condizione kinds è soddisfatta.
    • scope accetta *, Cluster o Namespaced, che determina se vengono selezionate le risorse con ambito cluster o con ambito spazio dei nomi (il valore predefinito è *).
    • namespaces è un elenco di nomi di spazi dei nomi a cui può appartenere l'oggetto. L'oggetto deve appartenere ad almeno uno di questi spazi dei nomi. Le risorse dello spazio dei nomi vengono trattate come se appartenessero a se stesse.
    • excludedNamespaces è un elenco di spazi dei nomi a cui l'oggetto non può appartenere.
    • labelSelector è un selettore di etichette Kubernetes che l'oggetto deve soddisfare.
    • namespaceSelector è un selettore di etichette nello spazio dei nomi a cui appartiene l'oggetto. Se lo spazio dei nomi non soddisfa l'oggetto, non corrisponderà. Le risorse dello spazio dei nomi vengono trattate come se appartenessero a se stesse.
  • Il campo parameters definisce gli argomenti per il vincolo, in base a ciò che si aspetta il modello di vincolo.

Il seguente vincolo, denominato ns-must-have-geo, richiama un modello di vincolo denominato K8sRequiredLabels, incluso nella libreria dei modelli di vincolo fornita da Google. Il vincolo definisce i parametri che il modello di vincolo utilizza per valutare se gli spazi dei nomi hanno l'etichetta geo impostata su un determinato valore.

# ns-must-have-geo.yaml

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredLabels
metadata:
  name: ns-must-have-geo
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Namespace"]
  parameters:
    labels:
      - key: "geo"

Per creare il vincolo, utilizza kubectl apply -f:

kubectl apply -f ns-must-have-geo.yaml

Eseguire l'audit di un vincolo

Se il vincolo è configurato e installato correttamente, il campo status.byPod[].enforced è impostato su true, indipendentemente dal fatto che il vincolo sia configurato per applicare o solo testare il vincolo.

I vincoli vengono applicati per impostazione predefinita e una violazione di un vincolo impedisce una determinata operazione del cluster. Puoi impostare spec.enforcementAction di un vincolo su dryrun per segnalare le violazioni nel campo status.violations senza impedire l'operazione.

Per saperne di più sull'audit, consulta Eseguire l'audit utilizzando i vincoli.

Avvertenze durante la sincronizzazione dei vincoli

Se sincronizzi i vincoli con una fonte centralizzata, ad esempio un repository Git, con Config Sync o un altro strumento di tipo GitOps, tieni presente le seguenti avvertenze durante la sincronizzazione dei vincoli.

Coerenza finale

Puoi eseguire il commit dei vincoli in una fonte di riferimento come un repository Git e puoi limitarne gli effetti utilizzando ClusterSelectors o NamespaceSelectors. Poiché la sincronizzazione è eventualmente coerente, tieni presente le seguenti avvertenze:

  • Se un'operazione del cluster attiva un vincolo il cui NamespaceSelector fa riferimento a uno spazio dei nomi non sincronizzato, il vincolo viene applicato e l'operazione viene impedita. In altre parole, uno spazio dei nomi mancante "non riesce a chiudere".
  • Se modifichi le etichette di uno spazio dei nomi, la cache potrebbe contenere dati obsoleti per un breve periodo di tempo.

Riduci al minimo la necessità di rinominare uno spazio dei nomi o modificarne le etichette e testa i vincoli che influiscono su uno spazio dei nomi rinominato o con nuove etichette per assicurarti che funzionino come previsto.

Configurare Policy Controller per i vincoli referenziali

Prima di poter attivare i vincoli referenziali, devi creare una configurazione che indichi a Policy Controller i tipi di oggetti da monitorare, ad esempio gli spazi dei nomi.

Salva il seguente manifest YAML in un file e applicalo con kubectl. Il manifest configura Policy Controller per monitorare gli spazi dei nomi e gli Ingress. Crea una voce con group, version e kind in spec.sync.syncOnly, con i valori per ogni tipo di oggetto che vuoi monitorare.

apiVersion: config.gatekeeper.sh/v1alpha1
kind: Config
metadata:
  name: config
  namespace: "gatekeeper-system"
spec:
  sync:
    syncOnly:
      - group: ""
        version: "v1"
        kind: "Namespace"
      - group: "extensions"
        version: "v1beta1"
        kind: "Ingress"

Attivare i vincoli referenziali

Un vincolo referenziale fa riferimento a un altro oggetto nella sua definizione. Ad esempio, puoi creare un vincolo che richieda che gli oggetti Ingress in un cluster abbiano nomi host univoci. Il vincolo è referenziale se il relativo modello di vincolo contiene la stringa data.inventory in Rego.

I vincoli referenziali sono attivati per impostazione predefinita se installi Policy Controller utilizzando la Google Cloud console. Se installi Policy Controller utilizzando Google Cloud CLI, puoi scegliere se attivare i vincoli referenziali quando installi Policy Controller. I vincoli referenziali hanno la garanzia di essere coerenti solo alla fine e questo crea rischi:

  • Su un server API sovraccarico, i contenuti della cache di Policy Controller potrebbero diventare obsoleti, causando un "fallimento aperto" di un vincolo referenziale, il che significa che l'azione di applicazione sembra funzionare quando non lo è. Ad esempio, puoi creare Ingress con nomi host duplicati troppo rapidamente per consentire al controller di ammissione di rilevare i duplicati.

  • L'ordine in cui vengono installati i vincoli e l'ordine in cui viene aggiornata la cache sono entrambi casuali.

Puoi aggiornare un cluster esistente per consentire i vincoli referenziali.

Console

Per disattivare i vincoli referenziali:

  1. Nella Google Cloud console, vai alla pagina Policy nella sezione Gestione della configurazione di sicurezza.

    Vai a Policy

  2. Nella scheda Impostazioni, nella tabella del cluster, seleziona Modifica nella colonna Modifica configurazione.
  3. Espandi il menu Modifica configurazione di Policy Controller.
  4. Seleziona la casella di controllo Abilita i modelli di vincolo che fanno riferimento a oggetti diversi dall'oggetto attualmente valutato.
  5. Seleziona Salva modifiche.

gcloud

Per attivare il supporto per i vincoli referenziali, esegui il comando seguente:

gcloud container fleet policycontroller update \
    --memberships=MEMBERSHIP_NAME \
    --referential-rules

Sostituisci MEMBERSHIP_NAME con il nome dell'appartenenza del cluster registrato su cui attivare le regole referenziali. Puoi specificare più appartenenze separate da una virgola.

Disattivare i vincoli referenziali

Quando disattivi i vincoli referenziali, tutti i modelli che utilizzano i vincoli referenziali vengono rimossi anche dal cluster, insieme a tutti i vincoli che utilizzano questi modelli.

Console

I vincoli referenziali sono attivati per impostazione predefinita quando installi Policy Controller con la Google Cloud console. Per disattivare i vincoli referenziali:

  1. Nella Google Cloud console, vai alla pagina Policy nella sezione Gestione della configurazione di sicurezza.

    Vai a Policy

  2. Nella scheda Impostazioni, nella tabella del cluster, seleziona Modifica nella colonna Modifica configurazione.
  3. Espandi il menu Modifica configurazione di Policy Controller.
  4. Deseleziona la casella di controllo Abilita i modelli di vincolo che fanno riferimento a oggetti diversi dall'oggetto attualmente valutato.
  5. Seleziona Salva modifiche.

gcloud

Per disattivare il supporto per i vincoli referenziali, esegui il comando seguente:

gcloud container fleet policycontroller update \
    --memberships=MEMBERSHIP_NAME \
    --no-referential-rules

Sostituisci MEMBERSHIP_NAME con il nome dell'appartenenza del cluster registrato su cui attivare le regole referenziali. Puoi specificare più appartenenze separate da una virgola.

Elencare tutti i vincoli

Per elencare tutti i vincoli installati in un cluster, utilizza il seguente comando:

kubectl get constraint

Puoi anche visualizzare una panoramica dei vincoli applicati nella Google Cloud console. Per saperne di più, consulta Metriche di Policy Controller.

Rimuovere un vincolo

Per trovare tutti i vincoli che utilizzano un modello di vincolo, utilizza il seguente comando per elencare tutti gli oggetti con lo stesso kind di metadata.name del modello di vincolo:

kubectl get CONSTRAINT_TEMPLATE_NAME

Per rimuovere un vincolo, specifica il relativo kind e name:

kubectl delete CONSTRAINT_TEMPLATE_NAME CONSTRAINT_NAME

Quando rimuovi un vincolo, la sua applicazione viene interrotta non appena il server API contrassegna il vincolo come eliminato.

Rimuovere tutti i modelli di vincolo

Console

Per disattivare la libreria dei modelli di vincolo:

  1. Nella Google Cloud console, vai alla pagina Policy nella sezione Gestione della configurazione di sicurezza.

    Vai a Policy

  2. Nella scheda Impostazioni, nella tabella del cluster, seleziona Modifica nella colonna Modifica configurazione.
  3. Nel menu Aggiungi/modifica pacchetti di policy, disattiva la libreria dei modelli e tutti i pacchetti di policy .
  4. Seleziona Salva modifiche.

gcloud

Per disattivare la libreria dei modelli di vincolo, esegui il comando seguente:

gcloud container fleet policycontroller content templates disable \
    --memberships=MEMBERSHIP_NAME

Sostituisci MEMBERSHIP_NAME con il nome dell'appartenenza del cluster registrato su cui disattivare la libreria dei modelli di vincolo. Puoi specificare più appartenenze separate da una virgola.

Ripristinare la libreria dei modelli di vincolo

Console

Per attivare la libreria dei modelli di vincolo:

  1. Nella Google Cloud console, vai alla pagina Policy nella sezione Gestione della configurazione di sicurezza.

    Vai a Policy

  2. Nella scheda Impostazioni, nella tabella del cluster, seleziona Modifica nella colonna Modifica configurazione.
  3. Nel menu Aggiungi/modifica pacchetti di policy, attiva la libreria dei modelli . Puoi anche attivare tutti o alcuni dei pacchetti di policy.
  4. Seleziona Salva modifiche.

gcloud

Per ripristinare la libreria dei modelli di vincolo, esegui il comando seguente:

gcloud container fleet policycontroller content templates enable \
    --memberships=MEMBERSHIP_NAME

Sostituisci MEMBERSHIP_NAME con il nome dell'appartenenza del cluster registrato su cui attivare la libreria dei modelli di vincolo. Puoi specificare più appartenenze separate da una virgola.

Passaggi successivi