Chrooted SSH/SFTP Anleitung (Debian Etch)

Version 1.0
Author: Falko Timme


Diese Anleitung veranschaulicht auf zwei verschiedenen Wegen wie man Benutzern einen chrooted SSH Zugriff ermöglicht. Mit diesem Setup ermöglichst Du Deinen Benutzern Shell Zugriff ohne fürchten zu müssen, dass sie Dein gesamtes System einsehen können. Deine Benutzer werden in ein bestimmtes Verzeichnis eingesperrt, aus dem sie nicht ausbrechen können. Die Benutzer werden außerdem in der Lage sein, SFTP in ihren chroot Gefängnissen zu verwenden.

Diese Anleitung ist ohne jegliche Gewähr! Ich möchte darauf hinweisen, dass dies nicht der einzige Weg ist, ein solches System einzurichten. Es gibt viele Möglichkeiten dieses Ziel zu erreichen - dies ist der Weg, den ich gewählt habe. Ich übernehme keine Garantie, dass dies auch bei Dir funktioniert!

1 Vorbemerkung

Dieses Setup basiert auf einem Debian Etch (Debian 4.0) System.

Die erste Variante eine chrooted SSH einzurichten, ist die manuelle Installation, die der Methode in der Anleitung für Debian Sarge sehr ähnlich ist: http://www.howtoforge.com/chrooted_ssh_howto_debian. Die chrooted SSH wird so installiert, dass sie immer noch die Konfigurationsdateien des Standard OpenSSH Debian Paketes verwendet, die sich in /etc/ssh/ befinden. Weiterhin kannst Du das Standard OpenSSH Debian Init Skript /etc/init.d/ssh verwenden. Daher musst Du kein eigenes Init Skript und keine eigene Konfigurationsdatei erstellen.

Bei der zweiten Variante verwendest Du das make_chroot_jail.sh Skript von http://www.fuschlberger.net/programs/ssh-scp-sftp-chroot-jail/. Dieses Setup unterscheidet sich vom ersten, in dem wir OpenSSH nicht neu kompilieren müssen. Anstelle von /bin/sh oder /bin/bash verwenden die chrooted Benutzer /bin/chroot-shell, die die sudo und chroot Befehle verwendet, um Benutzer zu chrooten. Ein weiterer Unterschied ist, dass die Benutzer keinen Punkt in ihren Homedirs in /etc/passwd haben (daher kann es nicht von Control Panels wie ISPConfig verwendet werden, was bei der ersten Variante kein Problem darstellt). Sieh Dir bitte http://www.fuschlberger.net/programs/ssh-scp-sftp-chroot-jail/ an um herauszufinden, was dieses Skript für Dich bereit hält und was nicht.

Du solltes Dich für eine Variante entscheiden - verwende bitte nicht beide Varianten zur gleichen Zeit!

2 Erste Variante (manuell)

2.1 Installation der chrooted OpenSSH

Zunächst installieren wir einige Voraussetzungen:

cd /tmp
apt-get install libpam0g-dev openssl libcrypto++-dev libssl0.9.7 libssl-dev ssh build-essential bzip2

Dann laden wir die gepatchten OpenSSH Quellen runter und konfigurieren sie mit /usr als Verzeichnis für die SSH ausführbaren Dateien mit /etc/ssh als dem Verzeichnis, in dem die chrooted SSH nach Konfigurationsdateien sucht. Außerdem erlauben wir PAM Authentifizierung:

wget http://chrootssh.sourceforge.net/download/openssh-4.5p1-chroot.tar.bz2
tar xvfj openssh-4.5p1-chroot.tar.bz2
cd openssh-4.5p1-chroot
./configure --exec-prefix=/usr --sysconfdir=/etc/ssh --with-pam
make
make install

2.2 Die chroot Umgebung erstellen

Als Nächstes erstelle ich eine chroot Umgebung unter /home/chroot. Das ist das Verzeichnis, in dem alle chrooted SSH Benutzer eingesperrt werden, d.h. sie können keine Dateien/Verzeichnisse außerhalb von /home/chroot sehen.

Ich muss /home/chroot einige Verzeichnisse anlegen und muss ein paar Binärdateien wie /bin/bash, /bin/ls, etc. wie auch die Libraries, von denen diese Binärdateien abhängen, in die chroot Umgebung kopieren, so dass sie jedem chrooted Benutzer zugänglich sind.

mkdir -p /home/chroot/home/
cd /home/chroot
mkdir -p usr/lib/openssh
mkdir etc
mkdir etc/pam.d/
mkdir bin
mkdir lib
mkdir usr/bin
mkdir dev
mknod dev/null c 1 3
mknod dev/zero c 1 5

chmod 666 dev/null
chmod 666 dev/zero

Da wir nun die notwendigen Verzeichnisse erstellt haben, werden wir einige Binärdateien und alle Libraries, von denen sie abhängen, in die chroot Umgebung kopieren. Dies ist ein Auszug eines Skriptes, das ich auf http://mail.incredimail.com/howto/openssh/create_chroot_env gefunden habe; dieses Skript führt diese Aktion aus. Es habe es ein bisschen modifiziert:

vi /usr/local/sbin/create_chroot_env


#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin APPS="/bin/sh /bin/bash /bin/cp /bin/ls /bin/mkdir /bin/mv /bin/pwd /bin/rm /bin/rmdir /usr/bin/id /usr/bin/ssh /bin/ping /usr/bin/dircolors /usr/bin/vi /usr/bin/sftp /usr/lib/openssh/sftp-server" for prog in $APPS; do mkdir -p ./`dirname $prog` > /dev/null 2>&1 cp $prog ./$prog # obtain a list of related libraries ldd $prog > /dev/null if [ "$?" = 0 ] ; then LIBS=`ldd $prog | awk '{ print $3 }'` for l in $LIBS; do mkdir -p ./`dirname $l` > /dev/null 2>&1 cp $l ./$l > /dev/null 2>&1 done fi done
(Wenn Du Deinen chrotted Benutzern mehr Programme zugänglich machen möchtest, füge diese Programme einfach der APPS Zeile hinzu.)

Nun machen wir das Skript ausführbar und führen es aus:

chmod 700 /usr/local/sbin/create_chroot_env
create_chroot_env


Als Nächstes müssen wir einige zusätzliche Dateien und Libraries in das chroot Gefängnis kopieren:

cp /lib/libnss_compat.so.2 /lib/libnsl.so.1 /lib/libnss_files.so.2 /lib/ld-linux.so.2 /lib/libcap.so.1 /lib/libnss_dns.so.2 ./lib/


cp /etc/hosts etc/
cp /etc/resolv.conf etc/
cp /etc/pam.d/* etc/pam.d/
cp -r /lib/security lib/
cp -r /etc/security etc/
cp /etc/login.defs etc/

cp /usr/lib/libgssapi_krb5.so.2 usr/lib/
cp /usr/lib/libkrb5.so.3 usr/lib/
cp /usr/lib/libk5crypto.so.3 usr/lib/
cp /lib/libcom_err.so.2 lib/
cp /usr/lib/libkrb5support.so.0 usr/lib/

Dann führen wir dies aus:

echo '#!/bin/bash' > usr/bin/groups
echo "id -Gn" >> usr/bin/groups
touch etc/passwd
grep /etc/passwd -e "^root" > etc/passwd

Du solltest auch die Zeile de Gruppe kopieren, in der Du neue Benutzer von /etc/group zu /home/chroot/etc/group erstellen wirst. In dieser Anleitung werden wir Benutzer in der Gruppe users anlegen, also führen wir Folgendes aus:

grep /etc/group -e "^root" -e "^users" > etc/group

und starten OpenSSH neu:

/etc/init.d/ssh restart


2.3 Einen chrooted Benutzer anlegen

Du kannst Dich sogar mit dem chrooted SSH, das wir gerade installiert haben, einloggen ohne gechrooted zu werden (was Sinn macht, wenn Du Dich zum Beispiel als Root Benutzer anmeldest). Aber wie entscheidet der die chrooted SSH nun, wer gechrooted wird und wer nicht? Das ist einfach: die chrooted SSH sieht sich den Benutzer an, der versucht, sich in /etc/passwd einzuloggen. Wenn das Home Verzeichnis des Benutzers in /etc/passwd einen . (Punkt) hat, dann wird der Benutzer gechrooted.


Beispiel (von /etc/passwd):user_a:x:2002:100:User A:/home/user_a:/bin/bashDieser Benutzer wird nicht gechrooted.

user_b:x:2003:100:User B:/home/chroot/./home/user_b:/bin/bash

Dieser Benutzer wird gechrooted.


Nun legen wir den Benutzer testuser mit dem Home Verzeichnis /home/chroot/./home/testuser und die Gruppe users (was die Standard-Gruppe für Benutzer auf Debian ist, Du musst sie also nicht explizit festlegen) an:useradd -s /bin/bash -m -d /home/chroot/./home/testuser -c "testuser" -g users testuserDann weisen wir testuser ein Passwort zu:

passwd testuser

Letztlich kopieren wir die Zeile für testuser in /etc/passwd nach /home/chroot/etc/passwd:

grep /etc/passwd -e "^testuser" >> /home/chroot/etc/passwd

Wir haben bereits die users Gruppen-Zeile von /etc/group nach /home/chroot/etc/group kopiert, also müssen wir das hier nicht noch einmal tun. Falls Du einen chrooted Benutzer in einer anderen Gruppe als users erstellst, füge diese Gruppe /home/chroot/etc/group hinzu:

grep /etc/group -e "^othergroup" >> /home/chroot/etc/group

Versuche nun Dich in SSH oder SFTP als testuser einzuloggen. Du müsstest gechrooted werden und dürftest nicht in der Lage sein, Dateien/Verzeichnisse außerhalb von /home/chroot zu durchsuchen.

Viel Spaß!

3 Zweite Variante (mit Skript)

Es gibt ein Skript namens make_chroot_jail.sh auf http://www.fuschlberger.net/programs/ssh-scp-sftp-chroot-jail/ das das Setup von SSH/SFTP chroot Gefängnissen automatisiert. Es läuft fehlerlos auf Debian Etch.

3.1 Das Skript beziehen

Zunächst müssen wir einige Voraussetzungen installieren:

apt-get install sudo debianutils coreutils

Dann laden wir make_chroot_jail.sh nach /usr/local/sbin und machen es für den Root Benutzer ausführbar:

cd /usr/local/sbin
wget http://www.fuschlberger.net/programs/ssh-scp-sftp-chroot-jail/make_chroot_jail.sh
chmod 700 /usr/local/sbin/make_chroot_jail.sh

3.2 make_chroot_jail.sh verwenden

Jetzt können wir das Skript bereits wie folgt verwenden:

make_chroot_jail.sh username [/path/to/chroot-shell [/path/to/chroot]]

Es spielt keine Rolle, ob der Benutzer bereits existiert oder nicht. Wenn ja, wird er aktualisiert; wenn nicht, wird er erstellt. Wenn Du den Pfad zu chroot-shell und den Pfad zum chroot Gefängnis nicht definierst, werden die Standardwerte /bin/chroot-shell und /home/jail verwendet, z.B.:

make_chroot_jail.sh testuser

Ich möchte /home/chroot als das chroot Gefängnis verwenden, daher muss ich auch den Pfad zu chroot-shell festlegen:

make_chroot_jail.sh testuser /bin/chroot-shell /home/chroot

Damit wird der Benutzer testuser mit dem chroot Gefängnis /home/chroot erstellt/aktualisiert.

Um alle Dateien/Libraries im chroot Gefängnis zu aktualisieren, führe dies aus

make_chroot_jail.sh update

oder

make_chroot_jail.sh update /bin/chroot-shell /home/chroot

das hängt davon ab, wie Du Deine Benutzer erstellt hast.

3.3 ProFTPd

Falls Du ProFTPd verwendest, solltest Du Folgendes lesen:

Wie auf http://www.fuschlberger.net/programs/ssh-scp-sftp-chroot-jail/ erwähnt wird, solltest Du /bin/chroot-shell nicht /etc/shells hinzufügen, da dies den Benutzern erlauben würde, aus dem chroot Gefängnis auszubrechen. Dieses Problem betrifft ProFTPd, da in ProFTPds Standardkonfiguration nur die Benutzer ProFTPd verwenden können, deren Shell in /etc/shells aufgelistet ist. Das bedeutet, dass Benutzer, die /bin/chroot-shell verwenden, ProFTPd nicht nutzen können.

Um dies zu ändern, öffne /etc/proftpd/proftpd.conf und füge Folgendes hinzu:

vi /etc/proftpd/proftpd.conf


[...]
RequireValidShell off [...]
Starte dann ProFTPd neu:

/etc/init.d/proftpd restart

Nun können alle Benutzer ProFTPd verwenden, egal was für eine Shell sie haben, was Du wiederum vielleicht nicht möchtest. Die beste Lösung wäre, einfach SFTP zu verwenden und das normale FTP auszulassen.

4 Links