Guia de Proteção CIS
Este documento fornece orientações prescritivas para a proteção de uma instalação de produção do SUSE® Rancher Prime: RKE2. Ele descreve as configurações e controles necessários para atender aos controles de referência do Kubernetes do Center for Internet Security (CIS).
Para mais detalhes sobre a avaliação de um cluster protegido em relação ao benchmark oficial do CIS, consulte o guia de autoavaliação do CIS apropriado:
-
Guia de Autoavaliação do CIS v1.11 para RKE2 v1.29 e versões mais recentes
-
Guia de Autoavaliação do CIS v1.10 para RKE2 v1.29-v1.31
-
Guia de Autoavaliação do CIS v1.9 para RKE2 v1.27-v1.29
O RKE2 foi projetado para ser "protegido por padrão" e passar a maioria dos controles do CIS do Kubernetes sem modificação. Existem algumas exceções notáveis a isso que exigem intervenção manual para passar totalmente o Benchmark do CIS:
-
O RKE2 não modificará o sistema operacional do host. Portanto, você, o operador, deve fazer algumas modificações a nível de host.
-
Certos controles do CIS para Políticas de Rede e Padrões de Segurança de Pod (ou Políticas de Segurança de Pod (PSP) em versões do RKE2 anteriores à v1.25) restringirão a funcionalidade do cluster. Você deve optar por ter o RKE2 configurando isso para você. Para ajudar a garantir que esses requisitos sejam atendidos, o RKE2 pode ser iniciado com a flag
profiledefinida comocisoucis-1.23, dependendo da versão do RKE2.
|
Este guia assume que o RKE2 foi instalado, mas ainda não está em execução. Se você já iniciou o RKE2, precisará parar o serviço do RKE2. |
Requisitos a nível de host
Existem três áreas de requisitos a nível de host: parâmetros do kernel, protect-kernel-defaults do kubelet e configuração do processo/diretório etcd. Esses são descritos nesta seção.
Parâmetros kernel
O benchmark do CIS requer que algumas configurações específicas de parâmetros do kernel sejam definidas. Quando o RKE2 é instalado, ele cria um arquivo de configuração sysctl para definir os parâmetros necessários de forma apropriada. No entanto, ele não configura automaticamente o host para usar essa configuração. Você deve fazer isso manualmente. A localização do arquivo de configuração depende do método de instalação utilizado.
Se o RKE2 foi instalado via RPM, YUM ou DNF (o padrão em sistemas operacionais que usam RPMs, como CentOS), execute os seguintes comandos:
sudo cp -f /usr/share/rke2/rke2-cis-sysctl.conf /etc/sysctl.d/60-rke2-cis.conf
sudo systemctl restart systemd-sysctl
Se o RKE2 foi instalado via tarball (o padrão em sistemas operacionais que não usam RPMs, como Ubuntu), execute os seguintes comandos:
sudo cp -f /usr/local/share/rke2/rke2-cis-sysctl.conf /etc/sysctl.d/60-rke2-cis.conf
sudo systemctl restart systemd-sysctl
Se o seu sistema não tiver o diretório systemd-sysctl.service e/ou o diretório /etc/sysctl.d, você vai querer garantir que os sysctls sejam aplicados na inicialização executando o seguinte comando durante a inicialização:
sudo sysctl -p /usr/local/share/rke2/rke2-cis-sysctl.conf
Por favor, realize esta etapa apenas em instalações novas, antes de realmente usar o RKE2 para implantar o Kubernetes. Muitos componentes do Kubernetes, incluindo plugins CNI, configuram seus próprios sysctls. Reiniciar o serviço systemd-sysctl em um cluster Kubernetes em execução pode resultar em efeitos colaterais inesperados.
O parâmetro do Kubelet protect-kernel-defaults está definido como true
Esta é uma flag do kubelet que fará com que o kubelet saia se os parâmetros do kernel exigidos não estiverem definidos ou estiverem definidos com valores diferentes dos padrões do kubelet.
O RKE2 definirá automaticamente a flag como true quando a flag profile estiver definida.
|
|
O RKE2 também verificará os mesmos parâmetros do kernel que o kubelet e sairá com um erro seguindo as mesmas regras que o kubelet. Isso é feito como uma conveniência para ajudar o operador a identificar mais rapidamente e facilmente quais parâmetros do kernel estão violando os padrões do kubelet.
etcd está configurado corretamente
O CIS Benchmark exige que o diretório de dados do etcd seja de propriedade do usuário e grupo etcd. Isso requer implicitamente que o processo etcd seja executado como o usuário etcd em nível de host. Para alcançar isso, o RKE2 toma várias medidas quando iniciado com um arquivo de controle cis ou cis-1.XX válido:
-
Verifique se o usuário e grupo
etcdexistem no host. Se não existirem, saia com um erro. -
Crie o diretório de dados do etcd com
etcdcomo o proprietário do usuário e do grupo. -
Certifique-se de que o processo etcd seja executado como o usuário e grupo
etcdconfigurando oSecurityContextdo pod estático etcd adequadamente.
Em algumas distribuições Linux, o comando useradd não criará um grupo. A flag -U está incluída abaixo para levar isso em conta. Essa flag informa ao useradd para criar um grupo com o mesmo nome que o usuário.
sudo useradd -r -c "etcd user" -s /sbin/nologin -M etcd -U
|
O usuário e grupo |
Configuração do RKE2
-
v1.29 e versões mais recentes
-
v1.25 - v1.28
-
v1.24 e versões anteriores
profile: "cis"
# For cis-1.11 only, not needed on cis-1.9/cis-1.10
kube-apiserver-arg:
- 'service-account-extend-token-expiration=false'
Configuração CIS Genérica
profile: "cis"
Usar o arquivo de controle genérico cis garantirá que o cluster passe no benchmark CIS (rke2-cis-1.XX-profile-hardened) associado à versão do Kubernetes que o RKE2 está executando. Por exemplo, o RKE2 v1.26.XX com o profile: cis passará no rke2-cis-1.8-profile-hardened no Rancher.
O uso do arquivo de controle genérico cis garante que as atualizações para o RKE2 não exijam uma alteração na configuração existente. Quaisquer alterações necessárias para passar no benchmark CIS aplicável serão aplicadas automaticamente.
Um mapeamento aproximado das versões do RKE2 para as versões do benchmark CIS é o seguinte:
Minors do RKE2 |
Benchmark CIS Aplicável |
Flag do arquivo de controle |
1.27-1.28 |
1.9 |
|
1.26 |
1.8 |
|
1.25 |
1.7 |
|
1.24 |
1.24 |
|
1.23 |
1.23 |
|
1.19-1.22 |
1.6 |
|
profile: "cis-1.23"
O arquivo de configuração deve ser nomeado config.yaml e colocado em /etc/rancher/rke2. O diretório precisa ser criado antes de instalar o RKE2.
Quando a flag profile está definida, ela faz o seguinte:
-
v1.25 e versões mais recentes
-
v1.24 e versões anteriores
-
Verifica se os requisitos em nível de host foram atendidos. Se não foram, o RKE2 sairá com um erro fatal descrevendo os requisitos não atendidos.
-
Configura o pod estático etcd para rodar como o usuário e grupo etcd, conforme explicado no guia de proteção do etcd.
-
Aplica políticas de rede que permitem que o cluster passe os controles associados.
-
Aplica permissões de arquivo mais restritivas (600 vs 644) aos manifests de agente e outros arquivos de configuração.
-
Configura o Controlador de Admissão de Segurança de Pod para impor o modo restrito em todos os namespaces, com exceção dos namespaces
kube-system,cis-operator-systemetigera-operator. Esses namespaces são isentos para permitir que os pods do sistema sejam executados sem restrições, o que é necessário para o funcionamento adequado do cluster. Para mais informações sobre a configuração do PSA, consulte as configurações padrão de Admissão de Segurança de Pod. Para mais informações sobre os Padrões de Segurança de Pod, consulte a documentação oficial.
-
Verifica se os requisitos em nível de host foram atendidos. Se não foram, o RKE2 sairá com um erro fatal descrevendo os requisitos não atendidos.
-
Aplica políticas de rede que permitem que o cluster passe os controles associados.
-
Configura políticas de segurança de pod de runtime que permitem que o cluster passe os controles associados.
Requisitos de runtime do Kubernetes
Os requisitos de runtime para passar o Benchmark CIS estão centrados em segurança de pod e políticas de rede. A maior parte disso é tratada automaticamente pelo RKE2 ao usar um arquivo de controle cis-1.XX válido, mas alguma intervenção adicional do operador é necessária.
Segurança de Pods
O RKE2 sempre opera com algum nível de segurança de pod.
-
v1.25 e versões mais recentes
-
v1.24 e versões anteriores
Na versão v1.25 e mais recente, o Controle de Admissão de Segurança de Pod (PSA) é usado para segurança de pod. Um arquivo de configuração padrão de Admissão de Segurança de Pod será adicionado ao cluster na inicialização da seguinte forma:
Com o arquivo de controle cis/cis-1.23:
-
O RKE2 aplicará um padrão de segurança de pod restrito por meio de um arquivo de configuração que imporá o modo
restrictedem todo o cluster, com exceção dos namespaceskube-system,cis-operator-systemetigera-operatorpara garantir a operação bem-sucedida dos pods do sistema.
Sem o arquivo de controle cis/cis-1.23:
-
O RKE2 aplicará um padrão de segurança de pod não restrito por meio de um arquivo de configuração que imporá o modo
privilegedem todo o cluster, permitindo um modo completamente irrestrito para todos os pods no cluster. Veja a página Políticas de Segurança de Pod para mais detalhes.
Na versão v1.24 e anteriores, o controlador de admissão PodSecurityPolicy está sempre habilitado. Uma política é aplicada com base no arquivo de controle passado para o RKE2.
Com o arquivo de controle cis-1.6:
-
O RKE2 implementará um conjunto de políticas muito mais restritivas. Essas políticas atendem aos requisitos descritos na seção 5.2 do CIS Benchmark.
Sem o arquivo de controle cis-1.6:
-
O RKE2 implementará uma política irrestrita que permite que o Kubernetes funcione como se o controlador de admissão
PodSecurityPolicynão estivesse habilitado. Veja a página Políticas de Segurança de Pod para mais detalhes.
|
Os componentes do plano de controle do Kubernetes e adições críticas, como CNI, DNS e Ingress, são executados como pods no namespace |
Políticas de Rede
Quando executado com um arquivo de controle válido "cis-1.XX", o RKE2 implementará NetworkPolicies que atende ao CIS Benchmark para os namespaces incorporados do Kubernetes. Esses namespaces são: kube-system, kube-public e default.
O NetworkPolicy utilizado permitirá apenas que pods dentro do mesmo namespace se comuniquem entre si. Existem algumas exceções notáveis, que permitem que as solicitações DNS sejam resolvidas.
-
As solicitações DNS podem alcançar o servidor DNS.
-
As solicitações HTTP/s podem alcançar o serviço ingress-nginx.
-
As solicitações HTTPs podem alcançar o metrics-server.
-
Solicitações para o webhook ingress-nginx no pod especificado pelo pod ingress-nginx (normalmente 8443).
-
Solicitações HTTPs para o rke2-snapshot-validation-webhook.
|
Intervenção do Operador Necessária
Os operadores devem gerenciar as políticas de rede normalmente para namespaces adicionais que são criados. |
Configurar a conta de serviço default.
|
Defina |
O Kubernetes fornece uma default conta de serviço que é usada pelos workloads do cluster onde nenhuma conta de serviço específica é atribuída ao pod. Quando o acesso à API do Kubernetes a partir de um pod é necessário, uma conta de serviço específica deve ser criada para esse pod, e os direitos devem ser concedidos a essa conta de serviço. A conta de serviço default deve ser configurada de forma que não forneça um token de conta de serviço e não tenha nenhuma atribuição de direitos explícita.
Para cada namespace, incluindo default e kube-system em uma instalação padrão do RKE2, a conta de serviço default deve incluir este valor:
automountServiceAccountToken: false
O RKE2 definirá automaticamente o valor corretamente para os namespaces kube-system, cis-operator-system, kube-node-lease e tigera-operator.
|
Intervenção do Operador Necessária
Para namespaces criados pelo operador do cluster, o seguinte script e arquivo de configuração podem ser usados para configurar a conta de serviço A configuração abaixo deve ser salva em um arquivo chamado
Crie um arquivo de script bash chamado
Execute este script para aplicar a configuração |
Configuração de auditoria do servidor API
Os requisitos do CIS 1.2.22 a 1.2.25 estão relacionados à configuração de logs de auditoria para o servidor API. Quando o RKE2 é iniciado com a flag profile definida, ele configurará automaticamente os parâmetros --audit-log- endurecidos no API Server para passar essas verificações CIS.
A política de auditoria padrão do RKE2 é configurada para não registrar solicitações no API Server. Isso é feito para permitir que os operadores do cluster tenham flexibilidade para personalizar uma política de auditoria que atenda às suas necessidades e requisitos de auditoria, pois estes são específicos para o ambiente e políticas de cada usuário.
Uma política de auditoria padrão é criada pelo RKE2 quando iniciado com a flag profile definida. A política é definida em /etc/rancher/rke2/audit-policy.yaml.
apiVersion: audit.k8s.io/v1
kind: Policy
metadata:
creationTimestamp: null
rules:
- level: None
|
Intervenção do Operador Necessária
Para começar a registrar solicitações no API Server, pelo menos o parâmetro Após adaptar a política de auditoria, o RKE2 deve ser reiniciado para carregar a nova configuração.
|
Os logs de auditoria do API Server serão gravados em /var/lib/rancher/rke2/server/logs/audit.log.
Problemas conhecidos
Os seguintes são controles que o RKE2 padrão atualmente não passa. Cada lacuna será explicada e como ela é abordada.
Controle 1.1.12
Certifique-se de que a propriedade do diretório de dados etcd esteja definida como etcd:etcd.
Fundamento Lógico
etcd é um armazenamento de chave-valor altamente disponível usado pelas implantações do Kubernetes para armazenamento persistente de todos os seus objetos da API REST. Este diretório de dados deve ser protegido contra qualquer leitura ou escrita não autorizada. Ele deve ser de propriedade de etcd:etcd.
de incidentes
Isso pode ser corrigido criando um usuário e grupo etcd conforme descrito acima.
Controle 5.1.5
Garanta que contas de serviço padrão não estejam sendo usadas ativamente
Fundamento Lógico
O Kubernetes fornece uma default conta de serviço que é usada pelos workloads do cluster onde nenhuma conta de serviço específica é atribuída ao pod.
Quando o acesso à API do Kubernetes a partir de um pod é necessário, uma conta de serviço específica deve ser criada para esse pod, e os direitos devem ser concedidos a essa conta de serviço.
A conta de serviço default deve ser configurada de forma que não forneça um token de conta de serviço e não tenha nenhuma atribuição de direitos explícita.
Isso pode ser corrigido atualizando o campo automountServiceAccountToken para false para a conta de serviço default em cada namespace.