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/