Use restrições de políticas MITRE

O Policy Controller inclui uma biblioteca predefinida de modelos de restrições que podem ser usados com o pacote de políticas MITRE para avaliar a conformidade dos recursos do cluster com alguns aspetos da base de conhecimentos MITRE de táticas e técnicas de adversários com base em observações do mundo real.

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

Restrições do pacote de políticas da MITRE

Nome da restrição Descrição da restrição
mitre-v2024-apparmor Restringe o perfil AppArmor para os Pods.
mitre-v2024-block-all-ingress Restringe a criação de objetos Ingress.
mitre-v2024-cronjob-restrict-repos Restringe as imagens de contentores para CronJob a uma lista de repositórios permitidos.
mitre-v2024-no-anonymous Não permite associar recursos ClusterRole e Role ao utilizador system:anonymous e ao grupo system:unauthenticated.
mitre-v2024-host-namespaces-host-pid-ipc Os contentores não podem ser executados com hostPID ou hostIPC definidos como true.
mitre-v2024-host-namespaces-hostnetwork Não é possível executar contentores com hostNetwork definido como true.
mitre-v2024-host-ports HostPorts deve ser proibido ou, pelo menos, restrito a uma lista conhecida.
mitre-v2024-no-secrets-as-env-vars Restringe a utilização de segredos como variáveis de ambiente em definições de contentores.
mitre-v2024-privileged-containers Restringe contentores com securityContext.privileged definido como true.
mitre-v2024-proc-mount-type As máscaras /proc predefinidas reduzem a superfície de ataque e são obrigatórias.
mitre-v2024-require-binauthz Requer o webhook de admissão de validação da autorização binária.
mitre-v2024-require-namespace-networkpolicy Requer que todos os namespaces definidos no cluster tenham uma NetworkPolicy.
mitre-v2024-restrict-admission-controller Restringe a utilização de controladores de admissão dinâmicos e webhooks.
mitre-v2024-restrict-automountserviceaccounttoken Restringe a utilização de tokens de contas de serviço.
mitre-v2024-restrict-capabilities Não é permitido adicionar capacidades além das indicadas.
mitre-v2024-restrict-cluster-admin-role Restringe a utilização da função cluster-admin.
mitre-v2024-restrict-hostpath-volumes Restringe a utilização de volumes HostPath.
mitre-v2024-restrict-kubernetes-dashboard-namespace Restringe a utilização do espaço de nomes kubernetes-dashboard.
mitre-v2024-restrict-pods-exec Restringe a utilização do pods/exec no Roles e no ClusterRoles.
mitre-v2024-restrict-rbac-subjects Restringe a utilização de nomes em objetos RBAC a valores permitidos.
mitre-v2024-restrict-repos Restringe as imagens de contentores a uma repos lista permitida.
mitre-v2024-restrict-role-secrets Restringe a utilização de segredos em Roles e ClusterRoles.
mitre-v2024-restrict-windows-hostprocess Restringe a execução de contentores / pods HostProcess do Windows
mitre-v2024-seccomp O perfil do Seccomp não pode estar definido como Unconfined.
mitre-v2024-selinux Não é possível definir o tipo SELinux nem definir uma opção de utilizador ou função SELinux personalizada.
mitre-v2024-sysctls Os contentores só podem definir sysctls indicados no campo allowedSysctls.

Antes de começar

  1. Instale e inicialize a CLI do Google Cloud, que fornece os comandos gcloud e kubectl usados nestas instruções. Se usar a Cloud Shell, a Google Cloud CLI é pré-instalada.
  2. Instale o Policy Controller v1.17.2 ou superior no seu cluster com a biblioteca predefinida de modelos de restrições. Também tem de ativar o suporte para restrições referenciais, uma vez que este pacote contém restrições referenciais.

Configure o Policy Controller para restrições referenciais

  1. Guarde o seguinte manifesto YAML num ficheiro como policycontroller-config.yaml. O manifesto configura o Policy Controller para monitorizar 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
    

Auditoria do pacote de políticas MITRE

O Policy Controller permite-lhe aplicar políticas ao seu cluster do Kubernetes. Para ajudar a testar as suas cargas de trabalho e a respetiva conformidade no que diz respeito às políticas da MITRE descritas na tabela anterior, pode implementar estas restrições no modo "auditoria" para revelar violações e, mais importante, dar-se a oportunidade de as corrigir antes de as aplicar no seu cluster do Kubernetes.

Pode aplicar estas políticas com spec.enforcementAction definido como dryrun através do kubectl, kpt, ou Config Sync.

kubectl

  1. (Opcional) Pré-visualize as restrições de políticas com o kubectl:

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

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

    O resultado é o seguinte:

    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. Confirme se as restrições de políticas foram instaladas e verifique se existem violações no cluster:

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

    O resultado é semelhante ao seguinte:

    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 implementar recursos do Kubernetes.

  2. Transfira o pacote de políticas da MITRE do GitHub através do kpt:

    kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/mitre-v2024
    
  3. Execute a função set-enforcement-action 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 monitorizar as alterações:

    cd mitre-v2024
    kpt live init
    
  5. Aplique as restrições de políticas com o kpt:

    kpt live apply
    
  6. Confirme se as restrições de políticas foram instaladas e verifique se existem violações no cluster:

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

    O estado 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 implementar recursos do Kubernetes.

Os operadores que usam o Config Sync para implementar políticas nos respetivos 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 acrescentar .gitignore com resourcegroup.yaml:

    echo resourcegroup.yaml >> .gitignore
    

  2. Crie um diretório policies dedicado:

    mkdir -p policies
    
  3. Transfira o pacote de políticas da MITRE do GitHub através do 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 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) Pré-visualize as restrições de políticas 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 o Kustomize, adicione policies/mitre-v2024 ao kustomization.yaml raiz. Caso contrário, remova o ficheiro policies/mitre-v2024/kustomization.yaml:

    rm SYNC_ROOT_DIR/policies/mitre-v2024/kustomization.yaml
    
  7. Envie 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. Valide o estado da instalação:

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

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

Veja as violações de políticas

Depois de instaladas no modo de auditoria, as restrições de políticas no cluster podem ser vistas na IU através do Painel de controlo do Policy Controller.

Também pode usar kubectl para ver as violações no cluster através do seguinte comando:

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

Se existirem violações, pode ver uma lista das mensagens de violação por restrição com o seguinte comando:

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

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

Depois de rever as violações de políticas no seu cluster, pode considerar alterar o modo de aplicação para que o controlador de admissão warn permita ou até mesmo deny impeça que o recurso não conforme seja aplicado ao cluster.

kubectl

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

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

kpt

  1. Execute a função set-enforcement-action 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 de políticas:

    kpt live apply
    

Config Sync

Os operadores que usam o Config Sync para implementar políticas nos respetivos 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 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 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. Valide o estado da instalação:

    nomos status
    

    O cluster deve apresentar o estado SYNCED com as políticas instaladas.

Teste a aplicação de políticas

Crie um recurso não compatível no cluster com 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 deve produzir um aviso que liste as violações de políticas que este recurso viola, conforme mostrado no exemplo seguinte:

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

Remova o pacote de políticas 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 implementar políticas nos respetivos clusters podem usar as seguintes instruções:

  1. Envie 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. Valide o estado:

    nomos status
    

    O cluster deve apresentar o estado SYNCED com os recursos removidos.