vsFTP mit SSL/TLS über DynDNS auf Ubuntu 14.04.01 und Filezilla

Veröffentlicht in: Netzkultur, IT & Zeugs | 0

Nachdem mein letzter Heimserver das Zeitliche gesegnet hat, musste ich einen neuen aufsetzten und habe dies gleich zum Anlass genommen einiges anders zu machen. Mein alter Heimserver hatte einen FTP Server ohne SSL, was natürlich sehr einfach ist aber die komplette Kommunikation ist unverschlüsselt und in Klartext. Mein neuer Server sollte verschlüsselt sein und bei der Umsetzung bin ich auf ein paar Probleme gestoßen, aber dazu später mehr.

Installation von vsftpd

Beginnen wir mit der Installation mit dem FTP Server, vsftpd.

sudo apt-get install vsftpd

Danach müssen wir uns erst einmal mit der Konfiguration von vsftp beschäftigen. Öffnet diese in dem Texteditor eurer wahl, ich benutzte vim:

vim /etc/vsftpd.conf

Diese ist ziemlich selbsterklärend, aber wir sollten ein paar Sachen ändern um nur System Benutzer (Schreib-) Zugriff zu erlauben.

anonymous_enable=NO
local_enable=YES
write_enable=YES

Mit diesen wenigen Einstellungen hätten wir schon einen FTP Server der unverschlüsselt funktioniert (nach einem Neustart des Dienstes).

SSL Zertifikat erstellen und vsftp anpassen

Wir möchten einen verschlüsselten FTP Server und müssen dazu ein Zertifikat erstellen:

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

Bei Bedarf (oder aus Faulheit) lässt sich die Gültigkeit des Zertifikates erweitern in dem man den Parameter „days 365“ anpasst.

Jetzt müssen wir vsftpd noch sagen das er das Zertifikat benutzten soll und müssen die /etc/vsftpd.conf abermals anpassen. Je nach Distribution können davon schon ein paar Sachen in der config stehen, bitte achtet darauf keine Doppeleinträge zu machen.

Hiermit sagen wir dem Server welche Zertifikate er wie benutzten soll:

rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
ssl_enable=YES
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 folgenden Einstellungen sagen vsftp das er Passive Dateiübertragungen verwenden soll. Dies ist nötig da der FTP Server keine statische IP Adresse hat (wir benutzten dem Server ja Zuhause). Dazu müssen wir noch noch die (TCP) Portrange definieren die ihr auch in der Firewall eures Router freigeben müsst (zusätzlich zu TCP Port 20 und 21). Die Portrange kann fast frei beliebig gewählt werden, solange sie aufeinander folgen und frei sind. Geht davon aus das ihr für jede gleichzeitig aktive Dateiübertragung einen Port braucht. Wenn ihr also 10 Dateien gleichzeitig übertragen wollt, öffnet 10 Ports. Da ich viele kleine Dateien hin und her schiebe, hab eich 20 Ports geöffnet. Dies Definiert ihr mit pasv_min_port und pasv_max_port. Die pasv_address ist eure aktuelle IP Adresse und bekommt später noch mehr Aufmerksamkeit.

pasv_enable=YES
pasv_promiscuous=YES
pasv_min_port=40000
pasv_max_port=40020
pasv_address=111.222.333.444

Filzilla konfigurieren

Wenn wir vsftp neustarten würden, könnten wir schon verschlüsselt auf den FTP Server aus dem lokalen Netzwerk zugreifen. Den Dienst neu zu starten könnt ihr mit diesem Befehl:

service vsftpd restart

Startet Filezilla,öffnet den Server Manager und erstellt einen neuen Server.

Filezilla

Bei Server gebt ihr den Hostnamen ein, in meinem Fall „fileserver“.

Den Port könnt ihr frei lassen, solange ihr connect_from_port_20=YES nicht geändert habt findet Filzilla den schon alleine.

Wichtig ist das ihr die Verschlüsselung auf „Explizites FTP über TLS erfordern“ stellt.

Als nächstes müsst ihr natürlich noch euren Benutzernamen und Passwort des Servers eingeben. Dies ist der Benutzter des Servers auf den ihr zugreifen wollt.

Bei allen anderen Einstellungen solltet ihr nichts mehr anpassen müssen, außer vielleicht die Anzahl der gleichzeitigen Dateiübertragungen.

 

 

vsFTP mit euer aktuellen DynDNS IP Adresse versorgen

Da wir den Server Zuhause im Netzwerk betreiben haben die meisten von uns keine Statische IP Adresse, sondern eine Dynamische. Besonders diejenigen unter euch die Internet  über DSL beziehen haben i.d.R. mindestens eine neue IP alle 24 Stunden. Damit kommt vsftp nicht klar in Verbindung mit SSL/TLS und der Verbindungsaufbau scheitert so lange die IP Adresse unter pasv_address in /etc/vsftpd.conf Konfigurationsdatei nicht mit der aktuellen überein stimmt. Wir müssen also entweder händische bei jedem IP wechsel die Konfigurationsdatei anpassen und den Service neu starten oder wir automatisieren das.

Bei meiner Recherche zu diesem Problem, bin ich auf verschiedene Lösungswege gestoßen. Fündig wurde ich schlussendlich im Gentoo Forum, dort hat der Benutzter Tomcat ein Bash Script veröffentlicht, das mit Hilfe von Lynx die IP Adresse von dem Webserver hinter der DynDNS Adresse erfragt. Ich Betreibe aber keinen Webserver, also musste ich das Script etwas modifizieren und ein paar andere Kleinigkeiten anpassen.

Zuerst prüft das Script auf root Rechte, da sonst die Konfigurationsdatei nicht modifiziert oder der FTP Dienst neu gestartet werden kann. Danach kommt der vergleich der IP Adresse die in der Konfigurationsdatei hinterlegt ist und der aktuellen. Dies passiert mit dem Tool dig (domain information groper) das einige Abfragemöglichkeiten in Bezug auf DNS bietet. Sind diese IPs unterschiedlich wird ein Eintrag in der vsftp Log Datei geschrieben und danach mit Hilfe von sed (stream editor) die IP in der Konfigurationsdatei von vsftp ausgetauscht und nach einem weiteren Logeintrag der Dienst neu gestartet.

Mein modifiziertes Script findet ihr weiter unten oder hier als Downloadvsftpd_IP_change

Das Script müsst ihr für euch noch etwas anpassen, im Speziellen müsst ihr eure eigene DynDNS Adresse eintragen, ändert dazu „meineadresse.dyndns.org“ in dieser Zeile:

CURRENTIP=$(dig meineadresse.dyndns.org +"short")

Hier ist das komplette Bash Script. Die Passage die ihr ändern müsst habe ich hervorgehoben hervorgehoben.

#!/bin/bash
if [ `/usr/bin/whoami` = 'root' ]
then 
 OLDIP=`cat /etc/vsftpd.conf | grep pasv_address | sed -e 's/pasv_address=\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)/\1/'` 
 CURRENTIP=$(dig meineadresse.dyndns.org +"short")
if [ "$OLDIP" != "$CURRENTIP" ]; 
 then 
 echo "$(date +'%a %b %d %T %Y') *** Public IP changed from $OLDIP to $CURRENTIP" >> /var/log/vsftpd.log 
 sed 's/\(pasv_address=\)\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)/\1'$CURRENTIP'/' /etc/vsftpd.conf > /etc/vsftpd.conf.new &&
 mv /etc/vsftpd.conf.new /etc/vsftpd.conf && 
 echo "$(date +'%a %b %d %T %Y') *** Pasv_address setting updated successfully - restarting daemon" >> /var/log/vsftpd.log &&
 service vsftpd restart
# this will spam much output in your log terminal 
# else 
# echo "$(date +'%a %b %d %T %Y') *** IP check OK - IP unchanged" >> /dev/tty12 
 fi 
else 
 echo "Permission denied" 
fi

Bash Script mit Cron Stündlich ausführen

Wie bereits erwähnt müsst ihr das Script unter root ausführen, da ihr sonst nicht die nötigen Berechtigungen habt die Konfigurationsdatei zu modifizieren oder den FTP Dienst neu zu starten. Speichert das Script am besten im Root Ordner, damit das nicht verloren geht. Zum Beispiel unter /root/vasftp_IP.sh und kontrolliert nochmal üb ihr eure eigene DynDNS Adresse eingefügt habt.

Wir möchten auch das ausführen dieses Scriptes automatisieren und benutzten dazu Cronjobs. Wechselt in root oder öffnet mit diesem Befehl die Cronjobs (möglicherweise müsst ihr noch den gewünschten Editor definieren mit dem ihr diese Datei editieren wollt):

sudo crontab -e

Um das Skript Stündlich aus zu führen fügt die untere Zeile (die mit der 0 Beginnt), falls ihr das Script unter eiem anderen Namen oder nicht in /root gespeichert habt müsst ihr das auch anpassen:

#m h dom mon dow command
0 * * * * /root/vsftpd_IP.sh

Und das wars, mit den Cronjobs wird das Script jede Stunde ausgeführt und prüft ob sich die Internet IP geändert hat. Ist dies der Fall wird der Konfigurations Datei angepasst und der vsftp Dienst neu gestartet.Ich empfehle auch den SSH Port 22 in eurer Firewall frei zu geben, so das ihr notfalls auch mit Putty oder ssh auf euren Server zugreifen könnt. Damit könnt ihr das Script manuell ausführen oder sonstige Administrative arbeiten durchführen.

Quellen:

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.