Perfis do AppArmor no Docker / LXC

11

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

Naftuli Kay
fonte
por que você quer usar o apparmor dentro do container?
C4f4t0r
3
Caso um dia zero ou outra exploração seja executada no banco de dados para impedir que ele acesse qualquer outra coisa . Eu confio no Linux cgroups, mas não tanto . É melhor prevenir do que remediar, eu prefiro ter o MySQL bloqueado do que um dia zero do MySQL encontrar uma maneira de sair de um cgroup.
Naftuli Kay

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, montagem, usuário ...) que fornecem algum isolamento (limitado).

Além disso, um processo iniciado dentro de um contêiner do Docker provavelmente não poderá gerenciar o perfil do AppArmor em que 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 a configuração de perfis do AppArmor para contêineres , mas não consigo encontrar nenhum exemplo ou referência no documento.

Aparentemente, o AppArmor também é suportado com LXC no Ubuntu .

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

Os perfis usados ​​dessa maneira devem ser aplicados e, para testá-lo, tente um acesso ilegal e verifique se ele falha.

Não há link entre o perfil binário e o perfil realmente aplicado nesse 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 somente o aplicará no host, não no contêiner.

Siosm
fonte
Essa tem sido minha experiência (limitada) até agora. Eu tive problemas para gerar um perfil de dentro de um contêiner do Docker, mas se um perfil fosse gerado fora do contêiner e depois copiado, ele funcionaria apenas, desde que você inicie o AppArmor no contêiner antes de executar o executável.
Naftuli Kay
@ Siosm: LCX! = Libcontainer. A pergunta era sobre o driver LXC.
0xC0000022L
@ 0xC0000022L: O modelo de imposição de perfil do AppArmor é o mesmo para qualquer ferramenta usada para confinar processos em contêineres.
Siosm
3

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

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

Os programas em um contêiner não podem ser mais confinados - por exemplo, o MySQL é executado sob o perfil do contêiner (protegendo o host), mas não poderá entrar no perfil do MySQL (para proteger o contêiner).

Uma opção melhor para evitar explorações com efeitos indesejados é limitar o usuário que está executando o contêiner e usar contêineres LXC do espaço do usuário que aproveitam o recurso de do kernel. No entanto, dockeratualmente - que eu saiba - não suporta userns.

Nesse caso, o MySQL - sob a perspectiva de hosts - seria executado como usuário não privilegiado, enquanto dentro do contêiner poderia ser executado como root. Você pode usar iptablespara ligar o MySQL a uma porta externa do host, se necessário.

0xC0000022L
fonte