Restrições de políticas essenciais de políticas de utilização v2022

O Policy Controller inclui uma biblioteca predefinida de modelos de restrições que podem ser usados com o pacote Policy Essentials v2022 para aplicar as práticas recomendadas da Google aos recursos do cluster.

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.

Este conjunto de restrições aborda e aplica políticas nos seguintes domínios:

  • RBAC e contas de serviço
  • Políticas de segurança de agrupamentos
  • Interface de rede de contentores (CNI)
  • Gestão de segredos
  • Políticas gerais

Restrições do pacote de políticas essenciais

Nome da restrição Descrição da restrição
policy-essentials-v2022-no-secrets-as-env-vars Prefira usar Secrets como ficheiros em vez de Secrets como variáveis de ambiente
policy-essentials-v2022-pods-require-security-context Aplique o contexto de segurança aos seus pods e contentores
policy-essentials-v2022-prohibit-role-wildcard-access Minimize a utilização de carateres universais em Roles e ClusterRoles.
policy-essentials-v2022-psp-allow-privilege-escalation-container Minimize a admissão de contentores com allowPrivilegeEscalation
policy-essentials-v2022-psp-capabilities Os contentores têm de remover a capacidade `NET_RAW` e não podem adicionar novamente capacidades.
policy-essentials-v2022-psp-host-namespace Minimize a admissão de contentores com `hostPID` ou `hostIPC` definidos como `true`.
policy-essentials-v2022-psp-host-network-ports Minimize a admissão de contentores que pretendam partilhar o espaço de nomes da rede do anfitrião
policy-essentials-v2022-psp-privileged-container Minimize a admissão de contentores privilegiados
policy-essentials-v2022-psp-pods-must-run-as-nonroot Minimize a admissão de contentores principais
policy-essentials-v2022-psp-seccomp-default Certifique-se de que o perfil seccomp está definido como `runtime/default` ou `docker/default` nas definições do seu pod
policy-essentials-v2022-restrict-clusteradmin-rolebindings Minimize a utilização da função cluster-admin.

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

Pacote de políticas Audit Policy Essentials

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/policy-essentials-v2022
    
  2. Aplique as restrições de políticas com o kubectl:

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

    O resultado é o seguinte:

    k8snoenvvarsecrets.constraints.gatekeeper.sh/policy-essentials-v2022-no-secrets-as-env-vars created
    k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/policy-essentials-v2022-psp-allow-privilege-escalation created
    k8spspallowedusers.constraints.gatekeeper.sh/policy-essentials-v2022-psp-pods-must-run-as-nonroot created
    k8spspcapabilities.constraints.gatekeeper.sh/policy-essentials-v2022-psp-capabilities created
    k8spsphostnamespace.constraints.gatekeeper.sh/policy-essentials-v2022-psp-host-namespace created
    k8spsphostnetworkingports.constraints.gatekeeper.sh/policy-essentials-v2022-psp-host-network-ports created
    k8spspprivilegedcontainer.constraints.gatekeeper.sh/policy-essentials-v2022-psp-privileged-container created
    k8spspseccomp.constraints.gatekeeper.sh/policy-essentials-v2022-psp-seccomp-default created
    k8spodsrequiresecuritycontext.constraints.gatekeeper.sh/policy-essentials-v2022-pods-require-security-context created
    k8sprohibitrolewildcardaccess.constraints.gatekeeper.sh/policy-essentials-v2022-prohibit-role-wildcard-access created
    k8srestrictrolebindings.constraints.gatekeeper.sh/policy-essentials-v2022-restrict-clusteradmin-rolebindings 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/policy-essentials-v2022
    

    O resultado é semelhante ao seguinte:

    NAME                                                                                          ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8snoenvvarsecrets.constraints.gatekeeper.sh/policy-essentials-v2022-no-secrets-as-env-vars   dryrun               0
    
    NAME                                                                                                                       ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/policy-essentials-v2022-psp-allow-privilege-escalation   dryrun               0
    
    NAME                                                                                                ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspallowedusers.constraints.gatekeeper.sh/policy-essentials-v2022-psp-pods-must-run-as-nonroot   dryrun               0
    
    NAME                                                                                    ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspcapabilities.constraints.gatekeeper.sh/policy-essentials-v2022-psp-capabilities   dryrun               0
    
    NAME                                                                                       ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spsphostnamespace.constraints.gatekeeper.sh/policy-essentials-v2022-psp-host-namespace   dryrun               0
    
    NAME                                                                                                 ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spsphostnetworkingports.constraints.gatekeeper.sh/policy-essentials-v2022-psp-host-network-ports   dryrun               0
    
    NAME                                                                                                   ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspprivilegedcontainer.constraints.gatekeeper.sh/policy-essentials-v2022-psp-privileged-container   dryrun               0
    
    NAME                                                                                  ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspseccomp.constraints.gatekeeper.sh/policy-essentials-v2022-psp-seccomp-default   dryrun               0
    
    NAME                                                                                                            ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spodsrequiresecuritycontext.constraints.gatekeeper.sh/policy-essentials-v2022-pods-require-security-context   dryrun               0
    
    NAME                                                                                                            ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8sprohibitrolewildcardaccess.constraints.gatekeeper.sh/policy-essentials-v2022-prohibit-role-wildcard-access   dryrun               0
    
    NAME                                                                                                           ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srestrictrolebindings.constraints.gatekeeper.sh/policy-essentials-v2022-restrict-clusteradmin-rolebindings   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 Policy Essentials v2022 do GitHub através do kpt:

    kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/policy-essentials-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 policy-essentials-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 policy-essentials-v2022
    kpt live init
    
  5. Aplique as restrições de políticas com o kpt:

    kpt live apply
    

    O resultado é o seguinte:

    k8spspseccomp.constraints.gatekeeper.sh/policy-essentials-v2022-psp-seccomp-docker-default created
    k8spodsrequiresecuritycontext.constraints.gatekeeper.sh/policy-essentials-v2022-pods-require-security-context created
    k8sprohibitrolewildcardaccess.constraints.gatekeeper.sh/policy-essentials-v2022-prohibit-role-wildcard-access created
    k8snoenvvarsecrets.constraints.gatekeeper.sh/policy-essentials-v2022-no-secrets-as-env-vars created
    k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/policy-essentials-v2022-psp-allow-privilege-escalation-container created
    k8spspallowedusers.constraints.gatekeeper.sh/policy-essentials-v2022-psp-pods-must-run-as-nonroot created
    k8spsphostnetworkingports.constraints.gatekeeper.sh/policy-essentials-v2022-psp-host-network-ports created
    k8srestrictrolebindings.constraints.gatekeeper.sh/policy-essentials-v2022-restrict-clusteradmin-rolebindings created
    k8spspcapabilities.constraints.gatekeeper.sh/policy-essentials-v2022-psp-capabilities created
    k8spsphostnamespace.constraints.gatekeeper.sh/policy-essentials-v2022-psp-host-namespace created
    k8spspprivilegedcontainer.constraints.gatekeeper.sh/policy-essentials-v2022-psp-privileged-container created
    11 resource(s) applied. 11 created, 0 unchanged, 0 configured, 0 failed
    
  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 Policy Essentials v2022 do GitHub através do kpt:

    kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/policy-essentials-v2022 policies/policy-essentials-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/policy-essentials-v2022 -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/policy-essentials-v2022
    kpt live apply --dry-run policies/policy-essentials-v2022
    

    O resultado é o seguinte:

    Dry-run strategy: client
    inventory update started
    inventory update finished
    apply phase started
    k8snoenvvarsecrets.constraints.gatekeeper.sh/policy-essentials-v2022-no-secrets-as-env-vars apply successful
    k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/policy-essentials-v2022-psp-allow-privilege-escalation apply successful
    k8spspallowedusers.constraints.gatekeeper.sh/policy-essentials-v2022-psp-pods-must-run-as-nonroot apply successful
    k8spspcapabilities.constraints.gatekeeper.sh/policy-essentials-v2022-psp-capabilities apply successful
    k8spsphostnamespace.constraints.gatekeeper.sh/policy-essentials-v2022-psp-host-namespace apply successful
    k8spsphostnetworkingports.constraints.gatekeeper.sh/policy-essentials-v2022-psp-host-network-ports apply successful
    k8spspprivilegedcontainer.constraints.gatekeeper.sh/policy-essentials-v2022-psp-privileged-container apply successful
    k8spspseccomp.constraints.gatekeeper.sh/policy-essentials-v2022-psp-seccomp-default apply successful
    k8spodsrequiresecuritycontext.constraints.gatekeeper.sh/policy-essentials-v2022-pods-require-security-context apply successful
    k8sprohibitrolewildcardaccess.constraints.gatekeeper.sh/policy-essentials-v2022-prohibit-role-wildcard-access apply successful
    k8srestrictrolebindings.constraints.gatekeeper.sh/policy-essentials-v2022-restrict-clusteradmin-rolebindings apply successful
    apply phase finished
    inventory update started
    inventory update finished
    apply result: 11 attempted, 11 successful, 0 skipped, 0 failed
    
  6. Se o diretório de sincronização do Config Sync usar o Kustomize, adicione policies/policy-essentials-v2022 ao kustomization.yaml raiz. Caso contrário, remova o ficheiro policies/policy-essentials-v2022/kustomization.yaml:

    rm SYNC_ROOT_DIR/policies/policy-essentials-v2022/kustomization.yaml
    
  7. Envie alterações para o repositório do Config Sync:

    git add SYNC_ROOT_DIR/policy-essentials-v2022
    git commit -m 'Adding Policy Essentials v2022 policy audit enforcement'
    git push
    
  8. 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=policy-essentials-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=policy-essentials-v2022 -o json | jq -C '.items[]| select(.status.totalViolations>0)| [.metadata.name,.status.violations[]?]'

Altere a ação de aplicação do conjunto de políticas Policy Essentials

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=policy-essentials-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=policy-essentials-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/policy-essentials-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/policy-essentials-v2022
    git commit -m 'Adding Policy Essentials 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: [policy-essentials-v2022-psp-capabilities] container <wordpress> is not dropping all required capabilities. Container must drop all of ["NET_RAW"] or "ALL"
pod/wp-non-compliant created

Remova o pacote de políticas Policy Essentials

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

kubectl

  • Use o kubectl para remover as políticas:

    kubectl delete constraint -l policycontroller.gke.io/bundleName=policy-essentials-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/policy-essentials-v2022
    git commit -m 'Removing Policy Essentials v2022 policies'
    git push
    
  2. Valide o estado:

    nomos status
    

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