Usar restrições da Política de referência dos padrões de segurança de pods

O Policy Controller inclui uma biblioteca padrão de modelos de restrição que podem ser usados com o pacote de referência dos padrões de segurança de pods. Esse pacote traz as mesmas proteções que a Política de referência dos padrões de segurança de pods (PSS, na sigla em inglês) do Kubernetes, permitindo testar suas políticas antes da aplicação e excluir a cobertura de recursos específicos.

Restrições do pacote de políticas de referência dos padrões de segurança de pods

Nome da restrição Descrição da restrição Nome do controle
pss-baseline-v2022-hostprocess Uso do Windows HostProcess HostProcess
pss-baseline-v2022-host-namespaces-hostnetwork Uso da rede do host Namespaces do host
pss-baseline-v2022-host-namespaces-host-pid-ipc Uso de namespaces do host
pss-baseline-v2022-privileged-containers Como executar contêineres privilegiados Contêineres privilegiados
pss-baseline-v2022-capabilities Recursos do Linux Recursos
pss-baseline-v2022-hostpath-volumes Uso do sistema de arquivos do host Volumes do HostPath
pss-baseline-v2022-host-ports Uso de portas do host Portas do host (configurável)
pss-baseline-v2022-apparmor O perfil do AppArmor usado pelos contêineres AppArmor
pss-baseline-v2022-selinux O contexto SELinux do contêiner SELinux
pss-baseline-v2022-proc-mount-type Tipos de montagem de processo permitidos para o contêiner Tipo de montagem /proc
pss-baseline-v2022-seccomp O perfil seccomp usado por contêineres Seccomp
pss-baseline-v2022-sysctls O perfil sysctl usado por contêineres Sysctls

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 v.1.14.1 ou mais recente no cluster com a biblioteca padrão de modelos de restrição.

Pacote de políticas de referência dos padrões de segurança de pods de auditoria

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 de CIS 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/bundles/pss-baseline-v2022
    
  2. Aplique as restrições da política com o kubectl:

    kubectl apply -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/pss-baseline-v2022
    

    A saída é esta:

    k8spspapparmor.constraints.gatekeeper.sh/pss-baseline-v2022-apparmor created
    k8spspcapabilities.constraints.gatekeeper.sh/pss-baseline-v2022-capabilities created
    k8spsphostfilesystem.constraints.gatekeeper.sh/pss-baseline-v2022-hostpath-volumes created
    k8spsphostnamespace.constraints.gatekeeper.sh/pss-baseline-v2022-host-namespaces-host-pid-ipc created
    k8spsphostnetworkingports.constraints.gatekeeper.sh/pss-baseline-v2022-host-namespaces-hostnetwork created
    k8spsphostnetworkingports.constraints.gatekeeper.sh/pss-baseline-v2022-host-ports created
    k8spspprivilegedcontainer.constraints.gatekeeper.sh/pss-baseline-v2022-privileged-containers created
    k8spspprocmount.constraints.gatekeeper.sh/pss-baseline-v2022-proc-mount-type created
    k8spspselinuxv2.constraints.gatekeeper.sh/pss-baseline-v2022-selinux created
    k8spspseccomp.constraints.gatekeeper.sh/pss-baseline-v2022-seccomp created
    k8spspforbiddensysctls.constraints.gatekeeper.sh/pss-baseline-v2022-sysctls created
    
  3. Verifique se as restrições da política foram instaladas e se existem violações no cluster:

    kubectl get -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/pss-baseline-v2022
    

    O resultado será assim:

    NAME                                                                   ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspapparmor.constraints.gatekeeper.sh/pss-baseline-v2022-apparmor                        0
    
    NAME                                                                           ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspcapabilities.constraints.gatekeeper.sh/pss-baseline-v2022-capabilities   dryrun               0
    
    NAME                                                                                 ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spsphostfilesystem.constraints.gatekeeper.sh/pss-baseline-v2022-hostpath-volumes                        0
    
    NAME                                                                                            ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spsphostnamespace.constraints.gatekeeper.sh/pss-baseline-v2022-host-namespaces-host-pid-ipc   dryrun               0
    
    NAME                                                                                                 ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spsphostnetworkingports.constraints.gatekeeper.sh/pss-baseline-v2022-host-namespaces-hostnetwork   dryrun               0
    k8spsphostnetworkingports.constraints.gatekeeper.sh/pss-baseline-v2022-host-ports                    dryrun               0
    
    NAME                                                                                           ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspprivilegedcontainer.constraints.gatekeeper.sh/pss-baseline-v2022-privileged-containers   dryrun               0
    
    NAME                                                                           ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspprocmount.constraints.gatekeeper.sh/pss-baseline-v2022-proc-mount-type                        0
    
    NAME                                                                   ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspselinuxv2.constraints.gatekeeper.sh/pss-baseline-v2022-selinux                        0
    
    NAME                                                                 ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspseccomp.constraints.gatekeeper.sh/pss-baseline-v2022-seccomp   dryrun               0
    
    NAME                                                                          ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspforbiddensysctls.constraints.gatekeeper.sh/pss-baseline-v2022-sysctls   dryrun               0
    
  4. (Opcional) Ajuste a restrição pss-baseline-v2022-host-ports para incluir uma lista mínima restrita de portas conhecidas do ambiente do cluster:

    parameters:
      # A minimum restricted known list can be implemented here.
      min: 0
      max: 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 da Política de referência dos padrões de segurança de pods v2022 no GitHub usando o kpt:

    kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/pss-baseline-v2022
    
  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 pss-baseline-v2022 -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 pss-baseline-v2022
    kpt live init
    
  5. (Opcional) Você também pode ajustar o arquivo de restrição pss-baseline-v2022-host-ports para incluir uma lista mínima restrita de portas conhecidas no ambiente do cluster:

    parameters:
      # A minimum restricted known list can be implemented here.
      min: 0
      max: 0
    
  6. Aplique as restrições da política ao kpt:

    kpt live apply
    
  7. 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 da Política de referência dos padrões de segurança de pods v2022 no GitHub usando o kpt:

    kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/pss-baseline-v2022 policies/pss-baseline-v2022
    
  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/pss-baseline-v2022 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=dryrun
    
  5. (Opcional) Você também pode ajustar o arquivo de restrição pss-baseline-v2022-host-ports para incluir uma lista mínima restrita de portas conhecidas no ambiente do cluster:

    parameters:
      # A minimum restricted known list can be implemented here.
      min: 0
      max: 0
    
  6. (Opcional) Visualize as restrições de política a serem criadas:

    kpt live init policies/pss-baseline-v2022
    kpt live apply --dry-run policies/pss-baseline-v2022
    

    A saída é esta:

    Dry-run strategy: client
    inventory update started
    inventory update finished
    apply phase started
    k8spspapparmor.constraints.gatekeeper.sh/pss-baseline-v2022-apparmor apply successful
    k8spspcapabilities.constraints.gatekeeper.sh/pss-baseline-v2022-capabilities apply successful
    k8spsphostfilesystem.constraints.gatekeeper.sh/pss-baseline-v2022-hostpath-volumes apply successful
    k8spsphostnamespace.constraints.gatekeeper.sh/pss-baseline-v2022-host-namespaces-host-pid-ipc apply successful
    k8spsphostnetworkingports.constraints.gatekeeper.sh/pss-baseline-v2022-host-namespaces-hostnetwork apply successful
    k8spsphostnetworkingports.constraints.gatekeeper.sh/pss-baseline-v2022-host-ports apply successful
    k8spspprivilegedcontainer.constraints.gatekeeper.sh/pss-baseline-v2022-privileged-containers apply successful
    k8spspprocmount.constraints.gatekeeper.sh/pss-baseline-v2022-proc-mount-type apply successful
    k8spspselinuxv2.constraints.gatekeeper.sh/pss-baseline-v2022-selinux apply successful
    k8spspseccomp.constraints.gatekeeper.sh/pss-baseline-v2022-seccomp apply successful
    apply phase finished
    inventory update started
    inventory update finished
    apply result: 10 attempted, 10 successful, 0 skipped, 0 failed
    
  7. Se o diretório de sincronização do Config Sync usar Kustomize, adicione policies/pss-baseline-v2022 à raiz kustomization.yaml. Caso contrário, remova o arquivo policies/pss-baseline-v2022/kustomization.yaml:

    rm SYNC_ROOT_DIR/policies/pss-baseline-v2022/kustomization.yaml
    
  8. Envie as alterações para o repositório do Config Sync:

    git add SYNC_ROOT_DIR/pss-baseline-v2022
    git commit -m 'Adding Pod Security Standards Baseline audit enforcement'
    git push
    
  9. 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=pss-baseline-v2022 -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=pss-baseline-v2022 -o json | jq -C '.items[]| select(.status.totalViolations>0)| [.metadata.name,.status.violations[]?]'

Alterar ação de aplicação do pacote de políticas de referência dos padrões de segurança de pods

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=pss-baseline-v2022 -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=pss-baseline-v2022
    

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/pss-baseline-v2022 -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/pss-baseline-v2022
    git commit -m 'Adding Pod Security Standards Baseline policy bundle warn enforcement'
    git push
    
  4. Verifique o status da instalação:

    gcloud alpha anthos config sync repo list --project PROJECT_ID
    

    Seu repo que aparece na coluna SYNCED confirma a instalação das políticas.

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
        hostPort: 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:  [pss-baseline-v2022-host-ports] The specified hostNetwork and hostPort are not allowed, pod: wp-non-compliant. Allowed values: {"max": 0, "min": 0}
pod/wp-non-compliant created

Remover o pacote de políticas de referência dos padrões de segurança de pods

Se necessário, o pacote de políticas de referência dos padrões de segurança de pods pode ser removido do cluster.

kubectl

  • Use o kubectl para remover as políticas:

    kubectl delete constraint -l policycontroller.gke.io/bundleName=pss-baseline-v2022
    

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/pss-baseline-v2022
    git commit -m 'Removing Pod Security Standards Baseline policies'
    git push
    
  2. Verifique o status:

    gcloud alpha anthos config sync repo list --project PROJECT_ID
    

    Seu repo que aparece na coluna SYNCED confirma a remoção das políticas.