Raspberry Pi: Unter Debian einen FTP-Server einrichten mit ProFTPd

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:

Automounted USB on Raspberry PI

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.

Schreibe einen Kommentar

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