Ü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 –configtestKonfiguration prüfen (/etc/ssh/sftp_konfig)
sftp-verifInstallation prüfen
sftp-whoAuflistung der angemeldeten Clients
sftp-stateSFTP Server Status
sftp-killBenutzer abmelden
sftp-userSFTP Benutzer erstellen
sftp-adminSFTP Remote Managen (habe ich noch nicht getestet)