linux-rhel-centos-fedora file-transfer ftp vsftpd rhel security

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:

  1. Control Channel (Port 21): Für Befehle.
  2. 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