Virtual Hosting mit vsftpd und MySQL auf Debian Etch

Version 1.0
Author: Falko Timme


Vsftpd ist einer der sichersten und schnellsten FTP Server für Linux. Vsftpd ist normalerweise so konfiguriert, dass er auf Systembenutzern basiert. Diese Anleitung veranschaulicht, wie man einen vsftpd Server installiert, der auf virtuellen Benutzern einer MySQL Datenbank anstatt "realen" Systembenutzern basiert. Dies ist um einiges leistungsfähiger und bietet die Möglichkeit, Tausende von ftp Benutzern auf einer einzigen Maschine zu haben.

Zur Administration der MySQL Datenbank kannst Du web-basierte Tools wie phpMyAdmin verwenden, das in dieser Anleitung ebenfalls installiert wird. phpMyAdmin ist eine angenehme grafische Oberfläche, was bedeutet, dass Du nicht mit der Kommandozeile rumbasteln musst.

Diese Anleitung basiert auf Debian Etch (Debian 4.0). Du solltest ein Debian Etch Basissystem bereits installiert haben, was in den ersten sechs Kapitel dieser Anleitung beschrieben wird: http://www.howtoforge.com/perfect_setup_debian_etch
Diese Anleitung ist ein praktischer Leitfaden; theoretisches Hintergrundwissen wird nicht abgedeckt. Dies wird in zahlreichen anderen Dokumenten im Netz behandelt.

Diese Anleitung ist ohne jegliche Gewähr! Ich möchte an dieser Stelle darauf hinweisen, dass dies nicht der einzige Weg ist, ein solches System einzurichten. Es gibt viele Möglichkeiten ans Ziel zu kommen - dies ist der Weg, den ich gewählt habe. Ich übernehme keine Garantie, dass dies auch bei Dir funktioniert!

1 Vorbemerkung

In dieser Anleitung verwende ich den Hostnamen server1.example.com mit der IP Adresse 192.168.0.100. Diese Einstellungen werden von Deinen abweichen, Du musst sie also an entsprechender Stelle ersetzen.

2 Installation von vsftpd, MySQL und phpMyAdmin

Vsftpd hat keine eingebaute MySQL Unterstützung, daher müssen wir PAM verwenden, damit wir uns gegenüber der MySQL Datenbank authentifizieren können. Also installieren wir zusätzlich zu vsftpd, MySQL und phpMyAdmin libpam-mysql:

apt-get install vsftpd libpam-mysql mysql-server mysql-client phpmyadmin

Richte ein Passwort für den MySQL Benutzer root ein (ersetze yourrootsqlpassword mit einem Passwort Deiner Wahl):

mysqladmin -u root password yourrootsqlpassword

Überprüfe dann mit

netstat -tap | grep mysql

auf welcher Adresse MySQL hört. Sieht die Ausgabe wie folgt aus:

tcp 0 0 localhost.localdo:mysql *:* LISTEN 2713/mysqld

was bedeutet, dass MySQL nur auf localhost.localdomain hört, dann ist das Passwort, das Du zuvor eingerichtet hast, sicher. Sieht die Ausgabe allerdings so aus:

tcp 0 0 *:mysql *:* LISTEN 2713/mysqld

solltest Du auch ein MySQL Passwort für Deinen Hostnamen anlegen, da sonst jeder Zugriff auf Deine Datenbank hat und Daten ändern kann:

mysqladmin -h server1.example.com -u root password yourrootsqlpassword

3 Die MySQL Datenbank für vsftpd erstellen

Nun erstellen wir eine Datenbank mit der Bezeichnung vsftpd sowie einen MySQL Benutzer namens vsftpd den der vsftpd Daemon später verwenden wird, um sich mit der vsftpd Datenbank zu verbinden:

mysql -u root -p

CREATE DATABASE vsftpd;
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON vsftpd.* TO 'vsftpd'@'localhost' IDENTIFIED BY 'ftpdpass';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON vsftpd.* TO 'vsftpd'@'localhost.localdomain' IDENTIFIED BY 'ftpdpass';
FLUSH PRIVILEGES;

Ersetze ftpdpass mit einem Passwort, das Du für den MySQL Benutzer vsftpd verwenden möchtest. Immer noch in der MySQL Kommandozeile, erstellen wir die Datenbanktabelle, die wir benötigen (ja, es gibt nur eine Tabelle!):

USE vsftpd;

CREATE TABLE `accounts` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`username` VARCHAR( 30 ) NOT NULL ,
`pass` VARCHAR( 50 ) NOT NULL ,
UNIQUE (
`username`
)
) ENGINE = MYISAM ;

quit;

Wie Dir vielleicht aufgefallen ist, haben wir mit dem quit; Befehl die MySQL Kommandozeile verlassen und befinden uns wieder in der Linux Kommandozeile.

Übrigens kannst Du (ich gehe davon aus, dass der Hostname Deines ftp Server Systems server1.example.com ist) auf phpMyAdmin in einem Browser unter http://server1.example.com/phpmyadmin/ zugreifen (Du kannst auch die IP Adresse anstelle von server1.example.com verwenden) und Dich als Benutzer vsftpd anmelden. Dann kannst Du Dir die Datenbank ansehen. Du kannst später phpMyAdmin verwenden um Deinen vsftpd Server zu verwalten.

4 vsftpd konfigurieren

Zunächst legen wir einen nicht-privilegierten Benutzer namens vsftpd an (mit der Homedir /home/vsftpd), der zur Gruppe nogroup gehört. Unter diesem Benutzer werden wir vsftpd ausführen und unsere FTP Verzeichnisse unserer virtuellen Benutzer werden sich im /home/vsftpd Verzeichnis befinden (z.B. /home/vsftpd/user1, /home/vsftpd/user2, etc.).

useradd --home /home/vsftpd --gid nogroup -m --shell /bin/false vsftpd

Dann erstellten wir eine Sicherung der originalen /etc/vsftpd.conf Datei und erstellen unsere eigene:

cp /etc/vsftpd.conf /etc/vsftpd.conf_orig
cat /dev/null > /etc/vsftpd.conf
vi /etc/vsftpd.conf

Die Datei sollte folgende Inhalte haben:

listen=YES
anonymous_enable=NO local_enable=YES write_enable=YES local_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES nopriv_user=vsftpd chroot_local_user=YES secure_chroot_dir=/var/run/vsftpd pam_service_name=vsftpd rsa_cert_file=/etc/ssl/certs/vsftpd.pem guest_enable=YES guest_username=vsftpd local_root=/home/vsftpd/$USER user_sub_token=$USER virtual_use_local_privs=YES user_config_dir=/etc/vsftpd_user_conf
Die Konfigurationsoptionen werden hier erklärt http://vsftpd.beasts.org/vsftpd_conf.html. Die wichtigen Optionen für unseres virtuelles Setup sind chroot_local_user, guest_enable, guest_username, user_sub_token, local_root und virtual_use_local_privs.

Mit der user_config_dir Option kannst Du ein Verzeichnis für Konfigurationsdateien pro Benutzer definieren, die Teile gesamten Einstellungen überschreiben. Das ist ganz optional und Dir überlassen, ob Du diese Funktion nutzen möchtest. Jedoch sollten wir nun dieses Verzeichnis anlegen:

mkdir /etc/vsftpd_user_conf

Nun müssen wir PAM konfigurieren, sodass es die MySQL Datenbank verwendet, um unsere virtuellen FTP Benutzer zu authentifizieren anstelle von /etc/passwd und /etc/shadow. Die PAM Konfiguration für vsftpd ist in /etc/pam.d/vsftpd. Wir sichern die originale Datei und erstellen eine neue wie folgt:

cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd_orig
cat /dev/null > /etc/pam.d/vsftpd
vi /etc/pam.d/vsftpd

auth required pam_mysql.so user=vsftpd passwd=ftpdpass host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=pass crypt=2
account required pam_mysql.so user=vsftpd passwd=ftpdpass host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=pass crypt=2
Bitte pass auf, dass Du das MySQL Passwort mit Deinem eigenen Passwort ersetzt!

Danach starten wir vsftpd neu:

/etc/init.d/vsftpd restart


5 Den ersten virtuellen Benutzer anlegen

Um die Datenbank zu füllen, kannst Du die MySQL Kommandozeile verwenden:

mysql -u root -p

USE vsftpd;

Nun erstellen wir den virtuellen Benutzer testuser mit dem Passwort secret (das verschlüsselt gespeichert wird, mit Hilfen von MySQLs PASSWORD Funktion):

INSERT INTO accounts (username, pass) VALUES('testuser', PASSWORD('secret'));
quit;

testusers Homedir ist /home/vsftpd/testuser; leider erstellt vsftpd dieses Verzeichnis nicht automatisch, wenn es nicht existiert. Daher erstellen wir es nun manuell und ändere den Benutzer auf vsftpd und die Gruppe auf nogroup:

mkdir /home/vsftpd/testuser
chown vsftpd:nogroup /home/vsftpd/testuser

Öffne nun Deinen FTP Client Programm auf Deinem Arbeitsplatz (wie zum Beispiel WS_FTP oder SmartFTP bei Windows oder gFTP auf dem Linux Desktop) und versuche Dich zu verbinden. Als Hostnamen verwendest Du server1.example.com (oder die IP Adresse des Systems), der Benutzername ist testuser und das Passwort ist secret.

Wenn Du Dich verbinden kannst - Glückwunsch! Wenn nicht, ist etwas schief gelaufen.

6 Verwalten der Datenbank

Für die Meisten ist es einfacher, wenn sie für MySQL ein grafisches Front-end haben; dafür kannst Du auch phpMyAdmin verwenden (in diesem Beispiel unter http://server1.example.com/phpmyadmin/) um die vsftpd Datenbank zu verwalten.


Wann auch immer Du einen Benutzer anlegst oder änderst, vergewissere Dich, dass Du die PASSWORD Funktion von MySQL verwendest, um das Passwort dieses Benutzers zu verschlüsseln. Wenn Du einen neuen virtuellen Benutzer anlegst, vergiss bitte auch nicht die Homedir des Benutzers in der Kommandozeile zu erstellen, wie am Ende des vorhergehenden Kapitels gezeigt wurde.

7 Links

1 Kommentar(e)

Zum Posten von Kommentaren bitte

Kommentare

Von: dobberph

Hi,

kann man auch in der Tabelle mit anlegen, wo das root-Verzeichnis des einzelnen User liegen soll? Ich möchte nämlich nicht alle im selben Verzeichnis unter ihrem Benutzernamen haben, sondern irgendwo in der Verzeichnisstruktur.
Am einfachsten wäre es, wenn es für die /etc/pam.d/vsftpd noch eine Variable gäbe: local_rootcolumn="irgendwo".

Geht das irgendwie?

Mfg und danke,
Tobias