replicar y aislar entornos de usuario sobre la marcha

8

Usaré Ubuntu Linux para este proyecto.

Para el entrenamiento de una aplicación particular en una conferencia necesito:

  1. Para que cada estudiante pueda ingresar a la misma cuenta de usuario en un servidor
  2. En cada inicio de sesión, coloque automáticamente al usuario en entornos aislados separados
  3. Cada entorno aislado incluye la aplicación, archivos de configuración de ejemplo y el conjunto de herramientas estándar de Unix (por ejemplo, grep, awk, sort, uniq, etc.) Sin embargo, el acceso a un sistema de archivos Linux completo también está bien siempre que el usuario solo pueda dañar su propio entorno aislado y no los de los demás.
  4. Los entornos virtuales deben destruirse cuando finaliza la sesión SSH de los usuarios.

Para el # 1 nos gustaría hacer la cuenta de usuario único para no tener que lidiar con la creación de una cuenta para cada estudiante y entregar los nombres de usuario y contraseñas.

¿Alguien sabe cómo puedo alcanzar estos objetivos? ¿Qué tecnología, por ejemplo, LXC, Chroot, etc., es mejor para esto? He estado jugando con la idea de usar .bash_profile y .bash_logout para manejar la creación y destrucción de estos entornos, pero no estoy seguro de qué tecnología es capaz de crear los entornos que necesito.

jonschipp
fuente

Respuestas:

8

Con Docker puedes hacer esto muy fácilmente.

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

Cada vez que inicie testusersesión, se colocarán en un contenedor aislado donde no podrán ver nada fuera de él, ni siquiera los contenedores de otros usuarios.
El contenedor se eliminará automáticamente cuando cierre la sesión.


Explicación:

docker pull ubuntu

Aquí buscamos la imagen base con la que vamos a trabajar. Docker proporciona imágenes estándar, y ubuntu es una de ellas.
 

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

Aquí lanzamos un shell desde la imagen de ubuntu. Cualquier cambio que realice se conservará para sus usuarios.
También podría usar un Dockerfile para construir la imagen, pero por una vez, creo que esto es más simple.
 

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

Aquí convertimos el último contenedor que se ejecutó en una nueva imagen llamada sandbox.
 

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

Este será un shell falso que el usuario está obligado a ejecutar al iniciar sesión. El script los lanzará en un contenedor acoplable que se limpiará automáticamente tan pronto como se desconecten.
 

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

Espero que esto sea obvio :-)
 

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

Es posible que esto no sea necesario en su sistema, pero en el mío un shell no puede ser un shell de inicio de sesión a menos que exista en /etc/shells.
 

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

Creamos un nuevo usuario que con su shell establecido en un script crearemos. El script los obligará a lanzarse en el contenedor de sandbox. Son miembros del dockergrupo para que el usuario pueda iniciar un nuevo contenedor.
Una alternativa para colocar al usuario en el grupo de acopladores sería otorgarle permisos de sudo a un solo comando.
 

passwd testuser

Espero que esto también sea obvio.
 

Patricio
fuente