chroot Jail für SFTP und SSH mit minimaler Shell

Einleitung

Möchte man Anwendern Webspace bereitstellen, muss man diesen Anwendern irgendwie ermöglichen dort Dateien hoch zu laden. Gleichzeitig sollten die Anwendungen die dann von dem Webserver ausgeführt werden auch nur Zugriff auf diese Dateien haben. Jeder Benutzerkontext sollte gegen die anderen abgeschirmt werden. Manchmal wünscht sich dann jemand doch noch einen Shell-Zugang.

Um sich zukünftig den Zugang mit dem veralteten FTP-Protokoll zu ersparen, soll jetzt SSH herhalten. Im Gegensatz zu FTP benötigt es keinen separaten Netzwerkport für Kontroll- und Datenverbindung. Das macht es in der Firewall deutlich einfacher zu konfigurieren. Als Alternative hatte ich in der Vergangenheit bereits einmal mit WebDAV gearbeitet. Leider scheiterte das an der Ermangelung passender Clients, beziehungsweise dem Kundenwunsch nach etwas anderem. Für SFTP gibt es FileZilla oder WinSCP.

Um SFTP nicht gleich das ganze System zu exponieren kann man Benutzer mittels „ChrootDirectory“ auf ein bestimmtes Verzeichnis beschränken. Dafür muss man dann jedoch den internen SFTP-Server verwenden.

SFTP-Zugang einrichten

Möchte man nur den SFTP-Zugang einrichten und ihn in das chroot verbannen, so reicht es eine Gruppe zur Steuerung anzulegen

groupadd chrootjail

und am am Ende der „/etc/ssh/sshd_config“ folgende Zeilen einzufügen.

Match group chrootjail
  AllowTcpForwarding no
  X11Forwarding no
  ChrootDirectory %h
  ForceCommand internal-sftp

SSH neu starten!

systemctl restart ssh.service

Dadurch können alle Benutzer der Gruppe „chrootjail“ ausschließlich auf ihr Home-Verzeichnis zugreifen, wie es in der /etc/passwd angegeben ist. Viel mehr sehen sie überhaupt nichts anderes. Das Home-Verzeichnis ist das neue Wurzelverzeichnis. „ForceCommand internal-sftp“ verwendet dabei SSH-Internen SFTP-Server. Dadurch kann jedoch keine Shell mehr bereitgestellt werden.

SSH-Zugang

Möchte man jedoch beides haben. Eine Zugriffsbeschränkung nur auf das Home-Verzeichnis aber Trotzdem eine Shell mit den nötigsten Befehlen, wird es noch etwas komplexer.

Prinzipiell kopiert man dafür die gewünschten Befehle mit den dazugehörigen Bibliotheken in das Home-Verzeichnis eines jeden Anwenders. Der „ldd„-Befehl ist dafür sehr hilfreich. Er listet die für einen Befehl benötigen Bibliotheken auf.

Folgendes Skript automatisiert das ganze.

#!/bin/bash
# This script can be used to create simple chroot environment
# Written by LinuxCareer.com <http://linuxcareer.com/>
# (c) 2013 LinuxCareer under GNU GPL v3.0+

#!/bin/bash

CHROOT='/var/chroot'
mkdir $CHROOT

for i in $( ldd $* | grep -v dynamic | cut -d " " -f 3 | sed 's/://' | sort | uniq )
  do
    cp --parents $i $CHROOT
  done

# ARCH amd64
if [ -f /lib64/ld-linux-x86-64.so.2 ]; then
   cp --parents /lib64/ld-linux-x86-64.so.2 /$CHROOT
fi

# ARCH i386
if [ -f  /lib/ld-linux.so.2 ]; then
   cp --parents /lib/ld-linux.so.2 /$CHROOT
fi

echo "Chroot jail is ready. To access it execute: chroot $CHROOT"

Ich habe es bei mir unter „makechroot“ gespeichert. Benutzt wird das Skript dann wie Folgt.

makechroot \
/bin/{ls,cat,echo,mv,rm,cp,tar,bzip2,gzip,bash,mkdir,rmdir,grep} \
/usr/bin/{vim,dircolors} /etc/hosts \
/etc/terminfo/p/putty-256color

Unter „/var/chroot“ liegt nun ein minimales chroot. Testen kann man das mit „chroot /var/chroot„.

Als nächstes geht es daran sich direkt in diese Umgebung anzumelden. Dazu legt man einen Benutzer an und fügt ihn der Gruppe „chrootjail“ hinzu.

useradd -m jailtest
usermod jailtest -a -G chrootjail

-m“ erzeugt ein Home-Verzeichnis.

Jetzt kopiert man die zuvor unter „/var/chroot“ erzeugte Umgebung in sein Home-Verzeichnis und legt ein neues Home-Verzeichnis im chroot an und ändern den Besitzer auf den angelegten Account.

cp -pr /var/chroot/ /home/jailtest
mkdir -p /home/jailtest/home/jailtest
chown jailtest:jailtest /home/jailtest/home/jailtest

Um sich jetzt direkt in diese Umgebung mit SSH anzumelden muss die „/etc/ssh/sshd_config“ angepasst werden. Man stellt das SFTP Subsystem direkt auf den internen SFTP-Server. Lässt dafür dann aber die „ForceCommand internal-sftp“ Direktive weg.

#Subsystem sftp /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp

Match group chrootjail
 AllowTcpForwarding no
 X11Forwarding no
 ChrootDirectory %h

An dieser Stelle ist vielleicht noch folgender Link interessant. https://serverfault.com/questions/660160/openssh-difference-between-internal-sftp-and-sftp-server

SSH neu starten!

systemctl restart ssh.service

Hat alles geklappt, landet man nach dem Anmelden in „/home/jailtest“ der Mini-Umgebung. Egal ob man sich mit SSH oder mit SFTP verbindet. Dem „jailtest“-Account muss man dafür noch ein Passwort oder einen SSH-Key verpassen, aber wer so tief im Knienchenbau steckt weiß das sowieso schon. 😉

Bei der Umsetzung war folgender Artikel ungeheuer hilfreich. Hier stammt auch das Skript zum Kopieren der Befehle her. https://linuxconfig.org/how-to-automatically-chroot-jail-selected-ssh-user-logins

Schöner machen

Damit der Promt etwas schöner aussieht, kann man eine „/var/chroot/etc/profie“ anlegen und mit folgenden Inhalt füllen:

PS1="${debian_chroot:+($debian_chroot)}@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ "

Ein Gedanke zu „chroot Jail für SFTP und SSH mit minimaler Shell“

Schreibe einen Kommentar