Header Ads

Como avaliar a segurança do Docker Engine

O Docker permite que desenvolvedores de software e engenheiros de DevOps empacotem aplicativos rapidamente para produção. Os contêineres do Docker operam independentemente de seu host, mas não são imunes a ameaças de segurança. Veja como auditar a instalação do Docker Engine para garantir a segurança máxima para o seu host e suas cargas de trabalho.

Compreendendo a arquitetura do Docker

A primeira etapa para avaliar os riscos do Docker é entender como a tecnologia realmente funciona. O Docker é alimentado por três componentes distintos:

  • Docker Engine daemon – O serviço de segundo plano que gerencia as operações nos bastidores com contêineres e imagens.
  • API REST – O Docker Engine fornece uma API REST que envia comandos para o daemon do Docker. A API geralmente é fornecida por um soquete REST, mas também pode ser exposta por HTTP.
  • Cliente de linha de comando Docker – O Docker CLI é executado quando você usa o docker em um terminal. Ele envia comandos para o daemon do Docker. Os comandos são processados ​​para determinar a ação a ser executada.

Um invasor que comprometa qualquer um desses componentes pode obter acesso ao seu ambiente. Por meio da configuração adequada, você pode proteger suas cargas de trabalho e aumentar a segurança em comparação com a execução de aplicativos diretamente no host.

A superfície de ataque

O daemon do Docker apresenta a maior superfície de ataque. Obter o controle do daemon fornece acesso ao host e a todos os seus contêineres. O daemon geralmente é executado como root, portanto, uma infiltração bem-sucedida pode conceder acesso irrestrito à sua máquina física.

Você deve garantir que o socket daemon Docker (/var/run/docker. sock) não seja acessível a ninguém além do usuário root. Como o daemon pode acessar o host, fornecer acesso ao soquete efetivamente transfere o controle de sua máquina.

O daemon do Docker oferece suporte a um soquete TCP que permite o controle remoto da rede. Se você ativar esse recurso, a comunicação não criptografada será oferecida sem qualquer autenticação.

Evite usar conexões TCP, a menos que você esteja em um ambiente de rede especificamente configurado para ser seguro. Você deve configurar o TLS e garantir que apenas clientes autorizados tenham permissão para se conectar.

Algumas imagens do Docker podem exigir que você monte o soquete do Docker no contêiner. Isso geralmente é usado por ferramentas de gerenciamento do Docker que fornecem uma interface para contêineres em execução no seu host. Ao montar o soquete dessa forma, qualquer coisa dentro do contêiner pode ganhar controle do seu sistema. Os contêineres nunca devem receber um soquete Docker, a menos que você tenha certeza de que a carga de trabalho exige um.

Modo sem raiz

O Docker agora oferece suporte a um modo sem raiz que permite executar o Docker sem acesso de raiz. Isso ajuda a melhorar a segurança, mas vem com complexidade adicional no momento da configuração.

O uso do modo sem raiz executa o Docker e seus contêineres dentro de um namespace de usuário. A maioria dos recursos do Docker funcionará, embora haja algumas limitações.

Nem todo driver de armazenamento está disponível, as redes de sobreposição não são suportadas e as redes de contêiner têm namespaces completos. Isso significa que você não pode acessar IPs de contêiner diretamente do host sem primeiro entrar no namespace de rede dedicado.

Usar o modo sem raiz pode ser útil em ambientes de alta segurança onde a integridade do host é fundamental. Isso ajuda a diminuir o impacto de um ataque bem-sucedido ao restringir as oportunidades de adulterar o sistema mais amplo.

Segurança da API REST

A API REST do Docker geralmente é acessada por meio de um soquete UNIX. As verificações de permissão são feitas usando mecanismos UNIX padrão.

Você pode expor a API em um soquete TCP, permitindo o acesso via HTTP. Isso aumenta o risco de compromisso. Você deve certificar-se de que seus controles de acesso à rede estejam definidos de forma que o tráfego só possa ser originado de hosts aprovados.

Você deve auditar suas políticas de firewall para não negligenciar um dispositivo que possa interagir com a API Docker. Lembre-se de que limitar as conexões ao host local não é &’ suficiente – isso ainda permitiria o acesso de dentro de contêineres Docker em execução em sua máquina, potencialmente permitindo o escalonamento de privilégios não intencional.

Limitando a comunicação entre contêineres

O Docker permite que todos os contêineres se comuniquem entre si por meio da rede em ponte docker0 padrão. Um contêiner comprometido pode bisbilhotar esta rede para aprender sobre seu ambiente. Ele poderia usar a rede de bridge como um ponto de vantagem para começar uma infiltração mais ampla de suas cargas de trabalho.

Desativar a comunicação entre contêineres melhora sua postura de segurança, aprimorando o isolamento do contêiner. Você precisará vincular explicitamente os contêineres usando a sinalização --link = ContainerName ou sua própria rede Docker.

Execute o daemon do Docker com o sinalizador --icc = false para desativar a comunicação pela ponte docker0.

Restringir as capacidades do contêiner

Os recursos do kernel do Linux definem as ações disponíveis para usuários com acesso root. Os recursos ajudam a bloquear processos que estão sendo executados como raiz, como contêineres Docker. Cada processo deve receber o conjunto mínimo de recursos de que precisa.

O Docker executa contêineres automaticamente com uma seleção limitada de recursos. Mesmo essa lista costuma ser excessiva para uma carga de trabalho simples, como um servidor da web. Você pode restringi-lo ainda mais especificando sua própria lista de recursos disponíveis para um contêiner.

 docker executado --cap-drop all --cap-add SYSLOG exemplo-imagem: mais recente 

O comando acima executará um contêiner com apenas o recurso SYSLOG. O sinalizador --cap-drop desconsidera a lista de capacidade padrão. Os recursos são então adicionados de volta com --cap-add, criando uma lista de permissões.

Vale a pena avaliar seu contêiner em relação à lista de recursos do kernel. Elimine todos os recursos não utilizados dos contêineres em produção. Isso ajuda a limitar os danos que um contêiner comprometido pode causar.

Habilitar recursos integrados do kernel

Não ignore os recursos de segurança embutidos em seu kernel. O Docker funciona com tecnologias existentes, como AppArmor e SELinux.

Algumas distribuições, como RedHat Linux, vêm com políticas de sistema SELinux predefinidas que aumentam a segurança do Docker. Você pode adicionar manualmente o suporte SELinux executando o daemon do Docker com a sinalização --selinux-enabled. Isso ativa uma política Docker para definir rótulos SELinux em seus contêineres. SELinux fornece melhor isolamento de processos de contêiner de processos de host, melhorando sua postura de segurança.

O básico

É fácil fixar nos aspectos complicados da segurança do Docker: modo sem raiz, acesso do daemon e comunicações do contêiner. Não negligencie o básico embora – a prática de segurança padrão ainda se aplica.

Sempre mantenha o Docker Engine atualizado para que você tenha as últimas correções de bugs. Você também deve garantir que o kernel do seu host está totalmente corrigido. Como os contêineres compartilham o mesmo kernel que seu host, quaisquer vulnerabilidades podem ser exploradas por seus aplicativos em contêineres.

É uma boa prática dedicar uma máquina física específica ou VM para executar o Docker. Não execute nenhum outro serviço diretamente no host. Em vez disso, você pode executá-los como contêineres, diminuindo o impacto de um comprometimento do host bem-sucedido.

Quando configurado corretamente, o Docker aumenta a segurança isolando os aplicativos. Reservar um tempo para avaliar sua posição ajuda a identificar riscos potenciais e entender como os ataques podem começar. Bloquear os privilégios do contêiner, proteger o daemon do Docker e manter seu host atualizado o ajudará a proteger seus contêineres.

Nenhum comentário