Wie installiert und konfiguriert man einen FTP-Server (vsftpd) mit SSL/TLS unter Ubuntu 20.04
FTP oder File Transfer Protocol ist ein sehr altes bekanntes Protokoll zur Übertragung von Dateien zwischen einem Client und einem Server. Es ist auch nur dann ein unsicheres Protokoll, wenn es ohne TLS verwendet wird. In diesem Tutorial werden wir vsftpd für TLS konfigurieren, was uns erlaubt, FTP sicher zu benutzen. FTP ist heutzutage oft durch sicherere Protokolle wie SFTP oder SCP ersetzt worden.
Wenn Sie jedoch FTP mit Ihrem Server verwenden müssen, ist vsftpd (Very Secure FTP Daemon) eine perfekte Wahl.
In diesem Tutorial werden wir lernen, wie man einen FTP-Server mit vsftpd auf einem Ubuntu 20.04-basierten Server installiert und konfiguriert. Wir werden auch lernen, wie man die Verbindung mit dem SSL/TLS-Protokoll sichert.
Voraussetzungen
- Ein Ubuntu 20.04-Server mit einem Nicht-Root-Benutzer mit sudo-Privilegien.
Schritt 1 – vsftpd installieren
Der erste Schritt ist die Installation von vsftpd.
$ sudo apt update
$ sudo apt install vsftpd
Als nächstes müssen wir die ursprüngliche Konfigurationsdatei sichern, damit wir mit einer neuen Konfiguration beginnen können.
$ sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig
Schritt 2 – Konfigurieren der Firewall
In diesem Schritt werden wir die UFW-Firewall so konfigurieren, dass sie den Zugriff auf die FTP-Ports erlaubt.
Zunächst überprüfen wir den Status der Firewall.
$ sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Wie wir sehen können, sind bisher nur SSH-Ports erlaubt. Öffnen wir die Ports 20 (FTP-Befehlsport), 21 (FTP-Datenport), 990 für den Fall, dass wir TLS verwenden, und die Ports 35000-40000 für den Bereich der passiven Ports, die wir in Zukunft möglicherweise benötigen.
$ sudo ufw allow 20:21/tcp
$ sudo ufw allow 990/tcp
$ sudo ufw allow 35000:40000/tcp
$ sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
990/tcp ALLOW Anywhere
20:21/tcp ALLOW Anywhere
35000:40000/tcp ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
20:21/tcp (v6) ALLOW Anywhere (v6)
990/tcp (v6) ALLOW Anywhere (v6)
35000:40000/tcp (v6) ALLOW Anywhere (v6)
Schritt 3 – Konfigurieren von vsftpd
Wir werden nun einige wichtige Einstellungen durchgehen, damit vsftpd funktionieren kann.
Beginnen Sie mit dem Öffnen der Konfigurationsdatei.
$ sudo nano /etc/vsftpd.conf
1. FTP-Zugang
In diesem Tutorial werden wir den FTP-Zugang nur den lokalen Benutzern erlauben und jeglichen anonymen Zugang deaktivieren. Um dies zu tun, stellen Sie sicher, dass die folgenden Zeilen existieren und wie folgt lauten.
anonymous_enable=NO
local_enable=YES
2. Aktivieren von Datei-Uploads
Der wichtigste Zweck von FTP ist hier die Möglichkeit, auf den Server schreiben zu können. Unkommentieren Sie die folgende Zeile, um Datei-Uploads zu ermöglichen, indem Sie #
davor entfernen.
write_enable=YES
3. Chroot-Gefängnis
FTP funktioniert am besten, wenn ein Benutzer auf ein bestimmtes Verzeichnis beschränkt ist. vsftpd erreicht dies durch die Verwendung von Chroot-Gefängnissen. Wenn chroot für lokale Benutzer aktiviert ist, sind sie standardmäßig auf ihre Heimatverzeichnisse beschränkt. Um dies zu erreichen, kommentieren Sie die folgende Zeile aus.
chroot_local_user=YES
Um jegliche Sicherheitslücke zu vermeiden, funktioniert chroot, wenn es aktiviert ist, nicht, solange das Verzeichnis, auf das die Benutzer beschränkt sind, beschreibbar ist.
Um diese Einschränkung zu umgehen, haben wir zwei Methoden, um Datei-Uploads zu erlauben, wenn chroot aktiviert ist.
- Methode 1 – Diese Methode funktioniert, indem ein anderes Verzeichnis für FTP-Uploads verwendet wird. Für dieses Tutorial werden wir ein Verzeichnis
ftp
im Haus des Benutzers als Chroot-Verzeichnis und ein zweites beschreibbares Verzeichnisupload
zum Hochladen der Dateien erstellen. Um dies zu erreichen, fügen Sie die folgenden Zeilen am Ende der Datei hinzu.user_sub_token=$USER local_root=/home/$USER/ftp
- Methode 2 – Die zweite Methode besteht darin, einfach beschreibbaren Zugriff auf das Home-Verzeichnis als Ganzes zu gewähren. Fügen Sie dazu die folgende Zeile hinzu.
allow_writeable_chroot=YES
4. Passives FTP
vsftpd kann jeden Port für passive FTP-Verbindungen verwenden. Wir können einen Bereich für die minimale und maximale Portnummer angeben, die vsftpd verwenden kann. Dies sind die Ports, die wir zuvor in unserer UFW-Firewall konfiguriert haben.
Fügen Sie die folgenden Zeilen hinzu, um passive FTP-Verbindungen zuzulassen.
pasv_min_port=35000
pasv_max_port=40000
5. Benutzer einschränken
Damit sich nur bestimmte Benutzer am FTP-Server anmelden können, fügen Sie unten die folgenden Zeilen hinzu.
userlist_enable=YES
userlist_file=/etc/vsftpd.userlist
userlist_deny=NO
Wenn diese Option aktiviert ist, müssen wir angeben, welche Benutzer FTP verwenden dürfen, und ihre Benutzernamen in der Datei /etc/vsftpd.userlist
hinzufügen.
Starten Sie vsftpd neu, um die Konfiguration zu aktivieren.
$ sudo systemctl restart vsftpd
Schritt 4 – Benutzerverzeichnis konfigurieren
Für die Zwecke dieses Tutorials werden wir ein neues Benutzerkonto für FTP-Transaktionen erstellen. Wenn Sie bereits ein Benutzerkonto für diesen Zweck haben, können Sie Schritt 1 überspringen. Auch wenn Sie zuvor allow_writeable_chroot=YES
in der Konfigurationsdatei eingestellt hatten, können Sie Schritt 3 überspringen.
Schritt 1 – Hinzufügen eines neuen Benutzers.
$ sudo adduser testuser
Legen Sie ein sicheres Passwort fest und überspringen Sie alle anderen Eingabeaufforderungen.
Schritt 2 – Fügen Sie den Benutzer zur Liste der zulässigen FTP-Benutzer hinzu.
$ echo "testuser" | sudo tee -a /etc/vsftpd.userlist
Schritt 3 – FTP- und Dateiverzeichnis erstellen
Dieser Schritt erfolgt, wenn Sie ein anderes Verzeichnis als FTP-Root und ein anderes für das Hochladen von Dateien wünschen, um die Beschränkung des Chroot-Gefängnisses zu umgehen.
Erstellen Sie den FTP-Ordner.
$ sudo mkdir /home/testuser/ftp
Legen Sie seine Eigentümerschaft fest.
$ sudo chown nobody:nogroup /home/testuser/ftp
Entfernen Sie die Schreibberechtigungen.
$ sudo chmod a-w /home/testuser/ftp
Überprüfen Sie die Berechtigungen, bevor Sie fortfahren.
$ sudo ls -al /home/testuser/ftp
total 8
dr-xr-xr-x 2 nobody nogroup 4096 Jun 7 13:08 .
drwxr-xr-x 3 testuser testuser 4096 Jun 7 13:08 ..
Lassen Sie uns nun das eigentliche beschreibbare Verzeichnis für die Dateien erstellen.
$ sudo mkdir /home/testuser/ftp/upload
$ sudo chown testuser:testuser /home/testuser/ftp/upload
Testen Sie die Berechtigungen.
$ sudo ls -al /home/testuser/ftp
total 12
dr-xr-xr-x 3 nobody nogroup 4096 Jun 7 13:10 .
drwxr-xr-x 3 testuser testuser 4096 Jun 7 13:08 ..
drwxr-xr-x 2 testuser testuser 4096 Jun 7 13:10 upload
Zum Schluss fügen wir eine test.txt
Datei zum Testen hinzu.
$ echo "vsftpd test file" | sudo tee /home/testuser/ftp/upload/test.txt
Schritt 5 – FTP-Zugang testen
Unser FTP-Server ist zu diesem Zeitpunkt voll funktionsfähig. Wir können einen kleinen Test durchführen, bevor wir weitermachen.
Lassen Sie uns versuchen, uns als anonymer Benutzer anzumelden.
$ ftp -p 136.244.105.99
Connected to 136.244.105.99.
220 (vsFTPd 3.0.3)
Name (136.244.105.99:default): anonymous
530 Permission denied.
ftp: Login failed.
ftp>
Schließen Sie die Verbindung.
ftp> bye
Es funktioniert wie vorgesehen, d.h. anonyme Benutzer sind nicht erlaubt.
Lassen Sie uns versuchen, uns wie jeder andere sudo-Benutzer anzumelden. Die Verbindung sollte nicht so gut funktionieren.
$ ftp -p 136.244.105.99
Connected to 136.244.105.99.
220 (vsFTPd 3.0.3)
Name (136.244.105.99:default): sudo_user
530 Permission denied.
ftp: Login failed.
ftp>
Schließen Sie die Verbindung.
ftp> bye
Lassen Sie uns schließlich versuchen, uns als testuser
zu verbinden, das wir für FTP erstellt haben.
$ ftp -p 136.244.105.99
Connected to 136.244.105.99.
220 (vsFTPd 3.0.3)
Name (136.244.105.99:default): testuser
331 Please specify the password.
Password: your_user's_password
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
Wechseln wir in das Verzeichnis upload
und benutzen den Befehl get
, um die Testdatei auf unseren lokalen Rechner zu übertragen.
ftp> cd upload
250 Directory successfully changed.
ftp> get test.txt
227 Entering Passive Mode (136,244,105,99,165,42).
150 Opening BINARY mode data connection for test.txt (17 bytes).
226 Transfer complete.
16 bytes received in 0.0101 seconds (164.3719 kB/s)
ftp>
Als nächstes laden wir die Datei mit einem neuen Namen hoch und verwenden den Befehl put
, um die Schreibrechte zu testen.
ftp> put test.txt upload.txt
227 Entering Passive Mode (136,244,105,99,163,102).
150 Ok to send data.
226 Transfer complete.
17 bytes sent in 0.000894 seconds (518.7988 kB/s)
Schließen Sie die Verbindung.
ftp> bye
Schritt 6 – Sichern der Übertragungen mit SSL/TLS
Um die FTP-Übertragungen zu verschlüsseln, benötigen wir ein SSL-Zertifikat und müssen vsftpd so konfigurieren, dass es verwendet wird.
Wenn Sie bereits eine Domain oder Subdomain haben, die auf Ihren FTP-Server zeigt, können Sie ein kostenloses Let’s Encrypt SSL-Zertifikat erstellen und dieses verwenden.
Für die Zwecke unseres Tutorials werden wir ein selbstsigniertes SSL-Zertifikat verwenden. Um eines zu erstellen, verwenden Sie den Befehl openssl
.
Der folgende Befehl erstellt einen 2048-bit privaten Schlüssel und ein Zertifikat mit einer Gültigkeit von 1 Jahr. Sowohl das Zertifikat als auch der Schlüssel werden in derselben Datei gespeichert.
$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem
Sie können entweder die folgenden Eingabeaufforderungen überspringen oder die Werte nach Ihren Wünschen ausfüllen.
Nun, da unser Zertifikat erstellt ist, ist es an der Zeit, die vsftpd-Konfigurationsdatei erneut zu öffnen.
$ sudo nano /etc/vsftpd.conf
Suchen Sie die folgenden Zeilen und kommentieren Sie sie aus, indem Sie ihnen wie folgt einen Hash voranstellen.
# rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
# rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
Fügen Sie nun die folgenden Zeilen hinzu.
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
Ändern Sie auch den Wert von ssl_enable
in YES
.
ssl_enable=YES
Lassen Sie uns ein paar weitere Einstellungen hinzufügen, um die SSL-Sicherheit zu verbessern.
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
require_ssl_reuse=NO
ssl_ciphers=HIGH
Die meisten dieser Einstellungen sind selbsterklärend. Sie deaktivieren SSL für anonyme Benutzer und verlangen SSL sowohl für die Datenübertragung als auch für Anmeldungen. Wir haben auch unsichere SSL-Protokolle deaktiviert und werden an TLSv1.0 festhalten. Und schließlich haben wir die Wiederverwendung von SSL deaktiviert und verlangen Chiffrier-Suites mit hoher Verschlüsselung.
Starten Sie den Server neu, damit die Einstellungen wirksam werden.
$ sudo systemctl restart vsftpd
Jetzt können Sie FTP nicht mehr über die Befehlszeile verwenden. Sie müssen eine Verbindung mit einem Client herstellen, der TLS unterstützt.
Schritt 7 – Testen von TLS mit FileZilla
Für unser Tutorial werden wir die TLS-Fähigkeit mit Filezilla testen.
Wenn Sie Filezilla öffnen, klicken Sie auf das Site Manager-Symbol direkt über dem Wort Host in der oberen Zeile.
Es öffnet sich ein neues Fenster. Klicken Sie auf die Schaltfläche New Site in der unteren rechten Ecke.
Es wird ein neues Symbol mit dem Namen New site angezeigt. Sie können es mit der Schaltfläche Umbenennen umbenennen.
Füllen Sie das Feld Host mit der IP-Adresse Ihres Servers aus. Da unser FTP-Port 21 ist, was der Standard-Port für FTP ist, können Sie das Port-Feld leer lassen. Wählen Sie für die Option Verschlüsselung die Option Explizites FTP über TLS erfordern aus dem Dropdown-Menü.
Geben Sie Ihren FTP-Benutzernamen und Ihr FTP-Passwort mit denen ein, die wir oben erstellt haben. Klicken Sie auf die Schaltfläche Verbinden, um fortzufahren.
Nach erfolgreicher Verbindung sehen Sie ein Server-Zertifikat, das wie folgt aussieht
Sie können die Option Diesem Zertifikat in zukünftigen Sitzungen immer vertrauen. aktivieren, damit Sie nicht jedes Mal beim Einloggen gefragt werden. Klicken Sie auf Ok, um fortzufahren.
Sie können nun normale FTP-Operationen durchführen.
Schritt 8 – Deaktivieren des Shell-Zugriffs
Dieser Schritt ist völlig freiwillig. Standardmäßig hat der Benutzer beim Anlegen eines FTP-Benutzers, wenn nicht explizit angegeben, SSH-Zugriff auf den Server.
Sie sollten den Shell-Zugriff auf den FTP-Benutzer deaktivieren, um die Sicherheit zu erhöhen. Um ihn zu deaktivieren, müssen wir eine neue Shell erstellen, die eine Meldung ausgibt, die besagt, dass das Benutzerkonto nur auf FTP-Zugriff beschränkt ist.
Erstellen Sie die Shell /bin/ftponly
und machen Sie sie ausführbar.
$ echo -e '#!/bin/sh\necho "This account is limited to FTP access only."' | sudo tee -a /bin/ftponly
$ sudo chmod a+x /bin/ftponly
Hängen Sie die neue Shell an die Liste der gültigen Shells in der Datei /etc/shells
an.
$ echo "/bin/ftponly" | sudo tee -a /etc/shells
Ändern Sie die Benutzer-Shell in /bin/ftponly
.
$ sudo usermod newftpuser -s /bin/ftponly
Sie können den gleichen Befehl verwenden, um die Shell aller Benutzer zu ändern, denen Sie den FTP-Zugang gewähren wollen.
Schlussfolgerung
Damit ist unser Tutorial abgeschlossen, in dem wir vsftpd installiert und konfiguriert haben, um einen FTP-Server auf einem Ubuntu 20.04-basierten Server zu installieren. Wir haben auch unsere FTP-Verbindung so konfiguriert, dass sie mit SSL/TLS funktioniert.
Wenn Sie Fragen haben, stellen Sie diese in den Kommentaren unten.