Vsftpd Instanzen mit xinetd
Dieser Artikel beschreibt, wie man mehrere vsftpd Instanzen (VirtualHosts) mit individueller Konfiguration mittels xinetd betreiben kann.
Das folgende Beispiel wurde unter Debian Wheezy getestet, sollte aber ohne größere Modifikationen unter jedem anderen Betriebssystem nutzbar sein, welches PAM anbietet und bei dem xinetd und vsftpd verfügbar ist.
Ziel
Ziel ist es, mehrere, getrennt voneinander verwaltbare FTP-Server auf einem Host zu betreiben. Dabei kann jeder FTP-Server eine komplett eigene Benutzerverwaltung haben und vollständig individuell konfiguriert werden.
Das Beispiel beschreibt, wie man für 2 Mandanten (zB. Kunden) namens Foo und Bar jeweils unabhängige Instanzen von vsftpd betreiben kann, mit jeweils eigenen Benutzern die gleich heißen und verschiedene Passwörter haben dürfen. Für jeden Mandant existiert jeweils ein eigener Unix-Benutzer (z.B. user_foo und user_bar).
Aufbau
xinetd ist sehr gut darin, bestimmte Services auf mehr oder weniger beliebigen Ports oder IP-Adressen zu betreiben. Der jeweilige Server, der mittels xinetd aufgerufen wird wird dabei pro tcp-Session neu aufgemacht, d.h. innerhalb eines Prozesses existieren nur die Daten, die für diese individuelle Session benötigt werden. Der jeweilige Service (zB vsftpd) muss nicht beim Booten gestartet werden und darf auch nicht auf irgendwelchen Ports lauschen sondern muss die Betriebsart "inetd" unterstützen (zB vsftpd -i, sshd -i, ...). Idealerweise unterstützt der aufgerufene Service per Parameter eine individuelle Konfigurationsdatei zu laden (sshd -i -f /path/to/sshd_foo.conf, vsftpd -i /path/to/vsftpd_foo.conf)
xinetd kann mehrere Services unabhängig voneinander verwalten.
xinetd
xinetd sollte bereits installiert sein und laufen. Nach dem Anlegen der beiden Dateien in /etc/xinetd.d/ muss er reloaded werden ("service xinetd reload").
- /etc/xinetd.d/vsftpd_foo
service vsftpd_foo { id = vsftpd_foo disable = no type = UNLISTED socket_type = stream protocol = tcp port = 2005 wait = no user = root server = /usr/sbin/vsftpd server_args = /etc/vsftpd_foo.conf log_on_success += HOST DURATION log_on_failure += HOST }
- /etc/xinetd.d/vsftpd_bar
service vsftpd_bar { id = vsftpd_bar disable = no type = UNLISTED socket_type = stream protocol = tcp port = 2006 wait = no user = root server = /usr/sbin/vsftpd server_args = /etc/vsftpd_bar.conf log_on_success += HOST DURATION log_on_failure += HOST }
vsftpd
- /etc/vsftpd_foo.conf
pam_service_name=vsftpd_foo listen=NO anonymous_enable=NO local_enable=YES write_enable=YES local_umask=022 nopriv_user=vsftpd virtual_use_local_privs=YES guest_enable=YES user_sub_token=$USER local_root=/ftp/foo/FTP/ chroot_local_user=YES hide_ids=YES guest_username=user_foo file_open_mode=0660 local_umask=002
- /etc/vsftpd_bar.conf
pam_service_name=vsftpd_bar listen=NO anonymous_enable=NO local_enable=YES write_enable=YES local_umask=022 nopriv_user=vsftpd virtual_use_local_privs=YES guest_enable=YES user_sub_token=$USER local_root=/ftp/bar/FTP/ chroot_local_user=YES hide_ids=YES guest_username=user_bar file_open_mode=0660 local_umask=002
- Wichtig
- Aufgrund von chroot_local_user müssen die Verzeichnisse /ftp/{foo,bar}/FTP/ dem User root gehören, darunter empfiehlt sich zB ein Unterverzeichnis, was für den jeweiligen Unix-User (user_foo oder user_bar) schreibbar ist, zB /ftp/{foo,bar}/FTP/pub/
PAM
vsftpd kann sich unter verschiedenen Service-Names für PAM ausgeben ("pam_service"), entsprechend kann man hier auch pro Service eine eigene Benutzerauthentifizierung konfigurieren, hier zum Beispiel pam_pwdfile, welches Benutzer anhand einer "htpasswd"-Datei authentifizieren kann. Gibt man hier jeweils verschiedene Passwort-Dateien an, kann man entsprechend gleichnamige Benutzer mit verschiedenen Passwörtern verwalten.
- /etc/pam.d/vsftpd_foo
auth required pam_pwdfile.so pwdfile /etc/vsftpd_foo/passwd account required pam_permit.so
- /etc/pam.d/vsftpd_bar
auth required pam_pwdfile.so pwdfile /etc/vsftpd_bar/passwd account required pam_permit.so
passwd
Diese Dateien werden mit "htpasswd" verwaltet. Hier werden "crypt"-Passwörter verwendet (htpasswd -d verwenden!):
- /etc/vsftpd_foo/passwd
admin:wTSSMEQYXTdus user1:e.aRF761T4UW6
- /etc/vsftpd_bar/passwd
admin:TilV1C4MCHkHo user1:T3BK8soj9osag