replicar e isolar ambientes de usuário em tempo real

8

Eu vou usar o Ubuntu Linux para este projeto.

Para o treinamento de um aplicativo específico em uma conferência, preciso:

  1. Para que cada aluno possa fazer ssh na mesma conta de usuário em um servidor
  2. Após cada login, coloque o usuário automaticamente em ambientes isolados separados
  3. Cada ambiente isolado inclui o aplicativo, arquivos de configuração de exemplo e o conjunto de ferramentas padrão do unix (por exemplo, grep, awk, sort, uniq etc.). No entanto, o acesso a um sistema de arquivos linux inteiro é bom, desde que o usuário possa danificar seu próprio ambiente isolado e não o de outros.
  4. Os ambientes virtuais devem ser destruídos quando a sessão SSH dos usuários termina

Para o número 1, gostaríamos de criar a conta de usuário único, para que não precisássemos criar uma conta para cada aluno e distribuir os nomes de usuário e senhas.

Alguém sabe como eu posso atingir esses objetivos? Qual tecnologia, por exemplo, LXC, Chroot, etc. é melhor para isso? Estou brincando com a idéia de usar .bash_profile e .bash_logout para lidar com a criação e destruição desses ambientes, mas não tenho certeza de qual tecnologia é capaz de criar os ambientes de que preciso.

jonschipp
fonte

Respostas:

8

Com o Docker, você pode fazer isso com muita facilidade.

docker pull ubuntu

docker run -t -i ubuntu /bin/bash
# make your changes and then log out
docker commit $(docker ps -a -q | head -n 1) sandbox

cat > /usr/local/bin/sandbox <<EOF
#!/bin/sh
exec docker run -t -i --rm=true sandbox /bin/bash
EOF
chmod a+x /usr/local/bin/sandbox

echo /usr/local/bin/sandbox >> /etc/shells

useradd testuser -g docker -s /usr/local/bin/sandbox
passwd testuser

Sempre que efetuar testuserlogin, eles serão colocados em um contêiner isolado, onde não poderão ver nada fora dele, nem mesmo os contêineres de outros usuários.
O contêiner será automaticamente removido quando sair.


Explicação:

docker pull ubuntu

Aqui, buscamos a imagem base com a qual vamos trabalhar. O Docker fornece imagens padrão e o ubuntu é um deles.
 

docker run -t -i ubuntu /bin/bash
# make your changes and then log out

Aqui lançamos um shell a partir da imagem do ubuntu. Quaisquer alterações que você fizer serão preservadas para seus usuários.
Você também pode usar um Dockerfile para criar a imagem, mas, por uma única vez, acho que isso é mais simples.
 

docker commit $(docker ps -a -q |  head -n 1) sandbox

Aqui, convertemos o último contêiner que foi executado em uma nova imagem chamada sandbox.
 

cat > /usr/local/bin/sandbox <<EOF
#!/bin/sh
exec docker run -t -i --rm=true sandbox /bin/bash
EOF

Este será um shell falso que o usuário é forçado a executar no login. O script irá iniciá-los em um contêiner de janela de encaixe, que será limpo automaticamente assim que sairem.
 

chmod a+x /usr/local/bin/sandbox

Espero que isso seja óbvio :-)
 

echo /usr/local/bin/sandbox >> /etc/shells

Isso pode não ser necessário no seu sistema, mas no meu um shell não pode ser um shell de logon, a menos que exista no /etc/shells.
 

useradd testuser -g docker -s /usr/local/bin/sandbox

Criamos um novo usuário que, com seu shell definido para um script, criaremos. O script os forçará a iniciar no contêiner de sandbox. Eles são um membro do dockergrupo para que o usuário possa iniciar um novo contêiner.
Uma alternativa para colocar o usuário no grupo de janelas de encaixe seria conceder a eles permissões de sudo para um único comando.
 

passwd testuser

Espero que isso também seja óbvio.
 

Patrick
fonte
2

Você pode usar o shell restrito do Firejail . Basicamente, anexa os namespaces de montagem, PID, IPC e rede a uma sessão bash regular aberta por SSH ou telnet. O ambiente virtual é destruído automaticamente após o logout. Este é um pequeno tutorial:

Como restringir um shell de logon usando namespaces do Linux

netblue
fonte