Pular para o conteúdo principal

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
  • 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.

alt text

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.