Dateiablage mittels FTP + TLS

Hinweis:
Diese Seite gibt meinen Wissensstand von ca. 2014 wieder und sollte heutzutage nicht mehr als Blaupause für das Anlegen eines Fileservers genutzt werden. Für eine Anleitung, die erst später veraltet sein wird, bitte die übergeordnete Seite betrachten. ;-)

Als Nächstes widmen wir uns der Frage, wie die Daten auf den neu eingerichteten Server gelangen sollen. Wie bereits verraten soll zum Hochladen von Dateien FTP genutzt werden. Während das ursprüngliche FTP sowohl Login-Daten als auch Nutzdaten im Klartext überträgt, möchten wir eine sichere Übertragung implementieren. Dazu verwenden wir TLS (der Nachfolger von SSL). Eine grobe Übersicht zur Funktionsweise vermittelt der Wikipedia-Artikel zum Thema Transport Layer Security.

Ich habe mich für vsftpd als FTP-Server entschieden, weil ich mit diesem schon gute Erfahrung gemacht habe und die Einrichtung relativ simpel ist. Zunächst installieren wir also dieses Paket:

# pacman -S vsftpd

Als Nächstes legen wir ein SSL-Zertifikat und einen Server-Schlüssel an. Weil wir das Zertifikat nur für unsere eigenen Zwecke nutzen wollen, benötigen wir keine Signatur einer CA, sondern signieren es einfach mit dem eigenen Server-Schlüssel.

# openssl req -new -x509 -days 365 -sha1 -newkey rsa:1024 -nodes -keyout /etc/ssl/certs/vsftpd.pem -out /etc/ssl/certs/vsftpd.pem
[...]
# chmod 600 /etc/ssl/certs/vsftpd.pem
# openssl x509 -fingerprint -in /etc/ssl/certs/vsftpd.pem -noout
SHA1 Fingerprint=7C:E2:A8:C4:85:40:9E:1A:42:0D:1F:56:56:85:DC:FC:E3:DA:66:8F

Nach dem ersten Schritt werden einem viele Fragen gestellt, z.B. nach Land/Staat/Stadt/Organisation, die eigentlich keine Rolle spielen, solange man das Zertifikat nicht "für echt" nutzen, also von einer CA unterzeichnen lassen will.

Weil die Vielzahl an Parametern etwas verwirrend ist, hier eine kurze Erklärung:

req PKCS#10 X.509 Certificate Signing Request (CSR) Management. Über diesen Parameter sagt man openssl, was man überhaupt vorhat.
-x509 Hiermit drücken wir aus, dass ein selbst-signiertes Zertifikat erstellt werden soll, und kein Signing Request das an eine CA gesendet wird.
-days 365 Das ist die Gültigkeitsdauer des Zertifikats. Default-Wert ist 30 Tage, wir legen 1 Jahr fest.
-sha1 Gibt den Digest-Algorithmus an, mit dem das Zertifikat unterschrieben wird.
-newkey rsa:1024 Wir wollen auch einen neuen Schlüssel erzeugen. Dieser verwendet RSA mit 1024 Bits. 1024 habe ich deshalb genommen, weil ich das auch in allen anderen Tutorials so gesehen habe.
-nodes Gibt an, dass der neu erzeugte Schlüssel selbst unverschlüsselt abgelegt werden soll. Das ist notwendig, damit er automatisiert vom Server benutzt werden kann, anstatt jedesmal mit einer Passphrase entsperrt werden zu müssen.
-keyout <path> Gibt die Datei an, in der unser Schlüssel abgelegt wird.
-out <path> Gibt die Datei an, in der unser Zertifikat abgelegt wird.
-fingerprint Gibt zusätzlich den Fingerabdruck des Zertifikats aus.
-in <path> Gibt die Datei an, aus der das Zertifikat gelesen wird.
-noout Gibt das eigentliche Zertifikat nicht mit aus.

Das mit dem -noout ist etwas unerwartet. Gibt man es nicht an, spuckt openssl x509 immer das gesamte Zertifikat mit aus. Da wir aber nur am Fingerprint interessiert sind, geben wir -noout an.

Wir haben hier übrigens sowohl den Schlüssel als auch das Zertifikat in der selben Datei abgelegt. Je nach Tutorial wird das unterschiedlich gehandhabt. Für uns macht das eigentlich keinen Unterschied, weil wir das Zertifikat ohnehin nicht separat verteilen wollen und durch das chmod jetzt beide Teile gleich gut geschützt haben.

Jetzt nehmen wir uns die Konfiguration des FTP-Servers vor:

# vi /etc/vsftpd.conf

anonymous_enable=NO
local_enable=YES
write_enable=YES
userlist_enable=YES
userlist_file=/etc/vsftpd.user_list
userlist_deny=NO
local_root=/mnt/files
ssl_enable=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
rsa_cert_file=/etc/ssl/certs/vsftpd.pem
rsa_private_key_file=/etc/ssl/certs/vsftpd.pem

Die Manpage vsftpd.conf(5) ist ein gutes Beispiel für eine ordentliche Dokumentation. Hier sind alle Anweisungen ausführlich beschrieben. Die folgende Tabelle liefert eine kurze Übersicht zu dem, das ich hinzugefügt habe.

anonymous_enable=NO Nur Benutzer mit gültigem Account können sich einloggen (kein Anonymous FTP).
local_enable=YES Benutzer mit Account im lokalen System (z.B. felix) können sich mit diesen Daten anmelden.
write_enable=YES Schreibzugriffe werden grundsätzlich unterstützt.
userlist_enable=YES Etwas verwirrend: diese Option besagt nur, dass die als userlist_file angegebene Datei ausgewertet wird. Wie diese wirkt wird allerdings durch userlist_deny definiert.
userlist_file Datei mit Benutzernamen.
userlist_deny=NO Steht diese Option auf NO, wird userlist_file als Positiv-Liste ausgewertet, d.h. nur dort aufgeführte Benutzer dürfen sich einloggen. Steht die Option auf YES (was Default ist) werden die Benutzer aus der Liste abgelehnt und alle anderen erlaubt.
local_root Gibt das Verzeichnis an, in das beim Einloggen automatisch gewechselt wird. Wenn das nicht klappt stellt dies keinen Fehler dar. Außerdem kann der Benutzer in jedes beliebige höherliegende Verzeichnis wechseln (es ist also nicht mit einer Chroot-Umgebung zu verwechseln).
ssl_enable=YES SSL aktivieren.
force_local_logins_ssl=YES Erzwingt SSL bzw. TLS. Versucht der Client sich mit "normalem" FTP anzumelden erhält er die Meldung "530 Non-anonymous sessions must use encryption.".
ssl_tlsv1=YES TLSv1-Verbindungen erlauben.
ssl_sslv2=NO SSLv2 nicht zulassen (wir wollen TLSv1 erzwingen).
ssl_sslv3=NO SSLv3 nicht zulassen (wir wollen TLSv1 erzwingen).
rsa_cert_file Pfad zum Zertifikat.
rsa_private_key_file Pfad zum Private Key.

Damit das Ganze jetzt auch funktioniert, legen wir ein passendes Verzeichnis an. Dieses soll nur für den Benutzer felix les- und schreibbar sein. Die Default-Einstellung für local_umask in vsftpd ist 077, d.h. neu angelegte Dateien und Verzeichnisse werden ebenfalls maximal 700 (les-, schreib- und ausführbar für den Besitzer).

# mkdir /mnt/files
# chown felix:users /mnt/files
# chmod 700 /mnt/files/

Als Nächstes wird noch die Benutzerliste angelegt und der Service gestartet. Danach sollte der Zugriff für den Benutzer felix mit dem lokalen Unix-Passwort funktionieren.

# echo felix > /etc/vsftpd.user_list
# systemctl start vsftpd.service

Weitere Informationen zum Einrichten von vsftpd findet man im passenden ArchWiki-Artikel


Zurück zur Hauptseite