Einrichtung eines FTP-Servers mit vsftpd

Wir verwenden dazu Debian Jessie.

Installation & Konfiguration

Die Installation ist schnell durchgeführt:

$# apt-get update
$# apt-get install vsftpd

Konfiguration des grundlegenden Zugriffs

$# vi /etc/vsftpd.conf

Einen öffentlichen Server erhalten wir mit:

anonymous_enable=YES

Wollen wir für die Nutzer mit einem vollständigen Unix-Account Schreibzugriff gewähren, setzen wir:

write_enable=YES

Der Standard-Pfad für anonmyous wird mittels des Benutzersaccounts ‚ftp‘ voreingestellt, welcher das ist, klärt die folgende Zeile auf:

$# grep ftp /etc/passwd
ftp:x:126:135:ftp daemon,,,:/srv/ftp:/bin/false
$#

Möchte man diesen Pfad verbiegen, kann die Anweisung ‚anon_root‘ genutzt werden, z.B.:

anon_root=/home/ftp

Wollen wir das so realisieren, ist vorher ein Blick auf die Rechte des originalen Verzeichnisses angebracht:

$# ls -ld /srv/ftp/
drwxr-xr-x 2 root ftp 4096 Jul  5 09:23 /srv/ftp/
$#

Nun erzeugen wir das neue Freigabeverzeichnis es und passen die Rechte entsprechend an:

$# mkdir /home/ftp
$# chgrp ftp /home/ftp
$# ls -ld /home/ftp
drwxr-xr-x 2 root ftp 4096 Jul  5 09:34 /ftp
$#
$# systemctl restart vsftpd.service
$#
$# pgrep -a ftp
30177 /usr/sbin/vsftpd /etc/vsftpd.conf
$#
$# echo Willkommen > /ftp/willkommen.txt
$#
$# ftp 127.0.0.1
Connected to 127.0.0.1.
220 (vsFTPd 3.0.2)
Name (127.0.0.1:tux): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
ftp> ls -l
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-r--r--    1 0        0              11 Jul 05 09:35 willkommen.txt
226 Directory send OK.
ftp>

Die Datei /etc/vsftpd.conf sieht jetzt insgesamt folgendermaßen aus:

listen=NO
listen_ipv6=YES
anonymous_enable=YES
anon_root=/ftp
local_enable=YES
write_enable=YES
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=NO

SSL-Zertifikate für Vsftpd

In neueren Versionen von vsftpd können Key und Certificate in separaten Dateien abgelegt werden. Außerdem sind 1024 Bits als Schlüssellänge für RSA nicht mehr ausreichend, es müssen die Zertifikate 2048 oder 4096 Bits aufweisen - der Daemon verweigert ansonsten den Start:

$# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.key  -out /etc/ssl/certs/vsftpd.pem
Generating a 2048 bit RSA private key
....++++++
..............................................................................++++++
writing new private key to '/etc/ssl/private/vsftpd.key'
-----
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]:DE
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) []:d81.dom1.site
Email Address []:
$#

Nun fügen wir der Datei /etc/vsftpd.conf folgende Zeilen hinzu:

# Eigenes Zertifikat
rsa_private_key_file=/etc/ssl/private/vsftpd.key
rsa_cert_file=/etc/ssl/certs/vsftpd.pem

# SSL aktivieren
ssl_enable=YES

# Sicherheit und Kompatibilität
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
# Nur wenn der Client es unbedingt möchte
#require_ssl_reuse=NO

Insgesamt haben wir jetzt dies in der Datei stehen:

listen=NO
listen_ipv6=YES
anonymous_enable=YES
anon_root=/ftp
local_enable=YES
write_enable=YES
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_private_key_file=/etc/ssl/private/vsftpd.key
rsa_cert_file=/etc/ssl/certs/vsftpd.pem
ssl_enable=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO

Nun müssen wir nur noch den Daemon neu starten:

$# systemctl restart vsftpd

Verifizierung der SSL-Kommunikation

  1. Den Fingerabdruck des Zertifikats ausgeben:

    $# openssl x509 -fingerprint -noout -in /etc/ssl/certs/vsftpd.pem
    SHA1 Fingerprint=A6:81:BE:A4:2D:91:F3:41:D7:D3:50:59:9D:CC:86:15:94:74:79:BF
    $#
    
  2. Verbindungsaufbau testweise mit TLS:

    $# openssl s_client -starttls ftp -connect 10.20.30.3:21
    
  3. Verbindungsaufbau zum Speichern und Prüfen des Zertifikates (Mit STRG+D abzuschließen!)

    $# openssl s_client -starttls ftp -connect 10.20.30.3:21 2> /dev/null | sed -n '/BEGIN/,/END/p' > vsftpd.pem
    

CLI-FTP-CLIENT MIT VERSCHLÜSSELUNG (HINWEIS: Debian 10 hat dieses Paket nicht mehr im Repository, alternativ lässt sich lftp einsetzen:

$# apt-get install ftp-ssl

Achtung: Dabei wird der alte FTP-Client entfernt und ein Link namens ‚ftp‘ auf das neue Programm ‚ftp-ssl‘ gesetzt.

GUI-CLIENT FÜR ALLE PLATTFORMEN: Oder man installiert sich am allerbesten den grafischen FTP-Client ‚filezilla‘:

$# apt-get install filezilla

Nun starten wir als einfacher Nutzer das Programm ‚filezilla‘ und legen eine Profil für unseren neuen Server an:

  • Servermanager öffnen (Button oben links)

  • „Schalter „Neuer Server“

  • Name vergeben

  • Server hinterlegen: 10.20.30.3

  • Port: 21

  • Verschlüsselung: „Wenn verfügbar, explizites FTP über TLS verwenden

  • Auth.: Normal (als Tux)

  • Verbinden

  • Zertifikat überprüfen, dann Häckchen setzen bei „Zertifikat zukünftig immer vertrauen“

Einrichten von virtuellen Nutzern für vsftpd

Wir verfahren am besten nach dem Tutorial von Julien Bourdeau, zu finden unter:

=> http://www.sigerr.org/linux/setup-vsftpd-custom-multiple-directories-users-accounts-ubuntu-step-by-step/

Installation

Uns fehlt für dieses Szenario zuerst noch ein spezielles Paket:

$# apt-get install libpam-pwdfile

Konfiguration

FTP-Server konfigurieren

Wir beginnen - wie im Tutorial empfohlen - mit einer ganz neuen Konfigurationsdatei:

$# mv /etc/vsftpd.conf /etc/vsftpd.conf_first_with_TLS

Die Datei /etc/vsftpd.conf wird nun neu angelegt und mit diesem Inhalt befüllt:

listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
nopriv_user=vsftpd
virtual_use_local_privs=YES
guest_enable=YES
user_sub_token=$USER
local_root=/var/www/$USER
chroot_local_user=YES
hide_ids=YES
guest_username=vsftpd

PAM-Login konfigurieren

Um die virtuellen Benutzer authentifizieren zu können, brauchen wir zwar keine passwd-Datei, aber PAM. Wir fangen wie oben mit einer leeren Datei an:

$# mv /etc/pam.d/vsftpd /etc/pam.d/vsftpd_orig

Wir befüllen die neue Datei /etc/pam.d/vsftpd mit folgenden Inhalt:

auth required pam_pwdfile.so pwdfile /etc/vsftpd/ftpd.passwd
account required pam_permit.so

Benutzeraccounts

Dann folgt das Anlegen eines speziellen, grundlegenden System-Benutzers, unter dessen Kennung die virtuellen Benutzer dann arbeiten werden:

$# useradd --home /home/vsftpd --gid nogroup -m --shell /bin/false vsftpd

Nun ist die Nutzerauthentifizierung an der Reihe, hier wird ein erster virtueller Benutzer angelegt:

$# mkdir /etc/vsftpd
$# htpasswd -c -d /etc/vsftpd/ftpd.passwd user1
New password:
Re-type new password:
Adding password for user user1
$#

ACHTUNG: Beim Erzeugen weiterer Benutzer ist die Option ‚-c‘ WEGZULASSEN, ansonsten wird die Benutzerdatenbankdatei überschrieben!!

Datenverzeichnisse

Als letztes fehlen nur noch die Verzeichnisse für die Nutzdaten, das Wurzel-Verzeichnis des Users ‚/var/www/user1‘ darf selbst kein Schreibrecht haben, weshalb wir gleich ein untergeordnetes Verzeichis ‚write‘ mit erhöhten Rechten anlegen. Im einfachsten Falle reicht ‚chmod‘:

$# mkdir -m 757 -p /var/www/user1/write

Im oben genannten Tutorial von Julien Bourdeau wird dargestellt, wie besser mit ‚chown‘ verfahren werden kann.

Neustart, Testings

Natürlich muss die Konfiguration wieder eingelesen werden:

$# systemctl restart vsftpd

Uns schon gehts ans Ausprobieren:

$# ftp 127.0.0.1
Connected to 127.0.0.1.
220 (vsFTPd 3.0.2)
Name (127.0.0.1:tux): user1
530 Please login with USER and PASS.
530 Please login with USER and PASS.
SSL not available
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir ABC
550 Create directory operation failed.
ftp> cd write
250 Directory successfully changed.
ftp> mkdir ABC
257 "/write/ABC" created
ftp> by
221 Goodbye.
$#

Ein weiterer Linktipp zum Thema Sicherheit:

http://digilib.happy-security.de/files/anleitung_zum_absichern_von_debian.pdf