replicare e isolare gli ambienti utente al volo


8

Userò Ubuntu Linux per questo progetto.

Per la formazione di una particolare applicazione durante una conferenza ho bisogno di:

  1. Per consentire a ogni studente di accedere allo stesso account utente su un server
  2. Ad ogni accesso posizionare automaticamente l'utente in ambienti isolati separati
  3. Ogni ambiente isolato include l'applicazione, i file di configurazione di esempio e il set di strumenti unix standard (ad es. Grep, awk, sort, uniq, ecc.) Tuttavia, l'accesso a un intero filesystem linux va bene anche se l'utente può solo danneggiare il proprio ambiente isolato e non quelli degli altri.
  4. Gli ambienti virtuali devono essere distrutti al termine della sessione SSH degli utenti

Per il n. 1 vorremmo creare il singolo account utente, quindi non dobbiamo occuparci di creare un account per ogni studente e distribuire i nomi utente e le password.

Qualcuno sa come posso raggiungere questi obiettivi? Quale tecnologia, ad esempio LXC, Chroot, ecc. È la migliore per questo? Ho avuto l'idea di utilizzare .bash_profile e .bash_logout per gestire la creazione e la distruzione di questi ambienti, ma non sono sicuro di quale tecnologia sia in grado di creare gli ambienti di cui ho bisogno.

Risposte:


8

Con Docker puoi farlo molto facilmente.

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

Ogni volta che effettuano l'accesso testuser, verranno inseriti in un contenitore isolato dove non potranno vedere nulla al di fuori di esso, nemmeno i contenitori di altri utenti.
Il contenitore verrà quindi rimosso automaticamente quando si disconnettono.


Spiegazione:

docker pull ubuntu

Qui prendiamo l'immagine di base con cui lavoreremo. Docker fornisce immagini standard e Ubuntu è una di queste.
 

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

Qui lanciamo una shell dall'immagine di Ubuntu. Tutte le modifiche apportate verranno conservate per i tuoi utenti.
Puoi anche usare un Dockerfile per creare l'immagine, ma per una volta, penso che sia più semplice.
 

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

Qui convertiamo l'ultimo contenitore che è stato eseguito in una nuova immagine chiamata sandbox.
 

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

Questa sarà una shell falsa che l'utente è costretto a eseguire al login. Lo script li avvierà in un contenitore docker che verrà automaticamente ripulito non appena si disconnettono.
 

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

Spero sia ovvio :-)
 

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

Questo potrebbe non essere richiesto sul tuo sistema, ma sul mio una shell non può essere una shell di accesso a meno che non esista in /etc/shells.
 

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

Creiamo un nuovo utente che con la shell impostata su uno script creeremo. Lo script li costringerà ad avviarsi nel contenitore sandbox. Sono membri del dockergruppo in modo che l'utente possa avviare un nuovo contenitore.
Un'alternativa al mettere l'utente nel gruppo docker sarebbe quella di concedere loro le autorizzazioni sudo per un singolo comando.
 

passwd testuser

Spero che anche questo sia ovvio.
 


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.