O Policy Controller inclui uma biblioteca predefinida de modelos de restrições que podem ser usados com o pacote PCI-DSS v4.0 para avaliar a conformidade dos recursos do cluster com alguns aspetos da Norma 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. 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 de utilizadores do GKE.
Restrições do conjunto de políticas da PCI-DSS v4.0
Nome da restrição | Descrição da restrição | IDs de controlo |
---|---|---|
pci-dss-v4.0-require-apps-annotations | Requer que todas as 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 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 o webhook de admissão de validação da autorização binária. | 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 aos recursos BackendConfig .
|
6.4.1, 6.4.2 |
pci-dss-v4.0-require-config-management | Requer que a gestão de configuração esteja em execução com a prevenção de desvio ativada 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 todos os espaços de nomes definidos no cluster tenham uma negação predefinida NetworkPolicy para a saída.
|
1.3.2, 1.4.4 |
pci-dss-v4.0-require-managed-by-label | Exige que todas as apps tenham uma etiqueta app.kubernetes.io/managed-by válida.
|
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 as PeerAuthentications não podem substituir o mTLS rigoroso. | 2.2.7, 4.2.1, 8.3.2 |
pci-dss-v4.0-require-valid-network-ranges | Restringe os intervalos CIDR permitidos para utilização com entrada e saída. | 1.3.1, 1.3.2, 1.4.2, 1.4.4 |
pci-dss-v4.0-resources-have-required-labels | Exige que todas as apps contenham uma etiqueta especificada para cumprir os requisitos da firewall. | 1.2.7 |
pci-dss-v4.0-restrict-cluster-admin-role | Restringe a utilização da função 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 através de uma conta de serviço predefinida. Não tem efeito durante a auditoria. | 2.2.2 |
pci-dss-v4.0-restrict-default-namespace | Impede que os pods usem o espaço de nomes predefinido. | 2.2.3 |
pci-dss-v4.0-restrict-ingress | Restringe a criação de Ingress objetos.
|
1.3.1, 1.4.2, 1.4.4 |
pci-dss-v4.0-restrict-node-image | Garante uma hora consistente e correta nos nós, permitindo apenas o SO otimizado para contentores ou o Ubuntu como imagem do SO. | 10.6.1, 10.6.2, 10.6.3 |
pci-dss-v4.0-restrict-pods-exec | Restringe a utilização do pods/exec no Roles e no ClusterRoles .
|
8.6.1 |
pci-dss-v4.0-restrict-rbac-subjects | Restringe a utilização de nomes em objetos RBAC a valores permitidos. | 7.3.2, 8.2.1, 8.2.2 e 8.2.4 |
pci-dss-v4.0-restrict-role-wildcards | Restringe a utilização de carateres universais em Roles e ClusterRoles .
|
7.3.3, 8.2.4 |
pci-dss-v4.0-restrict-storageclass | Restringe StorageClass a uma lista de StorageClass que encriptam por predefinição.
|
3.3.2, 3.3.3 |
Antes de começar
- Instale e inicialize a CLI do Google Cloud, que fornece os comandos
gcloud
ekubectl
usados nestas instruções. Se usar a Cloud Shell, a Google Cloud CLI é pré-instalada. - Instale o Policy Controller v1.16.0 ou superior no seu cluster com a biblioteca predefinida de modelos de restrições. Também tem de ativar o suporte para restrições referenciais, uma vez que este pacote contém restrições referenciais.
Configure o Policy Controller para restrições referenciais
Guarde o seguinte manifesto YAML num ficheiro como
policycontroller-config.yaml
. O manifesto configura o Policy Controller para monitorizar 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"
Aplique o manifesto
policycontroller-config.yaml
:kubectl apply -f policycontroller-config.yaml
Configure a carga de trabalho do cluster para a norma PCI-DSS v4.0
- Todas as apps (
ReplicaSet
,Deployment
,StatefulSet
,DaemonSet
) têm de incluir uma anotaçãonetwork-controls/date
com o esquema deYYYY-MM-DD
. - É necessária uma solução antivírus. A predefinição é a presença de um
daemonset
denominadoclamav
noclamav
Namespace
. No entanto, o nome e o espaço de nomes dodaemonset
podem ser personalizados para a sua implementação na restriçãopci-dss-v4.0-require-av-daemonset
. - A ativação e a configuração da autorização binária são necessárias em
pci-dss-v4.0-require-binauthz
. - Todos os
BackendConfig
têm de ser configurados para o CloudArmor. - A presença e a ativação da sincronização de configuração são necessárias.
- Todos os
Namespace
definidos no cluster têm uma negação predefinidaNetworkPolicy
para a saída, e as exceções permitidas podem ser específicas empci-dss-v4.0-require-namespace-network-policies
. - A utilização da sincronização de configuração para
configmanagement.gke.io
é necessária por predefinição. No entanto, o valorapp.kubernetes.io/managed-by
permitido pode ser personalizado na restriçãopci-dss-v4.0-enforce-managed-by-configmanagement-label
. - Cada
Namespace
definido no cluster tem de ter umNetworkPolicy
. - Se usar o Cloud Service Mesh, a PeerAuthentication do ASM tem de usar o mTLS rigoroso
spec.mtls.mode: STRICT
. - Só é possível usar intervalos de IP permitidos para Ingress e Express. Estes podem ser especificados em
pci-dss-v4.0-require-valid-network-ranges
. - Todas as apps (
ReplicaSet
,Deployment
,StatefulSet
eDaemonSet
) têm de incluir umpci-dss-firewall-audit label
com o esquema depci-dss-[0-9]{4}q[1-4]
. - A utilização do cluster-admin
ClusterRole
não é permitida. - Não é possível criar recursos com a conta de serviço predefinida.
- Não é possível usar o
Namespace
predefinido para agrupamentos. - Só é possível criar objetos Ingress permitidos (tipos
Ingress
,Gateway
eService
deNodePort
eLoadBalancer
), que podem ser especificados empci-dss-v4.0-restrict-ingress
. - Todos os nós têm de usar o SO otimizado para contentores ou o Ubuntu para a respetiva imagem para uma hora consistente.
- A utilização do caráter universal ou da autorização
pods/exec
emRoles
eClusterRoles
não é permitida. - Só é possível usar assuntos permitidos em associações de RBAC. Pode especificar os nomes dos seus domínios em
pci-dss-v4.0-restrict-rbac-subjects
. - A utilização da encriptação por predefinição
StorageClass
é obrigatória nopci-dss-v4.0-restrict-storageclass
.
Audite o pacote de políticas PCI-DSS v4.0
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 no que diz respeito às políticas PCI-DSS v4.0 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 as aplicar no seu cluster Kubernetes.
Pode aplicar estas políticas com spec.enforcementAction
definido como dryrun
através do kubectl,
kpt,
ou
Config Sync.
kubectl
(Opcional) Pré-visualize as restrições de políticas com o kubectl:
kubectl kustomize https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/pci-dss-v4.0
Aplique as restrições de políticas com o kubectl:
kubectl apply -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/pci-dss-v4.0
O resultado é o seguinte:
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
Confirme se as restrições de políticas foram instaladas e verifique se existem violações no cluster:
kubectl get constraints -l policycontroller.gke.io/bundleName=pci-dss-v4.0
O resultado é semelhante ao seguinte:
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
Instale e configure o kpt. O kpt é usado nestas instruções para personalizar e implementar recursos do Kubernetes.
Transfira o pacote de políticas PCI-DSS v4.0 do GitHub através do kpt:
kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/pci-dss-v4.0
Execute a função
set-enforcement-action
kpt para definir a ação de aplicação das políticas comodryrun
:kpt fn eval pci-dss-v4.0 -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 monitorizar as alterações:
cd pci-dss-v4.0 kpt live init
Aplique as restrições de políticas com o kpt:
kpt live apply
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
- 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:
Altere para o diretório de sincronização do Config Sync:
cd SYNC_ROOT_DIR
Para criar ou acrescentar
.gitignore
comresourcegroup.yaml
:echo resourcegroup.yaml >> .gitignore
Crie um diretório
policies
dedicado:mkdir -p policies
Transfira o pacote de políticas PCI-DSS v4.0 do GitHub através do kpt:
kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/pci-dss-v4.0 policies/pci-dss-v4.0
Execute a função
set-enforcement-action
kpt para definir a ação de aplicação das políticas comodryrun
:kpt fn eval policies/pci-dss-v4.0 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=dryrun
(Opcional) Pré-visualize as restrições de políticas a serem criadas:
kpt live init policies/pci-dss-v4.0 kpt live apply --dry-run policies/pci-dss-v4.0
Se o diretório de sincronização do Config Sync usar o Kustomize, adicione
policies/pci-dss-v4.0
aokustomization.yaml
raiz. Caso contrário, remova o ficheiropolicies/pci-dss-v4.0/kustomization.yaml
:rm SYNC_ROOT_DIR/policies/pci-dss-v4.0/kustomization.yaml
Envie 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
Valide 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=pci-dss-v4.0 -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=pci-dss-v4.0 -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 da PCI-DSS v4.0
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
permita
ou até mesmo deny
impeça que o recurso não conforme seja aplicado ao cluster.
kubectl
Use o kubectl para definir a ação de aplicação 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"}]'
Verifique se a ação de aplicação das restrições de políticas foi atualizada:
kubectl get constraint -l policycontroller.gke.io/bundleName=pci-dss-v4.0
kpt
Execute a função
set-enforcement-action
kpt para definir a ação de aplicação das políticas comowarn
:kpt fn eval -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn
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:
Altere para o diretório de sincronização do Config Sync:
cd SYNC_ROOT_DIR
Execute a função
set-enforcement-action
kpt para definir a ação de aplicação das políticas comowarn
:kpt fn eval policies/pci-dss-v4.0 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn
Envie 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
Valide 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: [pci-dss-v4.0-restrict-default-namespace] <default> namespace is restricted pod/wp-non-compliant created
Remova o pacote de políticas PCI-DSS v4.0
Se necessário, o pacote de políticas PCI-DSS v4.0 pode ser removido 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 implementar políticas nos respetivos clusters podem usar as seguintes instruções:
Envie 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
Valide o estado:
nomos status
O cluster deve apresentar o estado
SYNCED
com os recursos removidos.