Einrichtung eines FTP-Servers mit vsftpd ######################################## .. highlight:: shell-session 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> .. highlight:: bash 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: .. highlight:: shell-session :: $# 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: .. highlight:: bash :: # 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 .. highlight:: shell-session Nun müssen wir nur noch den Daemon neu starten: :: $# systemctl restart vsftpd Verifizierung der SSL-Kommunikation ----------------------------------- a) 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 $# b) Verbindungsaufbau testweise mit TLS:: $# openssl s_client -starttls ftp -connect 10.20.30.3:21 c) 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: .. highlight:: bash :: 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 ^^^^^^^^^^^^^^^^^^^^^^^ .. highlight:: shell-session 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: .. highlight:: bash :: 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: .. highlight:: shell-session :: $# 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