Von Neakro am 12. December 2009, 20:28
Eigentlich ist es keine Kunst, aber wenn man das erste Mal damit zu tun hat, wird man doch ziemlich erschlagen. Deshalb gibt es hier kleine Übersicht der Möglichkeiten und eine nähere Erläuterung meiner Lösung, die von hier abgeleitet wurde.
Alles gilt für Debian Lenny.
Grundsätzlich gibt es folgende Möglichkeiten:
- SSH-Server in einer chroot-Umgebung auf einem eigenen Port lauschen lassen.
- Einen evtl. existierenden SSH-Server zu verwenden und nur bestimmte User per Konfigurationsdatei in eine chroot-Umgebung einzusperren.
Für 1. muss man eine relativ große chroot-Umgebung schaffen. D.h. man muss viele Konfigurationsdateien wie /etc/hostname, /etc/passwd, /etc/group etc. und natürlich auch sshd inklusive aller nötigen Bibliotheken in diese Umgebung kopieren. Außerdem muss man ein init-Skript anlegen, das den SSH-Server automatisch startet und /proc und einige /dev-Devices in die Umgebung mounten (u.a. devpts und ptmx).
Bei 2. ist es einfacher. Seit Version 4.9 kann SSH unter Linux auch von sich aus (ausgewählte) Benutzer in eine chroot-Umgebung einsperren. Man kann sie sogar so zu “nur SFTP”-Benutzern degradieren. Dafür sind folgende Änderungen an der /etc/ssh/sshd_config nötig:
Subsystem sftp internal-sftp
Wenn man das normale SFTP-Subsystem benutzt kommt es zu Fehlern.
Nun konfiguriert man für spezielle Benutzer ein paar SSH-Optionen um:
Match group sshchroot
ChrootDirectory /home/%u
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
Die Option ForceCommand muss man auskommentieren, wenn die Benutzer auch Shell-Zugriff per SSH haben sollen.
Das %u steht für den Usernamen. Das heißt, wenn ein Benutzer sich einloggt, ist er direkt in das Verzeichnis /home/<username> eingesperrt.
Anschließend fügt man die Benutzer zu der Gruppe sshchroot hinzu:
# adduser user sshchroot # usermod -d / user # chown root:root /home/user
Es ist wichtig, dass das Wurzelverzeichnis der chroot-Umgebung dem Benutzer root gehört! Untergeordnete Verzeichnisse dürfen dann dem jeweiligen Benutzer gehören, in die er dann auch schreiben kann.
Wenn der Benutzer nun auch SSH-Zugang haben soll, muss eine passende chroot-Umgebung mit /bin/bash, /bin/ls etc. erstellt werden. Dies ist relativ einfach, aber je nach Umfang der chroot-Umgebung langwierig zu erstellen. Ganz am Anfang sollte man ein Homeverzeichnis unter /home/user/home/user für den Benutzer erstellen und es ihm als sein Heimatverzeichnis zuweisen:
# usermod -d /home/user user
Am Beispiel von /bin/bash, welches dabei sein muss, erläutere ich das Vorgehen für das Hinzufügen von Programmen in die chroot-Umgebung. Natürlich sind Pfadangaben an den entsprechenden Stellen zu ersetzen.
- /bin/bash nach /home/user/bin/ kopieren
ldd /bin/bashausführen und die entsprechenden Bibliotheken nach /home/user/lib/ kopieren. Wichtig ist, dass /lib64/-Bibliotheken dann nach /home/user/lib64/ kopiert werden.- Konfigurationsdateien anlegen bzw. kopieren. Im Falle von /bin/bash ist das z.B. die Datei .bashrc im /home-Verzeichnis des Benutzers.
Anschließend kann die Umgebung getestet werden:
# chroot /home/user
Wenn nun ein Fehler erscheint sollte man seine Schritte nochmals überprüfen. Per exit verlässt man die chroot-Umgebung wieder.
Als letztes folgt der Test per SSH, wenn dieser erfolgreich verläuft hat man es geschafft und einen Benutzer erfolgreich eingesperrt.