Virtuelles Hosting mit PureFTPd und MySQL (inkl. Quota und Bandbreiten Management) auf Fedora 7

Version 1.0
Author: Falko Timme


Diese Anleitung veranschaulicht, wie man einen PureFTPd Server installiert, der virtuelle Benutzer einer MySQL Datenbank verwendet, anstelle von wirklichen Systembenutzern. Dies ist um einiges leistungsfähiger und ermöglicht es, Tausende von ftp Benutzern auf nur einer Maschine zu haben. Weiterhin werde ich die Anwendung von Quota sowie das Hochladen/Runterladen von Bandbreiten-Limits in diesem Setup beschreiben. Passwörter werden als MD5 Strings in der Datenbank verschlüsselt.

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 Fedora 7. Du solltest ein Fedora 7 Basissystem bereits aufgesetzt haben, wie zum Beispiel in den ersten vier Kapiteln dieser Anleitung beschrieben wird: http://www.howtoforge.com/perfect_server_fedora7
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 können von den Deinen etwas abweichen, Du musst sie also an gegebener Stelle ersetzen.

2 Installation von MySQL und phpMyAdmin

Das kann alles in einem Befehl installiert werden:

yum install mysql mysql-server phpMyAdmin httpd

Danach müssen wir die Datei /etc/httpd/conf.d/phpMyAdmin.conf bearbeiten, um von allen IP Adressen auf phpMyAdmin zugreifen zu können. Standardmäßig kann nur von 127.0.0.1 zugegriffen werden. Kommentiere diesen Bereich aus:

<Directory /usr/share/phpMyAdmin/>
order deny,allow
deny from all
allow from 127.0.0.1
</Directory>

damit die Datei wie folgt aussieht:

vi /etc/httpd/conf.d/phpMyAdmin.conf


# phpMyAdmin - Web based MySQL browser written in php
# # Allows only localhost by default # # But allowing phpMyAdmin to anyone other than localhost should be considered # dangerous unless properly secured by SSL Alias /phpMyAdmin /usr/share/phpMyAdmin #<Directory /usr/share/phpMyAdmin/> # order deny,allow # deny from all # allow from 127.0.0.1 #</Directory> # This directory does not require access over HTTP - taken from the original # phpMyAdmin upstream tarball # <Directory /usr/share/phpMyAdmin/libraries> Order Deny,Allow Deny from All Allow from None </Directory> # This configuration prevents mod_security at phpMyAdmin directories from # filtering SQL etc. # <IfModule mod_security.c> <LocationMatch "/phpMyAdmin/(.+)"> SecFilterInheritance Off </LocationMatch> </IfModule>
Dann erstellen wir die System Startup Links für MySQL und Apache (so dass beide automatisch starten, so bald das System hochfährt) und starte beide Dienste:

chkconfig --levels 235 mysqld on
/etc/init.d/mysqld start

chkconfig --levels 235 httpd on
/etc/init.d/httpd start

Erstelle ein Passwort für den MySQL Benutzer root (ersetze yourrootsqlpassword mit dem Passwort, das Du verwenden möchtest):

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

3 Installation von PureFTPd mit MySQL Unterstüztung

Fedoras PureFTPd Paket unterstützt zahlreiche Backends, wie zum Beispiel MySQL, PostgreSQL, LDAP, etc. Daher brauchen wir lediglich das normale PureFTPd Paket installieren:

yum install pure-ftpd

Dann erstellen wir eine ftp Gruppe (ftpgroup) und einen Benutzer (ftpuser), mit dem alle unsere virtuellen Benutzer verknüpft werden. Ersetze die Gruppen- und BenutzerID 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 mit der Bezeichnung pureftpd und einem MySQL Benuzter mit der Bezeichnung pureftpd den der PureFTPd Daemon später verwenden wird, um sich mit der pureftpd Datenbank in Verbindung zu setzen:

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 die Zeichenfolge ftpdpass mit dem Passwort, das Du für den MySQL Benutzer pureftpd verwenden möchtest. Immer noch in der MySQL Kommandozeile, erstellen wir die benötigte Datenbanktabelle (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 aufgefallen ist, haben wir mit dem quit; Befehl die MySQL Kommandozeile verlassen und befinden uns wieder in der Linux Kommandozeile.

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

5 Konfiguration von PureFTPd

Bearbeite /etc/pure-ftpd/pure-ftpd.conf und vergewissere Dich, dass die ChrootEveryone, MySQLConfigFile und CreateHomeDir Zeilen aktiviert sind und wie folgt aussehen:

vi /etc/pure-ftpd/pure-ftpd.conf


[...]
ChrootEveryone yes [...] MySQLConfigFile /etc/pure-ftpd/pureftpd-mysql.conf [...] CreateHomeDir yes [...]
Mit der ChrootEveryone Eingtellung wird jeder virtuelle Benutzer von PureFTPd in sein Home Verzeichnis gechrootet und ist nicht mehr in der Lage, Verzeichnisse und Datein außerhalb seines Verzeichnissen zu durchsuchen. Die CreateHomeDir Zeile bewirkt, dass PureFTPd ein neues Benutzer- Home Verzeichnis erstellt, wenn sich der Benutzer einloggt und das Home Verzeichnis noch nicht vorhanden ist.

Dann bearbeiten wir /etc/pure-ftpd/pureftpd-mysql.conf. So sollte es aussehen:

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

MYSQLSocket      /var/lib/mysql/mysql.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")
Pass auf, dass Du die Zeichenfolge ftpdpass mit dem richtigen Passwort für den MySQL Benutzer pureftpd in der MYSQLPassword Zeile ersetzt! Bitte beachte, dass wir die md5 as MYSQLCrypt Methode verwenden, was bedeutet, dass wir das Passwort des Benutzers als MD5 Zeichenfolge in der Datenbank ablegen, was weitaus sicherer ist als das Verwenden von einfachen Passwörtern!

Nun erstellen wir die System Startup Links für PureFTPd und starten es:

chkconfig --levels 235 pure-ftpd on
/etc/init.d/pure-ftpd start

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, sein ftp Konto ist aktiv), das Passwort secret (das verschlüsselt mittels MySQL MD5 Funktion abgelegt wird), die BenutzerID und GruppenID 2001 (verwende die BenutzerID und GruppenID des Benutzers/der Gruppe, den Du am Ende von Schritt 2 angelegt hast!), das Home Verzeichnis /home/www.example.com, ein Upload und Download Bandbreite 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 auf Deinem Arbeitsplazt Dein FTP Client Programm (etwas wie WS_FTP oder SmartFTP wenn Du Dich auf einem Windows System befindest oder gFTP auf einem Linux Desktop) und versuche Dich zu verbinden. Als Hostname verwendest Du server1.example.com (oder die IP Adresse des Systems), der Benutzername ist exampleuser und das Passwort ist secret.

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

Wenn Du nun Folgendes ausführst

ls -l /home

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

[root@server1 ~]# ls -l /home
total 4
drwxr-xr-x 2 ftpuser ftpgroup 4096 2007-07-04 01:50 www.example.com
[root@server1 ~]#

7 Administration der Datenbank

Für die meisten Leute 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.


Wenn Du einen neuen Benutzer erstellen möchtest, musst Du einen Eintrag in der ftpd Tabelle vornehmen, alsso werde ich die Spalten dieser Tabelle hier erklären:

ftpd Table:

  • User: Der Name des virtuellen PureFTPd Benutzers (z.B. exampleuser).
  • status: 0 oder 1. 0 bedeutet, das Konto ist deaktiviert, der Benutzer kann sich nicht anmelden.
  • Password: Das Passwort des virtuellen Benutzers. Pass auf, dass Du die MySQLs MD5 Funkiton verwendest, um das Passwort verschlüsselt als MD5 String zu speichern:
  • UID: Die BenutzerID, die Du am Ende von Schritt 2 angelegt hast (z.B. 2001).
  • GID: Die GruppenID der ftp Gruppen, die Du am Ende von Schritt 2 angelegt hast (z.B. 2001).
  • Dir: Das Home Verzeichnis des virtuellen PureFTPd Benutzers (z.B. /home/www.example.com). Wenn es nicht vorhanden ist, wird es erstellt, wenn sich der neue Benutzer erstmalig via FTP einloggt. Der virtuelle Benutzer wird in sein Home Verzeichnis gesperrt, d.h. er kann auf andere Verzeichnisse außerhalb seines Home Verzeichnisses nicht zugreifen.
  • ULBandwidth: Die Upload Bandbreite des virtuellen Benutzers in KB/sec. (Kilobytes pro Sekunde). 0 bedeutet unbegrenzt.
  • DLBandwidth: Die Download Bandbreite des virtuellen Benutzers in KB/sec. (Kilobytes pro Sekunde). 0 bedeutet unbegrenzt.
  • comment: Hier kannst Du irgendeinen Kommentar eingeben (z.B. für Deine interne Administration). Normalerweise lässt man dieses Feld frei.
  • ipaccess: Gib hier IP Adressen ein, die sich mit diesem FTP Konto verbinden dürfen. * bedeutet, dass sich jede IP Adresse verbinden darf.
  • QuotaSize: Speicherplatz in MB (nicht KB, wie bei ULBandwidth und DLBandwidth!), den der virtuelle Benutzer auf dem FTP Server verwenden darf. 0 bedeutet unbegrenzt.
  • QuotaFiles: Menge an Dateien, die der virtuelle Benutzer auf dem FTP Server speichern darf. 0 bedeutet unbegrenzt.

8 Anonymes FTP Konto

Wenn Du ein anonymes FTP Konto erstellen möchtest (ein FTP Konto, in das sich jeder ohne Passwort einloggen kann), dann brauchst Du einen Benutzer und ein Gruppe mit der Bezeichnung ftp. Beide wurden automatisch erstellt als Du das pure-ftpd Paket installiert hast, Du musst sie also nicht manuell erstellen. Jedoch ist ftps Homedir standardmäßig /var/ftp, ich möchte das anonyme FTP Verzeichnis aber in /home/ftp (die normalen FTP Verzeichnisse des Benutzers befinden sich auch in /home, z.B. /home/www.example.com) erstellen. Selbstverständlich kannst Du auch das /var/ftp Verzeichnis für anonyme FTP Konten verwenden, wenn Du dies bevorzugst.

Wenn Du /home/ftp verwenden möchtest, öffne /etc/passwd und ändere die Homedir des ftp Benutzers von /var/ftp zu /home/ftp (tu dies nicht, wenn Du /var/ftp verwenden möchtest):

vi /etc/passwd


[...]
#ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin ftp:x:14:50:FTP User:/home/ftp:/sbin/nologin [...]
Verschiebe dann /var/ftp nach /home (tu dies nicht, wenn Du  /var/ftp verwenden möchtest):

mv /var/ftp /home

Dann erstellen wir das Verzeichnis /home/ftp/incoming, was anonymen Benutzern erlaubt, Dateien hochzuladen. Wir geben dem Home Verzeichnis /home/ftp/incoming Berechtigungen von 311, damit Benutzer Hochladen, aber Dateien in diesem Verzeichnis nicht sehen oder hochladen können. Das /home/ftp Verzeichnis wird die Berechtigungen von 555 haben, wobei Datein runter geladen und gesehen werden können:

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

(Wenn Du stattdessen  /var/ftp verwenden möchtest, ersetze /home/ftp with /var/ftp in den obigen Befehlen.)

Anonyme Benutzer werden in der Lage sein, sich anzumelden und dürfen Dateien von /home/ftp runterladen, Uploads werden allerdings auf /home/ftp/incoming (und wenn eine Datei einmal nach /home/ftp/incoming hochgeladen wurde, kann sie von dort aus weder gelesen noch runter geladen werden; der Server Admin muss sie in /home/ftp setzen, um sie anderen zur Verfügung zu stellen) beschränkt.

Nun müssen wir PureFTPd für das anonyme FTP Konto konfigurieren. Öffne /etc/pure-ftpd/pure-ftpd.conf und vergewissere Dich, dass folgende Einstellungen darin enthalten sind:

vi /etc/pure-ftpd/pure-ftpd.conf


[...]
NoAnonymous no [...] AntiWarez no [...] AnonymousBandwidth 8 [...] AnonymousCantUpload no [...]
(Die AnonymousBandwidth Einstellung ist optional - sie erlaubt Dir Upload und Download Bandbreiten für anonyme Benutzer zu begrenzen. 8 bedeutet 8 KB/sec. Verwende irgendeinen Wert oder kommentiere die Zeile aus, wenn Du keine Bandbreiten begrenzen möchtest.)

Schließlich starten wir PureFTPd neu:

/etc/init.d/pure-ftpd restart


9 Links