Perfis do AppArmor no Docker / LXC

11

Eu tenho um contêiner Docker (LXC) que executa o MySQL. Como a ideia por trás do Docker é geralmente "um processo em execução por contêiner", se eu definir perfis do AppArmor visando o binário do MySQL, eles serão impingidos? Existe uma maneira de eu testar isso?

    
por Naftuli Kay 02.05.2014 / 19:20

2 respostas

8

Primeiro, os cgroups não são usados para isolar um aplicativo de outros em um sistema. Eles são usados para gerenciar o uso de recursos e o acesso ao dispositivo. São os vários namespaces (PID, UTS, mount, user ...) que fornecem algum isolamento (limitado).

Além disso, um processo iniciado em um contêiner do Docker provavelmente não conseguirá gerenciar o perfil do AppArmor no qual está sendo executado. A abordagem atualmente adotada é configurar um perfil específico do AppArmor antes de iniciar o contêiner.

Parece que o driver de execução libcontainer no Docker suporta configuração dos perfis do AppArmor para contêineres , mas não consigo encontrar nenhum exemplo ou referência no documento.

Aparentemente, o AppArmor também é compatível com o LXC no Ubuntu .

Você deve escrever um perfil do AppArmor para o seu aplicativo e verificar se o LXC / libcontainer / Docker / ... o carrega antes de iniciar os processos dentro do contêiner.

Os perfis usados dessa maneira devem ser aplicados e, para testá-lo, você deve tentar um acesso ilegal e verificar se ele falha.

Não há link entre o binário e o perfil realmente imposto neste caso. Você precisa informar explicitamente ao Docker / LXC para usar esse perfil para seu contêiner. Escrever um perfil para o binário do MySQL irá forçá-lo apenas no host, não no contêiner.

    
por 11.05.2014 / 20:13
3

A resposta é muito provável: não.

O tópico de guia do Ubuntu Server LXC discute praticamente a sua pergunta exata e faz com que o seguinte declaração:

Programs in a container cannot be further confined - for instance, MySQL runs under the container profile (protecting the host) but will not be able to enter the MySQL profile (to protect the container).

A melhor opção para evitar exploits com efeitos indesejados é confinar o usuário que está executando o container e usar contêineres LXC do espaço do usuário que aproveitam a <-href="/ questions / tagged / userns" class="post-tag" title=" mostre perguntas marcadas com o recurso 'userns'"> userns do kernel. No entanto, docker atualmente - que eu saiba - não suporta userns .

Nesse caso, o MySQL - da perspectiva do host - seria executado como usuário sem privilégios, enquanto dentro do contêiner poderia ser executado como root . Você pode usar iptables para ligar o MySQL a uma porta externa do host, se necessário.

    
por 11.05.2014 / 20:46