8. Juni 2021, 20:10
Lesezeit: ca. 6 Min

Gehe direkt ins Gefängnis, gehe nicht über LOS

Das Netz ist voller Tipps zur Absicherung von SSH-Zugängen. Die Bandbreite reicht von SSH-Schlüsseln, Zwei-Faktor-Authentifizierung nach RFC 62381 bis zu drei Faktoren für alle mit Security-Fetisch. An der Praxis gehen diese gutgemeinten Vorschläge mitunter vorbei. Hier helfen andere Konzepte und Instrumente.

Best-Practice für Ports im Allgemeinen und SSH-Ports im Besonderen: Keine offenen Ports im öffentlichen Internet anbieten. Eine Begrenzung auf ein Firmen-IP-Segment oder einzelne Jump-Server2 oder alternativ auch ein Port-Knocking3 ist die erste und meist auch beste Basis-Absicherung. Ein Blick in Shodan auf die 1.3 Mio Hosts aus Deutschland mit offenem Port 22 zeigt, dass dieses nicht von allen beherzigt wird4. Unverständlich und fahrlässig besonders bei Unternehmen mit Business-Anschlüssen und festen IPs.

1.3 Mio Server mit offenem SSH-Port 22 allein aus Deutschland

Dort wo ein SSH-Zugang benötigt wird führt eine auf die Spitze getriebene Absicherung jeden Admin oder DevOps zur Verzweiflung. Die Zugangsschwelle für Webdesigner, Developer und Anwender muss so niedrig und pragmatisch wie möglich bleiben, sofern kein Callcenter für den 1st-Level-Support eingeplant ist. Alles jenseits Benutzername/ Passwort ist den meisten zu kompliziert. Der Fokus liegt daher weniger in der Absicherung von Zugängen sondern in der Isolierung. Die Sicherheit gibt es nachgeschaltet auf Anwendungsebene, hoffentlich.

Das seit vielen Jahren bewährte Jailkit5 ist für diesen Zweck das richtige Werkzeug. Ideal für Werbeagenturen, die Ihren Mitarbeitern oder Kunden getunnelte Verbindungen zu Datenbanken oder Webspaces ermöglichen möchten. Auch die Dienstkonten von Server-Executables lassen sich mit Jailkit ohne Overhead und Container-Abhängigkeitsdschungel separieren.

Was ist Jailkit?

Wie der Name vermuten lässt, stammt Jailkit aus einer Zeit, wo Nützliches noch als “Kit” bezeichnet wurde. Jailkit ist eine bewährte und robuste Script-Sammlung zum Erstellen einer isolierten Umgebung für nicht-privilegierte Benutzer. Es macht nichts anderes, was händisch mit Linux-Bordmittelm nicht auch gehen könnte: Einen Unterordner im Dateisystem einem Benutzer als Root-Hauptordner vorsetzen. Ein Benutzer mit Shell und allen Abhängigkeiten bleibt dort im Idealfall gefangen, “chrooted”6 oder “jailed”7. Das Konzept hat sich über Jahrzehnte in der Unix-Welt bewährt und wurde von der Linux-Welt übernommen.

Der Charme und Vorteil von Jailkit: Es automatisiert und vermeidet Fehlerquellen, die durch ein manuelles “Chrooten” in diesem sicherheitskritischen Bereich schnell entstehen. Im nachfolgenden Screenshot wird das Prinzip gut erkennbar:

Links die Ansicht vom root, rechts die vom Benutzer demo

Die linke Bildschirmhälfte zeigt die Perspektive von root mit vollem Zugriff auf das Dateisystem. In der rechten Hälfte hat sich der Benutzer “demo” via SSH am gleichen Host angemeldet. Der zum Gefängnis gewordene Ordner ist sein Root. Die Liste an ausführbaren Befehlen im /bin Ordner stark reduziert. Weil “demo” in den wenigen Ordnern „rumschnüffelt“ bekommt es zur Strafe links vom root “ls” entzogen. Ein erneuter Aufruf rechts führt ins Leere. Weitere Aufrufe von “cat” und “nano” gleichfalls. Böse Zeitgenossen verlieren so schnell das Interesse und suchen nach leichteren Zielen.

Installation von Jailkit

Im Debian Bullseye Repository ist Jailkit bereits enthalten und findet voraussichtlich mit Release diesen Sommer seinen Einzug in das offizielle Stable-Repository8. Für das aktuelle Debian Buster und davon abgeleitete Linux-Distributionen muss ein DEB-Paket händisch gebaut werden. Die nachfolgende Anleitung zeigt wie. Alle Befehle werden als root ausgeführt.

apt install build-essential autoconf automake libtool flex bison debhelper binutils -y
mkdir /root/tmp && cd /root/tmp
wget http://olivier.sessink.nl/jailkit/jailkit-2.22.tar.gz

Nach Download vergleichen Sie bitte die Prüfsumme des Tarballs.

shasum -a 256 jailkit-2.22.tar.gz

Bei Übereinstimmung extrahieren Sie den Tarball, setzen den Kompatibilitäts-Level und bauen mit Aufruf des Rules-Scriptes die benötigten .deb Pakete. Die angezeigten Warnungen von dpkg-gencontrol können ignoriert werden:

tar xvfz jailkit-2.22.tar.gz && cd jailkit-2.22
echo 10 > debian/compat
./debian/rules binary

Im tmp-Ordners findet sich das Programmpaket jailkit_2.22-1_amd64.deb zusammen mit einem weiteren Paket für Debug-Symbole. Mit dpkg -i installieren Sie bitte das erstgenannte Paket.

dpkg -i jailkit_2.22-1_amd64.deb

Ein Gefängnis bauen

Der Gefängnisbau beginnt mit Auswahl eines geeigneten Verzeichnisses. Der /home Ordner ist eine mögliche, weniger gute Option aufgrund der Konfliktmöglichkeit mit gleichnamigen Benutzern. Empfohlen wird ein Unterverzeichnis unterhalb /usr/local. Auch ein neu erstellter Ordner unterhalb von Root / kommt in Betracht. Für die Sicherheit wichtig: Ein Benutzer darf außer im persönlichen /home und dem /tmp Verzeichnis keine Schreibrechte im Gefängnis erhalten.

Ist ein Verzeichnis z.B. /jail auserwählt, erzeugen Sie mit Aufruf von jk_init ein Gefängnis mit einer minimalen Jailkit Shell, der jk_lsh oder auch “Limitedshell”:

jk_init -j /jail limitedshell

Was jk_init nicht automatisch erstellt ist ein /tmp Verzeichnis:

mkdir /jail/tmp
chmod a+rwx /jail/tmp

Das Gefängnis ist by Design and Default nicht für interaktive SSL-Sitzungen ausgelegt. Die Jailkit “Limitedshell” nimmt lediglich einen bei Anmeldung übermittelten Befehl entgegen und führt diesen aus, sofern dieser im /jail/bin Verzeichnis enthalten ist. Der Singular ist hier bewusst gewählt: Komplexe mit && verbundene Befehlsketten oder Pipes werden nicht ausgeführt.

Für einen interaktiven Zugriff bedarf es des Jailkit “Basicshell” Paketes:

jk_init -j /jail basicshell

Den vollständigen Befehlsumfang gibt es mit Aufruf von “Extendedshell”, was den Sinn von Jailkit ad absurdum führt. Die üblichen Jailkit Programmpakete sind SCP und SFTP:

jk_init -j /jail scp
jk_init -j /jail sftp

Alle Parameter können Sie auch in einer Zeile Jailkit mitteilen:

jk_init -j /jail basicshell ssh scp sftp

Für eine Übersicht lohnt sich ein Blick in die Datei /etc/jailkit/jk_init.ini. Eigene Pakete oder Paketgruppen für einzusperrende Dienste können ergänzt werden. Gehen Sie bitte sehr sparsam mit Auswahl und Hinzufügen von Anwendungen um. Eine Privilege Escalation9 in einer lausig programmierten, unbekannten Software führt unweigerlich zum Gefängnisausbruch. Das Kopieren ausführbarer Programme an den Jailkit-Skripten und INI-Datei vorbei gehört zu den Dingen, die ebenfalls zu vermeiden sind.

Einen Benutzer einsperren

Was dem sorgsam gebauten Gefängnis fehlt sind die Insassen. Wie bei allen kritischen Änderungen an Benutzerkonten halten Sie zur Sicherheit im Hintergrund bitte ein weiteres Fenster mit angemeldeten root oder sudo-Benutzer offen. Unter Annahme, dass die oder der einzusperrende Benuter “demo” heißt, erfolgt die “Einlieferung” mit Aufruf von jk_jailuser unter Angabe des Jails und dem Benutzernamen. Bei einem bestehenden Home-Verzeichnis fragt Jailkit nach, ob es ins Gefängnis verschoben werden darf.

jk_jailuser -j /jail demo

Zur interaktiven SSH-Anmeldung benötigt ein Benutzer ein Gefängnis mit bash, die es mit dem Jailkit “Basicshell” Paket gibt. So wie im nachfolgenden Screenshot, muss in der /jail/etc/passwd Datei anstelle der Limitedshell /usr/sbin/jk_lsh die /bin/bash hinterlegt sein:

Setzen der /bin/bash in der passwd des Jails

Bei massenhaften “Gefängniseinweisungen” und Benutzerbewegungen ist es ratsam, die passwd Datei im Blick zu behalten und ggf. nachzutragen. Gelöschte Benutzerkonten werden im Gegensatz zur Welt außerhalb des Gefängnisses nicht automatisch entfernt. Im Idealfall sind diese wenigen manuellen Notwendigkeiten auf einem Host mit vielen Benutzern automatisiert.

Konzeptionell bedingt, erstellt Jailkit von allen Systemdateien Kopien. Nach jedem Update sollten Sie mögliche Versionsunterschiede zwischen Kopie und Original mit jk_update überprüfen.

Fazit

Eine Maximalabsicherung eines SSH-Ports ist in der Praxis wenig zielführend wenn damit auch gearbeitet werden soll. Das Chrooten und stark eingegrenzte Zugänge bietet jedem Administrator ein über Jahrzehnte bewährtes Konzept zur Isolierung, mit Jailkit auch die passende Scriptsammlung dazu. Im Zusammenwirken mit weiteren Sicherheitsmaßnahmen und einem Monitoring verbessert es die Gesamtsicherheit eines Systems deutlich.

.


  1. https://datatracker.ietf.org/doc/html/rfc6238 ↩︎

  2. https://en.wikipedia.org/wiki/Jump_server ↩︎

  3. https://en.wikipedia.org/wiki/Port_knocking ↩︎

  4. https://www.shodan.io/search?query=port%3A%2222%22+country%3A%22de%22 ↩︎

  5. https://olivier.sessink.nl/jailkit/ ↩︎

  6. https://en.wikipedia.org/wiki/Chroot ↩︎

  7. https://en.wikipedia.org/wiki/FreeBSD_jail ↩︎

  8. https://packages.debian.org/bullseye/utils/ ↩︎

  9. https://en.wikipedia.org/wiki/Privilege_escalation ↩︎

© 2021 Tomas Jakobs - Impressum und Datenschutzhinweis