Benchmark do Kubernetes do CIS (Center for Internet Security)
Como um serviço seguro, o AKS (Serviço de Kubernetes do Azure) está em conformidade com os padrões SOC, ISO, PCI DSS e HIPAA. Este artigo aborda a proteção de segurança aplicada ao AKS com base no benchmark do Kubernetes do CIS. Para saber mais sobre a segurança do AKS, confira Conceitos de segurança para aplicativos e clusters no AKS (Serviço de Kubernetes do Azure). Para obter mais informações sobre o benchmark do CIS, consulte Benchmarks do CIS (Center for Internet Security).
Benchmark do Kubernetes CIS
Veja a seguir os resultados das recomendações do CIS Kubernetes V1.27 Benchmark v1.8.0 no AKS. Os resultados são aplicáveis ao AKS 1.21.x pelo AKS 1.27.x.
As recomendações Pontuadas afetam a pontuação do parâmetro de comparação se não forem aplicadas, enquanto as recomendações Não pontuadas não.
Os benchmarks do CIS fornecem dois níveis de configurações de segurança:
- L1, ou Nível 1, recomenda requisitos básicos de segurança essenciais que podem ser configurados em qualquer sistema e devem causar pouca ou nenhuma interrupção de serviço ou funcionalidade reduzida.
- L2, ou Nível 2, recomenda configurações de segurança para ambientes que exigem maior segurança que podem reduzir a funcionalidade.
As recomendações podem ter um dos seguintes status:
- Aprovado - a recomendação foi aplicada.
- Reprovada: a recomendação não foi aplicada.
- N/A – a recomendação está relacionada aos requisitos de permissão de arquivo de manifesto que não são relevantes para o AKS. Por padrão, os clusters do Kubernetes usam um modelo de manifesto para implantar os pods do painel de controle, que dependem de arquivos da VM do nó. O benchmark do Kubernetes do CIS recomenda que esses arquivos devem ter determinados requisitos de permissão. Os clusters do AKS usam um gráfico do Helm para implantar pods do painel de controle e não dependem de arquivos na VM do nó.
- Depende do Ambiente: a recomendação é aplicada no ambiente específico do usuário e não é controlada pelo AKS. As recomendações com pontuação afetam a pontuação do benchmark, quer a recomendação se aplique ou não ao ambiente específico do usuário.
- Controle equivalente – a recomendação foi implementada de maneira diferente e equivalente.
ID do CIS | Descrição da recomendação | Tipo de pontuação | Nível | Status |
---|---|---|---|---|
1 | Componentes do painel de controle | |||
1,1 | Arquivos de configuração de nó do painel de controle | |||
1.1.1 | Verificar se as permissões de arquivo de especificação do pod do servidor de API estão definidas como 600 ou com uma opção mais restritiva | Com pontuação | L1 | N/D |
1.1.2 | Verificar se a propriedade do arquivo especificação de pod do servidor de API está definida como root:root | Com pontuação | L1 | N/D |
1.1.3 | Verificar se as permissões de arquivo de especificação do pod do gerenciador do controlador estão definidas como 600 ou com uma opção mais restritiva | Com pontuação | L1 | N/D |
1.1.4 | Verificar se a propriedade do arquivo especificação de pod do gerenciador do controlador está definida como root:root | Com pontuação | L1 | N/D |
1.1.5 | Verificar se as permissões de arquivo de especificação do pod do agendador estão definidas como 600 ou com uma opção mais restritiva | Com pontuação | L1 | N/D |
1.1.6 | Verificar se a propriedade do arquivo especificação de pod do agendador está definida como root:root | Com pontuação | L1 | N/D |
1.1.7 | Verificar se as permissões de arquivo de especificação do pod do etcd estão definidas como 600 ou com uma opção mais restritiva | Com pontuação | L1 | N/D |
1.1.8 | Verificar se a propriedade do arquivo especificação de pod do etcd está definida como root:root | Com pontuação | L1 | N/D |
1.1.9 | Verificar se as permissões de arquivo do Adaptador de Rede de Contêiner estão definidas como 600 ou com uma opção mais restritiva | Sem pontuação | L1 | N/D |
1.1.10 | Verificar se a propriedade do arquivo adaptador de rede de contêiner está definida como root:root | Sem pontuação | L1 | N/D |
1.1.11 | Verificar se as permissões do diretório de dados do etcd estão definidas como 700 ou mais restritivas | Com pontuação | L1 | N/D |
1.1.12 | Verificar se a propriedade do diretório de dados do etcd está definida como etcd:etcd | Com pontuação | L1 | N/D |
1.1.13 | Verificar se as permissões do arquivo admin.conf estão definidas como 600 ou com uma opção mais restritiva | Com pontuação | L1 | N/D |
1.1.14 | Verificar se a propriedade do arquivo admin.conf está definida como root:root | Com pontuação | L1 | N/D |
1.1.15 | Verificar se as permissões do arquivo scheduler.conf estão definidas como 600 ou com uma opção mais restritiva | Com pontuação | L1 | N/D |
1.1.16 | Verificar se a propriedade do arquivo scheduler.conf está definida como root:root | Com pontuação | L1 | N/D |
1.1.17 | Verificar se as permissões do arquivo controller-manager.conf estão definidas como 600 ou com uma opção mais restritiva | Com pontuação | L1 | N/D |
1.1.18 | Verificar se a propriedade do arquivo controller-manager.conf está definida como root:root | Com pontuação | L1 | N/D |
1.1.19 | Verificar se a propriedade do arquivo e do diretório PKI do Kubernetes está definida como root:root | Com pontuação | L1 | N/D |
1.1.20 | Verificar se as permissões de arquivo do certificado de PKI do Kubernetes estão definidas como 600 ou com uma opção mais restritiva | Com pontuação | L1 | N/D |
1.1.21 | Verificar se as permissões do arquivo chave PKI do Kubernetes estão definidas como 600 | Com pontuação | L1 | N/D |
1,2 | Servidor de API | |||
1.2.1 | Verificar se o argumento --anonymous-auth está definido como false |
Sem pontuação | L1 | Aprovado |
1.2.2 | Verificar se o parâmetro --token-auth-file não está definido |
Com pontuação | L1 | Falha |
1.2.3 | Verificar se --DenyServiceExternalIPs não está definido |
Com pontuação | L1 | Falha |
1.2.4 | Verificar se os argumentos --kubelet-client-certificate e --kubelet-client-key estão definidos conforme apropriado |
Com pontuação | L1 | Aprovado |
1.2.5 | Verificar se o argumento --kubelet-certificate-authority está definido conforme apropriado |
Com pontuação | L1 | Falha |
1.2.6 | Verificar se o argumento --authorization-mode não está definido AlwaysAllow |
Com pontuação | L1 | Aprovado |
1.2.7 | Verificar se o argumento --authorization-mode inclui o Node |
Com pontuação | L1 | Aprovado |
1.2.8 | Verificar se o argumento --authorization-mode inclui o RBAC |
Com pontuação | L1 | Aprovado |
1.2.9 | Verificar se o plug-in de controle de admissão EventRateLimit está definido | Sem pontuação | L1 | Falha |
1.2.10 | Verificar se o plug-in de controle de admissão AlwaysAdmit não está definido | Com pontuação | L1 | Aprovado |
1.2.11 | Verificar se plug-in de controle de admissão AlwaysPullImages está definido | Sem pontuação | L1 | Falha |
1.2.12 | Verificar se o plug-in de controle de admissão SecurityContextDeny está definido se PodSecurityPolicy não for usado | Sem pontuação | L1 | Falha |
1.2.13 | Verificar se o plug-in de controle de admissão ServiceAccount está definido | Com pontuação | L1 | Aprovado |
1.2.14 | Verificar se o plug-in de controle de admissão NamespaceLifecycle está definido | Com pontuação | L1 | Aprovado |
1.2.15 | Verificar se o plug-in de controle de admissão NodeRestriction está definido | Com pontuação | L1 | Aprovado |
1.2.16 | Verificar se o argumento --secure-port não está definido como 0 |
Com pontuação | L1 | Aprovado |
1.2.17 | Verificar se o argumento --profiling está definido como false |
Com pontuação | L1 | Aprovado |
1.2.18 | Verificar se o argumento --audit-log-path está definido |
Com pontuação | L1 | Controle equivalente |
1.2.19 | Verificar se o argumento --audit-log-maxage está definido como 30 ou conforme apropriado |
Com pontuação | L1 | Controle equivalente |
1.2.20 | Verificar se o argumento --audit-log-maxbackup está definido como 10 ou conforme apropriado |
Com pontuação | L1 | Aprovado |
1.2.21 | Verificar se o argumento --audit-log-maxsize está definido como 100 ou conforme apropriado |
Com pontuação | L1 | Aprovado |
1.2.22 | Verificar se o argumento --request-timeout está definido conforme apropriado |
Com pontuação | L1 | Aprovado |
1.2.23 | Verificar se o argumento --service-account-lookup está definido como true |
Com pontuação | L1 | Aprovado |
1.2.24 | Verificar se o argumento --service-account-key-file está definido conforme apropriado |
Com pontuação | L1 | Aprovado |
1.2.25 | Verificar se os argumentos --etcd-certfile e --etcd-keyfile estão definidos conforme apropriado |
Com pontuação | L1 | Aprovado |
1.2.26 | Verificar se os argumentos --tls-cert-file e --tls-private-key-file estão definidos conforme apropriado |
Com pontuação | L1 | Aprovado |
1.2.27 | Verificar se o argumento --client-ca-file está definido conforme apropriado |
Com pontuação | L1 | Aprovado |
1.2.28 | Verificar se o argumento --etcd-cafile está definido conforme apropriado |
Com pontuação | L1 | Depende do ambiente |
1.2.29 | Verificar se o argumento --encryption-provider-config está definido conforme apropriado |
Com pontuação | L1 | Depende do ambiente |
1.2.30 | Verificar se os provedores de criptografia estão configurados adequadamente | Com pontuação | L1 | Depende do ambiente |
1.2.31 | Verificar se o servidor de API usa apenas codificações criptográficas fortes | Sem pontuação | L1 | Aprovado |
1,3 | Gerenciador do controlador | |||
1.3.1 | Verificar se o argumento --terminated-pod-gc-threshold está definido conforme apropriado |
Com pontuação | L1 | Aprovado |
1.3.2 | Verificar se o argumento --profiling está definido como false |
Com pontuação | L1 | Aprovado |
1.3.3 | Verificar se o argumento --use-service-account-credentials está definido como true |
Com pontuação | L1 | Aprovado |
1.3.4 | Verificar se o argumento --service-account-private-key-file está definido conforme apropriado |
Com pontuação | L1 | Aprovado |
1.3.5 | Verificar se o argumento --root-ca-file está definido conforme apropriado |
Com pontuação | L1 | Aprovado |
1.3.6 | Verificar se o argumento RotateKubeletServerCertificate está definido como true | Com pontuação | L2 | Falha |
1.3.7 | Verificar se o argumento --bind-address está definido como 127.0.0.1 |
Com pontuação | L1 | Controle equivalente |
1.4 | Agendador | |||
1.4.1 | Verificar se o argumento --profiling está definido como false |
Com pontuação | L1 | Aprovado |
1.4.2 | Verificar se o argumento --bind-address está definido como 127.0.0.1 |
Com pontuação | L1 | Controle equivalente |
2 | etcd | |||
2.1 | Verificar se os argumentos --cert-file e --key-file estão definidos conforme apropriado |
Com pontuação | L1 | Aprovado |
2.2 | Verificar se o argumento --client-cert-auth está definido como true |
Com pontuação | L1 | Aprovado |
2.3 | Verificar se o argumento --auto-tls não está definido como true |
Com pontuação | L1 | Aprovado |
2.4 | Verificar se os argumentos --peer-cert-file e --peer-key-file estão definidos conforme apropriado |
Com pontuação | L1 | Aprovado |
2.5 | Verificar se o argumento --peer-client-cert-auth está definido como true |
Com pontuação | L1 | Aprovado |
2.6 | Verificar se o argumento --peer-auto-tls não está definido como true |
Com pontuação | L1 | Aprovado |
2.7 | Verificar se uma autoridade de certificação exclusiva é usada para o etcd | Sem pontuação | L2 | Aprovado |
3 | Configuração do painel de controle | |||
3.1 | Autenticação e autorização | |||
3.1.1 | A autenticação do certificado do cliente não deve ser usada para usuários | Sem pontuação | L2 | Aprovado |
3.1.2 | A autenticação do token da conta de serviço não deve ser usada para os usuários | Sem pontuação | L2 | Aprovado |
3.1.3 | A autenticação do token de inicialização não deve ser usada para os usuários | Sem pontuação | L2 | Aprovado |
3.2 | Log | |||
3.2.1 | Verificar se uma política de auditoria mínima é criada | Com pontuação | L1 | Aprovado |
3.2.2 | Verificar se a política de auditoria abrange as principais preocupações de segurança | Sem pontuação | L2 | Aprovado |
4 | Nós de trabalho | |||
4.1 | Arquivos de configuração de nó de trabalho | |||
4.1.1 | Verificar se as permissões de arquivo do serviço do kubelet estão definidas como 600 ou com uma opção mais restritiva | Com pontuação | L1 | Aprovado |
4.1.2 | Verificar se a propriedade do arquivo serviço Kubelet está definida como root:root | Com pontuação | L1 | Aprovado |
4.1.3 | Se o arquivo kubeconfig do proxy existir, verifique se as permissões estão definidas como 600 ou com uma opção mais restritiva | Com pontuação | L1 | N/D |
4.1.4 | Se o arquivo kubeconfig do proxy existir, verifique se a propriedade está definida como root:root | Com pontuação | L1 | N/D |
4.1.5 | Verificar se as permissões do arquivo --kubeconfig kubelet.conf estão definidas como 600 ou com uma opção mais restritiva |
Com pontuação | L1 | Aprovado |
4.1.6 | Verificar se a propriedade do arquivo --kubeconfig kubelet.conf está definida como root:root |
Com pontuação | L1 | Aprovado |
4.1.7 | Verificar se as permissões do arquivo de autoridades de certificação estão definidas como 600 ou com uma opção mais restritiva | Com pontuação | L1 | Aprovado |
4.1.8 | Verificar se a propriedade do arquivo autoridades de certificação do cliente está definida como root:root | Com pontuação | L1 | Aprovado |
4.1.9 | Se o arquivo de configuração config.yaml do kubelet estiver sendo usado, verifique se as permissões estão definidas como 600 ou com uma opção mais restritiva | Com pontuação | L1 | Aprovado |
4.1.10 | Se o arquivo de configuração config.yaml do kubelet estiver sendo usado, verifique se a propriedade do arquivo está definida como root:root | Com pontuação | L1 | Aprovado |
4.2 | Kubelet | |||
4.2.1 | Verificar se o argumento --anonymous-auth está definido como false |
Com pontuação | L1 | Aprovado |
4.2.2 | Verificar se o argumento --authorization-mode não está definido AlwaysAllow |
Com pontuação | L1 | Aprovado |
4.2.3 | Verificar se o argumento --client-ca-file está definido conforme apropriado |
Com pontuação | L1 | Aprovado |
4.2.4 | Verificar se o argumento --read-only-port está definido como 0 |
Com pontuação | L1 | Aprovado |
4.2.5 | Verificar se o argumento --streaming-connection-idle-timeout não está definido como 0 |
Com pontuação | L1 | Aprovado |
4.2.6 | Verificar se o argumento --protect-kernel-defaults está definido como true |
Com pontuação | L1 | Aprovado |
4.2.7 | Verificar se o argumento --make-iptables-util-chains está definido como true |
Com pontuação | L1 | Aprovado |
4.2.8 | Verificar se o argumento --hostname-override não está definido |
Sem pontuação | L1 | Aprovado |
4.2.9 | Verificar se o argumento eventRecordQPS está definido com um nível que garanta a captura adequada de eventos | Sem pontuação | L2 | Aprovado |
4.2.10 | Verificar se os argumentos --tls-cert-file e --tls-private-key-file estão definidos conforme apropriado |
Com pontuação | L1 | Aprovado |
4.2.11 | Verificar se o argumento --rotate-certificates não está definido como false |
Com pontuação | L1 | Aprovado |
4.2.12 | Verificar se o argumento RotateKubeletServerCertificate está definido como true | Com pontuação | L1 | Aprovado |
4.2.13 | Verificar se o Kubelet usa apenas codificações criptográficas fortes | Sem pontuação | L1 | Aprovado |
5 | Políticas | |||
5.1 | Contas de serviço e RBAC | |||
5.1.1 | Verificar se a função cluster-admin só é usada quando necessário | Sem pontuação | L1 | Depende do ambiente |
5.1.2 | Minimizar o acesso a segredos | Sem pontuação | L1 | Depende do ambiente |
5.1.3 | Minimizar o uso de curinga em Roles e ClusterRoles | Sem pontuação | L1 | Depende do ambiente |
5.1.4 | Minimizar o acesso para criar pods | Sem pontuação | L1 | Depende do ambiente |
5.1.5 | Verificar se as contas de serviço padrão não são usadas ativamente | Com pontuação | L1 | Depende do ambiente |
5.1.6 | Verificar se os tokens da conta de serviço só são montados quando necessário | Sem pontuação | L1 | Depende do ambiente |
5.1.7 | Evitar usar o grupo system:masters | Sem pontuação | L1 | Depende do ambiente |
5.1.8 | Limitar o uso das permissões Bind, Impersonate e Escalate no cluster do Kubernetes | Sem pontuação | L1 | Depende do ambiente |
5.1.9 | Minimizar o acesso para criar volumes persistentes | Sem pontuação | L1 | Depende do ambiente |
5.1.10 | Minimizar o acesso ao sub-recurso do proxy de nós | Sem pontuação | L1 | Depende do ambiente |
5.1.11 | Minimizar o acesso ao sub-recurso de aprovação dos objetos certificatesigningrequests | Sem pontuação | L1 | Depende do ambiente |
5.1.12 | Minimizar o acesso aos objetos de configuração do webhook | Sem pontuação | L1 | Depende do ambiente |
5.1.13 | Minimizar o acesso à criação do token da conta de serviço | Sem pontuação | L1 | Depende do ambiente |
5.2 | Política de segurança de pods | |||
5.2.1 | Certifique-se de que o cluster tenha pelo menos um mecanismo de controle de política ativo em vigor | Sem pontuação | L1 | Depende do ambiente |
5.2.2 | Minimizar a admissão de contêineres privilegiados | Sem pontuação | L1 | Depende do ambiente |
5.2.3 | Minimizar a admissão de contêineres que desejam compartilhar o namespace da ID do processo de host | Com pontuação | L1 | Depende do ambiente |
5.2.4 | Minimizar a admissão de contêineres que desejam compartilhar o namespace do IPC do host | Com pontuação | L1 | Depende do ambiente |
5.2.5 | Minimizar a admissão de contêineres que desejam compartilhar o namespace da rede do host | Com pontuação | L1 | Depende do ambiente |
5.2.6 | Minimizar a admissão de contêineres com allowPrivilegeEscalation | Com pontuação | L1 | Depende do ambiente |
5.2.6 | Minimizar a admissão de contêineres raiz | Sem pontuação | L2 | Depende do ambiente |
5.2.7 | Minimizar a admissão de contêineres com a funcionalidade NET_RAW | Sem pontuação | L1 | Depende do ambiente |
5.2.8 | Minimizar a admissão de contêineres com funcionalidades adicionadas | Sem pontuação | L1 | Depende do ambiente |
5.2.9 | Minimizar a admissão de contêineres com funcionalidades atribuídas | Sem pontuação | L1 | Depende do ambiente |
5.2.10 | Minimizar a admissão de contêineres com funcionalidades atribuídas | Sem pontuação | L2 | |
5.2.11 | Minimizar a admissão dos Contêineres do HostProcess do Windows | Sem pontuação | L1 | Depende do ambiente |
5.2.12 | Minimizar a admissão dos volumes do HostPath | Sem pontuação | L1 | Depende do ambiente |
5.2.13 | Minimizar a admissão dos contêineres que usam HostPorts | Sem pontuação | L1 | Depende do ambiente |
5,3 | CNI e políticas de rede | |||
5.3.1 | Verificar se a CNI em uso dá suporte a políticas de rede | Sem pontuação | L1 | Aprovado |
5.3.2 | Verificar se todos os namespaces têm políticas de rede definidas | Com pontuação | L2 | Depende do ambiente |
5.4 | Gerenciamento de segredos | |||
5.4.1 | Preferir usar segredos como arquivos em vez de segredos como variáveis de ambiente | Sem pontuação | L1 | Depende do ambiente |
5.4.2 | Considerar o armazenamento de segredo externo | Sem pontuação | L2 | Depende do ambiente |
5.5 | Controle de admissão extensível | |||
5.5.1 | Configurar a proveniência de imagens usando o controlador de admissão ImagePolicyWebhook | Sem pontuação | L2 | Falha |
5.7 | Políticas gerais | |||
5.7.1 | Criar limites administrativos entre recursos usando namespaces | Sem pontuação | L1 | Depende do ambiente |
5.7.2 | Verificar se o perfil seccomp está definido como docker/padrão em suas definições de pod | Sem pontuação | L2 | Depende do ambiente |
5.7.3 | Aplicar contexto de segurança a seus pods e contêineres | Sem pontuação | L2 | Depende do ambiente |
5.7.4 | O namespace padrão não deve ser usado | Com pontuação | L2 | Depende do ambiente |
Observação
Além do benchmark do CIS do Kubernetes, também há um benchmark cis do AKS disponível.
Observações adicionais
- O sistema operacional protegido por segurança é criado e mantido especificamente para o AKS e não tem suporte fora da plataforma AKS.
- Para reduzir ainda mais a área de superfície de ataque, alguns drivers de módulo de kernel desnecessários foram desabilitados no sistema operacional.
Próximas etapas
Para saber mais sobre a segurança do AKS, confira os seguintes artigos: