Usar restrições de política do PCI-DSS v4.0

O Policy Controller vem com uma biblioteca padrão de modelos de restrição que pode ser usada com o PCI-DSS v4.0 bundle para avaliar a conformidade. dos recursos do cluster em relação a alguns aspectos do padrão de segurança de dados do setor de cartões de pagamento (PCI DSS) v4.0.

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.

Restrições do pacote de políticas do PCI-DSS v4.0

Nome da restrição Descrição da restrição IDs de controle
pci-dss-v4.0-require-apps-annotations Requer que todos os apps no cluster tenham uma anotação network-controls/date. 2.2.5
pci-dss-v4.0-require-av-daemonset Requer a presença de um daemonset antivírus DaemonSet. 5.2.1, 5.2.2, 5.2.3, 5.3.1, 5.3.2, 5.3.5
pci-dss-v4.0-require-binauthz Requer a autorização binária que valida o webhook de admissão. 2.2.1, 2.2.4, 6.2.3, 6.3.1, 6.3.2
pci-dss-v4.0-require-cloudarmor-backendconfig Aplica a configuração do Google Cloud Armor a recursos BackendConfig. 6.4.1, 6.4.2
pci-dss-v4.0-require-config-management Exige que o Config Management esteja em execução com o Drift Prevention ativado e pelo menos um objeto RootSync no cluster. 1.2.8, 2.2.6, 5.3.5, 6.3.2, 6.5.1
pci-dss-v4.0-require-default-deny-network-policies Requer que cada namespace definido no cluster tenha um NetworkPolicy de negação padrão para saída. 1.3.2, 1.4.4
pci-dss-v4.0-require-managed-by-label Requer que todos os apps tenham um rótulo app.kubernetes.io/managed-by válido. 1.2.8, 2.2.6, 5.3.5, 6.3.2, 6.5.1
pci-dss-v4.0-require-namespace-network-policies Requer que cada Namespace definido no cluster tenha um NetworkPolicy. 1.2.5, 1.2.6, 1.4.1, 1.4.4
pci-dss-v4.0-require-peer-authentication-strict-mtls Garante que o PeerAuthentications não pode substituir o mTLS restrito. 2.2.7, 4.2.1, 8.3.2
pci-dss-v4.0-require-valid-network-ranges Restringe intervalos CIDR permitidos para uso com a entrada e a saída. 1.3.1, 1.3.2, 1.4.2, 1.4.4
pci-dss-v4.0-resources-have-required-labels Requer que todos os apps tenham um rótulo especificado para atender aos requisitos de firewall. 1.2.7
pci-dss-v4.0-restrict-cluster-admin-role Restringe o uso do papel cluster-admin. 7.2.1, 7.2.2, 7.2.5, 8.2.4
pci-dss-v4.0-restrict-creation-with-default-serviceaccount Restringe a criação de recursos usando uma conta de serviço padrão. Não tem efeito durante a auditoria. 2.2.2
pci-dss-v4.0-restrict-default-namespace Restringe os pods a usarem o namespace padrão. 2.2.3
pci-dss-v4.0-restrict-ingress Restringe a criação de objetos Ingress. 1.3.1, 1.4.2, 1.4.4
pci-dss-v4.0-restrict-node-image Garante tempo consistente e correto nos nós permitindo apenas o Container-Optimized OS ou o Ubuntu como a imagem do SO. 10.6.1, 10.6.2, 10.6.3
pci-dss-v4.0-restrict-pods-exec Restringe o uso de pods/exec em Roles e de ClusterRoles. 8.6.1
pci-dss-v4.0-restrict-rbac-subjects Restringe o uso de nomes nos assuntos do RBAC a valores permitidos. 7.3.2, 8.2.1, 8.2.2, 8.2.4
pci-dss-v4.0-restrict-role-wildcards Restringe o uso de caracteres curinga em Roles e ClusterRoles. 7.3.3, 8.2.4
pci-dss-v4.0-restrict-storageclass Restringe StorageClass a uma lista de StorageClass que são criptografadas por padrão. 3.3.2, 3.3.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 v1.16.0 ou mais recente 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 Controlador de Políticas 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: "networking.k8s.io"
            version: "v1"
            kind: "NetworkPolicy"
          - group: "admissionregistration.k8s.io"
            version: "v1"
            kind: "ValidatingWebhookConfiguration"
          - group: "storage.k8s.io"
            version: "v1"
            kind: "StorageClass"
    
  2. Aplique o manifesto policycontroller-config.yaml:

    kubectl apply -f policycontroller-config.yaml
    

Configurar a carga de trabalho do cluster para PCI-DSS v4.0

  1. Todos os apps (ReplicaSet, Deployment, StatefulSet, DaemonSet) precisam incluir uma anotação network-controls/date com o esquema de YYYY-MM-DD.
  2. Uma solução antivírus é necessária. O padrão é a presença de um daemonset chamado clamav no clamav Namespace, mas o nome e o namespace do daemonset podem ser personalizados para sua implementação na restrição pci-dss-v4.0-require-av-daemonset.
  3. A ativação e a configuração da autorização binária são necessárias em pci-dss-v4.0-require-binauthz.
  4. Todos os BackendConfig precisam ser configurados para CloudArmor.
  5. A presença e a ativação do Config Sync são obrigatórias.
  6. Cada Namespace definido no cluster tem uma NetworkPolicy de negação padrão para saída. As exceções permitidas podem ser específicas em pci-dss-v4.0-require-namespace-network-policies.
  7. O uso do Config Sync para configmanagement.gke.io é obrigatório por padrão, mas o valor permitido do app.kubernetes.io/managed-by pode ser personalizado na restrição pci-dss-v4.0-enforce-managed-by-configmanagement-label.
  8. Cada Namespace definido no cluster precisa ter um NetworkPolicy.
  9. Se estiver usando o Cloud Service Mesh, o PeerAuthentication de ASM precisará usar mTLS restrito spec.mtls.mode: STRICT.
  10. Somente intervalos de IP permitidos podem ser usados para Entrada e Express. Eles podem ser especificados em pci-dss-v4.0-require-valid-network-ranges.
  11. Todos os apps (ReplicaSet, Deployment, StatefulSet e DaemonSet) precisam incluir um pci-dss-firewall-audit label com o esquema de pci-dss-[0-9]{4}q[1-4].
  12. Não é permitido usar o administrador do cluster ClusterRole.
  13. Não é possível criar recursos usando a conta de serviço padrão.
  14. O Namespace padrão não pode ser usado para pods.
  15. Somente os objetos de entrada permitidos (tipos de Ingress, Gateway e Service de NodePort e LoadBalancer) podem ser criados, que podem ser especificados em pci-dss-v4.0-restrict-ingress.
  16. Todos os nós precisam usar o Container-Optimized OS ou o Ubuntu para a imagem a fim de garantir um tempo consistente.
  17. Não é permitido usar o caractere curinga ou a permissão pods/exec em Roles e ClusterRoles.
  18. Somente assuntos permitidos podem ser usados em vinculações do RBAC. Seus nomes de domínio podem ser especificados em pci-dss-v4.0-restrict-rbac-subjects.
  19. O uso da criptografia por padrão StorageClass é obrigatório em pci-dss-v4.0-restrict-storageclass.

Auditar o pacote de políticas do PCI-DSS v4.0

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 PCI-DSS v4.0 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/anthos-bundles/pci-dss-v4.0
    
  2. Aplique as restrições da política com o kubectl:

    kubectl apply -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/pci-dss-v4.0
    

    A saída é esta:

    asmpeerauthnstrictmtls.constraints.gatekeeper.sh/pci-dss-v4.0-require-peer-authentication-strict-mtls created
    k8sblockallingress.constraints.gatekeeper.sh/pci-dss-v4.0-restrict-ingress created
    k8sblockcreationwithdefaultserviceaccount.constraints.gatekeeper.sh/pci-dss-v4.0-restrict-creation-with-default-serviceaccount created
    k8senforcecloudarmorbackendconfig.constraints.gatekeeper.sh/pci-dss-v4.0-require-cloudarmor-backendconfig created
    k8senforceconfigmanagement.constraints.gatekeeper.sh/pci-dss-v4.0-require-config-management created
    k8sprohibitrolewildcardaccess.constraints.gatekeeper.sh/pci-dss-v4.0-restrict-role-wildcards created
    k8srequirebinauthz.constraints.gatekeeper.sh/pci-dss-v4.0-require-binauthz created
    k8srequirecosnodeimage.constraints.gatekeeper.sh/pci-dss-v4.0-restrict-node-image created
    k8srequiredaemonsets.constraints.gatekeeper.sh/pci-dss-v4.0-require-av-daemonset created
    k8srequiredefaultdenyegresspolicy.constraints.gatekeeper.sh/pci-dss-v4.0-require-default-deny-network-policies created
    k8srequirenamespacenetworkpolicies.constraints.gatekeeper.sh/pci-dss-v4.0-require-namespace-network-policies created
    k8srequirevalidrangesfornetworks.constraints.gatekeeper.sh/pci-dss-v4.0-require-valid-network-ranges created
    k8srequiredannotations.constraints.gatekeeper.sh/pci-dss-v4.0-require-apps-annotations created
    k8srequiredlabels.constraints.gatekeeper.sh/pci-dss-v4.0-require-managed-by-label created
    k8srequiredlabels.constraints.gatekeeper.sh/pci-dss-v4.0-resources-have-required-labels created
    k8srestrictnamespaces.constraints.gatekeeper.sh/pci-dss-v4.0-restrict-default-namespace created
    k8srestrictrbacsubjects.constraints.gatekeeper.sh/pci-dss-v4.0-restrict-rbac-subjects created
    k8srestrictrolebindings.constraints.gatekeeper.sh/pci-dss-v4.0-restrict-cluster-admin-role created
    k8srestrictrolerules.constraints.gatekeeper.sh/pci-dss-v4.0-restrict-pods-exec created
    k8sstorageclass.constraints.gatekeeper.sh/pci-dss-v4.0-restrict-storageclass created
    
  3. Verifique se as restrições da política foram instaladas e se existem violações no cluster:

    kubectl get constraints -l policycontroller.gke.io/bundleName=pci-dss-v4.0
    

    O resultado será assim:

    NAME                                                                                                    ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmpeerauthnstrictmtls.constraints.gatekeeper.sh/pci-dss-v4.0-require-peer-authentication-strict-mtls   dryrun               0
    
    NAME                                                                         ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8sblockallingress.constraints.gatekeeper.sh/pci-dss-v4.0-restrict-ingress   dryrun               0
    
    NAME                                                                                                                             ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8sblockcreationwithdefaultserviceaccount.constraints.gatekeeper.sh/pci-dss-v4.0-restrict-creation-with-default-serviceaccount   dryrun               0
    
    NAME                                                                                                        ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8senforcecloudarmorbackendconfig.constraints.gatekeeper.sh/pci-dss-v4.0-require-cloudarmor-backendconfig   dryrun               0
    
    NAME                                                                                          ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8senforceconfigmanagement.constraints.gatekeeper.sh/pci-dss-v4.0-require-config-management   dryrun               0
    
    NAME                                                                                           ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8sprohibitrolewildcardaccess.constraints.gatekeeper.sh/pci-dss-v4.0-restrict-role-wildcards   dryrun               0
    
    NAME                                                                         ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srequirebinauthz.constraints.gatekeeper.sh/pci-dss-v4.0-require-binauthz   dryrun               0
    
    NAME                                                                                ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srequirecosnodeimage.constraints.gatekeeper.sh/pci-dss-v4.0-restrict-node-image   dryrun               0
    
    NAME                                                                               ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srequiredaemonsets.constraints.gatekeeper.sh/pci-dss-v4.0-require-av-daemonset   dryrun               0
    
    NAME                                                                                     ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srequiredannotations.constraints.gatekeeper.sh/pci-dss-v4.0-require-apps-annotations   dryrun               0
    
    NAME                                                                                                             ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srequiredefaultdenyegresspolicy.constraints.gatekeeper.sh/pci-dss-v4.0-require-default-deny-network-policies   dryrun               0
    
    NAME                                                                                      ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srequiredlabels.constraints.gatekeeper.sh/pci-dss-v4.0-require-managed-by-label         dryrun               0
    k8srequiredlabels.constraints.gatekeeper.sh/pci-dss-v4.0-resources-have-required-labels   dryrun               0
    
    NAME                                                                                                           ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srequirenamespacenetworkpolicies.constraints.gatekeeper.sh/pci-dss-v4.0-require-namespace-network-policies   dryrun               0
    
    NAME                                                                                                   ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srequirevalidrangesfornetworks.constraints.gatekeeper.sh/pci-dss-v4.0-require-valid-network-ranges   dryrun               0
    
    NAME                                                                                      ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srestrictnamespaces.constraints.gatekeeper.sh/pci-dss-v4.0-restrict-default-namespace   dryrun               0
    
    NAME                                                                                    ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srestrictrbacsubjects.constraints.gatekeeper.sh/pci-dss-v4.0-restrict-rbac-subjects   dryrun               0
    
    NAME                                                                                         ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srestrictrolebindings.constraints.gatekeeper.sh/pci-dss-v4.0-restrict-cluster-admin-role   dryrun               0
    
    NAME                                                                             ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srestrictrolerules.constraints.gatekeeper.sh/pci-dss-v4.0-restrict-pods-exec   dryrun               0
    
    NAME                                                                           ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8sstorageclass.constraints.gatekeeper.sh/pci-dss-v4.0-restrict-storageclass   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 PCI-DSS v4.0 no GitHub usando o kpt:

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

    kpt live apply
    
  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 PCI-DSS v4.0 no GitHub usando o kpt:

    kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/pci-dss-v4.0 policies/pci-dss-v4.0
    
  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/pci-dss-v4.0 -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/pci-dss-v4.0
    kpt live apply --dry-run policies/pci-dss-v4.0
    
  6. Se o diretório de sincronização do Config Sync usar Kustomize, adicione policies/pci-dss-v4.0 à raiz kustomization.yaml. Caso contrário, remova o arquivo policies/pci-dss-v4.0/kustomization.yaml:

    rm SYNC_ROOT_DIR/policies/pci-dss-v4.0/kustomization.yaml
    
  7. Envie as alterações para o repositório do Config Sync:

    git add SYNC_ROOT_DIR/policies/pci-dss-v4.0
    git commit -m 'Adding PCI-DSS v4.0 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=pci-dss-v4.0 -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=pci-dss-v4.0 -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 PCI-DSS v4.0

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=pci-dss-v4.0 -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=pci-dss-v4.0
    

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/pci-dss-v4.0 -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/pci-dss-v4.0
    git commit -m 'Adding PCI-DSS v4.0 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: [pci-dss-v4.0-restrict-default-namespace] <default> namespace is restricted
pod/wp-non-compliant created

Remoção do pacote de políticas do PCI-DSS v4.0

Se necessário, remova o pacote de políticas do PCI-DSS v4.0 do cluster.

kubectl

  • Use o kubectl para remover as políticas:

    kubectl delete constraint -l policycontroller.gke.io/bundleName=pci-dss-v4.0
    

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/pci-dss-v4.0
    git commit -m 'Removing PCI-DSS v4.0 policies'
    git push
    
  2. Verifique o status:

    nomos status
    

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