Utilizzo della libreria dei modelli di vincolo

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

Questa pagina è rivolta agli amministratori IT e agli operatori che vogliono assicurarsi che tutte le risorse in esecuzione all'interno della piattaforma cloud soddisfino i requisiti di conformità dell'organizzazione fornendo e mantenendo l'automazione per eseguire controlli o applicare le norme e utilizzando i modelli di configurazione dichiarativa. Per scoprire di più su i ruoli comuni e le attività di esempio a cui facciamo riferimento nei contenuti di Google Cloud, vedi Ruoli e attività utente comuni di GKE Enterprise.

Policy Controller ti consente di applicare i criteri per un cluster Kubernetes definendo uno o più oggetti vincolo. Dopo l'installazione di una limitazione, le richieste al server API vengono controllate in base alla limitazione e rifiutate se non sono conformi. Le risorse preesistenti non conformi sono riportate su tempo di controllo.

Ogni vincolo è supportato da un modello che definisce lo schema e della logica del vincolo. I modelli di vincolo possono essere ricavati da Google e da terze parti oppure puoi crearne uno tuo. Per saperne di più sulla creazione di nuovi modelli, consulta Scrivere un modello di vincolo.

Prima di iniziare

esamina la libreria dei modelli di vincolo

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

Per elencare i vincoli, utilizza il comando seguente:

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

Per descrivere un modello di vincolo e verificare i parametri richiesti, utilizza la classe seguente comando:

kubectl describe constrainttemplate CONSTRAINT_TEMPLATE_NAME

Puoi inoltre visualizzare tutti i modelli di vincolo nella libreria.

Definire un vincolo

Definisci una limitazione utilizzando YAML e non devi comprendere o scrivere Rego. Un vincolo richiama un modello e gli fornisce parametri specifici del 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 della limitazione.
  • Il campo match definisce a quali oggetti si applica la limitazione. Tutte le condizioni specificate devono essere soddisfatte prima che un oggetto rientri nell'ambito di una limitazione. match sono definite dai seguenti sottocampi:
    • kinds sono i tipi di risorse a cui si applica la limitazione, determinati da due campi: apiGroups è un elenco di gruppi di API Kubernetes corrispondenti e kinds è un elenco di tipi corrispondenti. "*" corrisponde a tutto. Se almeno una voce apiGroup e una kind corrispondono, la condizione kinds è soddisfatta.
    • scope accetta *, Cluster o Namespaced, che determina se sono selezionate risorse con ambito cluster o con ambito nello spazio dei nomi (il valore predefinito è *).
    • namespaces è un elenco di nomi di spazi dei nomi a cui l'oggetto può appartenere. L'oggetto deve appartenere ad almeno uno di questi spazi dei nomi. Le risorse dello spazio dei nomi trattati come se appartenessero a sé stessi.
    • 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à. Spazio dei nomi le risorse sono trattate come se appartenessero a sé stesse.
  • Il campo parameters definisce gli argomenti per il vincolo, in base a quanto previsto dal modello di vincolo.

Il seguente vincolo, denominato ns-must-have-geo, richiama un modello di vincolo chiamato K8sRequiredLabels, incluso nella libreria di modelli di vincolo fornita da Google. Il vincolo definisce i parametri a cui si riferisce utilizzato dal modello per valutare se gli spazi dei nomi hanno l'etichetta geo impostata su una 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

Controllare un vincolo

Se il vincolo è configurato e installato correttamente, Il campo status.byPod[].enforced è impostato su true, se il vincolo è configurato per l'applicazione forzata o solo per testare il vincolo.

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

Per scoprire di più sul controllo, consulta Controlla con vincoli.

Avvertenze per la sincronizzazione dei vincoli

Se sincronizzi i vincoli con un'origine centralizzata, come un repository Git, con Config Sync o un altro strumento di tipo GitOps, tieni presente i seguenti accorgimenti quando sincronizzi i vincoli.

Coerenza finale

Puoi eseguire il commit dei vincoli su una fonte attendibile come un repository Git limitarne gli effetti usando ClusterSelectors o NamespaceSelectors: Poiché la sincronizzazione è alla fine coerente, tieni presente quanto segue:

  • Se un'operazione del cluster attiva una limitazione il cui NamespaceSelector fa riferimento a un ambito che non è stato sincronizzato, la limitazione viene applicata e l'operazione viene impedita. In altre parole, uno spazio dei nomi mancante "non viene chiuso".
  • 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 le limitazioni che influiscono su uno spazio dei nomi rinominato o con etichette diverse per assicurarti che funzionino come previsto.

Configura Policy Controller per i vincoli referenziali

Prima di poter abilitare i vincoli referenziali, devi creare un che indichi a Policy Controller quali tipi di oggetti monitorare, come 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 ingressi. Crea una voce con group, version e kind in spec.sync.syncOnly, con i valori per ogni tipo di oggetto che vuoi guardare.

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"

Abilita i vincoli referenziali

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

I vincoli di riferimento sono abilitati per impostazione predefinita se installi Policy Controller utilizzando la console Google Cloud. Se installi Policy Controller utilizzando in Google Cloud CLI, puoi scegliere se abilitare i vincoli referenziali quando Installa Policy Controller. È garantito che i vincoli di riferimento siano eventualmente coerenti e questo crea rischi:

  • Su un server API sovraccaricato, i contenuti della cache di Policy Controller possono diventare inattivi, causando un "errore aperto" per un vincolo referenziale, il che significa che l'azione di applicazione sembra funzionare, ma non è così. Ad esempio, puoi creare ingressi 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 disabilitare i vincoli referenziali, completa la seguenti passaggi:

  1. Nella console Google Cloud, vai alla pagina Criteri di GKE Enterprise nella sezione Gestione della postura.

    Vai al criterio

  2. Nella tabella dei cluster della scheda Impostazioni, 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 Policy Controller

Per abilitare il supporto dei vincoli referenziali, esegui questo comando:

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

Sostituisci MEMBERSHIP_NAME con il nome membro di il cluster registrato per abilitare le regole referenziali. Puoi specificare più iscrizioni separate da una virgola.

gcloud ConfigManagement

Per attivare il supporto dei vincoli di referenza, imposta policyController.referentialRulesEnabled su true nel file config-management.yaml:

apiVersion: configmanagement.gke.io/v1
kind: ConfigManagement
metadata:
  name: config-management
  namespace: config-management-system
spec:
  clusterName: my-cluster
  channel: dev
  policyController:
    enabled: true
    referentialRulesEnabled: true

Disattivare i vincoli referenziali

Quando disabiliti i vincoli referenziali, qualsiasi modello che utilizza vengono rimossi dal cluster, insieme a tutti i vincoli per utilizzare questi modelli.

Console

I vincoli referenziali sono abilitati per impostazione predefinita quando installi Policy Controller con la console Google Cloud. Per disattivare le limitazioni referenziali, completa i seguenti passaggi:

  1. Nella console Google Cloud, vai alla pagina Criteri di GKE Enterprise nella sezione Gestione della postura.

    Vai a Norme

  2. Nella tabella dei cluster della scheda Impostazioni, 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 Policy Controller

Per disattivare il supporto dei vincoli di referenza, esegui il seguente comando:

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

Sostituisci MEMBERSHIP_NAME con il nome dell'appartenenza al cluster registrato per attivare le regole di riferimento. Puoi specificare più separate da una virgola.

gcloud ConfigManagement

Per disabilitare i vincoli referenziali su un cluster, imposta Da policyController.referentialRulesEnabled a false nel tuo File config-management.yaml:

apiVersion: configmanagement.gke.io/v1
kind: ConfigManagement
metadata:
  name: config-management
  namespace: config-management-system
spec:
  clusterName: my-cluster
  channel: dev
  policyController:
    enabled: true
    referentialRulesEnabled: false

Elenco di 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 console Google Cloud. Per maggiori informazioni, consulta le metriche di Policy Controller.

Rimuovi 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 del metadata.name del modello di vincolo:

kubectl get CONSTRAINT_TEMPLATE_NAME

Per rimuovere un vincolo, specifica i relativi kind e name:

kubectl delete CONSTRAINT_TEMPLATE_NAME CONSTRAINT_NAME

Quando rimuovi un vincolo, questo cessa di essere applicato non appena il server API contrassegna il vincolo come eliminato.

Rimuovi tutti i modelli di vincoli

Console

Per disattivare la libreria di modelli di vincolo:

  1. Nella console Google Cloud, vai alla pagina Criteri di GKE Enterprise nella sezione Gestione della postura.

    Vai a Norme

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

gcloud Policy Controller

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

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

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

gcloud ConfigManagement

Imposta spec.policyController.templateLibraryInstalled su false. In questo modo che reinstalli automaticamente la libreria da parte di Policy Controller.

Per rimuovere tutti i modelli e tutti i vincoli, usa quanto segue :

kubectl delete constrainttemplate --all

Ripristinare la libreria dei modelli di vincolo

Console

Per attivare la libreria di modelli di vincolo:

  1. Nella console Google Cloud, vai alla pagina Criteri di GKE Enterprise nella sezione Gestione della conformità.

    Vai a Norme

  2. Nella scheda Impostazioni, nella tabella del cluster, seleziona Modifica nella colonna Modifica configurazione.
  3. Nel menu Aggiungi/modifica pacchetti di criteri, attiva la raccolta di modelli. Puoi anche attivare una o tutte le opzioni dei pacchetti di criteri.
  4. Seleziona Salva modifiche.

gcloud Policy Controller

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

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

Sostituisci MEMBERSHIP_NAME con il nome dell'appartenenza al cluster registrato per attivare la libreria dei modelli di vincolo. Puoi specificare più abbonamenti separati da una virgola.

gcloud ConfigManagement

Se hai disabilitato la libreria dei modelli di vincolo o hai disinstallato tutti i vincoli di modelli, puoi ripristinarli impostando Da spec.policyController.templateLibraryInstalled a true nel Configurazione di Policy Controller.

Per riavviare il pod dell'operatore, utilizza il seguente comando:

kubectl delete pod -n config-management-system -l k8s-app=config-management-operator

Passaggi successivi