Atualmente estou iniciando um projeto avaliando programas não confiáveis (tarefas de alunos) em um ambiente sandbox seguro. A ideia principal é criar um aplicativo web para GlassFish e Java wrapper em torno de lxc-utils para gerenciar contêineres LXC. Ele terá uma fila de programas em espera e um wrapper Java manterá um número fixo (pool) de contêineres LXC, atribuindo a cada programa um contêiner (não utilizado).
Cada contêiner deve ser protegido com SELinux para proteger o sistema host.
Minha pergunta é: é uma boa ideia criar tal mecanismo para um ambiente sandbox ou existe alguma solução mais adequada para esse problema? Deve ser leve e seguro contra a criatividade dos alunos.
Responder1
Você não escreveu por que escolheu o LXC, pois não é a solução de virtualização mais segura. Sou usuário pesado de KVM/XEN e também de LXC e posso dizer uma coisa: quando se trata de segurança, nunca uso containers Linux (não importa se LXC/OpenVZ/VServer). É apenas mais fácil (e mais confiável) com KVM/XEN.
Se for uma questão de desempenho ou requisitos de hardware, tudo bem - você pode tentar com o LXC, mas existem algumas regras que você deve seguir:
- libvirt garante confinamento estrito de contêineres ao usar SELinux (graças ao LXC_driver) - não tenho certeza se é apenas o caso RHEL/Centos/Fedora (eu não uso muito Ubuntu/Debian)https://www.redhat.com/archives/libvir-list/2012-January/msg01006.html- então usar o SELinux é uma boa ideia (na minha opinião é "obrigatório" em tais circunstâncias)
- Defina regras rígidas de cgroups para que seus convidados não congelem seu host ou afetem outros contêineres
- Prefiro usar contêineres baseados em LVM - é sempre mais uma camada de "segurança"
- Pense na solução e arquitetura de rede. Esses contêineres precisam se comunicar entre si?
Comece lendoesse- é bastante antigo, mas ainda assim - há muito conhecimento ali. E também - conheçanamespaces de usuário
E depois de tudo isso, pense novamente: você realmente tem tanto tempo para brincar com a segurança do LXC? KVM é muito mais simples...
Responder2
Para executar programas não confiáveis, os namespaces do Linux ainda são a melhor solução. É mais fácil de configurar que o KVM e requer menos recursos. Você pode experimentar o LXC, mas o LXC foi criado como uma sandbox mais genérica para executar imagens completas de distribuição do Linux. Dois outros sandboxes de namespaces do Linux vêm à mente:
- Google Chromesandbox, distribuído atualmente com Google Chrome/Chromium
- Cadeia de Fogo, uma sandbox de segurança criada para executar o Mozilla Firerfox e qualquer outro programa GUI.