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
A seguir estão os resultados das recomendações do CIS Kubernetes V1.27 Benchmark v1.9.0 no AKS. Os resultados são aplicáveis ao AKS 1.27.x até o AKS 1.29.x.
Níveis de segurança
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.
Status da avaliação
Um status de avaliação é incluído para cada recomendação. O status da avaliação indica se a recomendação fornecida pode ser automatizada ou requer etapas manuais para ser implementada. Ambos os status são igualmente importantes e são determinados e apoiados conforme definido abaixo:
- Automatizado: representa recomendações para as quais a avaliação de um controle técnico pode ser totalmente automatizada e validada para um estado de aprovação/reprovação. As recomendações incluirão as informações necessárias para implementar a automação.
- Manual: representa recomendações para as quais a avaliação de um controle técnico não pode ser totalmente automatizada e requer todas ou algumas etapas manuais para validar se o estado configurado está definido conforme o esperado. O estado esperado pode variar dependendo do ambiente.
Recomendações automatizadas afetam a pontuação de referência se não forem aplicadas, enquanto recomendações manuais não.
Status de atestado
As recomendações podem ter um dos seguintes status de atestado:
- Passar: A recomendação foi aplicada.
- Falhar: A recomendação não foi aplicada.
- N/A: A recomendação está relacionada aos requisitos de permissão do arquivo 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. Recomendações automatizadas afetam a pontuação de referência, independentemente de a recomendação se aplicar ao ambiente específico do usuário ou não.
- Controle Equivalente: A recomendação foi implementada de uma maneira diferente e equivalente.
Detalhes do benchmark
ID do CIS | Descrição da recomendação | Status da avaliaçã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 | Automatizado | 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 | Automatizado | 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 | Automatizado | 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 | Automatizado | 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 | Automatizado | L1 | N/D |
1.1.6 | Verificar se a propriedade do arquivo especificação de pod do agendador está definida como root:root | Automatizado | 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 | Automatizado | L1 | N/D |
1.1.8 | Verificar se a propriedade do arquivo especificação de pod do etcd está definida como root:root | Automatizado | 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 | Manual | L1 | N/D |
1.1.10 | Verificar se a propriedade do arquivo adaptador de rede de contêiner está definida como root:root | Manual | 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 | Automatizado | L1 | N/D |
1.1.12 | Verificar se a propriedade do diretório de dados do etcd está definida como etcd:etcd | Automatizado | 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 | Automatizado | L1 | N/D |
1.1.14 | Verificar se a propriedade do arquivo admin.conf está definida como root:root | Automatizado | 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 | Automatizado | L1 | N/D |
1.1.16 | Verificar se a propriedade do arquivo scheduler.conf está definida como root:root | Automatizado | 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 | Automatizado | L1 | N/D |
1.1.18 | Verificar se a propriedade do arquivo controller-manager.conf está definida como root:root | Automatizado | L1 | N/D |
1.1.19 | Verificar se a propriedade do arquivo e do diretório PKI do Kubernetes está definida como root:root | Automatizado | 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 | Manual | L1 | N/D |
1.1.21 | Verificar se as permissões do arquivo chave PKI do Kubernetes estão definidas como 600 | Manual | L1 | N/D |
1,2 | Servidor de API | |||
1.2.1 | Verificar se o argumento --anonymous-auth está definido como false |
Manual | L1 | Aprovado |
1.2.2 | Verificar se o parâmetro --token-auth-file não está definido |
Automatizado | L1 | Falha |
1.2.3 | Verificar se --DenyServiceExternalIPs não está definido |
Manual | L1 | Falha |
1.2.4 | Verificar se os argumentos --kubelet-client-certificate e --kubelet-client-key estão definidos conforme apropriado |
Automatizado | L1 | Aprovado |
1.2.5 | Verificar se o argumento --kubelet-certificate-authority está definido conforme apropriado |
Automatizado | L1 | Falha |
1.2.6 | Verificar se o argumento --authorization-mode não está definido AlwaysAllow |
Automatizado | L1 | Aprovado |
1.2.7 | Verificar se o argumento --authorization-mode inclui o Node |
Automatizado | L1 | Aprovado |
1.2.8 | Verificar se o argumento --authorization-mode inclui o RBAC |
Automatizado | L1 | Aprovado |
1.2.9 | Verificar se o plug-in de controle de admissão EventRateLimit está definido | Manual | L1 | Falha |
1.2.10 | Verificar se o plug-in de controle de admissão AlwaysAdmit não está definido | Automatizado | L1 | Aprovado |
1.2.11 | Verificar se plug-in de controle de admissão AlwaysPullImages está definido | Manual | L1 | Falha |
1.2.12 | Verificar se o plug-in de controle de admissão ServiceAccount está definido | Automatizado | L2 | Reprovado |
1.2.13 | Verificar se o plug-in de controle de admissão NamespaceLifecycle está definido | Automatizado | L2 | Aprovado |
1.2.14 | Verificar se o plug-in de controle de admissão NodeRestriction está definido | Automatizado | L2 | Aprovado |
1.2.15 | Verificar se o argumento --profiling está definido como false |
Automatizado | L1 | Aprovado |
1.2.16 | Verificar se o argumento --audit-log-path está definido |
Automatizado | L1 | Aprovado |
1.2.17 | Verificar se o argumento --audit-log-maxage está definido como 30 ou conforme apropriado |
Automatizado | L1 | Controle equivalente |
1.2.18 | Verificar se o argumento --audit-log-maxbackup está definido como 10 ou conforme apropriado |
Automatizado | L1 | Controle equivalente |
1.2.19 | Verificar se o argumento --audit-log-maxsize está definido como 100 ou conforme apropriado |
Automatizado | L1 | Aprovado |
1.2.20 | Verificar se o argumento --request-timeout está definido conforme apropriado |
Manual | L1 | Aprovado |
1.2.21 | Verificar se o argumento --service-account-lookup está definido como true |
Automatizado | L1 | Aprovado |
1.2.22 | Verificar se o argumento --service-account-key-file está definido conforme apropriado |
Automatizado | L1 | Aprovado |
1.2.23 | Verificar se os argumentos --etcd-certfile e --etcd-keyfile estão definidos conforme apropriado |
Automatizado | L1 | Aprovado |
1.2.24 | Verificar se os argumentos --tls-cert-file e --tls-private-key-file estão definidos conforme apropriado |
Automatizado | L1 | Aprovado |
1.2.25 | Verificar se o argumento --client-ca-file está definido conforme apropriado |
Automatizado | L1 | Aprovado |
1.2.26 | Verificar se o argumento --etcd-cafile está definido conforme apropriado |
Automatizado | L1 | Aprovado |
1.2.27 | Verificar se o argumento --encryption-provider-config está definido conforme apropriado |
Manual | L1 | Depende do ambiente |
1.2.28 | Verificar se os provedores de criptografia estão configurados adequadamente | Manual | L1 | Depende do ambiente |
1.2.29 | Verificar se o servidor de API usa apenas codificações criptográficas fortes | Manual | L1 | Aprovado |
1,3 | Gerenciador do controlador | |||
1.3.1 | Verificar se o argumento --terminated-pod-gc-threshold está definido conforme apropriado |
Manual | L1 | Aprovado |
1.3.2 | Verificar se o argumento --profiling está definido como false |
Automatizado | L1 | Aprovado |
1.3.3 | Verificar se o argumento --use-service-account-credentials está definido como true |
Automatizado | L1 | Aprovado |
1.3.4 | Verificar se o argumento --service-account-private-key-file está definido conforme apropriado |
Automatizado | L1 | Aprovado |
1.3.5 | Verificar se o argumento --root-ca-file está definido conforme apropriado |
Automatizado | L1 | Aprovado |
1.3.6 | Verificar se o argumento RotateKubeletServerCertificate está definido como true | Automatizado | L2 | Aprovado |
1.3.7 | Verificar se o argumento --bind-address está definido como 127.0.0.1 |
Automatizado | L1 | Controle equivalente |
1.4 | Agendador | |||
1.4.1 | Verificar se o argumento --profiling está definido como false |
Automatizado | L1 | Aprovado |
1.4.2 | Verificar se o argumento --bind-address está definido como 127.0.0.1 |
Automatizado | L1 | Controle equivalente |
2 | etcd | |||
2.1 | Verificar se os argumentos --cert-file e --key-file estão definidos conforme apropriado |
Automatizado | L1 | Aprovado |
2.2 | Verificar se o argumento --client-cert-auth está definido como true |
Automatizado | L1 | Aprovado |
2.3 | Verificar se o argumento --auto-tls não está definido como true |
Automatizado | L1 | Aprovado |
2.4 | Verificar se os argumentos --peer-cert-file e --peer-key-file estão definidos conforme apropriado |
Automatizado | L1 | Aprovado |
2.5 | Verificar se o argumento --peer-client-cert-auth está definido como true |
Automatizado | L1 | Aprovado |
2.6 | Verificar se o argumento --peer-auto-tls não está definido como true |
Automatizado | L1 | Aprovado |
2.7 | Verificar se uma autoridade de certificação exclusiva é usada para o etcd | Manual | 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 | Manual | L1 | Aprovado |
3.1.2 | A autenticação do token da conta de serviço não deve ser usada para os usuários | Manual | L1 | Aprovado |
3.1.3 | A autenticação do token de inicialização não deve ser usada para os usuários | Manual | L1 | Aprovado |
3.2 | Log | |||
3.2.1 | Verificar se uma política de auditoria mínima é criada | Manual | L1 | Aprovado |
3.2.2 | Verificar se a política de auditoria abrange as principais preocupações de segurança | Manual | 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 | Automatizado | L1 | Aprovado |
4.1.2 | Verificar se a propriedade do arquivo serviço Kubelet está definida como root:root | Automatizado | 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 | Manual | L1 | N/D |
4.1.4 | Se o arquivo kubeconfig do proxy existir, verifique se a propriedade está definida como root:root | Manual | 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 |
Automatizado | L1 | Aprovado |
4.1.6 | Verificar se a propriedade do arquivo --kubeconfig kubelet.conf está definida como root:root |
Automatizado | 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 | Manual | L1 | Aprovado |
4.1.8 | Verificar se a propriedade do arquivo autoridades de certificação do cliente está definida como root:root | Manual | 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 | Automatizado | 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 | Automatizado | L1 | Aprovado |
4.2 | Kubelet | |||
4.2.1 | Verificar se o argumento --anonymous-auth está definido como false |
Automatizado | L1 | Aprovado |
4.2.2 | Verificar se o argumento --authorization-mode não está definido AlwaysAllow |
Automatizado | L1 | Aprovado |
4.2.3 | Verificar se o argumento --client-ca-file está definido conforme apropriado |
Automatizado | L1 | Aprovado |
4.2.4 | Verificar se o argumento --read-only-port está definido como 0 |
Manual | L1 | Aprovado |
4.2.5 | Verificar se o argumento --streaming-connection-idle-timeout não está definido como 0 |
Manual | L1 | Aprovado |
4.2.6 | Verificar se o argumento --make-iptables-util-chains está definido como true |
Automatizado | L1 | Aprovado |
4.2.7 | Verificar se o argumento --hostname-override não está definido |
Manual | L1 | Aprovado |
4.2.8 | Certifique-se de que o argumento --eventRecordQPS esteja definido em um nível que garanta a captura de eventos apropriada |
Manual | L2 | Aprovado |
4.2.9 | Verificar se os argumentos --tls-cert-file e --tls-private-key-file estão definidos conforme apropriado |
Manual | L1 | Aprovado |
4.2.10 | Verificar se o argumento --rotate-certificates não está definido como false |
Automatizado | L1 | Aprovado |
4.2.11 | Verifique se o argumento RotateKubeletServerCertificate está definido como verdadeiro | Manual | L1 | Reprovado |
4.2.12 | Verificar se o Kubelet usa apenas codificações criptográficas fortes | Manual | L1 | Aprovado |
4.2.13 | Garanta que um limite seja definido nos PIDs do pod | Manual | L1 | Aprovado |
4.3 | kube-proxy | |||
4.3.1 | Certifique-se de que o serviço de métricas do kube-proxy esteja vinculado ao localhost | Automatizado | 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 | Automatizado | L1 | Depende do ambiente |
5.1.2 | Minimizar o acesso a segredos | Automatizado | L1 | Depende do ambiente |
5.1.3 | Minimizar o uso de curinga em Roles e ClusterRoles | Automatizado | L1 | Depende do ambiente |
5.1.4 | Minimizar o acesso para criar pods | Automatizado | L1 | Depende do ambiente |
5.1.5 | Verificar se as contas de serviço padrão não são usadas ativamente | Automatizado | L1 | Depende do ambiente |
5.1.6 | Verificar se os tokens da conta de serviço só são montados quando necessário | Automatizado | L1 | Depende do ambiente |
5.1.7 | Evitar usar o grupo system:masters | Manual | L1 | Depende do ambiente |
5.1.8 | Limitar o uso das permissões Bind, Impersonate e Escalate no cluster do Kubernetes | Manual | L1 | Depende do ambiente |
5.1.9 | Minimizar o acesso para criar volumes persistentes | Manual | L1 | Depende do ambiente |
5.1.10 | Minimizar o acesso ao sub-recurso do proxy de nós | Manual | L1 | Depende do ambiente |
5.1.11 | Minimizar o acesso ao sub-recurso de aprovação dos objetos certificatesigningrequests | Manual | L1 | Depende do ambiente |
5.1.12 | Minimizar o acesso aos objetos de configuração do webhook | Manual | L1 | Depende do ambiente |
5.1.13 | Minimizar o acesso à criação do token da conta de serviço | Manual | L1 | Depende do ambiente |
5.2 | Padrões 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 | Manual | L1 | Depende do ambiente |
5.2.2 | Minimizar a admissão de contêineres privilegiados | Manual | 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 | Manual | L1 | Depende do ambiente |
5.2.4 | Minimizar a admissão de contêineres que desejam compartilhar o namespace do IPC do host | Manual | L1 | Depende do ambiente |
5.2.5 | Minimizar a admissão de contêineres que desejam compartilhar o namespace da rede do host | Manual | L1 | Depende do ambiente |
5.2.6 | Minimizar a admissão de contêineres com allowPrivilegeEscalation | Manual | L1 | Depende do ambiente |
5.2.7 | Minimizar a admissão de contêineres raiz | Manual | L2 | Depende do ambiente |
5.2.8 | Minimizar a admissão de contêineres com a funcionalidade NET_RAW | Manual | L1 | Depende do ambiente |
5.2.9 | Minimizar a admissão de contêineres com funcionalidades adicionadas | Manual | L1 | Depende do ambiente |
5.2.10 | Minimizar a admissão de contêineres com funcionalidades atribuídas | Manual | L2 | Depende do ambiente |
5.2.11 | Minimizar a admissão dos Contêineres do HostProcess do Windows | Manual | L1 | Depende do ambiente |
5.2.12 | Minimizar a admissão dos volumes do HostPath | Manual | L1 | Depende do ambiente |
5.2.13 | Minimizar a admissão dos contêineres que usam HostPorts | Manual | 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 | Manual | L1 | Aprovado |
5.3.2 | Verificar se todos os namespaces têm políticas de rede definidas | Manual | 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 | Manual | L2 | Depende do ambiente |
5.4.2 | Considerar o armazenamento de segredo externo | Manual | 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 | Manual | L2 | Reprovado |
5.6 | Políticas gerais | |||
5.6.1 | Criar limites administrativos entre recursos usando namespaces | Manual | L1 | Depende do ambiente |
5.6.2 | Verificar se o perfil seccomp está definido como docker/padrão em suas definições de pod | Manual | L2 | Depende do ambiente |
5.6.3 | Aplicar contexto de segurança a seus pods e contêineres | Manual | L2 | Depende do ambiente |
5.6.4 | O namespace padrão não deve ser usado | Manual | 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 do kernel desnecessários são desabilitados no sistema operacional.
Próximas etapas
Para saber mais sobre a segurança do AKS, confira os seguintes artigos:
Azure Kubernetes Service