Jailkit

Aus Programmers Guide

Wechseln zu: Navigation, Suche

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."


Persönliche Werkzeuge