vsftpd
Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:
Ubuntu 22.04 Jammy Jellyfish
Ubuntu 20.04 Focal Fossa
Du möchtest den Artikel für eine weitere Ubuntu-Version testen? Mitarbeit im Wiki ist immer willkommen! Dazu sind die Hinweise zum Testen von Artikeln zu beachten.
Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:
vsftpd 🇬🇧 ist ein FTP-Server, der sehr bewusst auf Sicherheit ausgelegt ist. So überprüft das Programm z.B. vor dem Start seine eigene Konfiguration und die Rechte aller Dateien auf die es zugreifen soll und verweigert den Start bei einer eventuell falschen Konfiguration.
Des Weiteren ist vsftpd der einzige FTP-Server im "main"-Zweig der Ubuntu-Distribution, d.h. er wird garantiert gepflegt und mit Sicherheitsupdates versorgt. Bei anderen FTP-Servern aus den "universe/multiverse"-Zweigen muss dies nicht der Fall sein.
Zu guter Letzt ist vsftpd sehr einfach einzurichten. Ohne umständliche Konfigurationsdateien zu wälzen, kann man die lokalen Benutzer auf ihr Homeverzeichnis zugreifen lassen oder einen anonymen FTP-Zugang einrichten.
Hinweis:
Der Server vsftpd unterstützt die Protokolle FTP und FTPS (= FTP mit SSL), aber nicht das Protokoll SFTP. SFTP hat nichts mit FTP zu tun und wird vom SSH-Server verwendet.
Die Protokolle FTP und FTPS gelten als veraltet und unsicher. Statt dieser sollte besser SFTP eingesetzt werden.
Installation¶
vsftpd kann direkt aus den Ubuntu-Quellen installiert werden. Dazu ist lediglich das folgende Paket zu installieren [1]:
vsftpd
Befehl zum Installieren der Pakete:
sudo apt-get install vsftpd
Oder mit apturl installieren, Link: apt://vsftpd
Konfiguration¶
Nach der Installation muss die Konfigurationsdatei /etc/vsftpd.conf an die eigenen Bedürfnisse mit einem Editor [3] angepasst werden. Die Datei ist ausführlich kommentiert. Die wichtigsten Einstellungen werden trotzdem im folgenden erklärt.
Anonyme Logins zulassen¶
vsftpd ist von Haus aus so konfiguriert, dass anonyme Benutzer sich nicht einloggen dürfen. Durch Editieren der Datei /etc/vsftpd.conf kann der anonyme Zugriff aber leicht aktiviert werden. Anschließenden startet man nur den vsftp Dämon neu, wie im Abschnitt Server starten / stoppen beschrieben.
Lokale Benutzer zulassen¶
Die Standardeinstellung von vsftp ist, dass sich lokale Benutzer per ftp einloggen dürfen. Möchte man dies deaktivieren, so muss man die Option "local_enable=YES" wieder auskommentieren:
# Uncomment this to allow local users to log in. #local_enable=YES
Zugriff auf Benutzer beschränken¶
Bestimmte Nutzer erlauben¶
Um nur bestimmten Benutzern den Login via FTP zu erlauben, müssen folgende Optionen gesetzt werden:
userlist_deny=NO userlist_enable=YES userlist_file=/etc/vsftpd.user_list
Bestimmte Nutzer verbieten¶
Um bestimmten Benutzern den Login via FTP zu verbieten, müssen folgende Optionen gesetzt werden (In diesem Fall wird den restlichen Benutzern der Login gewährt):
userlist_deny=YES userlist_enable=YES userlist_file=/etc/vsftpd.user_list
Die Nutzer werden in beiden Fällen folgendermaßen in die Datei /etc/vsftpd.user_list eingetragen:
nutzer1 nutzer2 nutzer3
Globales Schreiben (de-)aktivieren¶
In der Basiskonfiguration darf kein Benutzer per ftp schreiben. Weder lokale Benutzer (wenn sie per "local_enable=YES" zugelassen wurden), noch anonyme Benutzer. Erst wenn die Option
# Uncomment this to enable any form of FTP write command. write_enable=YES
aktiviert wurde, dürfen per ftp eingeloggte Benutzer schreiben.
Anonymen Benutzern das Schreiben, Löschen und Herunterladen erlauben¶
Achtung!
Diesen Schritt sollte man nur tun, wenn der FTP-Server keinen Zugang zum Internet hat, sonst muss man sich nicht wundern, wenn der Server früher oder später im Internet entdeckt und für illegale Zwecke missbraucht wird.
Damit anonyme User auf dem FTP-Server Dateien erstellen, löschen und herunterladen können, müssen noch folgende Optionen in die /etc/vsftpd.conf [3] eingetragen werden:
anon_upload_enable=YES anon_other_write_enable=YES anon_mkdir_write_enable=YES anon_world_readable_only=NO
Daten der anonymen Benutzer werden in /home/ftp abgelegt. Anonyme Benutzer können jedoch nicht direkt in /home/ftp schreiben. Nur in einem Verzeichnis, das man mit den richtigen Rechten anlegen muss. Als Beispiel wird ein "upload"-Verzeichnis angelegt.
sudo mkdir -p /home/ftp/upload sudo chmod 777 /home/ftp/upload
Danach können anonyme Benutzer in /home/ftp/upload Daten ablegen.
Anonymen Benutzern das Erstellen von Verzeichnissen erlauben¶
Soll es anonymen Benutzern erlaubt sein Verzeichnisse anzulegen, so muss man ihnen dazu ebenfalls das Recht extra einräumen. Per Default ist diese Option deaktiviert.
# Uncomment this if you want the anonymous FTP user to be able to create # new directories. anon_mkdir_write_enable=YES
Lokale Benutzer auf ihr Homeverzeichnis beschränken¶
Die letzte wichtige Option wäre es, die lokalen Benutzer auf ihr Homeverzeichnis - also /home/benutzername - zu beschränken.
# You may restrict local users to their home directories. See the FAQ for # the possible risks in this before using chroot_local_user or # chroot_list_enable below. chroot_local_user=YES
Der Kommentar bezüglich der möglichen - sehr leichten - Schwachstelle wird in der FAQ 🇬🇧 von vsftpd beantwortet.
Wer den FTP-Nutzern dennoch den Zugriff auf Daten, die an anderer Stelle gespeichert sind, ermöglichen möchte, kommt mit einem Link zum entsprechenden Ordner nicht weit. Stattdessen kann man aber mit mount und der Option --bind den Ordner an gewünschter Stelle ein weiteres mal einbinden.
Weitere Optionen¶
Neben diesen Standardoptionen, die absolut ausreichen, einen einfachen FTP-Server einzurichten, gibt es noch weitere Optionen, die in der /etc/vsftpd.conf eingefügt werden können. Eine vollständige Liste aller Optionen bekommt man in der Man-Page der Konfigurationsdatei.
man vsftpd.conf
Da die Hilfeseite auf englisch ist, folgt hier eine Aufstellung der wichtigsten Optionen. Alle aufgeführten Optionen können nach dem Muster option=WERT
zur Konfiguration hinzugefügt werden. Ist eine Option nicht in der vsftpd.conf aufgeführt, so wird immer der in der zweiten Spalte angegebene Standardwert genutzt.
Logische Optionen¶
Option | Standardwert | Beschreibung |
download_enable | YES | Falls man hier NO einsetzt, so sind nur Uploads möglich |
force_anon_logins_ssl | NO | Wenn ssl_enable aktiviert ist, so werden anonyme Benutzer gezwungen, sich über eine SSL-Verbindung einzuloggen. |
force_local_data_ssl | NO | Wenn ssl_enable aktiviert ist, so werden nicht-anonymen Benutzer gezwungen, sich über eine SSL-Verbindung einzuloggen. |
force_local_logins_ssl | NO | Wenn ssl_enable aktiviert ist, so werden lokalen Benutzer gezwungen, sich über eine SSL-Verbindung einzuloggen. |
ssl_enable | NO | Aktiviert die Möglichkeit, sich über SSL auf dem FTP-Server einzuloggen. |
ssl_sslv2 | NO | Wenn ssl_enable aktiviert ist, so erlaubt diese Option auch Logins über SSLv2 zuzulassen. |
userlist_enable | NO | Falls diese Option aktiviert ist, so werden Benutzer, die in userlist_file aufgeführt sind, vom FTP-Server abgelehnt, bevor sie ihr Passwort eingeben können. So wird verhindert, dass diese Benutzer ihr Passwort im Klartext übertragen. |
userlist_deny | YES | Diese Option wird ausgewertet, wenn userlist_enable aktiviert ist. Ist diese Option auf NO gesetzt, so werden alle Benutzer abgelehnt, es sei denn sie werden in userlist_file aufgeführt. Diese Option dreht also userlist_enable logisch um. |
Numerische Optionen¶
Option | Standardwert | Beschreibung |
anon_max_rate | 0 | Die maximale Übertragungsgeschwindigkeit in byte/sekunde für anonyme Benutzer. 0 bedeutet unlimitiert. |
local_max_rate | 0 | Die maximale Übertragungsgeschwindigkeit in byte/sekunde für lokale Benutzer. 0 bedeutet unlimitiert. |
ftp_data_port | 20 | Angabe für den FTP-Data-Port. |
listen_port | 21 | Angabe für den FTP-Control-Port. |
max_clients | 0 | Maximale Anzahl der Client, die am FTP-Server angemeldet sein dürfen. |
max_per_ip | 0 | Maximale Anzahl der Verbindungen von einer IP. |
pasv_min_port | 0 | Minimale Portnummer, die bei einer passiven Übertragung genutzt wird. |
pasv_max_port | 0 | Maximale Portnummer, die bei einer passiven Übertragung genutzt wird. |
local_unmask | 077 | Wert für die umask bei neu erstellten Ordnern und Dateien. |
String Optionen¶
Option | Standardwert | Beschreibung |
anon_root | /home/ftp | Verzeichnis, in das anonyme Benutzer geleitet werden. |
userlist_file | /etc/vsftpd.user_list | Name und Pfad zur Datei, die ausgelesen wird, wenn die Option userlist_enable aktiviert ist. |
Überwachen¶
Über Log-Datei¶
vsftp schreibt ein ausführliches Log über alle Logins und Schreibvorgänge. Dieses muss allerdings zunächst aktiviert werden, in dem man in /etc/vsftpd.conf folgende Einstellung aktiviert:
# You may override where the log file goes if you like. The default is shown # below. xferlog_file=/var/log/vsftpd.log
Nach dem Neustart des Servers findet man die Log-Datei unter /var/log/vsftpd.log. Möchte man z.B. die aktuellen Aktivitäten ansehen, so kann man in einem Terminal [2] mit dem Befehl
sudo tail -f /var/log/vsftpd.log
den Verlauf des Logs begutachten.
Über System-Prozessliste¶
Ist die logische Option setproctitle_enable=YES in der Konfigurationsdatei /etc/vsftpd.conf gesetzt, schreibt vsftpd Statusinformationen in die System-Prozessliste. Der folgende Befehl in einem Terminal [2] zeigt diese Statusinformationen annähernd in Echtzeit an:
watch ps -C vsftpd -o user,pid,stime,cmd
SSL-Zertifikat erzeugen¶
Um gesicherte SSL-Verbindungen nutzen zu können muss nach der Installation noch ein Zertifikat erzeugt werden:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.key -out /etc/ssl/private/vsftpd.pem
Hierbei einfach alle Fragen beantworten, anschließend steht das Zertifikat zur Verfügung.
Server starten/stoppen¶
Manuell starten/stoppen¶
Das manuelle Starten und Stoppen erfolgt über systemctl, welches Teil von systemd ist:
# Allgemein sudo systemctl {start|stop|restart|status} vsftpd # Beispiel: vsftpd starten sudo systemctl start vsftpd
Dies lässt sich automatisieren, indem die entsprechenden Programmstarter ins Verzeichnis /usr/share/applications/ (systemweit) bzw. ~/.local/share/applications/ (nur für den lokalen Benutzer) platziert werden:
/usr/share/applications/vsftpd-start.desktop
[Desktop Entry] Name=vsFTPd server start Comment=Starts Very Secure FTP Daemon Exec=sudo systemctl start vsftpd.service Terminal=true Icon=/usr/share/icons/gnome/32x32/status/network-idle.png Type=Application Categories=System;
/usr/share/applications/vsftpd-stop.desktop
[Desktop Entry] Name=vsFTPd server stop Comment=Stop Very Secure FTP Daemon Exec=sudo systemctl stop vsftpd.service Terminal=true Icon=/usr/share/icons/gnome/32x32/status/connect_no.png Type=Application Categories=System;
Dann lässt sich der vsftpd-Server über den Menüeintrag "Anwendungen → Systemwerkzeuge → vsFTPd server start" starten und über den Menüeintrag "Anwendungen → Systemwerkzeuge → vsFTPd server stop" stoppen (im aufpoppenden Terminal-Fenster muss noch ein Benutzer-Passwort für den Befehl sudo
eingegeben werden).
Dauerhaft deaktivieren¶
Nach der Installation wird vsftpd automatisch beim Hochfahren des Computers gestartet. Es ist ratsam, den Server nicht permanent sondern nur dann laufen lassen, wenn er tatsächlich benötigt wird. Dafür soll man ihn dauerhaft deaktivieren:
Prüfen, ob der Server dauerhaft aktiviert ist:
systemctl is-enabled vsftpd.service
Den Server deaktivieren:
sudo systemctl disable vsftpd.service
Prüfen, ob der Server deaktiviert ist:
systemctl is-enabled vsftpd.service
Falls die Ausgabe lautet "disabled", ist der Server tatsächlich dauerhaft deaktiviert.
Man kann auch den Status abfragen:
systemctl status vsftpd.service
Beim deaktivierten Server sieht dann die Status-Ausgabe so aus:
● vsftpd.service - vsftpd FTP server Loaded: loaded (/lib/systemd/system/vsftpd.service; disabled; vendor preset: enabled) Active: inactive (dead)
Mit dem Befehl kann der vsftpd-Daemon wieder dauerhaft aktiviert werden:
sudo systemctl enable vsftpd.service
FTP-Benutzer ohne Shellzugang¶
Möchte man nicht, dass die erstellten Benutzer auch via SSH auf den Rechner zugreifen können, so muss die Shell des Benutzers in der /etc/passwd auf /bin/false gesetzt werden. Zum Beispiel:
user:x:1000:1000::/srv/ftp/user:/bin/false
Wenn es danach Probleme beim FTP-Login geben sollte (530 Login incorrect), liegt das daran, dass /bin/false nicht als Shell im System hinterlegt ist. Dann muss die Shell noch in die Datei /etc/shells eingetragen werden.
Probleme¶
Fehler "refusing to run with writable root"¶
Ein mögliches Problem könnte diese Meldung sein:
1 | 500 OOPS: vsftpd: refusing to run with writable root inside chroot() |
Das ist kein Fehler sondern ein Sicherheitsfeature
> The official reason is “Disallow login with writable root directory because of possible glibc vulnerabilities”
Übersetzung: Login verweigern, sollte das root directory beschreibbar sein, wegen der möglichen Verwundbarkeiten der glibc Bibliothek.
Lösung "refusing to run with writable root"¶
(Referenz: Forum Link uu-Forum) entweder
patchen siehe 4557407
oder
Rechte ändern - Konfiguration so ändern, dass wieder schreiben möglich ist...
oder
Unterordner verwenden - Änderungen nur in einem Unterordner erlauben
Rechte ändern¶
einfach
allow_writeable_chroot=YES
in die vsftpd.conf einfügen.
Achtung!
das ermöglicht aber wieder das Beschreiben des root und ist ein mögliches Sicherheitsrisiko!
Unterordner verwenden¶
Hierzu wird zunächst ein Unterordner angelegt. Anschließend werden die Rechte so geändert, so dass Dateien nur in dem Unterordner abgelegt werden können. Dies ermöglicht die Funktion ohne Sicherheitseinbußen.
mkdir -p /home/BENUTZERNAME/upload chmod 550 /home/BENUTZERNAME chmod 750 /home/BENUTZERNAME/upload
Links¶
Projektseite 🇬🇧
FAQ 🇬🇧
FTP-Server/FTPS-Server einrichten 🇩🇪 - Tutorial: Grundeinrichtung, Absicherung mit Zertifikaten, separate FTP User anlegen, Schreibzugriffe anpassen (FTP-Wurzelverzeichnis) sowie Client Zugriffsmöglichkeiten.