replicar e isolar ambientes do usuário em tempo real

8

Eu usarei o Ubuntu Linux para este projeto.

Para o treinamento de uma aplicação específica em uma conferência, eu preciso:

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

Para o número 1, gostaríamos de fazer a conta de usuário única para que não precisemos lidar com a criação de uma conta para cada aluno e a distribuição dos nomes de usuário e senhas.

Alguém sabe como posso atingir esses objetivos? Qual tecnologia, por exemplo? LXC, Chroot, etc. é melhor para isso? Eu tenho brincado 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 que eu preciso.

    
por jonschipp 25.04.2014 / 04:33

2 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 testuser fizerem login, 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á removido automaticamente quando fizer o logout.

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 feitas serão preservadas para seus usuários.
Você também pode usar um Dockerfile para construir a imagem, mas por um tempo, acho que isso é mais simples. br>

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 os lançará em um contêiner docker, que será automaticamente limpo assim que eles fizerem logoff.

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 em seu sistema, mas no meu caso, um shell não pode ser um shell de login, a menos que exista em /etc/shells .

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

Criamos um novo usuário que, com o shell, é definido como um script que criaremos. O script irá forçá-los a entrar no contêiner do sandbox. Eles são membros do grupo docker para que o usuário possa iniciar um novo contêiner.
Uma alternativa para colocar o usuário no grupo de encaixe seria conceder permissões de sudo a um único comando.

passwd testuser

Espero que isso também seja óbvio.

    
por 25.04.2014 / 06:55
2

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

Como restringir um login shell Usando os namespaces do Linux

    
por 13.05.2014 / 23:51