vsftpd: Secure FTP Server on RHEL (Artikel 100)
Konfiguration des vsftpd-Servers unter RHEL. Erfahren Sie alles über passive Modi, Benutzerisolierung (Chroot) und die komplexe Firewall- und SELinux-Konfiguration für FTP.
# vsftpd on RHEL: Sicherer Dateitransfer im Rechenzentrum
TL;DR / Management Summary Obwohl FTP ein veraltetes Protokoll ist, wird es in vielen Enterprise-Szenarien (z.B. für Backup-Targets oder Datenaustausch mit Altsystemen) weiterhin benötigt. vsftpd (Very Secure FTP Dämon) ist die Standardwahl für RHEL. Ein Senior Admin muss wissen, wie man den Passive Mode für Firewalls konfiguriert und wie man mittels SELinux-Booleans verhindert, dass FTP-Nutzer das gesamte System durchsuchen können.
# 1. Einführung & Architektur
Wie FTP durch die Firewall schlüpft.
FTP nutzt zwei Kanäle:
- Control Channel (Port 21): Für Befehle.
- Data Channel (Dynamisch): Für den eigentlichen Datentransfer.
In RHEL nutzen wir fast ausschließlich den Passive Mode, da hier der Client die Datenverbindung zum Server aufbaut, was kompatibler mit modernen Firewalls ist.
graph TD
A[Client] -->|Port 21: Command| B[vsftpd Server]
B -->|Port Range: 10000-10100| A
A -->|Port Range: Data| B
subgraph "RHEL Security"
C{firewalld} --> B
D{SELinux} --> B
end
# 2. Installation & Grundkonfiguration
Sicherheit durch Isolation.
# Schritt 1: Installation
sudo dnf install vsftpd
sudo systemctl enable --now vsftpd
# Schritt 2: Konfiguration (/etc/vsftpd/vsftpd.conf)
Ein gehärtetes Setup für lokale User:
anonymous_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user=YES
allow_writeable_chroot=YES
# Passive Mode Range
pasv_min_port=10000
pasv_max_port=10100
# 3. Firewall & SELinux: Das Nadelöhr
FTP zum Laufen bringen.
# Firewall konfigurieren
Neben dem Dienst ftp müssen die passiven Ports geöffnet werden:
sudo firewall-cmd --permanent --add-service=ftp
sudo firewall-cmd --permanent --add-port=10000-10100/tcp
sudo firewall-cmd --reload
# SELinux Booleans (Essenziell!)
Damit FTP-User in ihre Home-Verzeichnisse schreiben dürfen:
sudo setsebool -P ftp_home_dir on
# 4. Day-2 Operations: User-Management
Zugriff einschränken.
# Die user_list nutzen
Verhindern Sie, dass System-User (root, bin, etc.) sich via FTP anmelden.
Datei: /etc/vsftpd/user_list
Fügen Sie User hinzu, die nicht rein dürfen, oder kehren Sie die Logik um:
userlist_deny=NO (Nur User in der Liste dürfen rein).
# 5. Troubleshooting & “War Stories”
Wenn der Login geht, aber der List-Befehl hängt.
# Story 1: “Der hängende Verzeichnis-Inhalt”
Symptom: Der Login ist erfolgreich, aber ls oder dir führt zu einem Timeout.
Ursache: Der Control-Channel funktioniert, aber der Data-Channel (Passive Ports) wird durch eine Firewall blockiert (entweder am Server, am Client oder dazwischen).
Lösung: Prüfen Sie die pasv_min_port und pasv_max_port Einstellungen und stellen Sie sicher, dass diese in der Firewall (Hardware & OS) offen sind.
# Story 2: “500 OOPS: vsftpd: refusing to run with writable root inside chroot”
Symptom: Login schlägt fehl mit einer Fehlermeldung über beschreibbare Roots.
Ursache: Aus Sicherheitsgründen verbietet vsftpd den Login, wenn das oberste Verzeichnis des Users beschreibbar ist.
Lösung: Entweder Schreibrechte vom Root-Verzeichnis entfernen (chmod a-w ~) oder allow_writeable_chroot=YES in der Config setzen (weniger sicher).
# 6. Fazit & Empfehlung
- Sicherheit: Nutzen Sie wenn möglich SFTP (via SSH, Artikel 027) statt FTP.
- Verschlüsselung: Wenn FTP unumgänglich ist, aktivieren Sie TLS (FTPS) in der
vsftpd.conf:ssl_enable=YES. - Wartung: Überwachen Sie
/var/log/vsftpd.log, um unbefugte Login-Versuche zu erkennen.
# Anhang: Cheatsheet
| Aufgabe | RHEL Befehl |
|---|---|
| Status prüfen | systemctl status vsftpd |
| Port 21 Check | `ss -tulpn |
| SELinux Booleans | `getsebool -a |
| User ausschließen | /etc/vsftpd/ftpusers |
| Log-Datei | /var/log/xferlog |