/dev/null

Elite is stupid. Back to the roots.

June 22, 2007

Howto: vsftpd mit virtuellen Usern einrichten

13:15

This is a small vsftpd howto I wrote some months ago, while installing it on a SuSE Linux 10 server – sorry to those who don’t understand German or use another Linux distribution! Some hints may be useful anyways…

The official vsftpd home page is: http://vsftpd.beasts.org/

vsftpd installieren und anpassen

Zunaechst sollte man sicherstellen, dass man vsftpd ueberhaupt installiert hat:


walrus:~ # rpm -q vsftpd
vsftpd-2.0.2-3

Falls nicht, wie gewohnt ueber yast installieren (die Suchfunktion erspart Scrollen in der Paketliste!). Bei anderen Linux Distributionen entsprechend (z.B. yum unter Fedora).

Als naechstes legt man in /etc/passwd (bzw. ueber den Befehl useradd) einen user fuer vsftpd an:

useradd --system --home /var/run/vsftpd/ ftpsecure

In /etc/xinetd.d/vsftpd setzt man disable = no.

Die /etc/vsftpd.conf kann beispielsweise so aussehen (die Strings fuer guest_username und ftpd_banner sind ggf. anzupassen):


dirmessage_enable=YES
guest_enable=YES
guest_username=someuser
user_sub_token=$USER
write_enable=YES
anon_mkdir_write_enable=YES
anon_upload_enable=YES
nopriv_user=ftpsecure
ftpd_banner="Welcome to MY_HOSTNAME"
hide_ids=YES
local_enable=YES
chroot_local_user=YES
anonymous_enable=NO
anon_world_readable_only=YES
pam_service_name=vsftpd

FTP User anlegen

Um vsftpd mit virtuellen Accounts betreiben zu koennen, benoetigt man einen richtigen User Account (guest_username) und ein Verzeichnis (Home Verzeichnis dieses Users). Grundsaetzlich kann man dazu auch bereits bestehende Accounts aus der /etc/passwd verwenden (wie z.B. wwwrun oder apache, wenn man Webhosting betreibt):

someuser:x:1234:100:Virtual FTP User Account:/home/virtual/$USER:/bin/false

Zum Anlegen eines neuen Users kann wie oben ggf. useradd verwendet werden.

Wichtig ist das $USER, damit jeder User ein eigenes Verzeichnis hat. Man kann es selbsverstaendlich auch weglassen, aber dann landen alle Benutzer im selben Verzeichnis. Die $USER Verzeichnisse werden uebrigens, anders als in der vsftpd Doku angegeben, NICHT automatisch erstellt! Scheint ein Bug zu sein, ueber den man auch ueber Google einiges findet. Loesung habe ich noch keine gefunden.

PAM

Wo kommen nun die virtuellen Accounts her? Die Authentifizierung wird (leider nicht ganz trivial) ueber PAM (pam_pwdfile) und eine Apache-kompatible Account-Datei realisiert. Diese kann grundsatzlich ueberall liegen, sollte aber nur von root gelesen werden koennen. Im Beispiel heisst sie /etc/ftp/users und hat das einfache Format user:password_crypt. Sie kann mit dem Tool htpasswd bzw. htpasswd2 verwaltet werden. Auf debianhowto.de ist auch ein Perl Script zur Userverwaltung zu finden.

Da wir oben pam_service_name=vsftpd gesetzt haben, muss die Konfiguration in /etc/pam.d/vsftpd erfolgen:


#%PAM-1.0

auth    required pam_pwdfile.so pwdfile /etc/ftp/users
account required pam_permit.so

Wir waeren nun fertig, wuerde SuSE das benoetigte PAM Modul pam_pwdfile.so mitliefern – dies ist jedoch bei OpenSuSE 10 ganz offensichtlich nicht der Fall :(

Aber kein Problem… man kann es hier downloaden:

http://cpbotha.net/pam_pwdfile.html

Zusaetzlich muss man zum Kompilieren noch Linux-PAM selbst herunterladen:

ftp://ftp.kernel.org/pub/linux/libs/pam/pre/library

Anschliessend pam_pwdfile-0.XX.tar.gz in Linux-PAM-0.XX/modules/ entpacken:


tar -xzf Linux-PAM-0.78.tar.gz
cd Linux-PAM-0.XX/modules/
tar -xzf pam_pwdfile-0.XX.tar.gz

Jetzt kann man das Modul kompilieren und kopieren:


cd ..
./configure
make all
Auf 64-bit Systemem:
cp modules/pam_pwdfile-0.XX/pam_pwdfile.so /lib64/security/
oder auf 32-bit Systemem:
cp modules/pam_pwdfile-0.XX/pam_pwdfile.so /lib/security/

Das wars

Restart des xinetd ueber /etc/init.d/xinetd restart sollte nun zum gewuenschten Ergebnis fuehren. Bitte nicht vergessen User in /etc/ftp/users und die entsprechenden Unterverzeichnisse in /home/virtual anzulegen (wenn keine Schreibrechte da sind, funktioniert der Upload natuerlich nicht… also darauf achten, dass die Rechte ueberall stimmen).

Wenn noch eine Firewall da ist, dann muss Port 21 uebrigens freigegeben werden ;)

2 Comments »

  1. Hallo,

    toll die Einleitung, ich habe alles so gemacht und es hat auf anhieb funktioniert. Jetzt habe ich einige Rechte für die Verzeichnisse verändert und es funktioniert nicht mehr, ich versuche es wieder zurück zu ändern, ich kann mich aber nicht erinnern wie ich die Rechte anfangs gesetzt hatte. Wem müssen die Verzeichnisse gehören? Ich dachte meinen Realen User (ich habe Ihn in die Gruppe www hinzugefügt) also sieht es bei mir so aus:

    > ll /home/virtual/myvirtualftpaccount/
    drwxrwxrwx 2 myrealftpuser www 4096 Aug 17 14:31 .

    Es kommt folgende Fehlermeldung:
    ————————
    Auf diesen Ordner kann nicht zugegriffen werden. Vergewissern Sie sich, dass der Dateiname richtig angegeben wurde, und dass Sie über die erforderlichen Zugriffsberechtigungen verfügen.

    Details:
    The connection with the server was reset
    ————————

    Danke für Deine Hilfe!
    Eqvis.

    Comment by Eqvis — August 17, 2008 @ 14:55

  2. hallo,
    es ist nicht noetig, die werte fuer anon_mkdir_write_enable und anon_upload_enable auf YES zu setzen.

    virtual_use_local_privs=YES

    mappt die privileges des ordner auf den enstprechenden user.

    wenn also z.b.

    secre_chroot_dir=/mnt/pladde/ftp

    ist und der user “alice” entsprechend in /mnt/pladde/ftp/alice sein home hat, werden durch diese option die privileges des ordners alice ebenfalls im ftpd uebernommen.

    Comment by anon — February 3, 2009 @ 23:59

RSS feed for comments on this post. TrackBack URL

Leave a comment

Powered by PHP, Memcached, Suhosin, MySQL and WordPress