répliquer et isoler les environnements utilisateurs à la volée

8

J'utiliserai Ubuntu Linux pour ce projet.

Pour la formation d'une application particulière lors d'une conférence, j'ai besoin de:

  1. Pour que chaque élève puisse ssh dans le même compte utilisateur sur un serveur
  2. À chaque connexion, placez automatiquement l'utilisateur dans des environnements isolés distincts
  3. Chaque environnement isolé comprend l'application, des exemples de fichiers de configuration et le jeu d'outils Unix standard (par exemple grep, awk, sort, uniq, etc.). Cependant, l'accès à un système de fichiers linux complet est également correct tant que l'utilisateur ne peut endommager que le sien. environnement isolé et non ceux des autres.
  4. Les environnements virtuels doivent être détruits à la fin de la session SSH des utilisateurs

Pour # 1, nous aimerions créer un compte utilisateur unique afin de ne pas avoir à créer un compte pour chaque étudiant et à distribuer les noms d'utilisateur et les mots de passe.

Est-ce que quelqu'un sait comment je peux atteindre ces objectifs? Quelle technologie, par exemple LXC, Chroot, etc. est la meilleure pour cela? J'ai joué avec l'idée d'utiliser .bash_profile et .bash_logout pour gérer la création et la destruction de ces environnements, mais je ne sais pas quelle technologie est capable de créer les environnements dont j'ai besoin.

jonschipp
la source

Réponses:

8

Avec Docker, vous pouvez le faire très facilement.

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

Chaque fois testuserqu'ils se connectent, ils seront placés dans un conteneur isolé où ils ne peuvent rien voir à l'extérieur, pas même les conteneurs des autres utilisateurs.
Le conteneur sera alors automatiquement supprimé lors de leur déconnexion.


Explication:

docker pull ubuntu

Ici, nous récupérons l'image de base avec laquelle nous allons travailler. Docker fournit des images standard, et ubuntu en fait partie.
 

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

Ici, nous lançons un shell à partir de l'image ubuntu. Toutes les modifications que vous apportez seront conservées pour vos utilisateurs.
Vous pouvez également utiliser un Dockerfile pour créer l'image, mais pour une fois, je pense que c'est plus simple.
 

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

Ici, nous convertissons le dernier conteneur exécuté en une nouvelle image appelée sandbox.
 

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

Ce sera un faux shell que l'utilisateur sera obligé d'exécuter lors de la connexion. Le script les lancera dans un conteneur Docker qui sera automatiquement nettoyé dès leur déconnexion.
 

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

J'espère que c'est évident :-)
 

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

Cela peut ne pas être nécessaire sur votre système, mais sur le mien, un shell ne peut pas être un shell de connexion sauf s'il existe dans /etc/shells.
 

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

Nous créons un nouvel utilisateur qui, avec son shell défini sur un script, nous allons créer. Le script les forcera à se lancer dans le bac à sable. Ils sont membres du dockergroupe afin que l'utilisateur puisse lancer un nouveau conteneur.
Une alternative à la mise de l'utilisateur dans le groupe docker serait de leur accorder des autorisations sudo à une seule commande.
 

passwd testuser

J'espère que cela est également évident.
 

Patrick
la source