Blog
Alcançando o Verdadeiro Isolamento Multi-Inquilino no Docker
O modelo de kernel compartilhado do Docker apresenta riscos para ambientes multi-inquilino. Este guia fornece etapas concretas para fortalecer o isolamento usando namespaces de usuário, seccomp, AppArmor, ferramentas de sandboxing e práticas recomendadas de orquestração.
Resumo
Os contêineres Docker compartilham o kernel do host, o que pode ser uma preocupação de segurança para ambientes multi-inquilino onde os inquilinos podem não confiar uns nos outros. Este artigo explica as lacunas de isolamento nas configurações padrão do Docker e fornece etapas concretas para fortalecer o isolamento usando namespaces Linux, cgroups, namespaces de usuário, seccomp, AppArmor e virtualização de hardware. Você aprenderá como configurar daemons Docker por inquilino, usar ferramentas de sandboxing como gVisor ou Firecracker para um isolamento mais forte e orquestrar com Kubernetes para multi-inquilino. Também abordaremos a seleção do provedor de infraestrutura certo que oferece virtualização baseada em KVM para uma camada extra de separação. Ao final, você terá um modelo para executar cargas de trabalho multi-inquilino seguras com Docker.
Ao hospedar vários inquilinos em um único host Docker, o isolamento padrão do contêiner — construído em namespaces Linux e cgroups — muitas vezes não é suficiente. Uma fuga de contêiner em um inquilino pode comprometer todo o host e todos os outros contêineres. Esse problema é especialmente agudo em hospedagem compartilhada, plataformas SaaS ou qualquer cenário onde código não confiável é executado junto com o seu. A boa notícia: você pode empilhar várias técnicas de isolamento para construir um ambiente multi-inquilino endurecido. Este guia percorre seis etapas práticas, desde frutas mais fáceis como namespaces de usuário até medidas avançadas como runtimes em sandbox e escolhas de infraestrutura.
Entendendo o Isolamento Padrão do Docker
O Docker usa namespaces Linux para isolar processos, rede, sistema de arquivos e outros recursos. Cgroups limitam CPU, memória e I/O. Mas eles compartilham um único kernel — uma vulnerabilidade no kernel pode afetar todos os contêineres. Para um verdadeiro multi-inquilino, especialmente com inquilinos não confiáveis, você precisa de defesa em profundidade. Como discutido em Projetando uma Arquitetura Docker Multi-Inquilino: Escolhendo o Nível de Isolamento Adequado, os níveis de isolamento variam de fracos (apenas namespace) a fortes (virtualizados por hardware). Vamos construir a partir do mais fraco.
Passo 1: Habilitar Namespaces de Usuário
Por padrão, root dentro de um contêiner mapeia para root no host. Uma fuga de contêiner dá acesso total ao host. Os namespaces de usuário remapeiam o root do contêiner para um usuário não root externo. Habilite globalmente com dockerd --userns-remap=default ou por contêiner com --userns=host. Este passo simples elimina muitos ataques de escalonamento de privilégios. Teste suas aplicações: algumas que exigem privilégios de nível de host (por exemplo, montar sistemas de arquivos) podem falhar. Para sites Drupal ou WordPress, geralmente é seguro.
Passo 2: Aplicar Perfis Seccomp e AppArmor
Seccomp limita as chamadas de sistema que um contêiner pode fazer. O Docker vem com um perfil seccomp padrão que bloqueia syscalls perigosas como mount e reboot. Para multi-inquilino, aperte ainda mais — bloqueie syscalls incomuns que ferramentas de fuga usam. Da mesma forma, AppArmor pode confinar processos do contêiner. Crie um perfil AppArmor personalizado que negue acesso de escrita a interfaces do kernel e restrinja caminhos de arquivos. Ambos são configurados via flags --security-opt. Combine-os para defesa em camadas.
Passo 3: Usar Daemons Docker por Inquilino
Executar um único daemon Docker para todos os inquilinos é arriscado — qualquer fuga de contêiner pode acessar o socket do daemon. Isole daemons por inquilino usando Docker-in-Docker (DinD) ou endpoints de daemon remotos. Por exemplo, inicie um daemon Docker dentro de um contêiner com --privileged (mas isso enfraquece o isolamento). Uma abordagem melhor: execute daemons separados em VMs separadas ou use o recurso experimental --group do Docker com namespaces de usuário. Para orquestração, o isolamento baseado em namespace do Kubernetes é mais prático, como abordado em Defendendo Contra Fuga de Contêiner: Um Guia Prático para Isolamento Docker em Hospedagem Multi-Inquilino.
Passo 4: Considerar Runtimes em Sandbox
Quando o próprio kernel Linux não é confiável, use um runtime em sandbox que adiciona uma camada leve de VM. gVisor (runsc) intercepta syscalls e implementa seu próprio kernel, enquanto Firecracker usa micro-VMs com virtualização de hardware. Ambos integram com Docker via runtimes containerd. Por exemplo, adicione "runtimes": {"runsc": {}} à configuração do daemon Docker e execute contêineres com --runtime=runsc. A sobrecarga de desempenho é de 5 a 15%, mas o isolamento é muito mais forte. Ideal para configurações multi-inquilino de alta segurança.
Passo 5: Orquestrar com Kubernetes e Políticas de Segurança
O Kubernetes fornece multi-inquilino nativo através de namespaces, Padrões de Segurança de Pod e NetworkPolicies. Defina namespaces por inquilino com cotas de recursos e aplique contextos de segurança de pod restritos (remover todas as capacidades, sistema de arquivos raiz somente leitura). Controladores de admissão como OPA/Gatekeeper podem bloquear configurações incorretas. Se você está gerenciando muitos inquilinos, o Kubernetes automatiza a aplicação do isolamento. Para orquestração em escala de produção, consulte Além do Docker Compose: Orquestrando Aplicativos Containerizados Prontos para Produção.
Passo 6: Escolher o Provedor de Hospedagem Certo
O hipervisor do seu provedor de infraestrutura é importante. Docker em hospedagem compartilhada (OpenVZ) dá isolamento fraco — um inquilino pode ver outros processos. Prefira provedores que usam KVM ou VMware, que oferecem separação em nível de hardware. Provedores como DigitalOcean, Kamatera ou AWS oferecem VPS baseados em KVM com recursos dedicados. Para bare-metal, garanta que a virtualização em nível de BIOS esteja habilitada para contêineres aninhados. Um provedor que isola inquilinos na camada de hipervisor complementa seu isolamento de contêiner. Conforme detalhado em Dominando o Isolamento Docker para Hospedagem Web Segura e Eficiente, o SO do host também deve ser endurecido com superfície de ataque mínima.
Riscos e Compensações
Cada camada adicional adiciona complexidade e custo de desempenho. Namespaces de usuário podem quebrar volumes montados no host. Perfis Seccomp exigem ajuste por aplicação. Runtimes em sandbox como gVisor não suportam todas as syscalls — seu aplicativo pode não funcionar. Daemons Docker por inquilino aumentam a sobrecarga de memória. Escolha o nível de isolamento que corresponde ao seu modelo de ameaça: para inquilinos confiáveis, namespaces padrão podem ser suficientes; para SaaS público, invista em sandboxes de runtime e políticas Kubernetes. Teste minuciosamente antes da produção.
Conclusão
O verdadeiro isolamento multi-inquilino no Docker é alcançável empilhando múltiplos recursos do kernel, sandboxes de runtime e controles de orquestração. Comece com namespaces de usuário e seccomp, depois evolua para daemons por inquilino ou runtimes em sandbox. Para grande escala, o Kubernetes fornece isolamento orientado por políticas. Sempre combine com um host separado em nível de hipervisor de um provedor respeitável. Nenhuma técnica isolada é à prova de balas, mas combiná-las cria uma defesa robusta. Seus inquilinos agradecerão — e sua auditoria de segurança também.
Sources (5)
- Docker and Container Isolation - Medium
- Enhanced Container Isolation - Docker Docs
- Container orchestration is the automated process of deploying, managing, scaling, and networking containers in production.
- Container Orchestration 101 - Docker
- Best 10 Docker Container Hosting Platforms in 2026 - Purvaco Technology

