Einrichten von vsftpd für ein Benutzerverzeichnis unter Ubuntu 16.04

Einführung

FTP, kurz für File Transfer Protocol, ist ein Netzwerkprotokoll, das früher häufig zum Verschieben von Dateien zwischen einem Client und einem Server verwendet wurde. Seitdem wurde es durch schnellere, sicherere und bequemere Methoden zur Übermittlung von Dateien ersetzt. Viele gelegentliche Internetnutzer erwarten, dass sie mit "+ https " direkt von ihrem Webbrowser herunterladen, und Befehlszeilenbenutzer verwenden mit größerer Wahrscheinlichkeit sichere Protokolle wie " scp +" oder "https://www.digitalocean.com/community/". Tutorials / Wie verwende ich SFTP, um Dateien sicher mit einem Remote-Server zu übertragen? [sFTP].

FTP wird weiterhin verwendet, um ältere Anwendungen und Workflows mit sehr spezifischen Anforderungen zu unterstützen. Wenn Sie die Wahl haben, welches Protokoll Sie verwenden möchten, sollten Sie die moderneren Optionen in Betracht ziehen. Wenn Sie jedoch FTP benötigen, ist vsftpd eine ausgezeichnete Wahl. Vsftpd ist auf Sicherheit, Leistung und Stabilität optimiert und bietet starken Schutz vor vielen Sicherheitsproblemen, die bei anderen FTP-Servern auftreten. Dies ist die Standardeinstellung für viele Linux-Distributionen.

In diesem Lernprogramm erfahren Sie, wie Sie vsftpd so konfigurieren, dass ein Benutzer Dateien mit durch SSL / TLS gesicherten Anmeldeinformationen über FTP in sein Ausgangsverzeichnis hochladen kann.

Voraussetzungen

Um diesem Tutorial folgen zu können, benötigen Sie:

  • * Ein Ubuntu 16.04-Server mit einem Nicht-Root-Benutzer mit "+ sudo +" - Berechtigungen *: Weitere Informationen zum Einrichten eines Benutzers mit diesen Berechtigungen finden Sie unter https://www.digitalocean.com/community/tutorials/initial -server-setup-with-ubuntu-16-04 [Erstes Server-Setup mit Ubuntu 16.04].

Sobald Sie einen Ubuntu-Server eingerichtet haben, können Sie beginnen.

Schritt 1 - vsftpd installieren

Zunächst aktualisieren wir unsere Paketliste und installieren den vsftpd-Daemon:

sudo apt-get update
sudo apt-get install vsftpd

Nach Abschluss der Installation kopieren wir die Konfigurationsdatei, um mit einer leeren Konfiguration zu beginnen und das Original als Backup zu speichern.

sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig

Nach einem Backup der Konfiguration können wir die Firewall konfigurieren.

Schritt 2 - Öffnen der Firewall

Wir überprüfen den Firewall-Status, um festzustellen, ob er aktiviert ist. In diesem Fall stellen wir sicher, dass der FTP-Verkehr zulässig ist, damit Sie nicht auf Firewall-Regeln stoßen, die Sie beim Testen blockieren.

sudo ufw status

In diesem Fall ist nur SSH erlaubt durch:

OutputStatus: active

To Action  From
-- ------  ----
OpenSSH ALLOW   Anywhere
OpenSSH (v6)   ALLOW   Anywhere (v6)

Möglicherweise gibt es andere Regeln oder gar keine Firewall-Regeln. Da in diesem Fall nur "+ ssh +" - Datenverkehr zulässig ist, müssen Regeln für den FTP-Datenverkehr hinzugefügt werden.

Wir müssen die Ports 20 und 21 für FTP öffnen, Port 990 für später, wenn wir TLS aktivieren, und die Ports 40000-50000 für den Bereich der passiven Ports, den wir in der Konfigurationsdatei festlegen möchten:

sudo ufw allow 20/tcp
sudo ufw allow 21/tcp
sudo ufw allow 990/tcp
sudo ufw allow 40000:50000/tcp
sudo ufw status

Jetzt sehen unsere Firewall-Regeln so aus:

OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
990/tcp                    ALLOW       Anywhere
20/tcp                     ALLOW       Anywhere
21/tcp                     ALLOW       Anywhere
40000:50000/tcp            ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
20/tcp (v6)                ALLOW       Anywhere (v6)
21/tcp (v6)                ALLOW       Anywhere (v6)
990/tcp (v6)               ALLOW       Anywhere (v6)
40000:50000/tcp (v6)       ALLOW       Anywhere (v6)

Wenn "+ vsftpd +" installiert und die erforderlichen Ports geöffnet sind, können Sie mit dem nächsten Schritt fortfahren.

Schritt 3 - Vorbereiten des Benutzerverzeichnisses

In diesem Lernprogramm erstellen wir einen Benutzer. Möglicherweise benötigen Sie bereits einen Benutzer, der FTP-Zugriff benötigt. Wir werden darauf achten, dass der Zugriff eines vorhandenen Benutzers auf seine Daten in den folgenden Anweisungen erhalten bleibt. Trotzdem empfehlen wir Ihnen, mit einem neuen Benutzer zu beginnen, bis Sie Ihr Setup konfiguriert und getestet haben.

Zuerst fügen wir einen Testbenutzer hinzu:

sudo adduser

Vergeben Sie ein Passwort, wenn Sie dazu aufgefordert werden, und drücken Sie bei den anderen Eingabeaufforderungen die Eingabetaste.

FTP ist im Allgemeinen sicherer, wenn Benutzer auf ein bestimmtes Verzeichnis beschränkt sind. Wenn "+ chroot " für lokale Benutzer aktiviert ist, sind diese standardmäßig auf ihr Ausgangsverzeichnis beschränkt. Aufgrund der Art und Weise, wie " vsftpd +" das Verzeichnis sichert, darf es jedoch nicht vom Benutzer beschreibbar sein. Dies ist in Ordnung für einen neuen Benutzer, der nur über FTP eine Verbindung herstellen soll. Ein vorhandener Benutzer muss jedoch möglicherweise in seinen Basisordner schreiben, wenn er auch Shell-Zugriff hat.

In diesem Beispiel werden keine Schreibrechte aus dem Ausgangsverzeichnis entfernt, sondern ein "+ ftp " - Verzeichnis erstellt, das als " chroot " - und ein beschreibbares " files +" - Verzeichnis für die eigentlichen Dateien dient.

Erstellen Sie den Ordner "+ ftp +", legen Sie dessen Eigentümer fest, und entfernen Sie die Schreibberechtigungen mit den folgenden Befehlen:

sudo mkdir /home//ftp
sudo chown nobody:nogroup /home//ftp
sudo chmod a-w /home//ftp

Überprüfen wir die Berechtigungen:

sudo ls -la /home/sammy/ftp
Outputtotal 8
4 dr-xr-xr-x  2 nobody nogroup 4096 Aug 24 21:29 .
4 drwxr-xr-x 3 sammy  sammy   4096 Aug 24 21:29 ..

Als Nächstes erstellen wir das Verzeichnis, in das Dateien hochgeladen werden können, und weisen dem Benutzer den Besitz zu:

sudo mkdir /home//ftp/files
sudo chown : /home//ftp/files

Eine Berechtigungsprüfung für das Verzeichnis "+ files +" sollte Folgendes zurückgeben:

sudo ls -la /home/sammy/ftp
Outputtotal 12
dr-xr-xr-x 3 nobody nogroup 4096 Aug 26 14:01 .
drwxr-xr-x 3 sammy  sammy   4096 Aug 26 13:59 ..
drwxr-xr-x 2 sammy  sammy   4096 Aug 26 14:01 files

Schließlich fügen wir eine "+ test.txt +" - Datei hinzu, die wir später beim Testen verwenden können:

echo "vsftpd test file" | sudo tee /home//ftp/files/test.txt

Nachdem wir das "+ ftp " - Verzeichnis gesichert und dem Benutzer Zugriff auf das " files +" - Verzeichnis gewährt haben, konzentrieren wir uns auf die Konfiguration.

Schritt 4 - FTP-Zugang konfigurieren

Es ist geplant, dass ein einzelner Benutzer mit einem lokalen Shell-Konto eine Verbindung zu FTP herstellen kann. Die beiden Schlüsseleinstellungen dafür sind bereits in + vsftpd.conf + festgelegt. Öffnen Sie zunächst die Konfigurationsdatei, um sicherzustellen, dass die Einstellungen in Ihrer Konfiguration mit den folgenden übereinstimmen:

sudo nano /etc/vsftpd.conf

/etc/vsftpd.conf

. . .
# Allow anonymous FTP? (Disabled by default).
anonymous_enable=NO
#
# Uncomment this to allow local users to log in.
local_enable=YES
. . .

Als nächstes müssen wir einige Werte in der Datei ändern. Damit der Benutzer Dateien hochladen kann, müssen Sie die Einstellung "+ write_enable +" auskommentieren, damit Folgendes möglich ist:

/etc/vsftpd.conf

. . .
write_enable=
. . .

Wir werden auch das Chroot auskommentieren, um zu verhindern, dass der mit FTP verbundene Benutzer auf Dateien oder Befehle außerhalb der Verzeichnisstruktur zugreift.

/etc/vsftpd.conf

. . .
chroot_local_user=
. . .

Wir fügen ein "+ user_sub_token " hinzu, um den Benutzernamen in unser " local_root" -Verzeichnis einzufügen, damit unsere Konfiguration für diesen Benutzer und alle zukünftigen Benutzer, die möglicherweise hinzugefügt werden, funktioniert.

/etc/vsftpd.conf

Wir beschränken den Bereich der Ports, die für passives FTP verwendet werden können, um sicherzustellen, dass genügend Verbindungen verfügbar sind:

/etc/vsftpd.conf

Da wir den FTP-Zugriff nur von Fall zu Fall zulassen möchten, richten wir die Konfiguration so ein, dass Benutzer nur dann Zugriff erhalten, wenn sie explizit zu einer Liste hinzugefügt werden und nicht standardmäßig:

/etc/vsftpd.conf

+ userlist_deny + schaltet die Logik um. Bei der Einstellung „JA“ wird Benutzern in der Liste der FTP-Zugriff verweigert. Wenn "NEIN" eingestellt ist, können nur Benutzer in der Liste darauf zugreifen. Wenn Sie mit der Änderung fertig sind, speichern Sie die Datei und schließen Sie sie.

Zuletzt erstellen wir Ihren Benutzer und fügen ihn der Datei hinzu. Wir verwenden die Markierung "+ -a +", um an die Datei anzuhängen:

echo "" | sudo tee -a /etc/vsftpd.userlist

Stellen Sie sicher, dass es wie erwartet hinzugefügt wurde:

cat /etc/vsftpd.userlist
Outputsammy

Starten Sie den Dämon neu, um die Konfigurationsänderungen zu laden:

sudo systemctl restart vsftpd

Jetzt sind wir bereit zum Testen.

Schritt 5 - Testen des FTP-Zugriffs

Wir haben den Server so konfiguriert, dass nur der Benutzer "+ sammy +" eine Verbindung über FTP herstellen kann. Stellen wir sicher, dass dies der Fall ist.

  • Anonyme Benutzer können keine Verbindung herstellen *: Der anonyme Zugriff wurde deaktiviert. Hier testen wir dies, indem wir versuchen, anonym eine Verbindung herzustellen. Wenn wir es richtig gemacht haben, sollte anonymen Benutzern die Erlaubnis verweigert werden:

ftp -p
OutputConnected to 203.0.113.0.
220 (vsFTPd 3.0.3)
Name (203.0.113.0:default):
530 Permission denied.
ftp: Login failed.
ftp>

Beenden Sie die Verbindung:

bye
  • Andere Benutzer als "+ sammy " sollten keine Verbindung herstellen *: Als Nächstes versuchen wir, eine Verbindung als " sudo +" - Benutzer herzustellen. Auch ihnen sollte der Zugriff verweigert werden, und dies sollte geschehen, bevor sie ihr Passwort eingeben dürfen.

ftp -p
OutputConnected to 203.0.113.0.
220 (vsFTPd 3.0.3)
Name (203.0.113.0:default):
530 Permission denied.
ftp: Login failed.
ftp>

Beenden Sie die Verbindung:

bye
  • + sammy + sollte in der Lage sein, eine Verbindung herzustellen sowie Dateien zu lesen und zu schreiben *: Hier stellen wir sicher, dass unser designierter Benutzer canconnect:

ftp -p
OutputConnected to 203.0.113.0.
220 (vsFTPd 3.0.3)
Name (203.0.113.0:default):
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

Wir werden in das Verzeichnis "+ files in" wechseln und dann den Befehl "+ get" verwenden, um die zuvor erstellte Testdatei auf unseren lokalen Computer zu übertragen:

cd files
get test.txt
Output227 Entering Passive Mode (203,0,113,0,169,12).
150 Opening BINARY mode data connection for test.txt (16 bytes).
226 Transfer complete.
16 bytes received in 0.0101 seconds (1588 bytes/s)
ftp>

Wir kehren um und versuchen, die Datei mit einem neuen Namen hochzuladen, um die Schreibberechtigungen zu testen:

put test.txt upload.txt
Output227 Entering Passive Mode (203,0,113,0,164,71).
150 Ok to send data.
226 Transfer complete.
16 bytes sent in 0.000894 seconds (17897 bytes/s)

Beenden Sie die Verbindung:

bye

Nachdem wir unsere Konfiguration getestet haben, werden wir Schritte unternehmen, um unseren Server weiter abzusichern.

Schritt 6 - Sichern von Transaktionen

Da FTP keine Daten während der Übertragung nicht verschlüsselt, einschließlich der Benutzeranmeldeinformationen, wird TTL / SSL aktiviert, um diese Verschlüsselung bereitzustellen. Der erste Schritt besteht darin, die SSL-Zertifikate für die Verwendung mit vsftpd zu erstellen.

Wir werden "+ openssl " verwenden, um ein neues Zertifikat zu erstellen, und das " -days " -Flag verwenden, um es für ein Jahr gültig zu machen. Im selben Befehl fügen wir einen privaten 2048-Bit-RSA-Schlüssel hinzu. Wenn Sie dann die beiden Flags " -keyout " und " -out +" auf denselben Wert setzen, befinden sich der private Schlüssel und das Zertifikat in derselben Datei.

Dies machen wir mit dem folgenden Befehl:

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem

Sie werden aufgefordert, Adressinformationen für Ihr Zertifikat anzugeben. Ersetzen Sie die folgenden Fragen durch Ihre eigenen Informationen:

OutputGenerating a 2048 bit RSA private key
............................................................................+++
...........+++
writing new private key to '/etc/ssl/private/vsftpd.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:

Ausführlichere Informationen zu den Zertifikatflags finden Sie unter OpenSSL Essentials: Working with SSL Zertifikate, private Schlüssel und CSRs

Nachdem Sie die Zertifikate erstellt haben, öffnen Sie die Konfigurationsdatei "+ vsftpd +" erneut:

sudo nano /etc/vsftpd.conf

Am Ende der Datei befinden sich zwei Zeilen, die mit "+ rsa_ +" beginnen. Kommentiere sie aus, damit sie so aussehen:

/etc/vsftpd.conf

rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key

Fügen Sie darunter die folgenden Zeilen ein, die auf das Zertifikat und den privaten Schlüssel verweisen, die wir gerade erstellt haben:

/etc/vsftpd.conf

Danach erzwingen wir die Verwendung von SSL, wodurch verhindert wird, dass Clients, die mit TLS nicht umgehen können, eine Verbindung herstellen. Dies ist erforderlich, um sicherzustellen, dass der gesamte Datenverkehr verschlüsselt ist. Möglicherweise muss Ihr FTP-Benutzer jedoch den Client wechseln. Ändern Sie + ssl_enable + in + YES +:

/etc/vsftpd.conf

ssl_enable=

Fügen Sie anschließend die folgenden Zeilen hinzu, um anonyme Verbindungen über SSL explizit zu verweigern und SSL sowohl für die Datenübertragung als auch für die Anmeldung zu benötigen:

/etc/vsftpd.conf

Danach konfigurieren wir den Server für die Verwendung von TLS, dem bevorzugten Nachfolger von SSL, indem wir die folgenden Zeilen hinzufügen:

/etc/vsftpd.conf

Schließlich werden wir zwei weitere Optionen hinzufügen. Erstens ist keine erneute Verwendung von SSL erforderlich, da dadurch viele FTP-Clients beschädigt werden können. Wir werden "hohe" Verschlüsselungs-Cipher-Suites benötigen, was derzeit Schlüssellängen von mindestens 128 Bit bedeutet:

/etc/vsftpd.conf

Speichern und schließen Sie die Datei, wenn Sie fertig sind.

Jetzt müssen wir den Server neu starten, damit die Änderungen wirksam werden:

sudo systemctl restart vsftpd

Zu diesem Zeitpunkt können wir keine Verbindung mehr mit einem unsicheren Befehlszeilenclient herstellen. Wenn wir es versuchen, sehen wir so etwas wie:

ftp -p
Connected to 203.0.113.0.
220 (vsFTPd 3.0.3)
Name (203.0.113.0:default):
530 Non-anonymous sessions must use encryption.
ftp: Login failed.
421 Service not available, remote server has closed connection
ftp>

Als Nächstes überprüfen wir, ob wir eine Verbindung mit einem Client herstellen können, der TLS unterstützt.

Schritt 7 - TLS mit FileZilla testen

Die meisten modernen FTP-Clients können für die Verwendung der TLS-Verschlüsselung konfiguriert werden. Wir werden Ihnen zeigen, wie Sie mit FileZilla eine Verbindung herstellen, da es plattformübergreifend unterstützt wird. Konsultieren Sie die Dokumentation für andere Kunden.

Wenn Sie FileZilla zum ersten Mal öffnen, finden Sie das Site Manager-Symbol direkt unter dem Wort File, das am weitesten links stehende Symbol in der oberen Zeile. Klick es:

image: http: //assets.digitalocean.com/articles/vsftp-user/site-manager.png [Site Manager Screent Shot]

Ein neues Fenster wird geöffnet. Klicken Sie auf die Schaltfläche "Neue Site" in der unteren rechten Ecke:

image: http: //assets.digitalocean.com/articles/vsftp-user/new-site.png [Neue Site-Schaltfläche] + Unter "Meine Sites" wird ein neues Symbol mit den Worten "Neue Site" angezeigt. Sie können es jetzt benennen oder später zurückkehren und die Schaltfläche Umbenennen verwenden.

Sie müssen das Feld „Host“ mit dem Namen oder der IP-Adresse ausfüllen. Wählen Sie im Dropdown-Menü "Verschlüsselung" die Option "Explizites FTP über TLS erforderlich".

Wählen Sie unter "Anmeldetyp" die Option "Nach Passwort fragen". Geben Sie den von Ihnen erstellten FTP-Benutzer in das Feld "Benutzer" ein:

image: http: //assets.digitalocean.com/articles/vsftp-user/site-config2.png [Registerkarte Allgemeine Einstellungen] + Klicken Sie unten in der Benutzeroberfläche auf „Verbinden“. Sie werden nach dem Passwort des Benutzers gefragt:

image: http: //assets.digitalocean.com/articles/vsftp-user/user-pass.png [Kennwortdialog] + Klicken Sie auf "OK", um eine Verbindung herzustellen. Sie sollten jetzt mit TLS / SSL-Verschlüsselung mit Ihrem Server verbunden sein.

image: http: //assets.digitalocean.com/articles/vsftp-user/site-cert.png [Site Certificate Dialogue] + Wenn Sie das Zertifikat akzeptiert haben, doppelklicken Sie auf den Ordner "+ files +" und ziehen Sie den Upload. txt nach links, um zu bestätigen, dass Sie Dateien herunterladen können.

+ image: http: //assets.digitalocean.com/articles/vsftp-user/file-test.png [Download test.txt] + Wenn Sie dies getan haben, klicken Sie mit der rechten Maustaste auf die lokale Kopie und benennen Sie sie um, um sie hochzuladen. tls.txt` und ziehen Sie es zurück auf den Server, um zu bestätigen, dass Sie Dateien hochladen können.

image: http: //assets.digitalocean.com/articles/vsftp-user/file-upload.png [Umbenennen und Hochladen] + Sie haben jetzt bestätigt, dass Sie Dateien mit aktiviertem SSL / TLS sicher und erfolgreich übertragen können.

Schritt 8 - Deaktivieren des Shell-Zugriffs (optional)

Wenn Sie TLS aufgrund von Clientanforderungen nicht verwenden können, können Sie etwas Sicherheit gewinnen, indem Sie die Möglichkeit des FTP-Benutzers deaktivieren, sich auf andere Weise anzumelden. Eine relativ einfache Möglichkeit, dies zu verhindern, besteht darin, eine benutzerdefinierte Shell zu erstellen. Dadurch wird keine Verschlüsselung bereitgestellt, aber der Zugriff auf ein gefährdetes Konto wird auf Dateien beschränkt, auf die über FTP zugegriffen werden kann.

Öffnen Sie zunächst eine Datei mit dem Namen "+ ftponly +" im bin-Verzeichnis:

sudo nano /bin/ftponly

Wir fügen eine Nachricht hinzu, die den Benutzer darüber informiert, warum er sich nicht anmelden kann. Fügen Sie Folgendes ein:

#!/bin/sh
echo "This account is limited to FTP access only."

Ändern Sie die Berechtigungen, um die Datei ausführbar zu machen:

sudo chmod a+x /bin/ftponly

Öffnen Sie die Liste der gültigen Shells:

sudo nano /etc/shells

Fügen Sie unten Folgendes hinzu:

/ etc / shells

. . .
/bin/ftponly

Aktualisieren Sie die Shell des Benutzers mit dem folgenden Befehl:

sudo usermod sammy -s /bin/ftponly

Versuchen Sie nun, sich als sammy anzumelden:

ssh sammy@

Sie sollten etwas sehen wie:

OutputThis account is limited to FTP access only.
Connection to 203.0.113.0 closed.

Dies bestätigt, dass der Benutzer nicht länger "+ ssh +" zum Server kann und nur auf den FTP-Zugriff beschränkt ist.

Fazit

In diesem Tutorial haben wir uns mit dem Einrichten von FTP für Benutzer mit einem lokalen Konto befasst. Wenn Sie eine externe Authentifizierungsquelle verwenden müssen, sollten Sie die Unterstützung virtueller Benutzer durch vsftpd prüfen. Dies bietet eine Vielzahl von Optionen durch die Verwendung von PAM, den Pluggable Authentication Modules, und ist eine gute Wahl, wenn Sie Benutzer in einem anderen System wie LDAP oder Kerberos verwalten.