Raspberry Pi: Unter Debian einen FTP-Server einrichten mit ProFTPd
In der nachfolgenden Anleitung installieren wir auf dem Raspberry Pi einen FTP-Server und richten einen Benutzer hierfür ein. Meine Anleitung funktioniert im Gegensatz zu anderen Anleitungen tatsächlich, denn meine Anleitungen werden live getestet und nicht einfach blind verfasst. Die Anleitung funktioniert natürlich auch auf jedem anderen Debian-System (es muss kein Raspberry Pi sein).
In der neuesten Version gab es eine Abweichung. Aus diesem Grund wurde das Tutorial erneut aktualisiert.
Teil 1: FTP-Server installieren und einrichten
Zunächst installieren wir ProFTPd als FTP-Server
apt-get install proftpd
Danach ermitteln wir eine ID die wir uns für später merken
id www-data
Wir öffnen die Konfiguration
nano /etc/proftpd/proftpd.conf
und erweitern diese am Ende um den folgenden Code:
DefaultRoot ~
AuthOrder mod_auth_file.c mod_auth_unix.c
AuthUserFile /etc/proftpd/ftpd.passwd
AuthPAM off
RequireValidShell off
Wir speichern die Datei mit Strg + X und erstellen ein Verzeichnis
mkdir /home/ftpuser
chmod 775 /home/ftpuser
chown -R www-data:www-data /home/ftpuser
und wechseln in das ProFTPd Verzeichnis
cd /etc/proftpd
Beim nachfolgenden Befehl wir die oben ermittelte ID wieder erforderlich sein, hier im Beispiel als ID 33
ftpasswd --passwd --name ftpuser --uid 33 --gid 33 --home /home/ftpuser --shell /bin/false
Wichtig: Ist der Hostname nicht gesetzt kommt es zu einem Fehler, daher legen wir einen Hostnamen fest
Tipp: Zum Löschen einfach „–delete-user“ vorne anfügen.
hostnamectl set-hostname debian
Nunmehr starten wir den FTPd Server neu
/etc/init.d/proftpd restart
Teil 2: Raspberry Pi FTP-Server mit USB-Festplatte
Ihr möchtet einen Raspberry Pi FTP-Server mit einer USB-Festplatte aufsetzen? Dann könnte Euch der nachfolgende Teil meiner Anleitung helfen. Zunächst muss die USB-Festplatte angeschlossen werden, danach kann der Name der Festplatte mit
fdisk -l
ausgelesen werden. In unserem Beispiel handelt es sich bei der USB-Festplatte um /dev/sda1. Im nachfolgenden Beispiel legen wir eine neue Partitionstabelle mit fdisk auf der Festplatte an
fdisk /dev/sda1
g
n
1
ENTER
ENTER
w
und übermitteln die Änderungen an den Kernel
partx /dev/sda1
sodann können wir ein Dateisystem erstellen
mke2fs -j /dev/sda1
Wir mounten nunmehr die Festplatte auf den Pfad des vorher angelegten Verzeichnisses
mount -v -o rw /dev/sda1 /home/ftpuser
Setzen zur Sicherheit nochmal die entsprechenden Dateirechte
chmod 775 /home/ftpuser
chown -R www-data:www-data /home/ftpuser
Und erweitern die Boottabelle mit
nano /etc/fstab/
um folgenden Inhalt
/dev/sda1 /home/ftpuser auto rw 0 0
Abschließend starten wir den FTPd neu
/etc/init.d/proftpd restart
Teil 3: Eigener Service für Autostart bzw. Automount
Eine Alternative zur Boottabelle wäre ein eigener Service als Shellscript. Der Vorteil dabei ist dass der Bootvorgang bei Fehlern nicht unnötig unterbrochen wird.
Hierzu wechseln wir in das Systemd-Verzeichnis:
cd /etc/systemd/system
und erstellen einen neuen einfachen Service mit nano
nano automountusb.service
Hier tragen wir alle Details zu unserem Shellscript ein
[Unit]
Description=Automount USB by lautenbacher.ch
[Service]
Type=simple
ExecStart=/bin/bash /home/automount.sh
[Install]
WantedBy=multi-user.target
Anschließen generieren wir noch unser Shellscript mit nano
nano /home/automount.sh
und dem folgenden Inhalt
mount -v -o rw /dev/sda1 /home/ftpuser
chmod 775 /home/ftpuser
chown -R www-data:www-data /home/ftpuser
#service proftpd start #aktivieren falls der Autostart sonst nicht funktioniert
Das Shellscript machen wir ausführbar
chmod +x /home/automount.sh
und aktivieren den neu eingerichteten Service
systemctl enable automountusb.service
Nach einem Neustart mit
reboot
sollte die Ausgabe per
df
zeigen, dass /dev/sda1/ auf den Pfad /home/ftpuser/ gemountet ist:
Teil 4: TLS/SSL-Verschlüsselung
Wir aktivieren später unsere eigene Konfiguration indem wir in der proftpd.conf
nano /etc/proftpd/proftpd.conf
den Eintrag
Include /etc/proftpd/conf.d # Diese Zeile sollte vorhanden sein
hinzufügen. Weiter geht es indem wir zunächst zwei neue Pakete installieren werden:
apt-get install ssl-cert
apt-get install proftpd-mod-crypto
Danach generieren wir das Zertifikat:
make-ssl-cert generate-default-snakeoil -force-overwrite
und ändern die modules.conf indem wir die Auskommentierung (#) vom „mod_tls“ Modul entfernen
nano /etc/proftpd/modules.conf
anschließend erstellen wir eine benutzerdefinierte Konfiguration:
nano /etc/proftpd/conf.d/proftp-custom.conf
unter hinterlegen folgenden Inhalt:
<Global>
RequireValidShell off
</Global>
# Default directory is ftpusers home
DefaultRoot ~ ftpuser
# Limit login to the ftpuser group
<Limit LOGIN>
DenyGroup !ftpuser
</Limit>
<IfModule mod_tls.c>
TLSEngine on
TLSLog /var/log/proftpd/tls.log
TLSProtocol SSLv23
TLSRSACertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
TLSRSACertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
TLSVerifyClient off
TLSRequired on
TLSOptions NoSessionReuseRequired
</IfModule>
Danach wechseln wir in das ProFTPd Verzeichnis
cd /etc/proftpd
und legen einen neuen Systemuser an (Achtung hier gibt es Abweichungen zu oben)
adduser ftpuser -shell /bin/false -home /home/ftpuser
Da sich die uid und gid durch das Erstellen eines Systemusers geändert hat müssen wir hier auch entsprechende Anpassungen annehmen, deshalb verändern wir die Passwortkonfiguration von ProFTPd ebenfalls (nochmal):
ftpasswd --passwd --name ftpuser --uid 1000 --gid 1000 --home /home/ftpuser --shell /bin/false
Natürlich muss dann auch der Eigentümer geändert werden:
chown ftpuser:ftpuser /home/ftpuser
und anschließend der Service neu gestartet werden
/etc/init.d/proftpd restart
Solltet Ihr weiter oben den Automount-Service eingerichtet haben müsst Ihr das Shellscript natürlich auch dementsprechend anpassen (am besten „-R“ für Teil 5 entfernen)
nano /home/automount.sh
Teil 5: Unteraccounts anlegen
Der untenstehende Code solle für sich selbst sprechen, wichtig ist hier nur, dass der neue User der Gruppe ftpuser zugeordnet wird.
cd /etc/proftpd
mkdir /home/ftpuser/ftpusera
adduser ftpusera -shell /bin/false -home /home/ftpuser/ftpusera
ftpasswd --passwd --name ftpusera --uid 1001 --gid 1000 --home /home/ftpuser/ftpusera --shell /bin/false
chown -R ftpusera:ftpuser /home/ftpuser/ftpusera
usermod -a -G ftpuser ftpusera
/etc/init.d/proftpd restart
Teil 6: Weitere Einstellungen / Passive Ports
Um den FTP(S)-Server von außen auch gut erreichbar zu machen müssen noch einige Einstellung bezgl. der Passiven Ports und IP vorgenommen werden. Ansonsten erhalten wir z. B. die Fehlermeldung „unroutable Address“ oder der Verzeichnisinhalt kann nicht gelesen werden.
Zunächst erstellen wir eine neue Konfigurationsdatei
nano /etc/proftpd/passive.conf
mit folgendem Inhalt:
<Global>
PassivePorts 49152 65535
</Global>
Anschließend führen wir die folgenden Befehle aus
/sbin/modprobe nf_conntrack_ftp
/sbin/modprobe nf_nat_ftp
echo nf_nat_ftp >> /etc/modules-load.d/modules.conf
echo nf_conntrack_ftp >> /etc/modules-load.d/modules.conf
Zur Sicherheit ändern wir auch noch einmal die ursprüngliche Konfigurationsdatei
nano /etc/proftpd/proftpd.conf
Hier tragen wird als DefaultAddress und – oft vergessen – als Masquerade Address die öffentliche IP-Adresse ein. Zusätzlich tragen wir auch noch einmal die Passiven Ports hier ein.
DefaultAddress 1.1.1.1
MasqueradeAddress 1.1.1.1
PassivePorts 49152 65535
Danach starten wir den Service neu und können uns von den NAT-Einstellungen mit dem letzten Befehl überzeugen.
service proftpd restart
lsmod | grep nf_nat_ftp
Nach diesen Einstellungen ist der FTPS-Server auch hinter einer iptables Firewall sauber erreichbar.
Bei einer öffentlichen IP sollte noch unter
nano /etc/hosts
ein Eintrag mit dem Hostnamen und der öffentlichen IP erfolgen.