Linux - isole o processo sem recipientes

6

Estou construindo um sistema que tem as funções de um sistema de juiz online. Eu preciso executar todos os executáveis e avaliar sua saída. O problema é que, se todos eles forem colocados em um contêiner, em pastas diferentes, um dos aplicativos poderá tentar sair de sua pasta e acessar outra pasta pertencente a outro aplicativo. Neste caso, o servidor principal será protegido, mas não os outros aplicativos e não o avaliador.

Encontrei-me uma solução, mas penso que existe uma melhor, vou criar, por exemplo, 5 contentores, cada um deles irá executar o mesmo algoritmo e cada um deles irá avaliar 1 problema de cada vez . Após o problema ser avaliado, este será excluído e outro será recebido. Nesse caso, o servidor principal e todos os aplicativos serão protegidos, mas não o avaliador. A aplicação avaliada pode sair da pasta e começar a escrever arquivos de texto aleatórios, por exemplo, preenchendo toda a memória.

O avaliador iniciará o executável, medirá o seu tempo (se ele for maior que 1 ou 2 segundos, ele o matará) e a memória usada (se atingir um certo limite, ele será eliminado).

Também pensei em criar um contêiner a cada vez e excluí-lo após o executável ser avaliado, mas leva apenas alguns segundos para criar e iniciar o contêiner ...

Como faço para isolar o processo avaliado de mexer com o contêiner e o avaliador? Eu basicamente quero bloquear um processo de acessar outras pastas.

    
por Radu-Costin Nedelcescu 05.08.2017 / 14:36

3 respostas

6

Eu não li nada na descrição do seu problema que o impediria de criar contas de usuário diferentes para os aplicativos. Você pode usar permissões de arquivos comuns para evitar interferência:

chown app1 /var/lib/myapps/app1
chmod 700 /var/lib/myapps/app1
sudo -u app1 /var/lib/myapps/app1/run.sh

editar

Se o avaliador estiver sendo executado como root , ele poderá simplesmente iniciar os aplicativos por meio de sudo .

Se o avaliador não for executado como root , os aplicativos que ele chama (no modo normal) podem ser instalados com o bit SUID (ID do usuário definido) para que o processo seja executado como o usuário que possui o arquivo binário e não como o usuário do processo de avaliação.

    
por 05.08.2017 / 14:48
2

Dependendo da sua distribuição e do kernel, você pode usar o AppArmor ou Selinux para conter seus aplicativos. No geral, eu diria que o AppArmor é mais conveniente para configurar e manter. Wiki do Ubuntu tem alguns artigos explicando conceitos básicos.

    
por 05.08.2017 / 14:43
0

Sem confinamento eu aconselharia a execução do aplicativo em um ambiente chroot por um usuário específico, como sugerido por Hauke Laging. cf homem chroot

É fácil configurar, a complexidade depende de qual recurso seu aplicativo precisa acessar

    
por 05.08.2017 / 15:38