Eu tenho a seguinte configuração de contêiner.
Em um servidor bare metal, dois Docker Daemons são instalados e executados.
- Main Docker Daemon Executa meus contêineres de aplicativos expondo 80/443 para o mundo externo.
- Plugin Docker Daemon Executa alguns contêineres fornecidos pelo cliente que se comunicam com meu aplicativo via 80/443.
Gostaria de dar ao cliente acesso à API (2376) do Plugin Docker Daemon para que o cliente possa implantar/iniciar/interromper seus próprios contêineres. O cliente só terá acesso à API e não ao Host (SSH).
O problema que enfrento atualmente é: e se os clientes executarem um contêiner que faça algo inseguro como docker run -v /:/host/root Ubuntu rm -rf /host/root
.
Minha pergunta é o que posso fazer para impedir que o Plugin Docker Daemon monte root /
ou qualquer outro diretório externo /home/user/
,
- É uma opção iniciar o Docker Daemon
/home/user/
? - Posso usar alguma magia LSM (Linux Security Modules SELinux/Apparmor) para impedir que o daemon do docker monte alguns ou todos os caminhos de host, exceto usuários home ou var/docker/libs?
- Pode
--userns-remap
me ajudar a atingir meu objetivo? - Há outras opções disponíveis, exceto VMs?
O servidor pertence inteiramente a um único cliente. Portanto, segurança ou vazamento de dados não é minha principal preocupação. O que eu realmente quero evitar é que alguém no Plugin Daemon esteja fazendo algo estúpido, que influencie meus contêineres que rodam no Main Docker Daemon . Eu gostaria de me manter enxuto e manter o fluxo de trabalho apenas do docker e não vou configurar um fluxo de trabalho extra para a criação de VM.
O SELinux impedirá que qualquer coisa não rotulada corretamente seja montada como um volume dentro de um contêiner docker, como prova, aqui usando um único arquivo, a mesma política se aplica aos diretórios:
Usando o arquivo de exemplo:
Seu contexto de segurança padrão é:
A tentativa de usar este arquivo dentro de um contêiner falha conforme o esperado:
E uma negação AVC será registrada:
Depois de alterar o contexto de segurança para um, o Docker pode usar:
O contêiner agora tem acesso ao arquivo:
Mais informações sobre Docker e SELinux na documentação oficial da Red Hat e neste artigo de Dan Walsh.