Virtual Hosting mit PureFTPd und MySQL (Incl. Quota und Bandweiten Management) auf Ubuntu 7.10 (Gutsy Gibbon)

Version 1.0
Author: Falko Timme


Diese Anleitung veranschaulicht, wie man einen PureFTPd Server installiert, der virtuelle Benutzer von einer MySQL Datenbank anstelle von wirklichen System-Benutzern verwendet. Dies ist viel leistungsfähiger und ermöglicht Tausende von ftp Benutzern auf einer einzigen Maschine zu haben. Weiterhin werde ich in diesem Setup die Verwendung von Quota und den Upload/Download von Bandwidth Limits aufzeigen. Passwörter werden verschlüsselt als als MD5 Strings in der Datenbank abgelegt.

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

Diese Anleitung basiert auf Ubuntu 7.10 (Gutsy Gibbon). Du solltest ein Basis-Ubuntu 7.10 Server System bereits eingerichtet haben, wie in den ersten 9 Kapiteln dieser Anleitung beschrieben wird: http://www.howtoforge.com/perfect_server_ubuntu7.10
Diese Anleitung ist ein praktischer Leitfaden und deckt kein theoretisches Hintergrundwissen ab. Dies wird in zahlreichen anderen Dokumenten im Internet abgehandelt.

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

1 Vorbemerkung

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

Vergewissere Dich, dass Du als Rootanwender angemeldet bist (gib ein

sudo su

um Rootanwender zu werden), da wir alle Schritte dieser Anleitung als Rootanwender durchlaufen müssen. Wenn Du vi als Deinen Text Editor verwenden möchtest (wie es in dieser Anleitung vorgeschlagen wird), solltest Du dies laufen lassen

apt-get install vim-full

Das vim-full Paket stellt sicher, dass sich der vi Text Editor wie erwartet verhält (ohne vim-full könntest Du im vi Text Editor eventuell ein seltsames Verhalten beobachten).

2 Installiere MySQL Und phpMyAdmin

Dies kann alles mit einem einzigen Befehl installiert werden:

apt-get install mysql-server mysql-client libmysqlclient15-dev phpmyadmin apache2

Dir werden zwei Fragen gestellt:

New password for the MySQL "root" user: <-- yourrootsqlpassword (Passwort Deiner Wahl)
Web server to reconfigure automatically: <-- apache2

3 Installiere PureFTPd Mit MySQL Unterstützung

Für Ubuntu 7.10 ist ein vorkonfiguriertes pure-ftpd-mysql Paket verfügbar. Installiere es wie folgt:

apt-get install pure-ftpd-mysql

Dann erstellen wir eine ftp Gruppe (ftpgroup) und einen Benutzer (ftpuser) auf der alle unsere virtuellen Benutzer abgebildet sein werden. Ersetze die Gruppen- und Benutzer-ID 2001 mit einer Nummer, die auf Deinem System frei ist:

groupadd -g 2001 ftpgroup
useradd -u 2001 -s /bin/false -d /bin/null -c "pureftpd user" -g ftpgroup ftpuser

4 Erstelle Die MySQL Datenbank Für PureFTPd

Nun erstellen wir eine Datenbank namens pureftpd und einen MySQL Benutzer namens pureftpd den der PureFTPd daemon später verwenden wird, um sich mit der pureftpd Datenbank zu verbinden:

mysql -u root -p


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

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

USE pureftpd;


CREATE TABLE ftpd (
User varchar(16) NOT NULL default '',
status enum('0','1') NOT NULL default '0',
Password varchar(64) NOT NULL default '',
Uid varchar(11) NOT NULL default '-1',
Gid varchar(11) NOT NULL default '-1',
Dir varchar(128) NOT NULL default '',
ULBandwidth smallint(5) NOT NULL default '0',
DLBandwidth smallint(5) NOT NULL default '0',
comment tinytext NOT NULL,
ipaccess varchar(15) NOT NULL default '*',
QuotaSize smallint(5) NOT NULL default '0',
QuotaFiles int(11) NOT NULL default 0,
PRIMARY KEY (User),
UNIQUE KEY User (User)
) TYPE=MyISAM;

quit;

Wie Dir vielleicht bereits aufgefallen sein wird, haben wir mit dem quit; Befehl die MySQL Kommandozeile verlassen und sind wieder in der Linux Kommandozeile.

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

5 Konfiguriere PureFTPd

Bearbeite /etc/pure-ftpd/db/mysql.conf. Es sollte wie folgt aussehen:

cp /etc/pure-ftpd/db/mysql.conf /etc/pure-ftpd/db/mysql.conf_orig
cat /dev/null > /etc/pure-ftpd/db/mysql.conf
vi /etc/pure-ftpd/db/mysql.conf

MYSQLSocket      /var/run/mysqld/mysqld.sock
#MYSQLServer localhost #MYSQLPort 3306 MYSQLUser pureftpd MYSQLPassword ftpdpass MYSQLDatabase pureftpd #MYSQLCrypt md5, cleartext, crypt() or password() - md5 is VERY RECOMMENDABLE uppon cleartext MYSQLCrypt md5 MYSQLGetPW SELECT Password FROM ftpd WHERE User="L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "R") MYSQLGetUID SELECT Uid FROM ftpd WHERE User="L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "R") MYSQLGetGID SELECT Gid FROM ftpd WHERE User="L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "R") MYSQLGetDir SELECT Dir FROM ftpd WHERE User="L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "R") MySQLGetBandwidthUL SELECT ULBandwidth FROM ftpd WHERE User="L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "R") MySQLGetBandwidthDL SELECT DLBandwidth FROM ftpd WHERE User="L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "R") MySQLGetQTASZ SELECT QuotaSize FROM ftpd WHERE User="L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "R") MySQLGetQTAFS SELECT QuotaFiles FROM ftpd WHERE User="L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "R")
Vergewissere Dich, dass Du den ftpdpass String mit dem richtigen Passwort für den MySQL Benutzer pureftpd in der Zeile MYSQLPassword ersetzt! Bitte beachte, dass wir md5 als MYSQLCrypt Methode verwenden, was bedeutet, dass wir das Passwort des Benutzers als einen MD5 String in der Datenbank ablegen, was viel sicherer ist als Passwörter im Klartext!

Erstelle dann die Datei /etc/pure-ftpd/conf/ChrootEveryone die einfach den String yes enthält:

echo "yes" > /etc/pure-ftpd/conf/ChrootEveryone

Dies wird PureFTPd dazu veranlassen, jeden Benutzer in seinem Home Verzeichnis einzusperren, also wird er nicht in der Lage sein, Verzeichnisse und Dateien außerhalb seines Home Verzeichnisses zu durchsuchen.

Also erstelle die Datei /etc/pure-ftpd/conf/CreateHomeDir die den String yes enthält:

echo "yes" > /etc/pure-ftpd/conf/CreateHomeDir

Dies veranlasst PureFTPd ein Home Verzeichnis für den Benutzer anzulegen, wenn sich der Benutzer anmeldet und ein Home Verzeichnis noch nicht existiert.

Danach starten wir PureFTPd neu:

/etc/init.d/pure-ftpd-mysql restart


1 Kommentar(e)

Zum Posten von Kommentaren bitte

Kommentare

Von: hahni

Das HowTo funktioniert auch wunderbar mit Ubuntu 10.04 LTS. Das habe ich selbst gerade ausprobiert. Allerdings (und das gilt für alle Ubuntu- und Debian-Versionen) muss die /etc/pure-ftpd/db/mysql.conf wie folgt angepasst werden (man beachte die im SQL-Statement.

--
MYSQLGetPW SELECT password FROM ftpd WHERE user="L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "R")
MYSQLGetUID SELECT uid FROM ftpd WHERE user="L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "R")
MYSQLGetGID SELECT gid FROM ftpd WHERE user="L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "R")
MYSQLGetDir SELECT dir FROM ftpd WHERE user="L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "R")
MySQLGetBandwidthUL SELECT ulbandwidth FROM ftpd WHERE user="L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "R")
MySQLGetBandwidthDL SELECT dlbandwidth FROM ftpd WHERE user="L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "R")
MySQLGetQTASZ SELECT quotasize FROM ftpd WHERE user="L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "R")
MySQLGetQTAFS SELECT quotafiles FROM ftpd WHERE user="L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "R")
--