vsftpd

Siehe auch

  • SFTP mit sshd

Der „Very Secure File Transfer Protocol Daemon“ (vsftpd) ist ein schneller, kompakter FTP-Server, bei dem der Schutz gegen unbefugte Nutzung im Mittelpunkt der Entwicklung steht (in der Standard-Einstellung sind sämtliche Features abgeschaltet). Er ist der Standard FTP-Server auf RHEL-Derivaten.

Installation und Konfiguration

yum -y install vsftpd
systemctl enable --now vsftpd.service

In der Firewall müssen die FTP-Ports freigeschaltet werden:

firewall-cmd --permanent --add-service=ftp
firewall-cmd --reload

Eine Datei zum Download vorbereiten:

echo 'Works!' > /var/ftp/pub/test.txt

Der Benutzer „Anonymous“ darf sich nun verbinden und Dateien aus /var/ftp/pub herunterladen, was man auf dem Client mit

wget ftp://server/pub/test.txt

überprüfen kann.

Konfigurationsdatei sichern:

cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak

Log-File (wenn nicht anders konfiguriert):

tail -f /var/log/xferlog

Anwendungsfälle

Nur lokale System-Benutzer erlauben, anonyme sperren
/etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
Upload für anonyme Benutzer erlauben
/etc/vsftpd/vsftpd.conf
anonymous_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
setsebool -P allow_ftpd_anon_write on
Zugriff auf Verzeichnisse ausserhalb des Home-Verzeichnisses verhindern
/etc/vsftpd/vsftpd.conf
chroot_local_user=YES
Root-Verzeichnis pro Benutzer setzen

Dazu muss man user-spezifische Config-Files anlegen.

/etc/vsftpd/vsftpd.conf
chroot_local_user=YES
user_config_dir=/etc/vsftpd/user_config
/etc/vsftpd/user_config/user1
local_root=/data/share1
FTP-Benutzer muss die Apache DocumentRoot pflegen
/etc/vsftpd/vsftpd.conf
allow_writeable_chroot=YES
chroot_local_user=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/user_list
useradd \
    --home-dir /var/www/html/test \
    --shell /sbin/nologin \
    --groups apache \
    ftpuser
passwd ftpuser

echo 'ftpuser' >> /etc/vsftpd/user_list

chmod g=rwxs /var/www/html/test
setsebool -P ftpd_full_access on

/sbin/nologin muss in /etc/shells gelistet sein, ansonsten kann man sich nicht einloggen (Error 530).

/etc/shells
/sbin/nologin
FTPS konfigurieren, inkl. Zertifikatserzeugung
openssl req -x509 -nodes -days 365 \
    -newkey rsa:4096 \
    -keyout /etc/pki/tls/private/vsftpd.key \
    -out /etc/pki/tls/certs/vsftpd.pem
/etc/vsftpd/vsftpd.conf
# if implicit ftps is wanted, enable those
#implicit_ssl=YES
#listen=YES
#listen_port=990

# if using explicit (modern) ftps, lower the port range for data connection
#pasv_min_port=34000
#pasv_max_port=35000

# either way, this is needed for both
rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem
rsa_private_key_file=/etc/pki/tls/private/vsftpd.key
ssl_enable=YES
Logging erhöhen
/etc/vsftpd/vsftpd.conf
debug_ssl=YES
dual_log_enable=YES
log_ftp_protocol=YES
xferlog_std_format=YES
User aus dem Active Directory verwenden

Der Linux-Host muss AD-Joined sein.

/etc/vsftpd/vsftpd.conf
# use PAM authentication
session_support=YES
/etc/pam.d/vsftpd
# get users from Active Directory
auth       required      pam_env.so
auth       sufficient    pam_sss.so
account    sufficient    pam_sss.so
session    required      pam_loginuid.so

Tipp

Testen lässt sich am einfachsten mit FileZilla oder lftp -d -u 'user1,secretpassword' -e 'set ssl:verify-certificate no' ftp.example.com.

Gebräuchliche Konfigurationsoptionen

Ein Auszug der am häufigsten verwendeten Konfigurationsoptionen, abseits von den Standard-Einstellungen (alle Optionen erhält man per man vsftpd.conf 5):

anon_mkdir_write_enable=YES
anon_upload_enable=YES
anonymous_enable=YES
ascii_download_enable=YES
ascii_upload_enable=YES
async_abor_enable=YES
chown_uploads=YES
chown_username=whoever
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
chroot_local_user=YES
connect_from_port_20=YES
data_connection_timeout=120
deny_email_enable=YES
dirmessage_enable=YES
ftpd_banner=Welcome to blah FTP service.
idle_session_timeout=600
listen_ipv6=YES
local_enable=YES
local_umask=022
ls_recurse_enable=YES
nopriv_user=ftpsecure
pam_service_name=vsftpd
tcp_wrappers=YES
userlist_enable=YES
write_enable=YES
xferlog_enable=YES
xferlog_std_format=YES

Troubleshooting

krb5_child Pre-authentication failed: Cannot read password im /var/log/sssd/krb5_child.log
/etc/sssd/sssd.conf
[pam]
pam_passkey_auth = False
GPO-based access control failed im /var/log/sssd/sssd_*.log

Zum den Fehler eingrenzen, temporär GPOs ignorieren:

/etc/sssd/sssd.conf
[domain/example.com]
ad_gpo_access_control = disabled

Wenn nun das Login funktioniert, müssen als langfristige Lösung die AD GPOs angepasst werden.

Built on 2024-07-16