Usar restrições de política do CIS Benchmark do Kubernetes v1.5.1

O Policy Controller vem com uma biblioteca padrão de modelos de restrição que pode ser usada com o pacote CIS para auditar a conformidade do cluster em relação ao cluster Comparativo de mercado CIS do Kubernetes v1.5.1. Essa comparação é um conjunto de recomendações para configurar o Kubernetes a fim de oferecer suporte a uma postura de segurança reforçada.

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

Esta página é destinada a administradores e operadores de TI que querem usar e manter uma automação para garantir que todos os recursos em execução na plataforma de nuvem cumpram os requisitos de compliance organizacionais. Para saber mais sobre papéis comuns e tarefas de exemplo que mencionamos no conteúdo do Google Cloud , consulte Tarefas e funções de usuário comuns do GKE.

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

  • RBAC e contas de serviço
  • políticas de segurança de pods
  • Políticas de rede e CNI
  • Gerenciamento de secrets
  • Políticas gerais

Restrições do pacote de políticas CIS Kubernetes v1.5.1

Nome da restrição Descrição do controle ID do controle
cis-k8s-v1.5.1-restrict-clusteradmin-rolebindings.yaml Restringe o uso do papel "cluster-admin" 5.1.1
cis-k8s-v1.5.1-prohibit-role-wildcard-access.yaml Restringe o uso de caracteres curinga em "Papéis" e "ClusterRoles". 5.1.3
cis-k8s-v1.5.1-psp-privileged-container.yaml Minimizar a admissão de contêineres privilegiados 5.2.1
cis-k8s-v1.5.1-psp-host-namespace.yaml Minimizar a admissão de contêineres para compartilhamento do namespace do ID do processo do host 5.2.2
Minimizar a admissão de contêineres para compartilhamento do namespace de IPC do host 5.2.3
cis-k8s-v1.5.1-psp-host-network-ports Minimizar a admissão de contêineres para compartilhamento do namespace da rede do host 5.2.4
cis-k8s-v1.5.1-psp-allow-privilege-escalation-container Minimizar a admissão de contêineres com allowPrivilegeEscalation 5.2.5
cis-k8s-v1.5.1-psp-pods-must-run-as-nonroot Minimizar a admissão de contêineres raiz 5.2.6
cis-k8s-v1.5.1-psp-capabilities Minimizar a admissão de contêineres com o recurso NET_RAW 5.2.7
Minimizar a admissão de contêineres com recursos adicionados 5.2.8
Minimizar a admissão de contêineres com recursos atribuídos 5.2.9
cis-k8s-v1.5.1-require-namespace-network-policies Verificar se todos os namespaces têm políticas de rede definidas 5.3.2
cis-k8s-v1.5.1-no-secrets-as-env-vars Usar Secrets como arquivos em vez de Secrets como variáveis de ambiente 5.4.1
cis-k8s-v1.5.1-psp-seccomp-default Verificar se o perfil seccomp está definido como docker/default nas definições do pod 5.7.2
cis-k8s-v1.5.1-pods-require-security-context Aplicar o Contexto de segurança aos pods e contêineres 5.7.3

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 no cluster com a biblioteca padrão de modelos de restrição. Você também precisa ativar a compatibilidade com restrições referenciais, já que este pacote contém restrições referenciais.

Configurar o Policy Controller com restrições referenciais

  1. Salve o seguinte manifesto YAML em um arquivo como policycontroller-config.yaml. O manifesto configura o Policy Controller para observar tipos específicos de objetos.

    apiVersion: config.gatekeeper.sh/v1alpha1 kind: Config metadata:   name: config   namespace: "gatekeeper-system" spec:   sync:     syncOnly:       - group: ""         version: "v1"         kind: "Namespace"       - group: "networking.k8s.io"         version: "v1"         kind: "NetworkPolicy" 
  2. Aplique o manifesto policycontroller-config.yaml:

    kubectl apply -f policycontroller-config.yaml 

Auditar o pacote de políticas CIS Kubernetes v1.5.1

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/cis-k8s-v1.5.1 
  2. Aplique as restrições da política com o kubectl:

     kubectl apply -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/cis-k8s-v1.5.1 

    A saída é esta:

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

    O resultado será assim:

     NAME                                                                                 ENFORCEMENT-ACTION   TOTAL-VIOLATIONS k8snoenvvarsecrets.constraints.gatekeeper.sh/cis-k8s-v1.5.1-no-secrets-as-env-vars   dryrun               0  NAME                                                                                                              ENFORCEMENT-ACTION   TOTAL-VIOLATIONS k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/cis-k8s-v1.5.1-psp-allow-privilege-escalation   dryrun               0  NAME                                                                                       ENFORCEMENT-ACTION   TOTAL-VIOLATIONS k8spspallowedusers.constraints.gatekeeper.sh/cis-k8s-v1.5.1-psp-pods-must-run-as-nonroot   dryrun               0  NAME                                                                           ENFORCEMENT-ACTION   TOTAL-VIOLATIONS k8spspcapabilities.constraints.gatekeeper.sh/cis-k8s-v1.5.1-psp-capabilities   dryrun               0  NAME                                                                              ENFORCEMENT-ACTION   TOTAL-VIOLATIONS k8spsphostnamespace.constraints.gatekeeper.sh/cis-k8s-v1.5.1-psp-host-namespace   dryrun               0  NAME                                                                                        ENFORCEMENT-ACTION   TOTAL-VIOLATIONS k8spsphostnetworkingports.constraints.gatekeeper.sh/cis-k8s-v1.5.1-psp-host-network-ports   dryrun               0  NAME                                                                                          ENFORCEMENT-ACTION   TOTAL-VIOLATIONS k8spspprivilegedcontainer.constraints.gatekeeper.sh/cis-k8s-v1.5.1-psp-privileged-container   dryrun               0  NAME                                                                         ENFORCEMENT-ACTION   TOTAL-VIOLATIONS k8spspseccomp.constraints.gatekeeper.sh/cis-k8s-v1.5.1-psp-seccomp-default   dryrun               0  NAME                                                                                                   ENFORCEMENT-ACTION   TOTAL-VIOLATIONS k8spodsrequiresecuritycontext.constraints.gatekeeper.sh/cis-k8s-v1.5.1-pods-require-security-context   dryrun               0  NAME                                                                                                   ENFORCEMENT-ACTION   TOTAL-VIOLATIONS k8sprohibitrolewildcardaccess.constraints.gatekeeper.sh/cis-k8s-v1.5.1-prohibit-role-wildcard-access   dryrun               0  NAME                                                                                                             ENFORCEMENT-ACTION   TOTAL-VIOLATIONS k8srequirenamespacenetworkpolicies.constraints.gatekeeper.sh/cis-k8s-v1.5.1-require-namespace-network-policies   dryrun               0  NAME                                                                                                  ENFORCEMENT-ACTION   TOTAL-VIOLATIONS k8srestrictrolebindings.constraints.gatekeeper.sh/cis-k8s-v1.5.1-restrict-clusteradmin-rolebindings   dryrun               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 de políticas do CIS no GitHub usando o kpt:

     kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/cis-k8s-v1.5.1 
  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 cis-k8s-v1.5.1 -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 cis-k8s-v1.5.1 kpt live init 
  5. Aplique as restrições da política com kpt:

     kpt live apply 

    A saída é esta:

     k8spspseccomp.constraints.gatekeeper.sh/psp-seccomp-docker-default created k8spodsrequiresecuritycontext.constraints.gatekeeper.sh/pods-require-security-context created k8sprohibitrolewildcardaccess.constraints.gatekeeper.sh/prohibit-role-wildcard-access created k8srequirenamespacenetworkpolicies.constraints.gatekeeper.sh/require-namespace-network-policies created k8snoenvvarsecrets.constraints.gatekeeper.sh/no-secrets-as-env-vars created k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/psp-allow-privilege-escalation-container created k8spspallowedusers.constraints.gatekeeper.sh/psp-pods-must-run-as-nonroot created k8spsphostnetworkingports.constraints.gatekeeper.sh/psp-host-network-ports created k8srestrictrolebindings.constraints.gatekeeper.sh/restrict-clusteradmin-rolebindings created k8spspcapabilities.constraints.gatekeeper.sh/psp-capabilities created k8spsphostnamespace.constraints.gatekeeper.sh/psp-host-namespace created k8spspprivilegedcontainer.constraints.gatekeeper.sh/psp-privileged-container created 13 resource(s) applied. 13 created, 0 unchanged, 0 configured, 0 failed 
  6. 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 de políticas do CIS no GitHub usando o kpt:

     kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/cis-k8s-v1.5.1 policies/cis-k8s-v1.5.1 
  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/cis-k8s-v1.5.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=dryrun 
  5. (Opcional) Visualize as restrições de política a serem criadas:

     kpt live init policies/cis-k8s-v1.5.1 kpt live apply --dry-run policies/cis-k8s-v1.5.1 

    A saída é esta:

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

     rm SYNC_ROOT_DIR/policies/cis-k8s-v1.5.1/kustomization.yaml 
  7. Envie as alterações para o repositório do Config Sync:

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

Alterar a ação de aplicação do pacote de políticas do CIS Kubernetes v1.5.1

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=cis-k8s-v1.5.1 -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=cis-k8s-v1.5.1 

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/cis-k8s-v1.5.1 -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/cis-k8s-v1.5.1 git commit -m 'Adding CIS Kubernetes v1.5.1 policy bundle warn enforcement' git push 
  4. Verifique o status da instalação:

     nomos status 

    O cluster vai mostrar um status de SYNCED com as políticas instaladas.

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         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: [cis-k8s-v1.5.1-psp-pods-must-run-as-nonroot] Container wordpress is attempting to run without a required securityContext/runAsNonRoot or securityContext/runAsUser != 0 Warning: [cis-k8s-v1.5.1-psp-allow-privilege-escalation] Privilege escalation container is not allowed: wordpress Warning: [cis-k8s-v1.5.1-psp-seccomp-default] Seccomp profile 'not configured' is not allowed for container 'wordpress'. Found at: no explicit profile found. Allowed profiles: {"RuntimeDefault", "docker/default", "runtime/default"} Warning: [cis-k8s-v1.5.1-psp-capabilities] container <wordpress> is not dropping all required capabilities. Container must drop all of ["NET_RAW"] or "ALL" Warning: [cis-k8s-v1.5.1-pods-require-security-context] securityContext must be defined for all Pod containers pod/wp-non-compliant created 

Remover o pacote de políticas CIS Kubernetes v1.5.1

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

kubectl

Use o kubectl para remover as políticas:

   kubectl delete constraint -l policycontroller.gke.io/bundleName=cis-k8s-v1.5.1   

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/cis-k8s-v1.5.1 git commit -m 'Removing CIS policies' git push 
  2. Verifique o status:

     nomos status 

    O cluster vai mostrar o status SYNCED com os recursos removidos.