Introdução à Segurança Kubernetes
Vamos fazer uma visão geral sobre vários aspectos de segurança do kubernetes. Isso é bastante importante quando trabalhamos com Kubernetes em produção e para o exame do CKS.
Princípios da Segurança
De forma geral a segurança é um processo complexo pois não é uma única coisa que devemos nos atentar, é uma combinação de várias coisas diferentes.
Ambientes mudam, o que significa que a segurança não pode permanecer em um determinado estado por muito tempo, sendo necessário se adaptar constantemente.
Os invasores geralmente tem vantagem por decidirem quando e o que atacar, podendo escolher pelo elo fraco do nosso sistema, é por isso que é bom seguir os princípios de segurança.
- Defesa em profundidade: Devemos ter múltiplas camadas de segurança e redundância é sempre bem-vinda.
- Menor privilégio: Tudo deve rodar somente com a permissão necessária. Por exemplo um pod deve usar uma service account com o mínimo de privilégio para que se um atacante conseguir rodar algo esteja dentro do container limitado.
- Diminuir superfícies de Ataque: Remover ou até mesmo eliminar possibilidades para o invasor possa explorar qualquer coisa em nosso sistema.
A redundância é boa em segurança, o que vai contra o princício DRY (Don't repeat yourself) do desenvolvimento.
Imaginemos que um invasor irá atacar algo em nosso cluster.
O primeiro nível de defesa seria o que fizemos para reduzir a superfície de ataque. Removemos aplicações desnecessárias no sistema e implementamos algumas regras de firewall. Isso já mantém muitos invasores longe.
O níveis intermediários são todas as camadas de segurança que podemos implementar para garantir a redundância do primeiro nível.
Se o invasor conseguir romper todas as camadas ele já estará apto a fazer algo. O que podemos fazer é garantir que onde ele chegou não consiga fazer muita coisa que irá prejudicar o sistema.
Garantindo a segurança entre os componentes do Kubernetes, mesmo que o invasor consiga, através de um pod que roda um container sem limite de permissões, sair deste container para dentro do host, ele não deve ser capaz de se comunicar com o etcd. Nesse ponto podemos colocar restrição de comunicação e criptografia.
Categorias de Segurança do K8S
- Segurança do sistema operacional do host. Provavelmente é um sistema operacional Linux que já vem com alguma segurança implementada.
- Os nodes do Kubernetes devem apenas rodar os componentes do Kubernetes.
- Reduzir a superfície de ataque.
- Remover todas as aplicações extras que não são necessárias para executar os componentes do Kubernetes.
- Manter tudo atualizado.
- Usar ferramentas de segurança para ajudar.
- Identificar processos maliciosos.
- Restringir acessos de usuários ao host (IAM/SSH).
- Segurança do cluster Kubernetes. Esta é a parte de segurança dos componentes que rodam no host.
- Garantir que os componentes estejam rodando de forma segura e atualizados.
- Apiserver
- Kubelet
- ETCD
- Restringir acessos externos.
- Confinar a comunicação através da rede.
- Os componentes devem se comunicar com os outros que precisam se comunicar. Por exemplo o kubelet não precisa se comunicar com o etcd.
- Usar autenticação -> autorização.
- Admission controller
- NodeRestriction
- Custom Policies (OPA)
- Ativar logs de auditoria.
- Benchmark de segurança para nos dar recomendações
- Garantir que os componentes estejam rodando de forma segura e atualizados.
- Segurança das aplicações. É a segurança que aplicamos nos pods e containers que nele executam.
- Usar secrets ao invés escrevê-las dentro do nossos containers Docker ou nos manifestos.
- RBAC para controle e restrição de acesso.
- Rodar os containers do pod em sandbox para criar uma outra camada de segurança entre o container e o host.
- Container Hardening
- Reduzir ataques de superfície nas imagens base.
- Rodar containers como User e não como Root.
- Readonly filesystem.
- Container deve ser imutável durante sua execução.
- Scan de vulnerabilidades nas imagens deve ser feitos constantemente.
- mTLS/Service Meshes garantindo que o tráfego entre as nossas aplicações do cluster seja criptografado.

Os serviços de kubernetes em cloud como por exemplo o EKS, AKS, GKS, etc são responsáveis por garantir a segurança em nível de host e do cluster, mas a segurança das nossas aplicações é problema nosso. Se vamos montar um cluster auto gerenciado então devemos nos importar com todas as categorias e é nisso que foca o CKS.