Utilizzare i vincoli dei criteri MITRE

Policy Controller include una libreria predefinita di modelli di vincolo che possono essere utilizzati con il bundle di policy MITRE per valutare la conformità delle risorse del cluster con alcuni aspetti della knowledge base MITRE di tattiche e tecniche utilizzate da utenti malintenzionati basate sull'osservazione del mondo reale.

Questa pagina contiene le istruzioni per applicare manualmente un pacchetto di norme. In alternativa, puoi applicare direttamente i bundle di norme.

Vincoli del bundle di policy MITRE

Nome vincolo Descrizione del vincolo
mitre-v2024-apparmor Limita il profilo AppArmor per i pod.
mitre-v2024-block-all-ingress Limita la creazione di oggetti Ingress.
mitre-v2024-cronjob-restrict-repos Limita le immagini container per CronJob a un elenco di repository consentiti.
mitre-v2024-no-anonymous Non consente di associare le risorse ClusterRole e Role all'utente system:anonymous e al gruppo system:unauthenticated.
mitre-v2024-host-namespaces-host-pid-ipc I container non possono essere eseguiti con hostPID o hostIPC impostato su true.
mitre-v2024-host-namespaces-hostnetwork I container non possono essere eseguiti con hostNetwork impostato su true.
mitre-v2024-host-ports HostPorts non deve essere consentito o, come minimo, deve essere limitato a un elenco noto.
mitre-v2024-no-secrets-as-env-vars Limita l'utilizzo dei secret come variabili di ambiente nelle definizioni di container.
mitre-v2024-privileged-containers Limita i container con securityContext.privileged impostato su true.
mitre-v2024-proc-mount-type Le maschere /proc predefinite riducono la superficie di attacco e sono obbligatorie.
mitre-v2024-require-binauthz Richiede il webhook di ammissione di convalida di Autorizzazione binaria.
mitre-v2024-require-namespace-networkpolicy Richiede che ogni spazio dei nomi definito nel cluster abbia una NetworkPolicy.
mitre-v2024-restrict-admission-controller Limita l'utilizzo di controller di ammissione dinamici e webhook.
mitre-v2024-restrict-automountserviceaccounttoken Limita l'utilizzo dei token dei service account.
mitre-v2024-restrict-capabilities Non è consentito aggiungere funzionalità oltre a quelle elencate.
mitre-v2024-restrict-cluster-admin-role Limita l'utilizzo del ruolo cluster-admin.
mitre-v2024-restrict-hostpath-volumes Limita l'utilizzo dei volumi HostPath.
mitre-v2024-restrict-kubernetes-dashboard-namespace Limita l'utilizzo dello spazio dei nomi kubernetes-dashboard.
mitre-v2024-restrict-pods-exec Limita l'utilizzo di pods/exec in Roles e ClusterRoles.
mitre-v2024-restrict-rbac-subjects Limita l'utilizzo dei nomi nei soggetti RBAC ai valori consentiti.
mitre-v2024-restrict-repos Limita le immagini container a un elenco repos consentito.
mitre-v2024-restrict-role-secrets Limita l'utilizzo dei secret in Roles e ClusterRoles.
mitre-v2024-restrict-windows-hostprocess Limita l'esecuzione di container / pod HostProcess Windows
mitre-v2024-seccomp Il profilo Seccomp non deve essere impostato su Unconfined.
mitre-v2024-selinux Non è possibile impostare il tipo SELinux o un'opzione personalizzata per l'utente o il ruolo SELinux.
mitre-v2024-sysctls I container possono impostare solo i sysctl elencati nel campo allowedSysctls.

Prima di iniziare

  1. Installa e inizializza Google Cloud CLI, che fornisce i comandi gcloud e kubectl utilizzati in queste istruzioni. Se utilizzi Cloud Shell, Google Cloud CLI è preinstallato.
  2. Installa Policy Controller v1.17.2 o versioni successive sul tuo cluster con la libreria predefinita di modelli di vincolo. Devi anche attivare il supporto per i vincoli referenziali, poiché questo bundle contiene vincoli referenziali.

Configura Policy Controller per i vincoli referenziali

  1. Salva il seguente manifest YAML in un file come policycontroller-config.yaml. Il manifest configura Policy Controller per monitorare tipi specifici di oggetti.

    apiVersion: config.gatekeeper.sh/v1alpha1
    kind: Config
    metadata:
      name: config
      namespace: "gatekeeper-system"
    spec:
      sync:
        syncOnly:
          - group: "networking.k8s.io"
            version: "v1"
            kind: "NetworkPolicy"
          - group: "admissionregistration.k8s.io"
            version: "v1"
            kind: "ValidatingWebhookConfiguration"
    
  2. Applica il manifest policycontroller-config.yaml:

    kubectl apply -f policycontroller-config.yaml
    

Audit del bundle di policy MITRE

Policy Controller consente di applicare criteri per il cluster Kubernetes. Per testare i workload e la loro conformità alle norme MITRE descritte nella tabella precedente, puoi implementare questi vincoli in modalità "audit" per rivelare le violazioni e, soprattutto, darti la possibilità di correggerle prima di applicarle al tuo cluster Kubernetes.

Puoi applicare questi criteri con spec.enforcementAction impostato su dryrun utilizzando kubectl, kpt, o Config Sync.

kubectl

  1. (Facoltativo) Visualizza l'anteprima dei vincoli dei criteri con kubectl:

    kubectl kustomize https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/mitre-v2024
    
  2. Applica i vincoli dei criteri con kubectl:

    kubectl apply -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/mitre-v2024
    

    L'output è il seguente:

    k8sallowedrepos.constraints.gatekeeper.sh/mitre-v2024-restrict-repos created
    k8sblockallingress.constraints.gatekeeper.sh/mitre-v2024-block-all-ingress created
    k8scronjoballowedrepos.constraints.gatekeeper.sh/mitre-v2024-cronjob-restrict-repos created
    k8sdisallowanonymous.constraints.gatekeeper.sh/mitre-v2024-no-anonymous created
    k8snoenvvarsecrets.constraints.gatekeeper.sh/mitre-v2024-no-secrets-as-env-vars created
    k8spspapparmor.constraints.gatekeeper.sh/mitre-v2024-apparmor created
    k8spspcapabilities.constraints.gatekeeper.sh/mitre-v2024-restrict-capabilities created
    k8spspforbiddensysctls.constraints.gatekeeper.sh/mitre-v2024-sysctls created
    k8spsphostfilesystem.constraints.gatekeeper.sh/mitre-v2024-restrict-hostpath-volumes created
    k8spsphostnamespace.constraints.gatekeeper.sh/mitre-v2024-host-namespaces-host-pid-ipc created
    k8spsphostnetworkingports.constraints.gatekeeper.sh/mitre-v2024-host-namespaces-hostnetwork created
    k8spsphostnetworkingports.constraints.gatekeeper.sh/mitre-v2024-host-ports created
    k8spspprivilegedcontainer.constraints.gatekeeper.sh/mitre-v2024-privileged-containers created
    k8spspprocmount.constraints.gatekeeper.sh/mitre-v2024-proc-mount-type created
    k8spspselinuxv2.constraints.gatekeeper.sh/mitre-v2024-selinux created
    k8spspseccomp.constraints.gatekeeper.sh/mitre-v2024-seccomp created
    k8spspwindowshostprocess.constraints.gatekeeper.sh/mitre-v2024-restrict-windows-hostprocess created
    k8srequirebinauthz.constraints.gatekeeper.sh/mitre-v2024-require-binauthz created
    k8srequirenamespacenetworkpolicies.constraints.gatekeeper.sh/mitre-v2024-require-namespace-networkpolicy created
    k8srestrictadmissioncontroller.constraints.gatekeeper.sh/mitre-v2024-restrict-admission-controller created
    k8srestrictautomountserviceaccounttokens.constraints.gatekeeper.sh/mitre-v2024-restrict-automountserviceaccounttoken created
    k8srestrictnamespaces.constraints.gatekeeper.sh/mitre-v2024-restrict-kubernetes-dashboard-namespace created
    k8srestrictrbacsubjects.constraints.gatekeeper.sh/mitre-v2024-restrict-rbac-subjects created
    k8srestrictrolebindings.constraints.gatekeeper.sh/mitre-v2024-restrict-cluster-admin-role created
    k8srestrictrolerules.constraints.gatekeeper.sh/mitre-v2024-restrict-pods-exec created
    k8srestrictrolerules.constraints.gatekeeper.sh/mitre-v2024-restrict-role-secrets created
    
  3. Verifica che i vincoli dei criteri siano stati installati e controlla se esistono violazioni nel cluster:

    kubectl get constraints -l policycontroller.gke.io/bundleName=mitre-v2024
    

    L'output è simile al seguente:

    NAME                                                                   ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8sallowedrepos.constraints.gatekeeper.sh/mitre-v2024-restrict-repos   dryrun               0
    
    NAME                                                                         ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8sblockallingress.constraints.gatekeeper.sh/mitre-v2024-block-all-ingress   dryrun               0
    
    NAME                                                                                  ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8scronjoballowedrepos.constraints.gatekeeper.sh/mitre-v2024-cronjob-restrict-repos   dryrun               0
    
    NAME                                                                      ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8sdisallowanonymous.constraints.gatekeeper.sh/mitre-v2024-no-anonymous   dryrun               0
    
    NAME                                                                              ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8snoenvvarsecrets.constraints.gatekeeper.sh/mitre-v2024-no-secrets-as-env-vars   dryrun               0
    
    NAME                                                            ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspapparmor.constraints.gatekeeper.sh/mitre-v2024-apparmor   dryrun               0
    
    NAME                                                                             ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspcapabilities.constraints.gatekeeper.sh/mitre-v2024-restrict-capabilities   dryrun               0
    
    NAME                                                                   ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspforbiddensysctls.constraints.gatekeeper.sh/mitre-v2024-sysctls   dryrun               0
    
    NAME                                                                                   ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spsphostfilesystem.constraints.gatekeeper.sh/mitre-v2024-restrict-hostpath-volumes   dryrun               0
    
    NAME                                                                                     ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spsphostnamespace.constraints.gatekeeper.sh/mitre-v2024-host-namespaces-host-pid-ipc   dryrun               0
    
    NAME                                                                                          ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spsphostnetworkingports.constraints.gatekeeper.sh/mitre-v2024-host-namespaces-hostnetwork   dryrun               0
    k8spsphostnetworkingports.constraints.gatekeeper.sh/mitre-v2024-host-ports                    dryrun               0
    
    NAME                                                                                    ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspprivilegedcontainer.constraints.gatekeeper.sh/mitre-v2024-privileged-containers   dryrun               0
    
    NAME                                                                    ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspprocmount.constraints.gatekeeper.sh/mitre-v2024-proc-mount-type   dryrun               0
    
    NAME                                                          ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspseccomp.constraints.gatekeeper.sh/mitre-v2024-seccomp   dryrun               0
    
    NAME                                                            ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspselinuxv2.constraints.gatekeeper.sh/mitre-v2024-selinux   dryrun               0
    
    NAME                                                                                          ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspwindowshostprocess.constraints.gatekeeper.sh/mitre-v2024-restrict-windows-hostprocess   dryrun               0
    
    NAME                                                                        ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srequirebinauthz.constraints.gatekeeper.sh/mitre-v2024-require-binauthz   dryrun               0
    
    NAME                                                                                                       ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srequirenamespacenetworkpolicies.constraints.gatekeeper.sh/mitre-v2024-require-namespace-networkpolicy   dryrun               0
    
    NAME                                                                                                 ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srestrictadmissioncontroller.constraints.gatekeeper.sh/mitre-v2024-restrict-admission-controller   dryrun               0
    
    NAME                                                                                                                   ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srestrictautomountserviceaccounttokens.constraints.gatekeeper.sh/mitre-v2024-restrict-automountserviceaccounttoken   dryrun               0
    
    NAME                                                                                                  ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srestrictnamespaces.constraints.gatekeeper.sh/mitre-v2024-restrict-kubernetes-dashboard-namespace   dryrun               0
    
    NAME                                                                                   ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srestrictrbacsubjects.constraints.gatekeeper.sh/mitre-v2024-restrict-rbac-subjects   dryrun               0
    
    NAME                                                                                        ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srestrictrolebindings.constraints.gatekeeper.sh/mitre-v2024-restrict-cluster-admin-role   dryrun               0
    
    NAME                                                                               ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srestrictrolerules.constraints.gatekeeper.sh/mitre-v2024-restrict-pods-exec      dryrun               0
    k8srestrictrolerules.constraints.gatekeeper.sh/mitre-v2024-restrict-role-secrets   dryrun               0
    

kpt

  1. Installa e configura kpt. kpt viene utilizzato in queste istruzioni per personalizzare ed eseguire il deployment delle risorse Kubernetes.

  2. Scarica il bundle di policy MITRE da GitHub utilizzando kpt:

    kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/mitre-v2024
    
  3. Esegui la funzione kpt set-enforcement-action per impostare l'azione di applicazione delle policy su dryrun:

    kpt fn eval mitre-v2024 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 \
      -- enforcementAction=dryrun
    
  4. Inizializza la directory di lavoro con kpt, che crea una risorsa per monitorare le modifiche:

    cd mitre-v2024
    kpt live init
    
  5. Applica i vincoli dei criteri con kpt:

    kpt live apply
    
  6. Verifica che i vincoli dei criteri siano stati installati e controlla se esistono violazioni nel cluster:

    kpt live status --output table --poll-until current
    

    Lo stato CURRENT conferma l'installazione riuscita dei vincoli.

Config Sync

  1. Installa e configura kpt. kpt viene utilizzato in queste istruzioni per personalizzare ed eseguire il deployment delle risorse Kubernetes.

Gli operatori che utilizzano Config Sync per eseguire il deployment dei criteri nei propri cluster possono utilizzare le seguenti istruzioni:

  1. Passa alla directory di sincronizzazione per Config Sync:

    cd SYNC_ROOT_DIR
    

    Per creare o aggiungere .gitignore con resourcegroup.yaml:

    echo resourcegroup.yaml >> .gitignore
    

  2. Crea una directory policies dedicata:

    mkdir -p policies
    
  3. Scarica il bundle di policy MITRE da GitHub utilizzando kpt:

    kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/mitre-v2024 policies/mitre-v2024
    
  4. Esegui la funzione kpt set-enforcement-action per impostare l'azione di applicazione delle policy su dryrun:

    kpt fn eval policies/mitre-v2024 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=dryrun
    
  5. (Facoltativo) Visualizza l'anteprima dei vincoli delle norme da creare:

    kpt live init policies/mitre-v2024
    kpt live apply --dry-run policies/mitre-v2024
    
  6. Se la directory di sincronizzazione per Config Sync utilizza Kustomize, aggiungi policies/mitre-v2024 alla radice kustomization.yaml. In caso contrario, rimuovi il file policies/mitre-v2024/kustomization.yaml:

    rm SYNC_ROOT_DIR/policies/mitre-v2024/kustomization.yaml
    
  7. Esegui il push delle modifiche nel repository Config Sync:

    git add SYNC_ROOT_DIR/policies/mitre-v2024
    git commit -m 'Adding MITRE policy audit enforcement'
    git push
    
  8. Verifica lo stato dell'installazione:

    watch gcloud beta container fleet config-management status --project PROJECT_ID
    

    Lo stato SYNCED conferma l'installazione dei criteri.

Visualizzare le violazioni delle norme

Una volta installati i vincoli dei criteri in modalità audit, le violazioni nel cluster possono essere visualizzate nell'interfaccia utente utilizzando la dashboard di Policy Controller.

Puoi anche utilizzare kubectl per visualizzare le violazioni nel cluster utilizzando il seguente comando:

kubectl get constraint -l policycontroller.gke.io/bundleName=mitre-v2024 -o json | jq -cC '.items[]| [.metadata.name,.status.totalViolations]'

Se sono presenti violazioni, è possibile visualizzare un elenco dei messaggi di violazione per vincolo con:

kubectl get constraint -l policycontroller.gke.io/bundleName=mitre-v2024 -o json | jq -C '.items[]| select(.status.totalViolations>0)| [.metadata.name,.status.violations[]?]'

Modifica del provvedimento del bundle di policy MITRE

Dopo aver esaminato le violazioni delle norme nel cluster, puoi valutare la possibilità di modificare la modalità di applicazione in modo che il controller di ammissione warn o addirittura deny impedisca l'applicazione al cluster di risorse non conformi.

kubectl

  1. Utilizza kubectl per impostare l'azione di applicazione delle norme su warn:

    kubectl get constraint -l policycontroller.gke.io/bundleName=mitre-v2024 -o name | xargs -I {} kubectl patch {} --type='json' -p='[{"op":"replace","path":"/spec/enforcementAction","value":"warn"}]'
    
  2. Verifica che l'azione di applicazione dei vincoli dei criteri sia stata aggiornata:

    kubectl get constraint -l policycontroller.gke.io/bundleName=mitre-v2024
    

kpt

  1. Esegui la funzione kpt set-enforcement-action per impostare l'azione di applicazione delle policy su warn:

    kpt fn eval -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn
    
  2. Applica i vincoli dei criteri:

    kpt live apply
    

Config Sync

Gli operatori che utilizzano Config Sync per eseguire il deployment dei criteri nei propri cluster possono utilizzare le seguenti istruzioni:

  1. Passa alla directory di sincronizzazione per Config Sync:

    cd SYNC_ROOT_DIR
    
  2. Esegui la funzione kpt set-enforcement-action per impostare l'azione di applicazione delle policy su warn:

    kpt fn eval policies/mitre-v2024 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn
    
  3. Esegui il push delle modifiche nel repository Config Sync:

    git add SYNC_ROOT_DIR/policies/mitre-v2024
    git commit -m 'Adding MITRE policy bundle warn enforcement'
    git push
    
  4. Verifica lo stato dell'installazione:

    nomos status
    

    Il cluster dovrebbe mostrare lo stato SYNCED con i criteri installati.

Test dell'applicazione delle norme

Crea una risorsa non conforme sul cluster utilizzando il seguente comando:

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  namespace: default
  name: wp-non-compliant
  labels:
    app: wordpress
spec:
  containers:
    - image: wordpress
      name: wordpress
      ports:
      - containerPort: 80
        name: wordpress
EOF

Il controller di ammissione deve generare un avviso che elenca le violazioni delle norme che questa risorsa viola, come mostrato nell'esempio seguente:

Warning: [mitre-v2024-restrict-repos] container <wordpress> has an invalid image repo <wordpress>, allowed repos are ["gcr.io/gke-release/", "gcr.io/anthos-baremetal-release/", "gcr.io/gke-on-prem-release/", "gcr.io/gke-multi-cloud-release/", "gcr.io/config-management-release/", "gcr.io/kubebuilder/", "gcr.io/gkeconnect/", "gke.gcr.io/"]
pod/wp-non-compliant created

Rimuovi il bundle di policy MITRE

Se necessario, il pacchetto di norme MITRE può essere rimosso dal cluster.

kubectl

  • Utilizza kubectl per rimuovere i criteri:

    kubectl delete constraint -l policycontroller.gke.io/bundleName=mitre-v2024
    

kpt

  • Rimuovi le policy:

    kpt live destroy
    

Config Sync

Gli operatori che utilizzano Config Sync per eseguire il deployment dei criteri nei propri cluster possono utilizzare le seguenti istruzioni:

  1. Esegui il push delle modifiche nel repository Config Sync:

    git rm -r SYNC_ROOT_DIR/policies/mitre-v2024
    git commit -m 'Removing MITRE policies'
    git push
    
  2. Verifica lo stato:

    nomos status
    

    Il cluster dovrebbe mostrare lo stato SYNCED con le risorse rimosse.