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

0 Kommentar(e)

Zum Posten von Kommentaren bitte