Usar restrições da Política 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 políticas de segurança de pods para ter várias proteções iguais como a Política de Segurança de Pods do Kubernetes (PSP, na sigla em inglês), com a capacidade extra de testar as políticas antes de aplicá-las e excluir a cobertura de recursos específicos.
O pacote inclui essas restrições que fornecem parâmetros mapeados para os seguintes nomes de campo da Política de segurança de pods do Kubernetes (PSP, na sigla em inglês):
Antes de começar
- Instale e inicialize a Google Cloud CLI,
que fornece os
comandos
gcloud
ekubectl
usados nestas instruções. Se você usa o Cloud Shell, a Google Cloud CLI já vem pré-instalada. - Instale o Policy Controller no cluster com a biblioteca padrão de modelos de restrição.
Faça auditorias com o Policy Controller
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
(Opcional) Visualize as restrições de política com o kubectl:
kubectl kustomize https://github.com/GoogleCloudPlatform/acm-policy-controller-library.git/bundles/psp-v2022
Aplique as restrições da política com o kubectl:
kubectl apply -k https://github.com/GoogleCloudPlatform/acm-policy-controller-library.git/bundles/psp-v2022
A saída é esta:
k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/psp-v2022-psp-allow-privilege-escalation created k8spspallowedusers.constraints.gatekeeper.sh/psp-v2022-psp-pods-allowed-user-ranges created k8spspapparmor.constraints.gatekeeper.sh/psp-v2022-psp-apparmor created k8spspcapabilities.constraints.gatekeeper.sh/psp-v2022-psp-capabilities created k8spspfsgroup.constraints.gatekeeper.sh/psp-v2022-psp-fsgroup created k8spspflexvolumes.constraints.gatekeeper.sh/psp-v2022-psp-flexvolume-drivers created k8spspforbiddensysctls.constraints.gatekeeper.sh/psp-v2022-psp-forbidden-sysctls created k8spsphostfilesystem.constraints.gatekeeper.sh/psp-v2022-psp-host-filesystem created k8spsphostnamespace.constraints.gatekeeper.sh/psp-v2022-psp-host-namespace created k8spsphostnetworkingports.constraints.gatekeeper.sh/psp-v2022-psp-host-network-ports created k8spspprivilegedcontainer.constraints.gatekeeper.sh/psp-v2022-psp-privileged-container created k8spspprocmount.constraints.gatekeeper.sh/psp-v2022-psp-proc-mount created k8spspreadonlyrootfilesystem.constraints.gatekeeper.sh/psp-v2022-psp-readonlyrootfilesystem created k8spspselinuxv2.constraints.gatekeeper.sh/psp-v2022-psp-selinux-v2 created k8spspseccomp.constraints.gatekeeper.sh/psp-v2022-psp-seccomp created k8spspvolumetypes.constraints.gatekeeper.sh/psp-v2022-psp-volume-types created
Verifique se as restrições da política foram instaladas e se existem violações no cluster:
kubectl get -k https://github.com/GoogleCloudPlatform/acm-policy-controller-library.git/bundles/psp-v2022
O resultado será assim:
NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/psp-v2022-psp-allow-privilege-escalation dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspallowedusers.constraints.gatekeeper.sh/psp-v2022-psp-pods-allowed-user-ranges dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspapparmor.constraints.gatekeeper.sh/psp-v2022-psp-apparmor 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspcapabilities.constraints.gatekeeper.sh/psp-v2022-psp-capabilities dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspfsgroup.constraints.gatekeeper.sh/psp-v2022-psp-fsgroup 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspflexvolumes.constraints.gatekeeper.sh/psp-v2022-psp-flexvolume-drivers 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspforbiddensysctls.constraints.gatekeeper.sh/psp-v2022-psp-forbidden-sysctls 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spsphostfilesystem.constraints.gatekeeper.sh/psp-v2022-psp-host-filesystem 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spsphostnamespace.constraints.gatekeeper.sh/psp-v2022-psp-host-namespace dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spsphostnetworkingports.constraints.gatekeeper.sh/psp-v2022-psp-host-network-ports dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspprivilegedcontainer.constraints.gatekeeper.sh/psp-v2022-psp-privileged-container dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspprocmount.constraints.gatekeeper.sh/psp-v2022-psp-proc-mount 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspreadonlyrootfilesystem.constraints.gatekeeper.sh/psp-v2022-psp-readonlyrootfilesystem 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspselinuxv2.constraints.gatekeeper.sh/psp-v2022-psp-selinux-v2 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspseccomp.constraints.gatekeeper.sh/psp-v2022-psp-seccomp dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspvolumetypes.constraints.gatekeeper.sh/psp-v2022-psp-volume-types 0
(Opcional) Ajuste o nome do campo do PSP
parameters
nos arquivos de restrição conforme necessário para o ambiente do cluster. Para mais detalhes, confira na tabela acima o link para o nome do campo do PSP específico. Por exemplo, empsp-host-network-ports
:parameters: hostNetwork: true min: 80 max: 9000
kpt
Instale e configure o kpt. O kpt é usado nestas instruções para personalizar e implantar recursos do Kubernetes.
Faça o download do pacote de políticas da Política de segurança de pods (PSP, na sigla em inglês) v2022 do GitHub usando kpt:
kpt pkg get https://github.com/GoogleCloudPlatform/acm-policy-controller-library.git/bundles/psp-v2022
Execute a função
set-enforcement-action
do kpt para definir a ação de aplicação das políticas comodryrun
:kpt fn eval psp-v2022 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 \ -- enforcementAction=dryrun
Inicialize o diretório de trabalho com o kpt, que cria um recurso para acompanhar as alterações:
cd psp-v2022 kpt live init
(Opcional) Ajuste o nome do campo do PSP
parameters
nos arquivos de restrição conforme necessário para o ambiente do cluster. Para mais detalhes, confira na tabela acima o link para o nome do campo do PSP específico. Por exemplo, empsp-host-network-ports
:parameters: hostNetwork: true min: 80 max: 9000
Aplique as restrições da política ao kpt:
kpt live apply
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
Instale e configure o kpt. O kpt é usado nestas instruções para personalizar e implantar recursos do Kubernetes.
Se você estiver usando o Anthos Config Management pela primeira vez, ative o Anthos Config Management.
Os operadores que usam o Config Sync para implantar políticas nos clusters podem usar as seguintes instruções:
Altere para o diretório de sincronização do Config Sync:
cd SYNC_ROOT_DIR
Para criar ou anexar
.gitignore
comresourcegroup.yaml
:echo resourcegroup.yaml >> .gitignore
Crie um diretório
policies
dedicado:mkdir -p policies
Faça o download do pacote de políticas da Política de segurança de pods (PSP, na sigla em inglês) v2022 do GitHub usando kpt:
kpt pkg get https://github.com/GoogleCloudPlatform/acm-policy-controller-library.git/bundles/psp-v2022 policies/psp-v2022
Execute a função
set-enforcement-action
do kpt para definir a ação de aplicação das políticas comodryrun
:kpt fn eval policies/psp-v2022 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=dryrun
(Opcional) Ajuste o nome do campo do PSP
parameters
nos arquivos de restrição conforme necessário para o ambiente do cluster. Para mais detalhes, confira na tabela acima o link para o nome do campo do PSP específico. Por exemplo, empsp-host-network-ports
:parameters: hostNetwork: true min: 80 max: 9000
Visualize as restrições de política que serão criadas (opcional):
kpt live init policies/psp-v2022 kpt live apply --dry-run policies/psp-v2022
A saída é esta:
Dry-run strategy: client inventory update started inventory update finished apply phase started k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/psp-v2022-psp-allow-privilege-escalation apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspallowedusers.constraints.gatekeeper.sh/psp-v2022-psp-pods-allowed-user-ranges apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspapparmor.constraints.gatekeeper.sh/psp-v2022-psp-apparmor apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspcapabilities.constraints.gatekeeper.sh/psp-v2022-psp-capabilities apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspfsgroup.constraints.gatekeeper.sh/psp-v2022-psp-fsgroup apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspflexvolumes.constraints.gatekeeper.sh/psp-v2022-psp-flexvolume-drivers apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspforbiddensysctls.constraints.gatekeeper.sh/psp-v2022-psp-forbidden-sysctls apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spsphostfilesystem.constraints.gatekeeper.sh/psp-v2022-psp-host-filesystem apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spsphostnamespace.constraints.gatekeeper.sh/psp-v2022-psp-host-namespace apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spsphostnetworkingports.constraints.gatekeeper.sh/psp-v2022-psp-host-network-ports apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspprivilegedcontainer.constraints.gatekeeper.sh/psp-v2022-psp-privileged-container apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspprocmount.constraints.gatekeeper.sh/psp-v2022-psp-proc-mount apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspreadonlyrootfilesystem.constraints.gatekeeper.sh/psp-v2022-psp-readonlyrootfilesystem apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspselinuxv2.constraints.gatekeeper.sh/psp-v2022-psp-selinux-v2 apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspseccomp.constraints.gatekeeper.sh/psp-v2022-psp-seccomp apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspvolumetypes.constraints.gatekeeper.sh/psp-v2022-psp-volume-types apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) apply phase finished inventory update started inventory update finished apply result: 16 attempted, 0 successful, 16 skipped, 0 failed
Se o diretório de sincronização do Config Sync usar Kustomize, adicione
policies/psp-v2022
à raizkustomization.yaml
. Caso contrário, remova o arquivopolicies/psp-v2022/kustomization.yaml
:rm SYNC_ROOT_DIR/policies/psp-v2022/kustomization.yaml
Envie as alterações para o repositório do Config Sync:
git add SYNC_ROOT_DIR/policies/psp-v2022 git commit -m 'Adding Pod Security Policy audit enforcement' git push
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=psp-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=psp-v2022 -o json | jq -C '.items[]| select(.status.totalViolations>0)| [.metadata.name,.status.violations[]?]'
Aplicar políticas da política de segurança
Depois de revisar as violações da política no cluster e ajustar os parâmetros do nome do campo do PSP, conforme necessário, a próxima etapa é aplicar essas políticas para que o Controlador de admissão bloqueie a aplicação de qualquer recurso que não esteja em conformidade com o cluster.
kubectl
Use o kubectl para definir a ação de cumprimento das políticas como
deny
:kubectl get constraint -l policycontroller.gke.io/bundleName=psp-v2022 -o json | jq '.items[].spec.enforcementAction="deny"' | kubectl apply -f -
Verifique se a ação de cumprimento das restrições da política foi atualizada:
kubectl get -k https://github.com/GoogleCloudPlatform/acm-policy-controller-library.git/bundles/psp-v2022
kpt
Execute a função
set-enforcement-action
do kpt para definir a ação de aplicação das políticas comodeny
:kpt fn eval -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=deny
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:
Altere para o diretório de sincronização do Config Sync:
cd SYNC_ROOT_DIR
Execute a função
set-enforcement-action
do kpt para definir a ação de aplicação das políticas comodeny
:kpt fn eval policies/psp-v2022 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=deny
Envie as alterações para o repositório do Config Sync:
git add SYNC_ROOT_DIR/policies/psp-v2022 git commit -m 'Enforcing Pod Security Policy policies for GKE' git push
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
Faça um teste rápido para confirmar a aplicação da política e o bloqueio de recursos que não estejam em conformidade no cluster.
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 erro listando as violações da política que esse recurso viola. Exemplo:
Error from server (Forbidden): error when creating "STDIN": admission webhook "validation.gatekeeper.sh" denied the request: [psp-v2022-psp-pods-allowed-user-ranges] Container wordpress is attempting to run without a required securityContext/fsGroup. Allowed fsGroup: {"ranges": [{"max": 200, "min": 100}], "rule": "MustRunAs"} [psp-v2022-psp-pods-allowed-user-ranges] Container wordpress is attempting to run without a required securityContext/runAsGroup. Allowed runAsGroup: {"ranges": [{"max": 200, "min": 100}], "rule": "MustRunAs"} [psp-v2022-psp-pods-allowed-user-ranges] Container wordpress is attempting to run without a required securityContext/runAsUser [psp-v2022-psp-pods-allowed-user-ranges] Container wordpress is attempting to run without a required securityContext/supplementalGroups. Allowed supplementalGroups: {"ranges": [{"max": 200, "min": 100}], "rule": "MustRunAs"} [psp-v2022-psp-allow-privilege-escalation] Privilege escalation container is not allowed: wordpress [psp-v2022-psp-seccomp] Seccomp profile 'not configured' is not allowed for container 'wordpress'. Found at: no explicit profile found. Allowed profiles: {"RuntimeDefault", "docker/default", "runtime/default"} [psp-v2022-psp-capabilities] containeris not dropping all required capabilities. Container must drop all of ["must_drop"] or "ALL" [psp-v2022-psp-readonlyrootfilesystem] only read-only root filesystem container is allowed: wordpress