Diese Seite beschreibt die Einrichtung eines OpenSSH Servers, über den User nur SFTP und/oder SCP in ihrer Chroot Umgebung ausführen können. Der Server soll nur Protokoll 2 und Public-Key Authentifizierung unterstützen. Außerdem werden zusätzliche Möglichkeiten des Loggens von SFTP Transaktionen und der Rechtevergabe eingerichtet. Damit und aufgrund der Verschlüsselungskapazitäten von OpenSSH wird der Server zu einer sicheren Alternative zu allen privat betriebenen FTP Servern.
Über QoS und HTB wird die Upload Bandbreite, über Quota der Platzverbrauch der SFTP/SCP User beschränkt.
Zur Erreichung der Ziele kommt eine OpenSSH Version zum Einsatz, die mit Chroot und sftp-logging Patches modifiziert wird. Für die User Restriktionen wird die rssh und Chroot Umgebungen eingerichtet. Um den Upload Traffic und Quota zu steuern, wird der Kernel mit Quota und QoS/HTB kompiliert und das htb.init Script verwendet.
Die Beschreibung und Umsetzung ist an Fedora Linux orientiert, weil es hier im Einsatz ist, dürfte aber problemlos auf andere Distributionen anzuwenden sein.
Hinweis: Alle Programme werden mit "make install" installiert. Für RPM-Lösungen kann man sich z. B. RPM Pakete mittels checkinstall bauen, sich die Informationen des RPM HOWTO aneignen oder bei RPM pbone.net bzw. in den RPM Repositories nach fertigen Paketen suchen.
Laut einem Security Advisory auf der Bugtraq Malingliste vom 02.12.2004 können per rssh <= 2.2.2 und scp, rdist, rsync mit Ausnahme von sftp Kommandos und Programme auf dem Host außerhalb der Shell ausgeführt werden.
Mit der Version 2.2.3 wurden Prüfroutinen auf scp, rdist und rsync Argumente zur Kommandoausführung hinzugefügt.
Vorweg eine einfache und schnell umzusetzende Methode, mit scponly und dem OpenSSH Server so, wie er von den Repository der Distribution ausgeliefert wird, einen reinen SFTP/SCP Server einzurichten. scponly ist eine abgesicherte Shell bzw. ein Wrapper für eine begrenzte Anzahl von Programmen, die per SSH ausgeführt werden dürfen.
Zuerst wird das Binärpaket des OpenSSH Servers aus dem Distributionsrepository installiert und konfiguriert. Bei Fedora Core z. B. mit
$ yum install "openssh openssh-server"
Anschließend wird scponly installiert. Dabei sollte man darauf achten, dass bei einem Binärpaket auch die chroot-Variante scponlyc von scponly enthalten ist, was z. B. bei dem Paket aus dem Fedora Extras Paket nicht der Fall ist. Ob das scponly Binärpaket der Distributionsrepositories scponlyc enthält, kann man mit dem Paketmanager der eigenen Distribution überprüfen. Unter Fedora Core Linux z. B. mit:
$ yum what have scponlyc
$ No Matches found
Ohne scponlyc ist es dem Benutzer möglich, auf die meisten Dateien des Dateisystems lesen zuzugreifen, dafür muss scponlyc mit setuid ausgeführt werden. Allerdings wird scponlyc erst nach der Authentifizierung des Benutzers aufgerufen, die Kommandos bzw. scp oder sftp werden nicht mit UID 0 ausgeführt und man sollte schon ein Mindestmaß an Vertrauen in die Benutzer haben, denen man Zugriff auf den eigenen Rechner gewähren kann.
Für den Fall, dass scponlyc nicht im Binärpaket enthalten ist, hier der manuelle Weg:
Neben dem incoming Verzeichnis, in das der Benutzer Dateien ablegt, kann man ein weiteres Unterverzeichnis z. B. mit dem Namen pub anlegen, in das man Dateien ablegt oder Verzeichnisse mit Dateien mountet, die sich der Benutzer herunterladen kann.
Um Benutzer auf die Verzeichnisstruktur und den Typ des Servers hinzuweisen, kann man dem Benutzer den Inhalt der /etc/ssh/banner Datei vor der Authentifizierung übermitteln lassen. Die entsprechende Option in der sshd_config:
Banner /etc/ssh/banner # kann natürlich auch anders heißen als "banner"
Bevor sich bei mir ein Benutzer authentifiziert, erhält er z. B.:
rssh kompilieren & installieren:
$ tar -xzf rss-version.tar.gz
$ ./configure --sysconfdir=/etc/ssh --exec-prefix=/usr/local --prefix=/usr/local
$ make
$ su root
$ make install
Bei der Einrichtung der SSH User sollte man sich überlegen, dass für jeden User eine extra Chroot Umgebung und ein eigener Syslog Prozess eingerichtet werden muss.
Will man die Anzahl der Chroot Umgebungen und Syslog Prozesse begrenzen, kann man z. B. von dem Modell ausgehen, dass eine begrenzte Anzahl von SSH Usern stellvertretend für Gruppen steht, denen man verschiedene "Vertrauensstufen" und Möglichkeiten zubilligt. Die realen User werden dann über den Eintrag ihrer Public Keys in den authorized_keys Dateien der jeweiligen Chrootumgebungen diesen Gruppen "zugeordnet".
Man richtet z. B. 3 SSH User/Gruppen ein sshuser1, sshuser2, sshuser3 - sshuser1 wird über die rssh SCP und SFTP erlaubt und erhält Zugriff auf mehr Dateien, sshuser2 wird ebenfalls SCP und SFTP erlaubt, hat aber nur auf eine beschränkte Anzahl von Dateien Zugriff und/oder kann nur Downloads ausführen, sshuser3 hat nur SCP Zugriff und kann nur Uploads ausführen.
Damit wird zuerst 1x die Gruppe sshusers angelegt. Danach wird der User sshuserN, mit Gruppenzugehörigkeit zu sshuserN und sshusers (-G), angelegt, sein Heimatverzeichnis (-d) wird erzeugt (-m), ein Passwort vergeben (-p) und ihm wird die rssh als Shell zugeordnet.
Anschließend werden die automatisch angelegten Unterverzeichnisse und Dateien aus dem Heimatverzeichnis des Users gelöscht.
Dazu werden die Verzeichnisse, Bibliotheken, Programme und Konfigurationsdateien in die User Heimatverzeichnisse abgebildet, d. h. liegt z. B. sftp-server in /usr/local/libexec/sftp-server, wird von dort sftp-server in das Verzeichnis /opt/chroot/home/sshuserN/usr/local/libexec/sftp-server kopiert. Das betrifft auch alle Bibliotheken, von denen das Programm abhängt. Um das festzustellen, gibt man "ldd Programm" ein und erhält die Bibliotheken mit Verzeichnissen, die das Programm benötigt. Das betrifft scp, sftp-server, rssh und rssh_chroot_helper. Die ausgegebenen Informationen werden dann verwendet, um die Verzeichnis- und Dateistruktur abzubilden.
/opt/chroot/ - root:sshusers rwx-r-x---
/opt/chroot/dev/ - root:root rwx------
/opt/chroot/home/ - root:sshusers rwxr-x---
/opt/chroot/home/sshuserN/ - root:sshuserN rwxr-x---
/opt/chroot/home/sshuserN/.ssh - root:sshuserN rwxr-x---
/opt/chroot/home/sshuserN/.ssh/authorized_keys - root:sshuserN rw-r-----
/opt/chroot/home/sshuserN/dev/ - root:sshuserN rwxr-x---
/opt/chroot/home/sshuserN/etc/ - root:sshuserN rwxr-x---
/opt/chroot/home/sshuserN/etc/passwd - root:sshuserN rw-r-----
/opt/chroot/home/sshuserN/lib/ - root:sshuserN rwxr-x---
/opt/chroot/home/sshuserN/lib/libnss*_files*.so - root:sshuserN rwxr-x---*
/opt/chroot/home/sshuserN/lib/tls/ - root:sshuserN rwxr-x---
/opt/chroot/home/sshuserN/userarea/ - root:sshuserN rwxr-x---
/opt/chroot/home/sshuserN/userarea/upload/ - root:sshuserN rwxrwx---
/opt/chroot/home/sshuserN/userarea/download/ - root:sshuserN rwxr-x---
/opt/chroot/home/sshuserN/usr/ - root:sshuserN rwxr-x---
/opt/chroot/home/sshuserN/usr/kerberos/ - root:sshuserN rwxr-x---
/opt/chroot/home/sshuserN/usr/kerberos/lib/ - root:sshuserN rwxr-x---
/opt/chroot/home/sshuserN/usr/local/bin/rssh - root:sshuserN rwxr-x---
/opt/chroot/home/sshuserN/usr/local/bin/scp - root:sshuserN rwxr-x---
/opt/chroot/home/sshuserN/usr/local/libexec/rssh_chroot_helper - root:sshuserN rwxr-x---
/opt/chroot/home/sshuserN/usr/local/libexec/sftp-server - root:sshuserN rwxr-x---
* Die Bibliotheken sind notwendig, damit der User SCP verwenden kann.
Aus der /etc/passwd wird die entsprechende Zeile mit den Angaben zu sshuserN in die Datei /opt/chroot/home/sshuserN/etc/passwd kopiert.
In /etc/sysconfig/syslog werden für syslogd und für jeden SSH User in der Chrootumgebung zusätzliche Sockets angegeben (maximal 19):
SYSLOGD_OPTIONS="-m 0 -a /opt/chroot/dev/log -a /opt/chroot/home/sshuserN/dev/log"
Danach den syslogd neu starten:
$ service syslog restart
logfacility = LOG_name # name = Syslogkategorie, z. B. AUTH
# allowrsync # rsync erlauben
# allowrdist # rdist erlauben
# allowcvs # cvs erlauben
allowsftp # SFTP erlauben
allowscp # SCP erlauben
umask = 022 # Standard umask
chrootpath="/opt/chroot" # Standard chroot Verzeichnis
# User konfigurieren:
user="sshuserN:umask:nnnnn:/opt/chroot/home/sshuserN"
# n = 0|1 = Bits zur Deaktivierung|Freischaltung von rsync, rdist, cvs, SFTP und SCP (in der Reihenfolge)
z. B. 00011 = User kann nur SFTP und SCP nutzen.
Mit dem sftp-logging Patch kommen einige Optionen hinzu:
LogSftp yes # zusätzliche Informationen zu Kommandos, die der SFTP User ausführt, werden geloggt (Verzeichniswechsel, Löschen von Dateien, chmod, chown usw.)
SftpLogFacility AUTH # Syslog Kategorie festlegen
SftpLogLevel VERBOSE # Syslog Loggrad festlegen
SftpPermitChmod no # SFTP Usern ist chmod verboten
SftpPermitChown no # SFTP Usern ist chown verboten
SftpUmask # Vorgabe einer umask, die alle anderen überschreibt
sftp-server[397]: realpath /
sftp-server[397]: realpath /.ssh
sftp-server[397]: opendir /.ssh
sftp-server[397]: chown /.ssh/./authorized_keys: operation prohibited by sftp-server configuration.
Eine komplette Aufstellung der verwendeten Optionen erfolgt nicht, weil die Erfordernisse von System zu System abweichen werden.
## Groupnamen, denen Login erlaubt ist
AllowGroups sshusers sshuser1 sshuser2 sshuserN
## Usernamen, denen Login erlaubt ist
AllowUsers sshuser1 sshuser2 sshuserN
## Groupnamen, denen Login nicht erlaubt ist
DenyGroups root users
## Usernamen, denen Login nicht erlaubt ist
DenyUsers user1 user2 userN root
## nur Public Key Authentifizierung + Protokoll 2
ChallengeResponseAuthentication no
HostbasedAuthentication no
IgnoreRhosts yes
PasswordAuthentication no
PermitEmptyPasswords no
PermitUserEnvironment no
Protocol 2
PubkeyAuthentication yes
RhostsRSAAuthentication no
RSAAuthentication no
Um die SSH User daran zu hindern, den Plattenplatz durch Uploads vollständig auszunutzen, sollte man den Plattenplatz durch Quota beschränken. Als Beispiel soll für den SSH User sshuser1 Block User Quota eingerichtet werden. Auf ähnlichem Weg kann auch ein Gruppen Quota eingerichtet werden oder beides. Zur Information sind die entsprechenden Kommandos für Group Quota mit aufgeführt. Nähere Informationen findet man im Red Hat Red Hat Linux Customization Guide Kapitel 6 oder "man quota|quotacheck|quotaon|edquota|repquota".
| für User Quota | ||||
| LABEL=/opt | /opt | ext3 | defaults,usrquota | 1 2 |
| für Group Quota | ||||
| LABEL=/opt | /opt | ext3 | defaults,grpquota | 1 2 |
| Disk quotas for user sshuser1 (uid nnn): | ||||||
| Filesystem | blocks | soft | hard | inodes | soft | hard |
| /dev/hdN | 3720 | 102400 | 153600 | 47 | 0 | 0 |
OpenSSH bringt von Hause aus keine Funktionen zur Steuerung der Bandbreite mit wie alle bekannten FTP Server. Das mag für Anwender mit einer Standleitung weniger von Bedeutung sein. Für ADSL Flat Anwender, die in der Regel nur eine Uploadbandbreite von 128 Kb haben, aber schon. Um trotzdem eine Begrenzung des Uploads durch SFTP User zu erreichen, kann man auf die QoS Unterstützung des Kernels zurückgreifen und mit dem htb.init Script eine HTB (Hierachical Token Bucket) basierte Traffic Kontrolle für SSH/SFTP Transaktionen einrichten.