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