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.

  1. 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 Verzeichnis upload 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
    
  2. 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.

FileZilla Site Manager

Es öffnet sich ein neues Fenster. Klicken Sie auf die Schaltfläche New Site in der unteren rechten Ecke.

Create New Site - FileZilla

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ü.

Site Edit - FileZilla

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

FTP SSL Certificate - FileZilla

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.

Successful Connection - FileZilla

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.

Das könnte dich auch interessieren …