SSH/SFTP Chroot-Umgebung Auf Fedora 7

Version 1.0
Author: Oliver Meyer <o [dot] meyer [at] projektfarm [dot] de>


Diese Anleitung beschreibt, wie man eine Chroot-Umgebung für SSH/SFTP auf Fedora 7 aufsetzt. Die gechrooteten Benutzer werden in einem speziellen Verzeichnis eingesperrt, aus dem sie nicht ausbrechen können. Dieses "Gefängnis" ist für den jeweiligen Benutzer via SSH und SFTP erreichbar.

Dieses Tutorial soll ein praktischer Leitfaden sein. Theoretisches Hintergrundwissen wird damit nicht abgedeckt. Dies wird in vielen anderen Dokumenten im Netz abgehandelt.

Diese Anleitung ist ohne jede Garantie und ich möchte an dieser Stelle darauf hinweisen, dass dies hier nicht der einzige Weg ist, ein solches System zu installieren. Es gibt viele Möglichkeiten - ich selbst habe mich für diese entschieden. Ich kann aber nicht garantieren, dass diese Lösung bei jedem funktioniert bzw. für jeden die richtige ist!

1 Erste Methode (Per Hand)

1.1 Installiere Chroot-SSH

Als erstes installieren wir einige benötigte Pakete:

yum install openssl-devel pam-devel
yum groupinstall 'Development Tools'

Anschliessend müssen wir die ssh/sshd-Konfiguration anpassen:

vi /etc/ssh/sshd_config

ändere
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
in
#GSSAPIAuthentication yes
#GSSAPICleanupCredentials yes

vi /etc/ssh/ssh_config

ändere
GSSAPIAuthentication yes
in
#GSSAPIAuthentication yes
Als nächstes downloaden wir die gepatchten OpenSSH Quelldateien und passen sie an unsere Bedürfnisse an (/usr für die ausführbaren Dateien, /etc/ssh fü die Konfigurationsdateien und eingeschaltete PAM Authentifizierung).

cd /tmp/
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

1.2 Erzeuge die Chroot-Umgebung

Wir werden die Chroot-Umgebung unter /home/chroot erzeugen - das Gefängnis für alle gechrooteten Benutzer.

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

Nachdem wir die erforderlichen Verzeichnisse erzeugt haben müssen wir einige Binärpakete und ihre abhängigen Bibliotheken in die Chroot-Umgebung kopieren. Der Grossteil dieser Arbeit kann von einem kleinen Script erledigt werden, das Falko gefunden und modifiziert hat. Ich habe es so angepasst, dass es mit Fedora 7 funktioniert.

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 /bin/vi /usr/bin/sftp /usr/libexec/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/nullq 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
Anmerkung: Du kannst weitere Programme für die gechrooteten Benutzer verfügbar machen, indem Du sie zur APPS-Zeile hinzufügst.

Ändere die Rechte für das Script und führe es anschliessend aus:

chmod 700 /usr/local/sbin/create_chroot_env
create_chroot_env

Anschliessend müssen wir noch einige weitere Dateien und Bibliotheken per Hand in das Chroot-Gefängnis kopieren:

cp /lib/libnss_compat.so.2 /lib/libcom_err.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 -R /etc/pam.d/ etc/
cp -R /lib/security/ lib/
cp -R /etc/security/ etc/
cp /etc/login.defs /etc/hosts /etc/resolv.conf etc/
cp /usr/lib/libgssapi_krb5.so.2 /usr/lib/libkrb5.so.3 /usr/lib/libk5crypto.so.3 /usr/lib/libkrb5support.so.0 usr/lib/

Als nächstes machen wir folgendes:

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

Zusätzlich müssen wir die Zeile der Gruppe, der die gechrooteten Benutzer angehören sollen, von /etc/group nach /home/chroot/etc/group kopieren. In dieser Anleitung verwenden wir die Gruppe "users" für gechrootete Benutzer:

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

Nun ist es an der Zeit den OpenSSH-Server neu zu starten:

/etc/init.d/sshd restart


1.3 Gechrootete Benutzer Anlegen

Obwohl wir Chroot-SSH installiert haben, ist es immer noch möglich sich anzumelden ohne eingesperrt zu werden (das macht z.B. für den Root-Account Sinn). Die Entscheidung ob ein Benutzer gechrootet wird oder nicht, ist abhängig von einem einzigen Punkt. Falls das Heimverzeichnis des Benutzers in /etc/passwd einen Punkt enthält wird dieser Benutzer gechrootet.

Dieser Benutzer wird gechrootet:
user_b:x:2003:100:User B:/home/chroot/./home/user_b:/bin/bash
Dieser Benutzer wird nicht gechrootet:
user_a:x:2002:100:User A:/home/user_a:/bin/bash
Wir legen den Benutzer "testuser" mit dem Heimverzeichnis /home/chroot/./home/testuser/ und der Gruppe "users" an:

useradd -s /bin/bash -m -d /home/chroot/./home/testuser/ -c "testuser" -g users testuser

Anschliessend vergeben wir ein Passwort für diesen Benutzer:

passwd testuser

Als letztes müssen wir die Zeile für diesen Benutzer von /etc/passwd nach /home/chroot/etc/passwd kopieren:

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

Da wir die Zeile für die Gruppe "users" bereits von /etc/group nach /home/chroot/etc/group kopiert haben, brauchen wir das nicht nochmal zu tun. Falls Du einen gechrooteten Benutzer mit einer anderen Gruppe als "users" anlegen möchtest, musst du diese Gruppe zu /home/chroot/etc/group hinzufügen.

z.B.:

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

Nun versuch Dich per SSH oder SFTP als Benutzer "testuser" anzumelden. Du solltest in /home/chroot eingesperrt sein.

2 Zweite Methode (Per Script)

Das Script make_chroot_jail.sh, das die Erzeugung von SSH/SFTP-Gefängnissen automatisiert ist auf http://www.fuschlberger.net/programs/ssh-scp-sftp-chroot-jail/ verfügbar. Es funktioniert einwandfrei auf Fedora 7 - möglicherweise wird die Bibliothek ld-ldb.so.3 und/oder libxcrypt.so.1 nicht auf Deinem System gefunden (Du würdest einen Hinweis bei der Ausführung des Scriptes sehen), aber es funktioniert trotzdem richtig.

2.1 Das Script

Bevor wir weiter machen, müssen wir ein benötigtes Paket installieren:

yum install sudo

Anschliessend downloaden wir das Script und passen die Rechte an:

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

2.2 Das Script Benutzen

Du kannst einen gechrooteten Benutzer folgendermassen anlegen:

make_chroot_jail.sh %username% [%pfad_zur_chrootshell% [%pfad_zum_chrootverzeichnis%]]

z.B.:

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

Falls der Benutzer bereits existiert wird er geupdated - falls nicht, wird er angelegt. %pfad_zur_chrootshell% und %pfad_zum_chrootverzeichnis% sind optional - wenn Du sie nicht angiebst, werden die Standardwerte /bin/chroot-shell und /home/jail verwendet.

Folgender Befehl updatet alle Dateien und Bibliotheken im Chroot-Gefängnis:

make_chroot_jail.sh update [%pfad_zur_chrootshell% [%pfad_zum_chrootverzeichnis%]]

z.B.:

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

%pfad_zur_chrootshell% und %pfad_zum_chrootverzeichnis% sind wieder optional - abhängig davon, wie Du den Benutzer angelegt hast.

2.3 ProFTPd

Falls Du ProFTPd benutzt, solltest Du einen Blick auf http://www.fuschlberger.net/programs/ssh-scp-sftp-chroot-jail/ werfen.

Wie dort erwähnt, solltest Du bin/chroot-shell nicht zu /etc/shells hinzufügen weil es dadurch für die gehrooteten Benutzer möglich wird, aus ihrem Gefängnis auszubrechen. Dies ist allerdings ein Problem für ProFTPd, weil in der Standardkonfiguration nur Benutzer, deren Shell in /etc/shells gelistet ist, die Mögllichkeit haben ProFTPd zu benutzen. So können gechrootete Benutzer mit der Shell /bin/chrooted-shell ProFTPd nicht benutzen.

Um dies zu ändern, müssen wir die proftpd.conf etwas anpassen:

vi /etc/proftpd/proftpd.conf

Füge die folgende Zeile ein:
RequireValidShell	off
Anschliessend starte ProFTPd neu:

/etc/init.d/proftpd restart

Nun können alle Benutzer, unabhängig davon welche Shell sie benutzen, ProFTPd nutzen. Dies ist wahrscheinlich etwas, das Du auf keinen Fall möchtest - die beste Lösung wäre nur noch SFTP anstatt von FTP zu benutzen.

3 Links

0 Kommentar(e)

Zum Posten von Kommentaren bitte