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


6 Die Datenbank Füllen Und Testen

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

mysql -u root -p

USE pureftpd;

Nun erstellen wir den Benutzer exampleuser mit dem Status 1 (was bedeutet, dass sein ftp Konto aktiv ist), das Passwort secret (was mit der MD5 Funktion von MySQL verschlüsselt abgelegt wird), die UID und GID 2001 (verwende die Benutzer-ID und Gruppen-ID des Benutzers/der Gruppe, die Du am Ende von Schritt 2 angelegt hast!), das Home Verzeichnis /home/www.example.com, eine Upload und Download Bandwidth von 100 KB/sec. (kilobytes pro Sekunde) und eine Quota von 50 MB:

INSERT INTO `ftpd` (`User`, `status`, `Password`, `Uid`, `Gid`, `Dir`, `ULBandwidth`, `DLBandwidth`, `comment`, `ipaccess`, `QuotaSize`, `QuotaFiles`) VALUES ('exampleuser', '1', MD5('secret'), '2001', '2001', '/home/www.example.com', '100', '100', '', '*', '50', '0');

quit;

Öffne nun Dein FTP Client Programm auf Deinem Arbeitsplatz (etwas wie WS_FTP oder SmartFTP wenn Du auf einem Windows System arbeitest oder gFTP oder FileZilla auf einem Linux Desktop) und versuche Dich zu verbinden. Als Hostnamen siehst Du server1.example.com (oder die IP Adresse des Systems, der Benutzername ist exampleuser und das Passwort ist secret.

Wenn Du eine Verbindung bekommst - Gratulation! Wenn nicht, ist etwas schief gelaufen.

Wenn Du jetzt dies laufen lässt,

ls -l /home

solltest Du feststellen, dass das Verzeichnis /home/www.example.com (exampleuser's Home Verzeichnis) automatisch erstellt wurde und ftpuser und ftpgroup gehört (der Benutzer/die Gruppe, die wir am Ende von Schritt 2 erstellt haben):

root@server1:~# ls -l /home
total 8
drwxr-xr-x 2 administrator administrator 4096 2007-10-18 11:35 administrator
drwxr-xr-x 2 ftpuser ftpgroup 4096 2007-10-29 14:29 www.example.com
root@server1:~#

7 Administration der Datenbank

Für die meisten ist es einfacher wenn sie ein grafisches Frontend für MySQL haben; daher kannst Du auch phpMyAdmin (in diesem Beispiel unter http://server1.example.com/phpmyadmin/) verwenden, um die pureftpd Datenbank zu verwalten.


Wann immer Du einen neuen Benutzer anlegen möchtest, musst Du einen Eintrag in der Tabelle ftpd erstellen, also werde ich die Spalten dieser Tabelle hier erklären:

ftpd Tabelle:

  • User: Der Name des virtuellen PureFTPd Benutzers (z.B. exampleuser).
  • status: 0 oder 1. 0 bedeutet, dass das Konto deaktiviert ist, der Benutzer kann sich nicht anmelden.
  • Password: Das Passwort des virtuellen Benutzers. Pass auf, dass Du die MD5 Funktion von MySQL verwendest um das Passwort verschlüsselt als MD5 String zu speichern:
  • UID: Die Benutzer-ID des ftp Benutzers, die Du in Schritt 2 erstellt hast (z.B. 2001).
  • GID: Die Gruppen-ID der ftp Gruppe, die Du in Schritt 2 erstellt hast (z.B. 2001).
  • Dir: Das Home Verzeichnis des virtuellen PureFTPd Benutzers (z.B. /home/www.example.com). Wenn es nicht existiert, wird es angelegt, wenn sich der Benutzer zum ersten Mal via FTP anmeldet. Der virtuelle Benutzer wird in seinem Home Verzeichnis eingesperrt, das heißt auf andere Verzeichnisse außerhalb seines Home Verzeichnisses nicht zugreifen.
  • ULBandwidth: Die Upload Bandwidth des virtuellen Benutzers in KB/sec. (Kilobytes pro Sekunde). 0 bedeutet unbegrenzt.
  • DLBandwidth: Die Download Bandwidth des virtuellen Benutzers in KB/sec. (Kilobytes pro Sekunde). 0 bedeutet unbegrenzt.
  • comment: Du kannst hier Kommentare eingeben (z.B. für Deine interne Administration). Normalerweise lässt Du dieses Feld frei.
  • ipaccess: Gib hier IP Adressen ein, denen erlaubt ist sich mit diesem FTP Konto zu verbinden. * bedeutet, dass jeder IP Adresse erlaubt ist, sich zu verbinden
  • QuotaSize: Speicherplatz in MB (nicht KB, wie in ULBandwidth und DLBandwidth!) den der virtuelle Benutzer auf dem FTP Server verwenden darf. 0 bedeutet unbegrenzt.
  • QuotaFiles: Anzahl von Dateien, die der virtuelle Benutzer auf dem FTP Server speichern darf. 0 bedeutet unbegrenzt.

8 Anonymes FTP Konto

Wenn Du ein anonymes ftp Konto anlegen möchtest (ein ftp Konto, auf das sich jeder ohne Passwort anmelden kann), kannst Du dies wie folgt ausführen:

Erstelle zuerst einen Benutzer ftp (mit der homedir /home/ftp) und Gruppen ftp:

groupadd ftp
useradd -s /bin/false -d /home/ftp -m -c "anonymous ftp" -g ftp ftp

Erstelle dann die Datei /etc/pure-ftpd/conf/NoAnonymous, die den String no enthält:

echo "no" > /etc/pure-ftpd/conf/NoAnonymous

Mit dieser Konfiguration wird PureFTPd anonyme Logins zulassen.

Starte PureFTPd neu:

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

Dann erstellen wir das Verzeichnis /home/ftp/incoming, das anonymen Benutzern erlaubt, Dateien hochzuladen. Wir weisen dem /home/ftp/incoming Verzeichnis die Berechtigungen 311 zu, sodass die Benutzer Dateien in diesem Verzeichnis hochladen aber nicht sehen oder runter laden können. Das /home/ftp Verzeichnis hat die Berechtigungen 555, was erlaubt, Dateien anzusehen und runter zu laden:

cd /home/ftp
mkdir incoming
chown ftp:nogroup incoming/
chmod 311 incoming/
cd ../
chmod 555 ftp/

Nun können sich anonyme Benutzer anmelden und Dateien aus dem Verzeichnis /home/ftp runter laden, das Hochladen ist allerdings begrenzt in /home/ftp/incoming (wenn einmal eine Datei in /home/ftp/incoming hochgeladen ist, kann sie von da aus nicht gelesen oder runter geladen werden; der Server Admin muss sie zuerst nach /home/ftp verschieben, um sie anderen verfügbar zu machen).

9 Links