Log in

Bekijk de volledige versie : HowTo - vsftpd, jedem User sein eigenes Verzeichnis



newbiefan
30-12-2008, 10:10
Vielfach braucht man verschiedene Verzeichnisse für jeden User.
Da ich eine private Domain mit mehreren Subdomains betreibe, wollte
ich jedem User die Möglichkeit geben, seine Subdomain selbst zu gestalten.
Dazu war es erforderlich, einen FTP Zugang für jeden User einzurichten und
jedem User sein eigenes Directory zu geben.
Nun, ich mache es kurz - es gibt einige Lösungswege - ich wollte jedoch nach
Möglichkeit den bereits eingebauten VSFTPD von Oleg nutzen. Nach vielen
Versuchen habe ich letztendlich einen sehr stabilen und einfachen Weg
gefunden.
Noch ein paar Worte zu meiner Konfiguration:
Ich habe lighttpd laufen, um meine Webseiten lokal zu sammeln und probieren zu
können. Das Verzeichnis (document_root) von lighttpd liegt wie üblich in
/opt/share/www - die jeweiligen Unterverzeichnisse direkt darunter, also
Die startseite z.Bspl. auf /opt/share/www/index.html und im Unterordner
/opt/share/www/linux/index.html eine komplette Linux-Seite.
Der Vorteil liegt darin, dass man auf den Server von aussen mit
http://bespieluser.dyndns.org/linux sofort die Startseite unter dem jeweiligen
Ordner aufrufen kann. Genau so werden alle Ornder später auf den grossen Server
kopiert. Am grossen Server ist auf der Hauptseite ein Link auf die Unterseiten
und natürlich am DNS-Server die Subdomain direkt eingetragen. Deshalb brauche
ich nur alle Subordner unter document_root auf den Grossen Server kopieren um
den kleinen und grossen Server auf dem gleichen Stand zu halten. Das erleichtert
z.Bspl. die ganze Backup-Geschichte ganz wesentlich und ist zudem sehr einfach
zu realisieren. Weiters kann jeder User seine Seite beliebig testen, da ein
Upload nur alle 2 Tage durchgeführt wird.

VORBEDINGUNG:
- installierten und laufenden http Server (kein muss, ftp geht auch ohne)
- Olegs FW in der Version=>9 (mit VSFTP - VSFTPD muss funktionieren!)
- Die üblichen Kenntnisse und Installationen mit vi, putty, winscp

1.) User anlegen: legen sie alle User im Webif einfach an und read/write
Zugriff geben. Den Ftp Server eingeschaltet lassen. Abschließend noch
apply und finish.

2.) Mit winscp auf dem Router einloggen und aus /tmp/etc folgende Files auf den
PC kopieren:
- vsftpd.conf
- vsftpd.passwd
- den ganzen Ordner vsftpd.users
Winscp schliessen

3.) Im Webif vom Router den FTP einfach ausschalten, apply und finish

4.) Nochmals winscp starten und alle Files von Pkt. 2.) wieder an den
gleichen Ort zurück kopieren. Winscp schliessen.

5.) Nun mit Putty am Router einloggen und einen Ordner anlegen:

(bei mir) mkdir /tmp/mnt/disc0_3/Z_VSFTP_USERS
dann darunter alle gewünschten Ordner anlegen, z. Bspl.
mkdir /tmp/mnt/disc0_3/Z_VSFTP_USERS/linux (ist ein Beispieluser)
mkdir /tmp/mnt/disc0_3/Z_VSFTP_USERS/anderesbeispiel
usw. - bis alle Ordner angelegt sind

6.) Nun noch die wesentliche, kleine Änderung:

vi /tmp/etc/vsftpd.users/linux (mit i in den insert mode)
und als erste Zeile einfügen:
local_root=/tmp/mnt/disc0_3/Z_VSFTPD_USERS/linux
mit ESC:wq speichern

den gleichen Vorgang für jeden User durchführen, also

vi /tmp/etc/vsftpd.users/anderesbeispiel
local_root=/tmp/mnt/disc0_3/Z_VSFTP_USERS/anderesbeispiel
usw. usw., bis alle User ein eigenes Directory als local_root haben.

7.) Nun noch die geänderten Files (mit vi) in /tmp/local/.files eintragen

/etc/fstab
/etc/vsftpd.conf
/etc/vsftpd.users
/etc/vsftpd.passwd

8.) Jetzt muss nur noch der vsftpd beim booten gestartet werden:
In die /tmp/local/sbin/post-mount unmittelbar vor rc.unslung eintragen

#vsftpd starten, wegen eigener User-Config
/usr/sbin/vsftpd

9.) Wenn der Ordner des Users auch über das Web erreichbar sein soll,
einfach einen symbolischen Link legen:

ln -s /tmp/mnt/disc0_3/Z_FTP_USERS/linux /opt/share/www/linux


10.) Naja und was denn sonst noch - natürlich das berühmte:

flashfs save && flashfs commit && flashfs enable && reboot


Falls man den symbolischen Link entfernen will/muss:

unlink /opt/share/www/linux

Bitte niemals zur Linkentfernung rm -f /opt/share/www/linux benutzen,
das kann bei einer falschen Option (-f) sehr böse Folgen haben, ist mir
leider einmal passiert! (Leider ein r anstatt f erwischt) Und auch kein
unlink /opt/share/www/linux/ (/), die Fehlermeldung war für mich der
Grund, warum ich ein rm -r /opt/share/www/linux/ versuchte (unabsichtlich),
leider ist es bei einem einzigen Versuch geblieben, denn danach war das
gesamte Directory weg. (Aber aus Schaden wird man klug!)

Spielereien: natürlich kann man als local_root jedes beliebige Directory angeben, bei vielen Users wird das aber schnell sehr unübersichtlich - und noch etwas - verbieten sie root und anonymus als ftp, das stellt ein sehr grosses Sicherheitsrisiko dar!

Fehler: bis jetzt keine bekannt, lediglich ein nicht Linux-konformer Editor war Schuld für eine längere Fehlersuche. Seither nehme ich nur mehr den Editor von Winscp oder vi, von mc oder nano.

Viel Spass

hornau
08-01-2010, 13:40
Hallo newbiefan,

vielen Dank für Dein HowTo, mit dem ich den vsftpd auf meinem WL500gPV2 gut einrichten konnte.
Nun tritt bei mir folgendes Problem auf: Das Einloggen vom LAN funktioniert, z. B. mit Windows Start->Ausführen->ftp. Ich kann mit dann mit "pwd" meinen Verzeichnisnamen anschauen, mit "cd" in ein Unterverzeichnis wechseln aber "ls" oder "dir" brechen ab mit:


200 PORT command successful. Consider using PASV.
425 Failed to establish connection.


winscp bricht auch ab mit:


Timeout detected.
Could not retrieve directory listing
PORT command successful. Consider using PASV.
Error listing directory '/'.


Eigenartigerweise bekommt Firefox nach Aufruf von ftp://192.168.1.1 und Eingabe von User und Passwort ein Directorylisting, allerdings nur aus dem LAN. Wenn ich über Firefox aus dem WAN zugreife (Port 21 ist weitergeleitet), funktioniert auch das nicht.

In meiner vsftpd.conf habe ich dirlist_enable=yes und für meinen Benutzer "test2" in vsftpd.users/test2 auch nocheinmal.

Meine vsftpd.conf sieht so aus:


anonymous_enable=no
dirmessage_enable=yes
download_enable=no
dirlist_enable=no
hide_ids=yes
syslog_enable=yes
local_enable=yes
local_umask=022
chmod_enable=no
chroot_local_user=yes
check_shell=no
user_config_dir=/etc/vsftpd.users
passwd_file=/etc/vsftpd.passwd
listen_ipv6=yes
listen_port=21
background=yes
max_clients=12
idle_session_timeout=240
utf8=yes
use_sendfile=no
anon_max_rate=0
local_max_rate=0


und meine vsftpd.users/test2 so:


local_root=tmp/mnt/vsftp_users/disc0_3/test
dirlist_enable=yes
download_enable=yes
write_enable=yes


Die Berechtigungen für das Testverzeichnis tmp/mnt/vsftp_users/disc0_3/test sehen so aus:


drwxr-xr-x 3 admin root 4096 Jan 5 14:07 .
drwxr-xr-x 9 admin root 4096 Jan 5 12:14 ..
drwxrwxr-x 3 admin root 4096 Jan 6 13:18 test


Ich habe meinen Router nach der Anleitung von wengi eingerichtet und die von ihm empfohlenen "Weiterentwicklung von olegs Firmware" WL500gpv2-1.9.2.7-d-r1000.trx installiert.

Hättest Du vielleicht einen Ansatz wie ich das Problem lösen könnte? Ich wäre Dir sehr dankbar.

Grüße
hornau

newbiefan
08-01-2010, 17:02
Ich habe meinen Router nach der Anleitung von wengi eingerichtet und die von ihm empfohlenen "Weiterentwicklung von olegs Firmware" WL500gpv2-1.9.2.7-d-r1000.trx installiert.

Hättest Du vielleicht einen Ansatz wie ich das Problem lösen könnte? Ich wäre Dir sehr dankbar.

Grüße
hornau

Ich sende dir jedenfalls meine vsftpd.conf, bei mir geht es - habe aber die r740 FW noch drauf, sollte sich aber nichts geändert haben.
Was mir auffällt: benutzt du ipv6?
Jedenfalls sieht bei mir eine user-config so aus:

dirlist_enable=yes
download_enable=yes
write_enable=yes
local_root=/tmp/mnt/disc0_3/irgend_ein_dir

und meine vsftpd.conf:

anonymous_enable=no
dirmessage_enable=yes
download_enable=no
dirlist_enable=no
hide_ids=yes
syslog_enable=yes
local_enable=yes
local_umask=066
chmod_enable=no
chroot_local_user=yes
check_shell=no
user_config_dir=/etc/vsftpd.users
passwd_file=/etc/vsftpd.passwd
listen=yes
listen_port=21
background=yes
max_clients=12
idle_session_timeout=1200
utf8=yes
use_sendfile=no
anon_max_rate=0
ftpd_banner="welcome to example.net node63, everything is logged"
use_localtime=yes
delay_failed_login=15
max_login_fails=1

Also sehe ich vorerst keine Unterschiede, lediglich bei unmask und listen.
delay failed login erzwingt 15 Sekunden Verzögerung bei falschen Login, abhängig von max_login_fails. Achja, use_localtime behebt den Zeitfehler, den Vsftpd sonst ausgibt.
Solltest du keine ipv6 connection haben, versuche es einfach mit meiner Conf, kann ja nicht viel passieren...

Als ftp-client verwende ich Filezilla, versch. Linuxe wie Ubuntu; Debian; Mandrake, und eigentlich alles was eben so installiert ist und einen FTP-Client spielen kann.
(Lediglich IE habe ich noch nicht probiert)

Was ich auch noch sehe im Changelog ist ein Update von Vsftpd auf V2.2.2 ab FW r893. Das sollte jedoch nicht allzuviel ausmachen, r740 hatte die Version V2.2.1 laufen.

Wäre gut zu wissen, woran es hapert - teile uns bitte mit wenn es gehen sollte.

LG
Newbiefan

Nachtrag: Habe ich vergessen zu fragen: läuft dein Router im AP oder Gateway Mode?
Falls im Gateway-Mode, bitte die Ausgabe von 'lsmod' eventuell fehlt hier etwas (Conntrack), siehe http://forums.fedoraforum.org/showthread.php?t=61710

oder noch besser: https://www.linuxquestions.org/questions/linux-server-73/vsftpd-ls-problems-597966/

Falls notwendig, erklären wir dir wie und wo man das Modul laden kann.

hornau
09-01-2010, 23:29
Klasse! Es geht!
Das war wohl das listen_ipv6=yes anstelle von listen=yes in meiner vsftpd.conf.
IPV6 ist bei mir im WIF ausgeschaltet. Wenn ich mir die vsftpd Konfig-Dateien vom System erzeugen lasse, steht listen_ipv6=yes in der vsftpd.conf...

Nun, mit Deiner vsftpd.conf geht es. Vielen Dank!

Bzgl. Deiner Fragen: Mein Router läuft als Home Gateway.
Hier die mod-Liste:


Tainted: P
usb-storage 63112 4
sd_mod 12900 8
scsi_mod 72656 2 [usb-storage sd_mod]
printer 13060 0 (unused)
ehci-hcd 28212 0 (unused)
usb-ohci 19428 0 (unused)
usbcore 78936 1 [usb-storage printer ehci-hcd usb-ohci]
ip_nat_ftp 3136 0 (unused)
ip_conntrack_ftp 4584 1
ipt_NETMAP 760 2
et 29088 0 (unused)


ip_conntrack_ftp ist drin.

Dann vielen Dank nochmal für Deine Hilfe!
Ich mache mich dann mal an den Webserver...

Grüße
hornau

newbiefan
10-01-2010, 19:23
Was mir noch aufgefallen ist:
Laut deinen Angaben befindet sich ein vsftp_users Verzeichnis auf /tmp/mnt ,
dann wäre alles im RAM und ist nur beschränkt nutzbar, max. das freie RAM= wenige MB.

tmp/mnt/vsftp_users/disc0_3/test

Es kann aber auch ein Schreibfehler sein, denn normaler Weise wäre es:
/tmp/mnt/disc0_3/vsftp_users/test

Dann befindet sich das Verzeichnis auf der Festplatte, sonst im RAM.

Die einzige Ausnahme: wenn die HDD nicht nach /tmp/mnt/disc0_3 gemountet ist, sondern nach /tmp/mnt/vsftp_users/disc0_3

Aber ein einfaches 'mount' zeigt dir wohin die HDD gemountet ist.
Viel Spass

hornau
14-01-2010, 22:55
Oh, das war wohl ein Verdreher von mir. Die Partition ist aber nach /tmp/mnt/disc0_3 gemountet. Danke für den Hinweis.

A pros pos mounten: Ich habe eine weitere Partition unter /tmp/mnt/disc0_4. Wenn ich diese nun in /tmp mit einem Link "harddisk2" erreichen möchte und einen

ln -s /tmp/mnt/disc0_4 harddisk2
erzeuge: wie erhalte ich denn den Link nach einem Neustart? In der fstab habe ich den Mountpoint übrigens schon angelegt. (...die Frage ist unter diesem Thema vielleicht nicht richtig aufgehoben...)

Ich hätte auch noch ein paar Fragen zu vsftpd:
Werden eigentlich alle Benutzer in der vsftpd.passwd gebraucht? Die vom System generierte Datei legt standardmäßig die Benutzer "ftp", "admin" und "nobody" an, wobei alle /sbin/nologin haben.
Läuft vsftpd auch noch, wenn ich diese Benutzer lösche? Ich will wirklich nur mit meinen in vsftpd.passwd selbst angelegten Benutzern über ftp zugreifen.

Und wenn ich nun in Zukunft einen neuen vsftpd-Benutzer anlege: wie bekomme ich denn das Passwort in die vsftpd.passwd? Durch umkopieren des Benutzereintrags aus der /etc/passwd in die /etc/vsftpd.passwd?

Und meine letzte Frage: da ich "chroot" verwende kann ich mich wohl nicht entlang eines Links im Verzeichnisbaum bewegen, wenn ich per ftp zugreife?
Es wäre der Anwendungsfall, dass ich einem Freund bspw. einen ftp-Benutzer und Passwort gebe, damit er sich, ausgehend von seinem persönlichen vsftp-Ordner über einen Link zu einem Ordner bewegt, wo er z. B. Fotos herunterladen kann, die unter /harddisk/fotos/feier1 abgelegt sind. Ein weiterer würde einen anderen Zugang bekommen und hätte bspw. von seinem ftp-Verzeichnis einen Link zu den Ordnern /harddisk/fotos/feier1 und /harddisk/fotos/urlaub2.

Vielen Dank schonmal vorab für die Hilfe.
Grüße
hornau

newbiefan
16-01-2010, 21:32
Ein symbolischer Link bleibt auch nach einem Reboot erhalten.
ln -s /tmp/mnt/disc0_4 /tmp/mnt/harddisk2

Wenn du versuchst bereits in der Fstab zu mounten, müsste es bereits dort gehen: /dev/discs/disc0/part4 /tmp/harddisk2 ext3 rw,noatime 1 1
(Achtung: eine Änderung in der fstab wird nur dauerhaft gespeichert mit flashfs save......)

Ob die Benutzer gebraucht werden, kann ich nicht genau sagen. Ich würde aber tippen: ja, denn vsftpd schreibt z.Bspl. in den Logfile und muss daher auch bestimmte Rechte haben. Einfach probieren.

Die neuen Benutzer kannst du entweder umkopieren oder generell in der vsftpd.conf als Passwortdatei die /etc/passwd anstatt vsftpd.passwd verwenden.

Chroot: der Benutzer ist ja nur in seinem Käfig (chroot) eingesperrt, welche Dateien und Verzeichnise in seinem Käfig sind muss egal sein. Jedoch müssen die Rechte der gelinkten Verzeichnisse dem jeweiligen User erlauben, die Datei / Verzeichnisse auch zu lesen und zu schreiben oder nur zu lesen usw.
Dazu sollte man sich in die Rechtevergabe und deren Möglichkeiten einlesen.
Es ist viel einfacher als es aussieht - versteht man einmal das Prinzip, kann man viel damit machen.

Dennoch rate ich dringend von vielen symLinks bei FTP-User ab, letztendlich hebelt es die Sicherheit teilweise aus und ausserdem wird alles sehr unübersichtlich (bei vielen Usern).

Have fun