Eigenen FTP-Server unter Linux installieren und betreiben

Vorwort zur Anleitung:
Diese Anleitung hat einen mittleren bis erhöhten Schwierigkeitsgrad.
Installation von Linux und Kenntnisse in der Befehlszeile sind vorausgesetzt.
Ein FTP-Server (File Transfer Protocol Server) ist ein Server, der das FTP-Protokoll verwendet, um Dateien über ein Netzwerk zu übertragen.
Hauptfunktionen eines FTP-Servers:
• Dateiübertragung: Ermöglicht das Hochladen und Herunterladen von Dateien zwischen dem Server und Client
• Zugangskontrolle: Der FTP-Server kann so konfiguriert werden, dass nur autorisierte Benutzer Zugriff haben.
• Verzeichnisstruktur: Der Server speichert Dateien in Verzeichnissen und ermöglicht es, diese zu organisieren und zu navigieren.
• Sicherheit: Für sicheren Dateitransfer gibt es auch erweiterte Varianten wie FTPS oder SFTP, die eine verschlüsselte Übertragung bieten.
Wie funktioniert ein FTP-Server?
1. Verbindung:
Ein FTP-Client (z.B. ein Browser, ein spezielles FTP-Programm oder ein Betriebssystem) stellt eine Verbindung zum FTP-Server her, indem er die IP-Adresse oder den Hostnamen des Servers sowie die erforderlichen Anmeldedaten angibt.
2. Datenübertragung:
Nach erfolgreicher Authentifizierung kann der Client Dateien auf den Server hochladen oder vom Server herunterladen.
3. Befehlssatz:
FTP verwendet eine Reihe von Befehlen, um die Interaktion zu steuern, z.B. «GET» für das Herunterladen einer Datei, «PUT» für das Hochladen und «DELETE» für das Löschen von Dateien.
Vielseitige Anwendungsbeispiele:
• Webhosting
• Backup-Lösungen
• Datenarchivierung
• Drucker und Scan im Netzwerk
• …
Vor- und Nachteile:
Vorteile:
• Einfach und weit verbreitet.
• Ermöglicht die Übertragung großer Dateien.
• Viele FTP-Clients und -Server sind kostenlos und leicht zugänglich.
Nachteile:
• Standard-FTP überträgt Daten unverschlüsselt, was ein Sicherheitsrisiko darstellt.
• Benutzer müssen den richtigen FTP-Client verwenden und den Server korrekt konfigurieren.
• Ein sicherer Betrieb des FTP-Servers bedingt einer Reihe von weiteren Einstellungen, welche tieferes technisches Wissen voraussetzt.

Vorbereitungen / Anforderungen:

Anforderungen
Schwierigkeitsgrad-Installation: Mittel
Schwierigkeitsgrad-Anwendung: Einfach
Erforderliche Kenntnisse: Linux-Befehlszeile
Systemvoraussetzungen:
Basis: Debian
Betriebssystem: Ubuntu Server (Headless)
Festplattenspeicher: Mindestens 10 GB
CPU: Mindestens 1 CPU
RAM: Mindestens 512 MB
Internetverbindung: Verfügbar
Die Systemanforderungen wurden in einer virtualisierten Umgebung getestet.
Tipp:
Wenn du mit Virtualisierung, z.B. ProxMox, vertraut bist, kannst du deine eigenen Server effizient und stromsparend betreiben!
Getestet auf:
  • Ubuntu-Server 22.04
  • Ubuntu-Server 24.10
Installationsablauf:

1. Durchführung von System-Upgrade
2. Statische IP-Adresse festlegen und anwenden
3. (Optional) Hostnamen festlegen
4. Installation und Einstellungen
5. Systembedienung
6. Störungsanalyse
7. Erweiterte Serverentwicklung und Impulse
Optionale Schritte können weggelassen werden, da sie lediglich unterstützende Funktionen bieten, wie zum Beispiel die Zusammenfassung von Servern in einem Rechenzentrum.
Für den Betrieb in einem Rechenzentrum sollten die optionalen Abläufe jedoch aus Gründen des beruflichen Stolzes in Betracht gezogen werden.

1. Durchführung von System-Upgrade

Vor jeder Installation ist ein System-Update erforderlich:
$> ssh DEINUSER@192.168.1.X
# Stelle eine SSH-Verbindung zu deinem Server her
$> sudo apt update
# Aktualisiere die Paketquellen
$> sudo apt upgrade -y
# Starte das System-Upgrade
$> sudo apt autoclean
# Optional: Entferne überflüssige Pakete
$> sudo apt autoremove
# Optional: Bereinige das System von Abhängigkeiten

2. Statische IP-Adresse festlegen und anwenden

Ein FTP-Server benötigt eine statische IP-Adresse. Alternativ kann auch eine per DHCP zugewiesene feste Adresse verwendet werden, jedoch sollte diese niemals geändert werden.

Es besteht die Möglichkeit, sich selbst vom Server auszuschließen, wenn die IP-Adresse nicht korrekt konfiguriert ist.
$> ip addr
# Liste alle Netzwerkadapter und Informationen auf
$> sudo su
# Wechsel in die Super-User-Shell
$> cd /etc/netplan
# Wechsle ins Netplan-Verzeichnis
$> ls -l
# Zeige alle Dateien im Netplan-Verzeichnis an
$> for i in $( ls ); do mv $i $i.bak; done
# Sichere alle bestehenden Konfigurationen als Backup
$> touch /etc/netplan/01_static_ip.yaml
# Erstelle eine neue Konfigurations-Datei
$> nano /etc/netplan/01_static_ip.yaml
# Öffne die neue Konfigurations-Datei
network:
  version: 2
  renderer: networkd
  ethernets:
    ens18: #Edit this line according to your network interface name.
      dhcp4: no
      addresses:
        - 192.168.1.150/24
      gateway4: 192.168.1.1
      nameservers:
        addresses:
          - 8.8.8.8
          - 8.8.4.4
# Öffne die Datei mit einem Texteditor (Copy-Paste)
# Ersetze ens18 durch den Namen deines Netzwerk-Adapters (siehe Ausgabe von ip addr).
# Ändere die IP-Adresse und die Netzmaske nach Bedarf.
# Passen die DNS-Adressen an, falls erforderlich.
# Überprüfe und passe ggf. die Routen (Gateway) an.
Speichern und Verlassen
• Speichern der Datei: Ctrl + O
• Editor verlassen: Ctrl + X
$> netplan generate && netplan apply
# Wende die neuen Netzwerkeinstellungen an
🚨 Der Server wechselt nun zu einer neuen IP-Adresse, was dazu führt, dass deine SSH-Sitzung unterbrochen wird.

3. (Optional) Hostnamen festlegen

Durch das Ändern des Hostnamens der Server-Station vergibst du einen eindeutigen Namen für das System.

In unserem Fall könnte der Hostname beispielsweise „S3-FTP-Server“ lauten.

Die Hosts-Datei wird verwendet, um auf Server-Ebene IP-Adressen Namen zuzuordnen, die intern genutzt werden. Wenn du den Hostnamen änderst, muss auch der entsprechende Eintrag in der Hosts-Datei aktualisiert werden. Bei produktiven Systemen sollte diese Kleinigkeit unbedingt beachtet werden, da sie ein Zeichen von Berufsethos und Professionalität ist. Für Tests und Experimente ist dies jedoch nicht zwingend erforderlich.

Der neue Hostname muss zwingen der gleiche sein wie auch im Hosts-File.
$> ssh DEINUSER@192.168.1.X
# Wiederherstellen der SSH-Verbindung
$> sudo hostnamectl set-hostname DEINHOSTNAME
# Einen neuen Host-Namen setzen
$> sudo nano /etc/hosts 
# Hosts-Datei öffnen und ändere den markierten Bereich

127.0.0.1 localhost
127.0.1.1 DEINHOSTNAME

# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ……..

# Speichern und Verlassen
• Speichern der Datei: Ctrl + O
• Editor verlassen: Ctrl + X
$> sudo reboot
# Server neu starten, damit die Änderungen wirksam werden

4. Installation und Einstellungen

$> ssh DEINUSER@192.168.1.X
# Wiederherstellen der SSH-Verbindung
$> sudo apt install proftpd-basic -y
# System installieren
$> sudo systemctl enable proftpd.service 
# Autostart Eintrag setzen
Die Standard-Einstellungen eines FTP-Servers ermöglichen es, den Server direkt nach der Installation zu nutzen. Für das Login kann jedes existierende SSH-Nutzerkonto verwendet werden. Allerdings gibt es einige wichtige Sicherheitsaspekte, die beachtet werden sollten:
• Passwörter werden unverschlüsselt (im Klartext) über das Netzwerk übertragen und sind somit anfällig für das Abfangen durch Dritte.
• Mit diesem Nutzerkonto hat man grundsätzlich Zugriff auf fast alle Dateien des Servers.
• In diesem unsicheren Zustand sollte der FTP-Server nicht öffentlich zugänglich gemacht werden.
Fazit: Wenn die Nutzung des FTP-Servers über die Standard-Einstellungen hinausgeht, sollten unbedingt zusätzliche Sicherheitsmaßnahmen getroffen werden! Nachfolgend finden Sie Einstellungen für den minimalen Sicherheitsaspekt.
$> sudo useradd --create-home DEINFTPUSER --shell /bin/rbash
# Neuer User erstellen
$> sudo passwdd DEINFTPUSER
# Passwort setzen
Erstelle einen Benutzer mit einem eigenen Home-Verzeichnis für die spätere Datenablage. Als Shell wird eine Restricted Bash (»rbash«) eingerichtet. Diese Shell ist per SSH zugänglich, erlaubt jedoch nur den Zugriff auf das eigene Home-Verzeichnis.

Die rbash-Shell kommt ohne die üblichen Komfortfunktionen, die man von einer regulären Bash kennt. Der Zugriff auf höher privilegierte Benutzer ist nur über den Befehl „su USER“ möglich, vorausgesetzt, der Benutzer wurde nicht der sudo-Gruppe zugewiesen. Die rbash-Shell ist eine gute Wahl, wenn man dem Benutzer zusätzlich ein SSH-Login ermöglichen möchte.

Wichtig: Wählen Sie ein starkes, einzigartiges Passwort für diesen Benutzer, das sich deutlich von üblichen Passwörtern unterscheidet.

Fazit: Diese Konfiguration bietet einen zusätzlichen Sicherheits-Puffer, jedoch bleibt FTP auch in dieser Form eine unsichere Lösung für den Transfer sensibler Daten.
$> sudo nano /etc/proftpd/proftpd.conf
# Konfiguration bearbeiten
# Includes DSO modules
Include /etc/proftpd/modules.conf

# Set off to disable IPv6 support which is annoying on IPv4 only boxes.
UseIPv6 off

# If set on you can experience a longer connection delay in many cases.
IdentLookups off

ServerName FTP-Server
# Set to inetd only if you would run proftpd by inetd/xinetd/socket.
ServerType standalone
DeferWelcome off

# Disable MultilineRFC2228 per https://github.com/proftpd/proftpd/issues/1085
# MultilineRFC2228on

DefaultServer on
ShowSymlinks on

TimeoutNoTransfer 600
TimeoutStalled 600
TimeoutIdle 1200

DisplayLogin welcome.msg
DisplayChdir .message true
ListOptions -l
DenyFilter \*.*/

# Use this to jail all users in their homes
#DefaultRoot ~
DefaultRoot /home/deinftpuser deinftpuser

# Users require a valid shell listed in /etc/shells to login.
# RequireValidShelloff

# Port 21 is the standard FTP port.
Port 21

# Prevent DoS attacks, set the maximum number of child processes
MaxInstances 5

# Set the user and group that the server normally runs at.
User proftpd
Group nogroup

# Umask 022 is a good standard umask to prevent new files and dirs
Umask 022 022

# Normally, we want files to be overwriteable
AllowOverwrite on

# Log-Files
TransferLog /var/log/proftpd/xferlog
SystemLog /var/log/proftpd/proftpd.log

# Logging onto /var/log/lastlog is enabled but set to off by default
#UseLastlog on

# In order to keep log file dates consistent after chroot, use timezone info.
#SetEnv TZ :/etc/localtime

QuotaEngine off
Ratios off

# Delay engine reduces impact of the so-called Timing Attack
DelayEngine on

ControlsEngine off
ControlsMaxClients 2
ControlsLog /var/log/proftpd/controls.log
ControlsInterval 5
ControlsSocket /var/run/proftpd/proftpd.sock
AdminControlsEngine off

# This is used for FTPS connections
#Include /etc/proftpd/tls.conf

# This is used for SFTP connections
#Include /etc/proftpd/sftp.conf

# This is used for other add-on modules
#Include /etc/proftpd/dnsbl.conf
#Include /etc/proftpd/geoip.conf
#Include /etc/proftpd/snmp.conf

# Useful to keep VirtualHost/VirtualRoot directives separated
#Include /etc/proftpd/virtuals.conf

# Include other custom configuration files
Include /etc/proftpd/conf.d/

$> sudo systemctl restart proftpd.service
# Dienst neu laden

Kurze Beschreibung zu den Anpassungen:

#DefaultRoot ~

Die Standard-Default-Root würde den Zugang zum gesamten Verzeichnis ermöglich. Daher ist diese auszukommetieren

DefaultRoot /home/DEINUSER DEINUSER

Die neue Default-Root «sperrt» den Benutzer «DEINUSER» in sein Verzeichnis ein. Darüber hinaus kann dieser Benutzer nicht hinausgehen.

Port 21

Setzt den öffentlichen Port auf den gewünschen Port. Im klassischen Fall Port 21.

MaxInstances 5

Sichert den Zugang gegen DDOS Attacken ab. Nach fünf versuchen wird abgebrochen.

AllowOverwrite on

Erlaubt das Überschreiben von Daten

5. Systembedienung

$> sudo systemctl start proftpd.service
# Dienst starten
$> sudo systemctl restart proftpd.service
# Dienst neustarten 
$> sudo systemctl stop proftpd.service
# Dienst stoppen 
$> sudo nano /etc/proftpd/proftpd.conf
# Konfigurationsdatei bearbeiten
$> sudo apt install nmap -y && nmap localhost
# Ports des Server auflisten
$> man proftpd
# Hilfedatei des Dienstes
$> man proftpd.conf
# Hilfe-Datei der Konfiguration
$> sudo proftpd -t
# Konfigurations-Überprüfung
$> cat /var/log/proftpd/proftpd.log
# Log-Files
$> cat /var/log/proftpd/xferlog
# Log-Files
$> ftp
ftp> open ...
# FTP-CLI-Test

6. Störungsanalyse

Statische IP-Adresse wird nicht gesetzt:
Beachte, dass die Netzwerk-Konfiguration im YAML-Stil erfolgt. Die „Incidents“ (Einschübe des Textes) sind essenziell.
Einige CLI-Befehle benötigen ungewöhnlich lange…
Wenn du den optionalen Teil dieser Anleitung befolgt hast, überprüfe, ob der Hostname des Servers mit der Hosts-Datei übereinstimmt!
Der FTP-Server funktioniert generell nicht…
Die Basis-Installation von ProFTP ist einfach, doch die eigentliche Herausforderung besteht in der Konfiguration des FTP-Servers. Die meisten Fehler resultieren aus fehlerhaften Einstellungen, was besonders deutlich wird, wenn man sich eingehender mit der Konfiguration beschäftigt. Daher sollte der Zweck des Servers von vornherein klar definiert sein. Die folgende Anleitung bezieht sich auf den Einsatz des Servers zum Empfangen gescannter Dokumente von einem Drucker. Die empfohlenen Sicherheitsmaßnahmen sind in einer lokalen Umgebung ausreichend.
Viele Probleme entstehen durch die Vielfalt der Client-Systeme, die verwendet werden – eine Vielzahl an Systemen, die hier nicht alle aufgezählt werden können. Häufig liegen die Ursachen für Probleme in Credentials, Firewalls oder Proxy-Servern, die den Zugang blockieren. Tatsächlich handelt es sich bei diesen Problemen weniger um «Fehler» im engeren Sinne, sondern um Sicherheitsvorkehrungen, die speziell den Zugriff auf Port 21 betreffen.
Es sei nochmals betont: FTP gilt als unsicher. Viele Geräte, insbesondere Drucker, verwenden auch heute noch FTP anstelle des sichereren SFTP-Protokolls. Der Grund hierfür liegt oft in der Hardware der Geräte, die SFTP nur selten unterstützen.
Das eigentliche Troubleshooting wird besser in spezialisierten Anleitungen behandelt, da das Feld der Anwendungen gross ist.
Üblicherweise: Die Standard-Installation erzeugt bereits eine funktionale Serverumgebung,

7. Erweiterte Serverentwicklung und Impulse

FTP-Ordner neigen dazu, an Speicher schnell vollzulaufen. Daher sollten die Home-Verzeichnisse regelmäßig bereinigt werden. Am einfachsten lässt sich dies mit einem CronJob erreichen, der als Root-Benutzer ausgeführt wird.

Des weiteren: In diesem Fall sind die FTP-Benutzer echte SSH-Konten, können aber auch durch virtuelle Konten ersetzt werden. Bei Verwendung virtueller Konten gehen jedoch einige der komfortablen Funktionen verloren, die Linux auf Basis von Kommandozeilenbefehlen bietet.