Em Docker, os contêineres podem ser executados em dois modos principais: privileged e non-privileged. Essa escolha determina o nível de acesso que o contêiner terá aos recursos e funções do sistema do host. Compreender as diferenças entre esses modos é extremamente importante: disso depende tanto a segurança do seu sistema quanto o funcionamento dos aplicativos dentro dos contêineres. O modo non-privileged é adequado para a maioria das tarefas diárias, fornecendo isolamento e proteção ao host, enquanto o privileged concede ao contêiner acesso completo aos dispositivos, núcleo e interfaces de rede do host, necessário apenas em casos específicos, como teste de drivers ou gerenciamento de hardware. Uma escolha consciente do modo de execução ajuda a equilibrar funcionalidade e segurança.
Contêineres Non-privileged (padrão)
O que é:
- Os contêineres são executados em um ambiente restrito.
- Não possuem acesso direto ao núcleo do host e à maioria dos recursos do sistema.
- Não podem executar operações que exigem privilégios elevados (por exemplo, alterar interfaces de rede do host, gerenciar módulos do núcleo).
Características:
- Segurança: Maior isolamento do host.
- Limitações: Alguns aplicativos que exigem acesso de baixo nível ao host podem não funcionar.
Exemplos reais de uso: Serviços web, bancos de dados, aplicativos que não precisam alterar configurações do sistema do host.
Exemplo de execução:
docker run -it ubuntu:22.04 bashEste contêiner é executado no modo non-privileged por padrão.
Contêineres Privileged
O que é:
- O contêiner recebe acesso praticamente completo ao host.
- Todas as capabilities do núcleo e acesso aos dispositivos do host são permitidos.
O contêiner pode:
- Montar dispositivos do host (/dev),
- Gerenciar módulos do núcleo,
- Configurar interfaces de rede,
- Executar outras operações do sistema como root no host.
Características:
- Funcionalidade: O acesso completo ao host permite executar contêineres para software de sistema, emulação ou teste de drivers.
- Risco: Aumento da ameaça à segurança. Se um invasor obtiver controle sobre esse contêiner, ele efetivamente terá controle sobre o host.
Exemplo de execução:
docker run --privileged -it ubuntu:22.04 bashQuando usar:
- Para contêineres que precisam acessar dispositivos do host (por exemplo, USB, GPU).
- Para contêineres de sistema que emulam serviços do host.
- Para testes e depuração.
Diferenças de permissões
| Característica | Non-privileged | Privileged |
|---|---|---|
| Acesso ao núcleo do host | Não | Sim |
| Acesso a dispositivos /dev | Limitado | Completo |
| Gerenciamento de módulos do núcleo | Não | Sim |
| Alteração de interfaces de rede do host | Não | Sim |
| Risco para a segurança | Baixo | Alto |
| Aplicação | Aplicativos comuns, serviços | Serviços de sistema, teste, acesso a dispositivos |
| Exemplo de execução | docker run -it image bash | docker run --privileged -it image bash |
Recomendações
Na maioria dos casos, é melhor executar os contêineres no modo non-privileged — é seguro e ideal para aplicativos e serviços comuns que não precisam de acesso direto ao host. O modo privileged deve ser usado apenas quando realmente necessário, como quando seu aplicativo precisa gerenciar dispositivos, módulos do núcleo ou interfaces de rede do host. Mesmo nesses casos, é importante pensar na segurança e não conceder mais permissões do que o necessário. Frequentemente, uma boa alternativa ao `--privileged` completo é fornecer capabilities específicas via --cap-add ou acesso aos dispositivos necessários via --device, por exemplo:
docker run --cap-add=NET_ADMIN --device=/dev/sda1 -it ubuntu:22.04 bashDessa forma, você mantém o controle, aumenta a segurança e permite que o contêiner execute as tarefas necessárias sem riscos desnecessários.
Resumo rápido (Cheat Sheet)
| Característica | Non-privileged | Privileged |
|---|---|---|
| Acesso ao núcleo do host | Não | Sim |
| Acesso a dispositivos /dev | Limitado | Completo |
| Gerenciamento de módulos do núcleo | Não | Sim |
| Alteração de interfaces de rede do host | Não | Sim |
| Risco para a segurança | Baixo | Alto |
| Aplicação | Aplicativos comuns, serviços | Serviços de sistema, teste, acesso a dispositivos |
| Exemplo de execução | docker run -it image bash | docker run --privileged -it image bash |