Vsftpd Instanzen mit xinetd

Aus UUGRN

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[Bearbeiten]

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[Bearbeiten]

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, sshd -i, ...). Idealerweise unterstützt der aufgerufene Service per Parameter eine individuelle Konfigurationsdatei zu laden (sshd -i -f /path/to/sshd_foo.conf, vsftpd /path/to/vsftpd_foo.conf)

xinetd kann mehrere Services unabhängig voneinander verwalten.

xinetd[Bearbeiten]

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[Bearbeiten]

/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[Bearbeiten]

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[Bearbeiten]

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