Jailkit
Aus Programmers Guide
Inhaltsverzeichnis |
Jailkit vs RSSH
RSSH
Sehr lang habe ich nach einer Möglichkeit gesucht, eine Applikation über einen SSH-Tunnel auf einen Port zu schleusen und dabei in Punkto Sicherheit keine Abstriche machen zu müssen. Die erste Lösung hierbei war RSSH, welches in den Paketquellen verfügbar ist.
sudo apt-get install rssh
RSSH
Hierbei wird eine "Restricted Shell" jedem Nutzer zugeordnet. Der Nutzer ist vorab ersteinmal für alles gesperrt und bekommt beim Versuch eines SSH-Logins gleich ein Logout.
Die zugehörige rssh.conf zeigt nun die möglichen Optionen:
Auszug man rssh.conf
allowscp - Tells the shell that scp is allowed.
allowsftp - Tells the shell that sftp is allowed.
allowcvs - Tells the shell that cvs is allowed.
allowrdist - Tells the shell that rdist is allowed.
allowrsync - Tells the shell that rsync is allowed.
Leider trafen die hier aufgeführten Möglichkeiten nicht auf meinen gewünschen Verwendungszweck zu, vielmehr um Nutzern einen SSH-Login ohne Shell zu erlauben um das unsiche FTP gegen SFTP abzulösen.
Ich wollte aber dem Nutzer eine Shell geben, in welcher er nur zugelassene Befehle ausführen darf.
Jailkit
Nach erfolgreichem Googlen stieß ich auf Jailkit, dies versprach meinen Anforderungen gewachsen zu sein, indem es wohl möglich wäre für jeden Nutzer eine Art Gefängnis anzulegen, wo nur bestimmte Befehle dynamisch hinzugefügt oder entfernt werden können. Weiterhin soll das Nutzerverzeichnis in einen gesonderten Ordner gefangen werden, der nicht in den übergeordneten verlassen werden darf (chroot).
..Klingt ja super!
Die Implementation war recht einfach:
wget http://olivier.sessink.nl/jailkit/jailkit-2.11.tar.bz2 tar xvf jailkit-2.11.tar.bz2 cd jailkit-2.11/ sudo ./configure sudo make sudo make install
Nun wollte ich aber auch, dass Jailkit automatisch gestartet wird. Dazu muss man das Script, welches sich im "extra"-Ordner befindet, an den richtigen Fleck kopieren.
#kopieren sudo cp extra/jailkit /etc/init.d/jailkit #ausführbar machen sudo chmod a+x /etc/init.d/jailkit #in den Startvorgang implementieren sudo update-rc.d jailkit defaults
Soweit so gut. Nur wie gehts weiter? Nach weiterem Googlen bin ich auf eine interessante Beschreibung aus dem Magazin "ADMIN 03/2009" gestoßen. Nach dem von Daniel van Soest geschriebenen Artikel ging ich nun vor und versuchte meinen bereits bestehenden Nutzer in ein Gefängnis zu sperren.
Anmerkung: Ich selbst hatte auf dem Server natürlich einen anderen SSH-Zugang, ich wollte mich ja nicht selber "aussperren" :-)
Mein weiterer Vorgang in Kurzform:
#Erstellen eines Gefängnisverzeichnisses hier /srv/jail #jk_lsh ist hierbei eine fake-shell #j - Jailverzeichnis #v - verbose #basicshell - kleine shell für Dateioperationen mv, cp, cd ... sudo jk_init -v -j /srv/jail jk_lsh basicshell #es MUSS ein tmp-Verzeichnis existieren schreibt Daniel van Soest weiter, ...okay sudo mkdir /srv/jail/tmp sudo chmod a+rwx /srv/jail/tmp #er legt nun zwei Nutzer an, das brauchte ich ja nicht mehr, den Nutzer gibts ja bei mir schon #useradd -m max #passwd max #jetzt sperrt er den Nutzer ein #klaus ist mein bereits vorhandener Nutzer :) sudo jk_jailuser -m -j /srv/jail klaus #okay, ich gucke in die /etc/passwd und klaus wurde auch die #/usr/sbin/jk_chrootsh zugeordnet und #das Home-Verzeichnis ist auch geändert zu /srv/jail/./home/klaus ... alles okay soweit #jetzt gucke ich in die /srv/jail/etc/passwd und sehe #root:x........ und meinen #klaus:x:1003:1003::/home/klaus:/usr/sbin/jk_lsh #Ich ändere nach Anweisung nun /usr/sbin/jk_lsh in /bin/bash damit der Nutzer überhaupt was darf # und nicht ausgeloggt wird. sudo vim /srv/jail/etc/passwd #Jetzt passe ich die /srv/jail/etc/jailkit/jk_lsh.ini an, denn Klaus darf ja das Programm SSH nutzen sudo echo "[klaus] paths= /usr/bin/ executables= /usr/bin/ssh" >> /srv/jail/etc/jailkit/jk_lsh.ini
Jaaa, jetzt sollte ja alles funktionieren, ich versuche
ssh klaus@server
und bekomme gleich wieder ein Logout...
Ich lese nochmal den o.g Artikel und sehe den Befehl
jk_init -j /srv/jail sftp-client
Achja, man muss ja der Basicshell noch sagen, dass sie zusätzlich auch ssh anbieten soll, also
sudo jk_init -j /srv/jail ssh
und nochmal einloggen
ssh klaus@server
...logout :(
Nun weiß ich auch nicht weiter, letzte Instanz, ich lege einen neuen Nutzer an und folge nochmal den Schritten:
#Gefängnis anlegen sudo jk_init -v -j /srv/jail jk_lsh basicshell #Temp-Verzeichnisse anlegen sudo mkdir /srv/jail/tmp sudo chmod a+rwx /srv/jail/tmp #Diesmal Nutzer anlegen sudo useradd -m sshuser sudo passwd sshuser #Nutzer "einsperren" sudo jk_jailuser -m -j /srv/jail sshuser #Kontrolle sudo vim /etc/passwd #alles okay dort #richtige bash geben sudo vim /srv/jail/etc/passwd #/usr/sbin/jk_lsh zu /bin/bash geändert :wq #Nutzer das Programm SSH geben sudo echo "[sshuser] paths= /usr/bin/ executables= /usr/bin/ssh" >> /srv/jail/etc/jailkit/jk_lsh.ini #SSH im Gefängnis freigeben sudo jk_init -j /srv/jail ssh
Und sie an, es geht, beim einloggen kommt der Willkommensschirm und darunter steht
bash: groups: command not found
...sehr gut :) ich versuche doch gleich mal
ssh
und sieh an
usage: ssh [-1246AaCfgKkMNnqsTtVvXxY] [-b bind_address] [-c cipher_spec] ..
SSH funktioniert also, nur was funktioniert noch?
df -h
bash: df: command not found
Fazit
ES FUNKTIONIERT, der Nutzer sieht sein eigenes kleines Linux inclusive /etc /home /dev usw, dieses ist aber ein chroot (Gefängnis), er darf alle zugeordneten Programme darin ausführen. Bei mir darf nur ein SSH-Tunnel aufgebaut werden.
Selbst wenn der Nutzer das Passwort weiß, kann er dem System nicht schaden.
Da zitiere ich gerne nochmal den letzten Satz der Seite:
"Jailkit stellt eine solide Struktur zur Absicherung unserer Systeme da -- selbst Ede kann sich nur noch die Zähne ausbeißen."