Usar restrições da política MITRE

O Policy Controller vem com uma biblioteca padrão de modelos de restrição que pode ser usada com o pacote de políticas MITRE para avaliar a conformidade dos recursos do cluster em relação a alguns aspectos da base de conhecimento MITRE sobre táticas e técnicas de invasão baseadas em observações reais.

Esta página contém instruções para aplicar manualmente um pacote de políticas. Como alternativa, você pode aplicar pacotes de políticas diretamente.

Restrições do pacote de políticas MITRE

Nome da restrição Descrição da restrição
mitre-v2024-apparmor Restringe o perfil AppArmor para pods.
mitre-v2024-block-all-ingress Restringe a criação de objetos de entrada.
mitre-v2024-cronjob-restrict-repos Restringe imagens de contêiner de CronJob a uma lista de "repos" permitida.
mitre-v2024-no-anonymous Não permite associar recursos ClusterRole e Role ao usuário system:anonymous e ao grupo system:unauthenticated.
mitre-v2024-host-namespaces-host-pid-ipc Os contêineres não podem ser executados com hostPID ou hostIPC definido como true.
mitre-v2024-host-namespaces-hostnetwork Os contêineres não podem ser executados com hostNetwork definido como true.
mitre-v2024-host-ports HostPorts não podem ser permitidas; ou, no mínimo, precisam restritas a uma lista conhecida.
mitre-v2024-no-secrets-as-env-vars Restringe o uso de secrets como variáveis de ambiente em definições de contêiner.
mitre-v2024-privileged-containers Restringe contêineres com securityContext.privileged definido como true.
mitre-v2024-proc-mount-type As máscaras /proc padrão reduzem a superfície de ataque e são obrigatórias.
mitre-v2024-require-binauthz Requer a autorização binária que valida o webhook de admissão.
mitre-v2024-require-namespace-networkpolicy Requer que cada namespace definido no cluster tenha uma NetworkPolicy.
mitre-v2024-restrict-admission-controller Restringe o uso de controladores de admissão dinâmica e webhooks.
mitre-v2024-restrict-automountserviceaccounttoken Restringe o uso de tokens de contas de serviço.
mitre-v2024-restrict-capabilities Não é permitido adicionar recursos além dos listados.
mitre-v2024-restrict-cluster-admin-role Restringe o uso do papel cluster-admin.
mitre-v2024-restrict-hostpath-volumes Restringe o uso de volumes HostPath.
mitre-v2024-restrict-kubernetes-dashboard-namespace Restringe o uso do namespace kubernetes-dashboard.
mitre-v2024-restrict-pods-exec Restringe o uso de pods/exec em Roles e de ClusterRoles.
mitre-v2024-restrict-rbac-subjects Restringe o uso de nomes nos assuntos do RBAC a valores permitidos.
mitre-v2024-restrict-repos Restringe imagens de contêiner a uma lista de repos permitida.
mitre-v2024-restrict-role-secrets Restringe o uso de secrets em Roles e ClusterRoles.
mitre-v2024-restrict-windows-hostprocess Restringe a execução de contêineres / pods do HostProcess do Windows
mitre-v2024-seccomp O perfil Seccomp não pode ser definido como Unconfined.
mitre-v2024-selinux Não é possível definir o tipo de SELinux ou uma opção de papel ou usuário personalizado do SELinux.
mitre-v2024-sysctls Os contêineres só podem definir sysctls listados no campo allowedSysctls.

Antes de começar

  1. Instale e inicialize a Google Cloud CLI, que fornece os comandos gcloud e kubectl usados nestas instruções. Se você usa o Cloud Shell, a Google Cloud CLI já vem pré-instalada.
  2. Instale o Policy Controller v1.17.2 ou mais recente no cluster com a biblioteca padrão de modelos de restrição. Você também precisa ativar a compatibilidade com restrições referenciais, já que este pacote contém restrições referenciais.

Configurar o Controlador de Políticas com restrições referenciais

  1. Salve o seguinte manifesto YAML em um arquivo como policycontroller-config.yaml. O manifesto configura o Policy Controller para observar tipos específicos de objetos.

    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. Aplique o manifesto policycontroller-config.yaml:

    kubectl apply -f policycontroller-config.yaml 

Auditar o pacote de políticas do MITRE

O Policy Controller permite aplicar políticas ao cluster do Kubernetes. Para ajudar a testar suas cargas de trabalho e a conformidade delas com relação às políticas MITRE descritas na tabela anterior, implante essas restrições no modo de "auditoria" para revelar violações e, mais importante, se permitir corrigir antes de aplicar no cluster do Kubernetes.

É possível aplicar essas políticas com spec.enforcementAction definido como dryrun usando kubectl, kpt ou Config Sync.

kubectl

  1. (Opcional) Visualize as restrições de política com o kubectl:

     kubectl kustomize https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/mitre-v2024 
  2. Aplique as restrições da política com o kubectl:

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

    A saída é esta:

     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. Verifique se as restrições da política foram instaladas e se existem violações no cluster:

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

    O resultado será assim:

     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. Instale e configure o kpt. O kpt é usado nestas instruções para personalizar e implantar recursos do Kubernetes.

  2. Faça o download do pacote de políticas MITRE no GitHub usando o kpt:

     kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/mitre-v2024 
  3. Execute a função set-enforcement-action do kpt para definir a ação de aplicação das políticas como dryrun:

     kpt fn eval mitre-v2024 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 \   -- enforcementAction=dryrun 
  4. Inicialize o diretório de trabalho com o kpt, que cria um recurso para acompanhar as alterações:

     cd mitre-v2024 kpt live init 
  5. Aplique as restrições da política com kpt:

     kpt live apply 
  6. Verifique se as restrições da política foram instaladas e se existem violações no cluster:

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

    O status CURRENT confirma a instalação bem-sucedida das restrições.

Config Sync

  1. Instale e configure o kpt. O kpt é usado nestas instruções para personalizar e implantar recursos do Kubernetes.

Os operadores que usam o Config Sync para implantar políticas nos clusters podem usar as seguintes instruções:

  1. Altere para o diretório de sincronização do Config Sync:

     cd SYNC_ROOT_DIR 

    Para criar ou anexar .gitignore com resourcegroup.yaml:

     echo resourcegroup.yaml >> .gitignore 

  2. Crie um diretório policies dedicado:

     mkdir -p policies 
  3. Faça o download do pacote de políticas MITRE no GitHub usando o kpt:

     kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/mitre-v2024 policies/mitre-v2024 
  4. Execute a função set-enforcement-action do kpt para definir a ação de aplicação das políticas como dryrun:

     kpt fn eval policies/mitre-v2024 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=dryrun 
  5. (Opcional) Visualize as restrições de política a serem criadas:

     kpt live init policies/mitre-v2024 kpt live apply --dry-run policies/mitre-v2024 
  6. Se o diretório de sincronização do Config Sync usar Kustomize, adicione policies/mitre-v2024 à raiz kustomization.yaml. Caso contrário, remova o arquivo policies/mitre-v2024/kustomization.yaml:

     rm SYNC_ROOT_DIR/policies/mitre-v2024/kustomization.yaml 
  7. Envie as alterações para o repositório do Config Sync:

     git add SYNC_ROOT_DIR/policies/mitre-v2024 git commit -m 'Adding MITRE policy audit enforcement' git push 
  8. Verifique o status da instalação:

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

    O status SYNCED confirma a instalação das políticas.

Visualizar violações de políticas

Depois que as restrições de política são instaladas no modo de auditoria, as violações no cluster podem ser visualizadas na IU usando o Painel do Controlador de políticas.

Também é possível usar kubectl para visualizar violações no cluster usando o seguinte comando:

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

Se houver violações, uma lista das mensagens de violação por restrição poderá ser visualizada com:

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

Alterar ação de aplicação do pacote de políticas do MITRE

Depois de analisar as violações de políticas no cluster, considere alterar o modo de aplicação para que o controlador de admissão warn ou deny bloqueie a aplicação de recursos sem compliance no cluster.

kubectl

  1. Use o kubectl para definir a ação de cumprimento das políticas como 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. Verifique se a ação de cumprimento das restrições da política foi atualizada:

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

kpt

  1. Execute a função set-enforcement-action do kpt para definir a ação de aplicação das políticas como warn:

     kpt fn eval -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn 
  2. Aplique as restrições da política:

     kpt live apply 

Config Sync

Os operadores que usam o Config Sync para implantar políticas nos clusters podem usar as seguintes instruções:

  1. Altere para o diretório de sincronização do Config Sync:

     cd SYNC_ROOT_DIR 
  2. Execute a função set-enforcement-action do kpt para definir a ação de aplicação das políticas como warn:

     kpt fn eval policies/mitre-v2024 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn 
  3. Envie as alterações para o repositório do Config Sync:

     git add SYNC_ROOT_DIR/policies/mitre-v2024 git commit -m 'Adding MITRE policy bundle warn enforcement' git push 
  4. Verifique o status da instalação:

     nomos status 

    O cluster vai mostrar um status de SYNCED com as políticas instaladas.

Aplicação da política de testes

Crie um recurso não compatível no cluster usando o seguinte 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 

O controlador de admissão produzirá um alerta listando as violações da política que esse recurso viola, conforme mostrado no exemplo a seguir:

 Warning: [mitre-v2024-restrict-repos] container <wordpress&gt has an invalid image repo <wordpress&gt, 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 

Remover o pacote de políticas do MITRE

Se necessário, o pacote de políticas MITRE pode ser removido do cluster.

kubectl

  • Use o kubectl para remover as políticas:

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

kpt

  • Remova as políticas:

     kpt live destroy 

Config Sync

Os operadores que usam o Config Sync para implantar políticas nos clusters podem usar as seguintes instruções:

  1. Envie as alterações para o repositório do Config Sync:

     git rm -r SYNC_ROOT_DIR/policies/mitre-v2024 git commit -m 'Removing MITRE policies' git push 
  2. Verifique o status:

     nomos status 

    O cluster vai mostrar o status SYNCED com os recursos removidos.