Use restrições da política de segurança de pods

O Policy Controller inclui uma biblioteca predefinida de modelos de restrições que podem ser usados com o conjunto de políticas de segurança de pods para alcançar muitas das mesmas proteções que a política de segurança de pods (PSP) do Kubernetes, com a capacidade adicional de testar as suas políticas antes de as aplicar e excluir a cobertura de recursos específicos.

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

Esta página destina-se a administradores de TI e operadores que querem garantir que todos os recursos executados na plataforma de nuvem cumprem os requisitos de conformidade da organização, fornecendo e mantendo a automatização para auditar ou aplicar. Para saber mais sobre as funções comuns e as tarefas de exemplo a que fazemos referência no Google Cloud conteúdo, consulte o artigo Funções e tarefas comuns do utilizador do GKE.

O pacote inclui estas restrições que fornecem parâmetros que são mapeados para os seguintes nomes de campos (IDs de controlo) da política de segurança de pods (PSP) do Kubernetes:

Nome da restrição Descrição da restrição Control&nbspID
psp-v2022-psp-allow-privilege-escalation Restringir o escalamento a privilégios de raiz allowPrivilegeEscalation
psp-v2022-psp-apparmor O perfil do AppArmor usado pelos contentores anotações
psp-v2022-psp-capabilities Capacidades do Linux allowedCapabilities, requiredDropCapabilities
psp-v2022-flexvolume-drivers Permita controladores FlexVolume específicos allowedFlexVolumes
psp-v2022-psp-forbidden-sysctls O perfil sysctl usado pelos contentores forbiddenSysctls
psp-v2022-psp-fsgroup Alocar um FSGroup que seja proprietário dos volumes do pod fsGroup
psp-v2022-psp-host-filesystem Utilização do sistema de ficheiros do anfitrião allowedHostPaths
psp-v2022-psp-host-namespace Utilização de espaços de nomes de anfitriões hostPID, hostIPC
psp-v2022-psp-host-network-ports Utilização de portas e redes de anfitriões hostNetwork, hostPorts
psp-v2022-psp-privileged-container Execução de contentores privilegiados privilegiado
psp-v2022-psp-proc-mount Os tipos de montagem de proc permitidos para o contentor allowedProcMountTypes
psp-v2022-psp-readonlyrootfilesystem Exigir a utilização de um sistema de ficheiros raiz só de leitura readOnlyRootFilesystem
psp-v2022-psp-seccomp O perfil seccomp usado pelos contentores anotações
psp-v2022-psp-selinux-v2 O contexto SELinux do contentor seLinux
psp-v2022-psp-pods-allowed-user-ranges Os IDs de utilizadores e grupos do contentor runAsUser, runAsGroup, supplementalGroups, fsGroup
psp-v2022-psp-volume-types Utilização de tipos de volumes volumes

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 no seu cluster com a biblioteca predefinida de modelos de restrições.

Audite o pacote de políticas da política de segurança de pods

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 relativamente às práticas recomendadas da Google 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 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/bundles/psp-v2022
    
  2. Aplique as restrições de políticas com o kubectl:

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

    O resultado é o seguinte:

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

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

    O resultado é semelhante ao seguinte:

    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
    
  4. (Opcional) Ajuste o nome do campo PSP parameters nos ficheiros de restrição, conforme necessário para o seu ambiente de cluster. Para mais detalhes, consulte o link do nome do campo do FSP específico na tabela acima. Por exemplo, em psp-host-network-ports:

    parameters:
      hostNetwork: true
      min: 80
      max: 9000
    

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 v2022 da política de segurança de pods (PSP) do GitHub através do kpt:

    kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/psp-v2022
    
  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 psp-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 monitorizar as alterações:

    cd psp-v2022
    kpt live init
    
  5. (Opcional) Ajuste o nome do campo PSP parameters nos ficheiros de restrição, conforme necessário para o seu ambiente de cluster. Para mais detalhes, consulte o link do nome do campo do FSP específico na tabela acima. Por exemplo, em psp-host-network-ports:

    parameters:
      hostNetwork: true
      min: 80
      max: 9000
    
  6. Aplique as restrições de políticas com o kpt:

    kpt live apply
    
  7. 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 v2022 da política de segurança de pods (PSP) do GitHub através do kpt:

    kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/psp-v2022 policies/psp-v2022
    
  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/psp-v2022 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=dryrun
    
  5. (Opcional) Ajuste o nome do campo PSP parameters nos ficheiros de restrição, conforme necessário para o seu ambiente de cluster. Para mais detalhes, consulte o link do nome do campo do FSP específico na tabela acima. Por exemplo, em psp-host-network-ports:

    parameters:
      hostNetwork: true
      min: 80
      max: 9000
    
  6. (Opcional) Pré-visualize as restrições de políticas a serem criadas:

    kpt live init policies/psp-v2022
    kpt live apply --dry-run policies/psp-v2022
    

    O resultado é o seguinte:

    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
    
  7. Se o diretório de sincronização do Config Sync usar o Kustomize, adicione policies/psp-v2022 ao kustomization.yaml raiz. Caso contrário, remova o ficheiro policies/psp-v2022/kustomization.yaml:

    rm SYNC_ROOT_DIR/policies/psp-v2022/kustomization.yaml
    
  8. Envie 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
    
  9. Verifique 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=psp-v2022 -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=psp-v2022 -o json | jq -C '.items[]| select(.status.totalViolations>0)| [.metadata.name,.status.violations[]?]'

Alterar a ação de aplicação do conjunto de políticas da política de segurança de pods

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 ative ou até mesmo deny bloqueie a aplicação de recursos não conformes 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=psp-v2022 -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=psp-v2022
    

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/psp-v2022 -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/psp-v2022
    git commit -m 'Adding Pod Security Policy policy bundle warn enforcement'
    git push
    
  4. Verifique 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: [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"}
Warning: [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"}
Warning: [psp-v2022-psp-pods-allowed-user-ranges] Container wordpress is attempting to run without a required securityContext/runAsUser
Warning: [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"}
Warning: [psp-v2022-psp-allow-privilege-escalation] Privilege escalation container is not allowed: wordpress
Warning: [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"}
Warning: [psp-v2022-psp-capabilities] container <wordpress> is not dropping all required capabilities. Container must drop all of ["must_drop"] or "ALL"
Warning: [psp-v2022-psp-readonlyrootfilesystem] only read-only root filesystem container is allowed: wordpress
pod/wp-non-compliant created

Remova o pacote de políticas da política de segurança de pods

Se necessário, o pacote de políticas da política 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=psp-v2022
    

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/psp-v2022
    git commit -m 'Removing PSP policies'
    git push
    
  2. Valide o estado:

    nomos status
    

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