Explorando a segurança (ausente) de instalações típicas de Docker e Kubernetes

Explorando a segurança (ausente) de instalações típicas de Docker e Kubernetes
Trabalho com TI há mais de 20 anos, mas de alguma forma nunca tive contato com contêineres. Na teoria, entendi como eles estavam estruturados e como funcionavam. Mas como nunca os encontrei na prática, não tinha certeza de como exatamente as engrenagens sob o capô giravam e giravam.

Além disso, eu não tinha ideia de como era a segurança deles. Mas, novamente, a teoria parece boa, e a velha canção “conforme a segurança aumenta, a usabilidade diminui” ficou na minha cabeça. Então pensei que como tudo é tão fácil de fazer com containers, a segurança ali está abaixo da média. Acontece que eu estava certo.

Para começar rapidamente, me inscrevi em cursos Black Hat 2020 intitulado "Da miséria à riqueza: penetração e proteção dos ambientes Docker Swarm e Kubernetes".

O curso, ministrado por Sheila A. Berta e Sol Ozzan, começou imediatamente com uma descrição de como funcionam os contêineres Docker e a jornada que eles percorrem quando implantados no Kubernetes. Esta foi uma aula totalmente prática - os alunos tiveram que instalar o Docker e o microk8s em suas máquinas antes da aula - uma ótima maneira de ver como as ferramentas interagem entre si, encontrar pontos fracos e, o mais importante, tentar bloqueá-los.

Infelizmente, embora os cursos prometessem me tornar um “príncipe” depois de dois dias, senti que tudo estava apenas começando e ainda tinha muito que aprender.

Explorando a segurança (ausente) de instalações típicas de Docker e Kubernetes

Antes de mergulhar em minhas observações sublimes, é importante explicar o que é um contêiner. No mundo do desenvolvimento, é considerado normal que o código escrito em sua máquina pessoal funcione perfeitamente, mas quando você tenta executá-lo em algum servidor em algum lugar, ele simplesmente não funciona. Os contêineres tentam superar esse problema fornecendo máquinas independentes que você pode mover facilmente de um servidor para outro, sabendo que sempre funcionarão. Como o nome sugere, eles contêm o código, as bibliotecas e outros softwares necessários para realizar o trabalho. O Kubernetes, por outro lado, é plataforma de orquestração para contêineres. Em princípio, ele pode ser usado para gerenciar centenas ou milhares de contêineres diferentes.

Abaixo estão algumas das minhas descobertas da perspectiva da equipe vermelha e azul.

Equipa vermelha

A maior parte do conteúdo do contêiner é executada como root: Isso significa que se o contêiner estiver comprometido, você terá acesso total ao contêiner. Isso torna as próximas etapas muito mais fáceis.

Montar docker.sock dentro de um contêiner é perigoso: se você tiver root dentro de um contêiner e também instalou o Docker dentro de um contêiner que tenha um soquete Docker (/var/run/docker.sock), você terá o potencial de explorar todo o cluster, incluindo acesso a qualquer outro contêiner. Esse acesso não pode ser evitado pelo isolamento da rede ou por outros meios.

Variáveis ​​de ambiente geralmente contêm dados secretos: na maioria dos casos, as pessoas enviam senhas para o contêiner usando variáveis ​​de ambiente normais. Portanto, se você tiver acesso à conta, poderá espionar essas variáveis ​​de ambiente para posteriormente expandir seus poderes.

A API Docker pode fornecer muitas informações: a API Docker, quando configurada por padrão, é executada sem autorização e pode produzir muitas informações. Usando o Shodan, você pode encontrar facilmente uma lista de portas abertas, obter informações detalhadas sobre o cluster e prosseguir para sua captura completa. TrendMicro escreveu sobre isso artigo mais interessante.

Time azul

Não execute o conteúdo do contêiner como root: Mesmo que seja mais fácil rodar como root, você não deveria fazer isso. Em vez disso, execute aplicativos com permissões de redefinição exibindo o uid, usando a opção --user ao executar a partir da CLI ou especificando USER no Dockerfile.

Não permitir que software seja instalado em contêineres: Quase todo ataque começa com o plantio de algo. Do nmap ao ifconfig e ao próprio Docker (dentro de um contêiner), instalar qualquer coisa em um contêiner tem sido comum. Pelo mesmo motivo, você deve sempre bloquear todas as portas não utilizadas. Isso também ajuda a evitar que comandos de controle sejam transmitidos quando sua máquina estiver infectada. Além de impedir a instalação de programas, vale garantir que o número mínimo de aplicativos necessários para concluir a tarefa esteja instalado no próprio contêiner.

Proteger docker.sock: deve ser protegido porque a comunicação entre o contêiner e o cluster é processada por meio deste soquete. Como não quero entrar em detalhes neste artigo, leia nota do Docker, o que pode acontecer e também como bloquear tudo.

Use segredos do Docker em vez de variáveis ​​de ambiente: Existem segredos desde cerca de 2017. Embora isso não seja seguro, ainda é melhor que variáveis ​​de ambiente para passar dados secretos para o contêiner.

Se o artigo despertou seu interesse em contêineres, você pode instalar facilmente o Docker ou o microk8s (uma versão pequena do Kubernetes). é há instruções para instalar o Docker para Linux e MacOS, e aqui — instruções para instalação de microk8s para Windows, Linux e MacOS.

Após a instalação você pode ir este é um guia de início rápido do Docker, opção semelhante proposto e para microk8s.

Se você deseja ou precisa fazer um curso abrangente sobre Docker, no qual palestrantes práticos examinam todas as suas ferramentas: desde abstrações básicas até parâmetros de rede, nuances de trabalhar com vários sistemas operacionais e linguagens de programação, tente “Curso de vídeo Docker" Você se familiarizará com a tecnologia e entenderá onde e como usar melhor o Docker. E, ao mesmo tempo, obtenha casos de melhores práticas - é melhor aprender com segurança e com o apoio de profissionais com histórias sobre ancinhos do que pessoalmente com os próprios ancinhos com cabos pontiagudos.

Fonte: habr.com

Adicionar um comentário