Über einen SFTP Server lassen sich Daten über standardisierte Verfahren speichern und abrufen. Die Technik für Server und Clients ist normalerweise Open Source und daher frei verfügbar.
Was wollen wir?
- Zugang per SFTP
- Zugriff nur auf einen dem Benutzer zugewiesenen Ordner, mit der Möglichkeit darin eigene Ordnerstrukturen anzulegen.
- Kein Zugriff auf Daten außerhalb des Ordner (chroot Jail)
- Keine Shell, also kein Zugriff per SSH
Methode 1: Internal SFTP
Diese Lösung zeigt die Einrichung eines einfachen SFTP-Servers mit chroot auf. Es gibt für diesen Einsatzzweck auch eine Lösung, die mehr Möglichkeiten bietet (z.B. Zugriff per ACL) und mit der ich gute Erfahrungen gemacht habe. Nennt sich mysecureshell. Leider scheint das Projekt eingeschlafen zu sein. Die Dokumentation ist nicht mehr ganz aktuell. In den Repositorys von Debian Jessy und Stretch ist es aber enthalten und wird offiziell gepflegt. Zur einrichtung siehe Methode 2.
Schritt 1: Gruppe und Benutzer einrichten
Wir erstellen eine Gruppe sftpbenutzer und einen Benutzer benutzer1. Der Gruppe erteilen wir später Zugriff auf das Verzeichnis /sftproot. Der Shellzugriff wird verweigert. Die Befehle können abgesetzt werden, ohne dass das Verzeichnis bereits existiert.
groupadd sftpbenutzer useradd -g sftpbenutzer -d /incoming -s /sbin/nologin benutzer1 passwd benutzer1
Einen bereits vorhandenen Benutzer könnten wir hierzu auch nehmen. Bitte beachten, dass wir für diesen Benutzer das Homedirectory ändern und den Shellzugriff verweigern.
usermod -g sftpbenutzer -d /sftproot -s /sbin/nologin alterbenutzer
Schritt 2: sshd_config anpassen
Hierfür schalten wir von dem Standardmäßig aktivem sftp-server auf den internal-sftp um.
# /etc/ssh/sshd_config #Subsystem sftp /usr/libexec/openssh/sftp-server Subsystem sftp internal-sftp
An das Ende der Konfigurationsdatei fügen wir die Parameter für das chroot-jail ein.
Match Group sftbenutzer ChrootDirectory /sftproot/%u ForceCommand internal-sftp PasswordAuthentication yes PermitTunnel no AllowAgentForwarding no AllowTcpForwarding no X11Forwarding no
Schritt 3: Verzeichnis erstellen und Berechtigungen vergeben
Wir haben den SSHD so konfiguriert, dass das chroot Verzeichnis /sftproot/Benutzername ist. Somit hat jeder Benutzer in der Gruppe sftpbenutzer sein eigenes chroot-jail. Die Benutzer der Gruppe können gegenseitig also keine Dateien austauschen.
mkdir /sftproot mkdir /sftproot/benutzer1 mkdir /sftproot/benutzer1/incoming chown root:root /sftproot chown root:root /sftp/benutzer1 chown benutzer1:sftpbenutzer /sftp/benutzer1/incoming chmod -R 755 /sftproot
Beim Anlegen des Benutzers haben wir als Homedirectory /incoming angegeben. Somit landet der Benutzer bei einer SFTP-Verbindung direkt im incoming Ordner. Da wir als chroot-jail /sftproot/%u angegeben haben kann er dann aus dem Verzeichnis imcoming heraus in das Unterverzeichnis wechseln. Aber nicht weiter in andere Verzeichnisse/Unterverzeichnisse.
Nun kann der SSHD neu gestartet werden
service sshd restart
Methode 2: mysecureshell
mysecureshell ist ein separat zu installierendes Softwarepaket, mit dem auch große SFTP-Server mit vielen Nutzerzugriffen möglich ist. Diese SOftware ist meiner Meinung nach generell der bevorzugte Weg eine SFTP Umgebung bereit zu stellen, da diese Lösung viel flexibler ist und gute Kontrollmöglichkeiten bietet. Für die Installation unter anderen Systemen bitte in der Dokumentation schauen.
Achtung: Logging bei neuster Version (2.0) defekt.
Auf einem Debian Server hatte ich damals die Version 1.31 compliliert. Nun gibt es mysecureshell in den offiziellen Repos von Debian. Daraus habe ich die neue Version installiert. Die Version 1.31 kam als CamelCase, die Binary war unter /usr/bin/MySecureShell zu finden. Die Version 2.0 war nicht mehr CamelCase und unter /usr/bin/mysecureshell zu finden. Nach der Umstellungen auf die neue Shell in /etc/passwd wurden Zugriffe nicht mehr in die konfigurierte Logdatei geschrieben. Testweise habe ich die neue Version dann auch mal in CamelCase umbenannt. Dann wurden wieder Logs geschrieben, doch die IP zu dem Zugriff hat gefehlt. Bei Gelegenheit muss ich mal testen, ob die neue Version auf einem sauberen Debian korrekt läuft oder ob das ein Bug ist. Die Version 2.0 ist übrigens vom 26.10.2014. Scheint nicht mehr entwicklet zu werden. Sehr traurig. Ist aber vielleicht auch nicht nötig, denn das hat bisher einfach prima funktioniert.
Update: Logging Funktioniert
Auf einem frisch aufgestezten Debian 9 (Stretch) funktioniert das Logging in der neuesten Version 2.0 wie gewünscht. Muss also mit der vorher per Sourcecode installierten Version zu tun gehabt haben.
Schritt 1: Installation
apt-get install mysecureshell chmod 4755 /usr/bin/mysecureshell
Schritt 2: Konfiguration
Dann die Konfigurationsdatei unter /etx/ssh/sftp_config anpassen. Das Ding ist wirklich flexibel und man kann einiges damit machen. Wir wollen hier aber einfach den Zugang zu einem Verzeichnis pro Benutzer erlauben.
<Group sftpbenutzer> Home /sftproot/$USER Download 500k Upload 500k StayAtHome true VirtualChroot true LimitConnectionByUser 3 LimitConnectionByIp 3 IdleTimeOut 300 HideNoAccess true LogFile /var/log/sftp-server.log </Group>
Schritt 3: Benutzer und Gruppe anlegen
Im Gegensatz zur Methode 1 geben wir hier den kompetten Pfad als Homedir ein und setzen als Shell die MySecureShell.
groupadd sftpbenutzer useradd -g sftpbenutzer -d /sftproot/benutzer1 -s /usr/bin/mysecureshell benutzer1 passwd benutzer1
Schritt 4: Verzeichnisse erstellen und Berechtigungen vergeben
mkdir /sftproot mkdir /sftproot/benutzer1 chown root:root /sftproot chown benutzer1:sftpbenutzer /sftp/benutzer1 chmod -R 755 /sftproot
Appendix A: Steuerung
Zur Steuerung der MySecureShell gibt es ein paar nützliche Kommandos:
/usr/bin/mysecureshell –configtest | Konfiguration prüfen (/etc/ssh/sftp_konfig) |
sftp-verif | Installation prüfen |
sftp-who | Auflistung der angemeldeten Clients |
sftp-state | SFTP Server Status |
sftp-kill | Benutzer abmelden |
sftp-user | SFTP Benutzer erstellen |
sftp-admin | SFTP Remote Managen (habe ich noch nicht getestet) |