Benutzerumgebungen im laufenden Betrieb replizieren und isolieren

8

Ich werde Ubuntu Linux für dieses Projekt verwenden.

Für das Training einer bestimmten Anwendung auf einer Konferenz benötige ich:

  1. Damit jeder Schüler auf einem Server in dasselbe Benutzerkonto ssh kann
  2. Bei jeder Anmeldung wird der Benutzer automatisch in separate isolierte Umgebungen versetzt
  3. Jede isolierte Umgebung enthält die Anwendung, Beispielkonfigurationsdateien und das Standard-Unix-Toolset (z. B. grep, awk, sort, uniq usw.). Der Zugriff auf ein gesamtes Linux-Dateisystem ist jedoch ebenfalls in Ordnung, solange der Benutzer nur sein eigenes beschädigen kann isolierte Umgebung und nicht die anderer.
  4. Die virtuellen Umgebungen sollten zerstört werden, wenn die SSH-Sitzung des Benutzers endet

Für # 1 möchten wir das Einzelbenutzerkonto erstellen, damit wir nicht für jeden Schüler ein Konto erstellen und die Benutzernamen und Passwörter verteilen müssen.

Weiß jemand, wie ich diese Ziele erreichen kann? Welche Technologie wie LXC, Chroot usw. ist dafür am besten geeignet? Ich habe mit der Idee gespielt, .bash_profile und .bash_logout zu verwenden, um die Erstellung und Zerstörung dieser Umgebungen zu handhaben, bin mir aber nicht sicher, welche Technologie in der Lage ist, die von mir benötigten Umgebungen zu erstellen.

jonschipp
quelle

Antworten:

8

Mit Docker können Sie dies sehr einfach tun.

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

Wenn Sie sich testuseranmelden, werden sie in einen isolierten Container gestellt, in dem sie nichts außerhalb sehen können, nicht einmal die Container anderer Benutzer.
Der Container wird dann automatisch entfernt, wenn er sich abmeldet.


Erläuterung:

docker pull ubuntu

Hier rufen wir das Basisbild ab, mit dem wir arbeiten werden. Docker bietet Standardbilder, und Ubuntu ist eines davon.
 

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

Hier starten wir eine Shell aus dem Ubuntu-Image. Alle Änderungen, die Sie vornehmen, bleiben für Ihre Benutzer erhalten.
Sie könnten auch eine Docker-Datei verwenden , um das Image zu erstellen, aber zum einen denke ich, dass dies einfacher ist.
 

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

Hier konvertieren wir den letzten Container, der ausgeführt wurde, in ein neues Image namens sandbox.
 

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

Dies ist eine gefälschte Shell, die der Benutzer beim Anmelden ausführen muss. Das Skript startet sie in einem Docker-Container, der automatisch bereinigt wird, sobald sie sich abmelden.
 

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

Ich hoffe das ist offensichtlich :-)
 

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

Dies ist auf Ihrem System möglicherweise nicht erforderlich, aber auf meinem System kann eine Shell keine Anmeldeshell sein, es sei denn, sie ist in vorhanden /etc/shells.
 

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

Wir erstellen einen neuen Benutzer, dessen Shell auf ein Skript eingestellt ist, das wir erstellen werden. Das Skript zwingt sie, in den Sandbox-Container zu starten. Sie sind Mitglied der dockerGruppe, damit der Benutzer einen neuen Container starten kann.
Eine Alternative zum Einfügen des Benutzers in die Docker-Gruppe besteht darin, ihm Sudo-Berechtigungen für einen einzelnen Befehl zu erteilen.
 

passwd testuser

Ich hoffe das ist auch offensichtlich.
 

Patrick
quelle
2

Sie können eine eingeschränkte Firejail- Shell verwenden. Grundsätzlich werden Mount-, PID-, IPC- und Netzwerk-Namespaces an eine reguläre Bash-Sitzung angehängt, die über SSH oder Telnet geöffnet wird. Die virtuelle Umgebung wird beim Abmelden automatisch zerstört. Dies ist eine kleine Anleitung:

So beschränken Sie eine Anmeldeshell mithilfe von Linux-Namespaces

netblue
quelle