Vsftpd Instanzen mit xinetd

Aus UUGRN

Dieser Artikel beschreibt, wie man mehrere vsftpd Instanzen (VirtualHosts) mit individueller Konfiguration mittels xinetd betreiben kann. Das Beispiel wurde unter debian wheezy getestet.

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.

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


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