Blog
Uma Lista de Verificação Prática de Segurança de Isolamento Docker para Hospedagem Multi-Tenant
Proteja sua hospedagem Docker multi-tenant com esta lista de verificação prática que abrange usuários não root, capacidades, seccomp, namespaces de usuário, limites de recursos e sistemas de arquivos somente leitura.
Resumo
A hospedagem Docker multi-tenant requer isolamento forte para evitar escapes de contêiner. Este artigo fornece uma lista de verificação prática de segurança cobrindo seis áreas-chave: executar como não root, remover capacidades, aplicar perfis seccomp, ativar o mapeamento de namespace de usuário, definir limites de recursos e usar sistemas de arquivos raiz somente leitura. Cada etapa inclui um exemplo de configuração concreto para Docker Compose. Você também aprenderá armadilhas comuns, como problemas de compatibilidade de kernel com namespaces de usuário e trade-offs de desempenho ao aplicar seccomp. Seguindo esta lista de verificação, você pode reduzir significativamente a superfície de ataque sem adicionar complexidade desnecessária. O artigo conclui com uma configuração base recomendada para ambientes multi-tenant de produção.
Se você executa um ambiente Docker multi-tenant, o espectro de um ataque de escape de contêiner tira seu sono. Uma exploração de kernel pode sair de um contêiner e dar a um invasor acesso irrestrito ao host e a todos os dados de outros inquilinos. Embora o Docker forneça primitivas poderosas de isolamento — namespaces, cgroups e capacidades — a má configuração deixa lacunas. Este artigo apresenta uma lista de verificação de segurança passo a passo que você pode aplicar hoje. Cada etapa inclui um trecho funcional de Docker Compose e ressalvas importantes. Ao final, você terá uma base fortalecida que equilibra segurança e desempenho.
1. Execute Contêineres como um Usuário Não Root
Os contêineres, por padrão, são executados como root dentro do contêiner. Se um invasor obtiver root no contêiner, ele terá vantagem para escapar. Sempre defina um usuário não root no seu Dockerfile.
FROM alpine:3.18
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
No Compose, você também pode definir o usuário diretamente:
services:
app:
image: myapp
user: "1000:1000"
Ressalva: Alguns aplicativos precisam de root para operações legítimas (por exemplo, vincular a portas abaixo de 1024). Use CAP_NET_BIND_SERVICE em vez de executar todo o contêiner como root. Para uma visão mais aprofundada dos fundamentos de isolamento, veja nosso guia sobre alcançando isolamento verdadeiramente multi-tenant no Docker.
2. Remova Todas as Capacidades e Adicione Apenas o Necessário
As capacidades do Linux concedem privilégios refinados aos contêineres. Por padrão, o Docker concede um conjunto de capacidades. Remova tudo e conceda apenas as necessárias.
services:
app:
image: myapp
cap_drop:
- ALL
cap_add:
- NET_BIND_SERVICE # se necessário
Ressalva: Capacidades como SYS_ADMIN ou NET_RAW raramente são necessárias. Audite seu aplicativo para determinar o conjunto mínimo. Remover todas as capacidades bloqueia muitos vetores de escape.
3. Aplique um Perfil Seccomp
Seccomp (modo de computação segura) filtra as chamadas de sistema disponíveis para um contêiner. O Docker vem com um perfil seccomp padrão que bloqueia chamadas de sistema perigosas como clone com certas flags. Você pode personalizá-lo ainda mais.
services:
app:
image: myapp
security_opt:
- seccomp=/path/to/custom-profile.json
Um perfil fortalecido pode bloquear unshare, ptrace e mount. Comece com o padrão do Docker e restrinja mais. Ressalva: Perfis excessivamente rigorosos podem quebrar aplicativos. Teste minuciosamente em um ambiente de staging. Para mais sobre defesas contra escape de contêiner, leia defendendo contra escape de contêiner.
4. Ative o Mapeamento de Namespace de Usuário
Os namespaces de usuário mapeiam o usuário root do contêiner para um usuário não privilegiado do host. Isso significa que, mesmo que um invasor ganhe root dentro do contêiner, ele não terá privilégios especiais no host.
Ative-o no daemon Docker editando /etc/docker/daemon.json:
{
"userns-remap": "default"
}
Em seguida, reinicie o Docker. Ressalva: O mapeamento de namespace de usuário tem duas desvantagens: ele quebra montagens de volume quando não configurado cuidadosamente (os arquivos pertencem ao usuário remapeado) e é incompatível com alguns drivers de armazenamento como overlay2 em kernels mais antigos. Teste minuciosamente.
5. Defina Limites de Recursos com Cgroups
Os limites de recursos impedem que um contêiner comprometido lance um ataque de negação de serviço contra o host. Use cgroups para limitar CPU, memória e I/O de disco.
services:
app:
image: myapp
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
Para Docker Compose v3, use a seção deploy (funciona com swarm ou compose v2). Para Docker simples, use --memory e --cpus. Ressalva: Definir limites muito baixos pode causar mortes por OOM. Monitore o uso e ajuste conforme necessário.
6. Use Sistema de Arquivos Raiz Somente Leitura
Um sistema de arquivos raiz somente leitura impede que invasores escrevam binários maliciosos ou modifiquem arquivos de configuração dentro do contêiner.
services:
app:
image: myapp
read_only: true
tmpfs:
- /tmp:noexec,nosuid,size=64m
Monte tmpfs em diretórios que precisam de acesso de gravação (como /tmp). Isso força todos os dados graváveis a serem efêmeros. Ressalva: Alguns aplicativos precisam de armazenamento persistente; use volumes nomeados para isso.
Armadilhas Comuns
- Compatibilidade de kernel: O mapeamento de namespace de usuário e algumas regras seccomp exigem um kernel Linux recente (4.14+). Verifique a versão do seu kernel.
- Impacto no desempenho: Seccomp e namespaces de usuário adicionam uma pequena sobrecarga, mas é insignificante para a maioria das cargas de trabalho. Faça benchmark do seu aplicativo específico.
- Complexidade: Adicionar todas as seis medidas de uma vez pode quebrar coisas. Aplique uma de cada vez, testando cada mudança.
Para uma visão mais ampla de padrões de orquestração, veja nosso guia sobre projetando uma arquitetura Docker multi-tenant.
Conclusão
Um host Docker multi-tenant seguro não requer ferramentas exóticas — apenas o uso correto dos recursos integrados do Docker. Comece com um usuário não root, remova todas as capacidades, aplique um perfil seccomp, ative o mapeamento de namespace de usuário, defina limites de recursos e use um sistema de arquivos somente leitura. Esta lista de verificação forma uma base forte que bloqueia as técnicas de escape mais comuns. Após a implementação, execute ferramentas de segurança como docker-bench-security para verificar sua configuração. Lembre-se: segurança é um processo, não um produto. À medida que novas vulnerabilidades de kernel surgirem, revise suas configurações. Para landing pages automatizadas que mostrem seu serviço de hospedagem, use o Pagenza para colocar seu site no ar em minutos.
Sources (5)
- Docker and Container Isolation
- Chapter 2. Container Hosts and Multi-tenancy | Container Security Guide | OpenShift Container Platform | 3.6 | Red Hat Documentation
- What is Container Escape? - Aqua Security
- Container escape vulnerabilities allow attackers to break out of isolated environments and gain unauthorized access to host systems.
- Enhanced Container Isolation - Docker Docs

