Virtual Hosting mit PureFTPd und MySQL auf Fedora 9 (Inkl. Quota und Bandbreiten Management)

Version 1.0
Autor: Falko Timme


Mit dieser Anleitung möchte ich zeigen wie man einen PureFTD Server installiert, der virtuelle Benutzer einer MySQL Datenbank anstelle von echten Systembenutzern nutzt. Diese Funktion gewährleistet eine weitaus höhere Leistungsfähigkeit, indem es ermöglicht mehrere tausend FTP-Nutzer auf einem einzelnen Server zu verwalten. Zusätzlich werde ich die Benutzung von Quota und Upload/Download Bandbreitenbegrenzungen zeigen. Die Passwörter werden als MD5 Strings verschlüsselt in der Datenbank verwaltet.

Für die Verwaltung der MySQL Datenbank können webbasierte Applikationen wie phpMyAdmin genutzt werden, die auch Bestandteil dieser Anleitung sein wird. phpMyAdmin bringt eine komfortable graphische Oberfläche mit, die die Benutzung der Kommandozeile überflüssig macht.

Diese Anleitung basiert auf Fedora 9. Das Fedora 9 Betriebssystem sollte als Basis bereits vorinstalliert sein, wie beispielsweise hier in der ersten sieben Kapiteln beschrieben: http://www.howtoforge.com/perfect-server-fedora9
Diese Anleitung zielt auf die rein praktische Anwendung, die theoretischen Hintergründe werden nicht näher erörtert. Dies wird in zahlreichen anderen Dokumenten im Netz behandelt.

Diese Anleitung kommt ohne jegliche Gewährleistung. Es gibt natürlich diverse Möglichkeiten solch ein System aufzusetzen, und das ist der Weg, den ich gewählt habe. Ich kann leider nicht garantieren, dass es bei Dir genauso funktioniert!

1 Vorbemerkung

In dieser Anleitung nutze ich als Hostnamen server1.example.com mit der IP Adresse 192.168.0.100. Dise Einstellungen werden bei Dir entsprechend anders sein, daher ersetze sie bitte an den passenden Stellen.

2 MySQL und phpMyAdmin installieren

MySQL und phpMyAdmin können mit nur einem Befehl eingerichtet werden:

yum install mysql mysql-server phpMyAdmin httpd

Hiernach muss die Datei /etc/httpd/conf.d/phpMyAdmin.conf editiert werden, um alle IP Adressen für phpMyAdmin zugänglich zu machen. Standardmässig ist sie nur von 127.0.0.1 zugänglich. Kommentiere diesen Bereich bitte aus:

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

...so dass die Datei folgendermassen 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 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. This may break your mod_security implementation. # #<IfModule mod_security.c> # <LocationMatch "/phpMyAdmin/(.+)"> # SecRuleInheritance Off # </LocationMatch> #</IfModule>
Wir erstellen nun die System Startup Links für MySQL und Apache, damit beide gleichzeitig gestartet werden, sobald das Betriebssystem bootet:

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 dabei yourrootsqlpassword mit dem von Dir ausgewählten Passwort:

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

3 PureFTPd mit MySQL Unterstützung installieren

Fedora's PureFTPd Paket unterstützt eine vielfältige Anzahl von Administrationsbereichen wie MySQL, PostgreSQL, LDAP, etc., daher brauchen wir nur das gängige PureFTPd Paket zu installieren:

yum install pure-ftpd

Anschliessend erstellen wir eine FTP-Gruppe (ftpgroup) sowie einen Benutzer (ftpuser), dem alle unsere virtuellen Benutzer zugeschrieben werden. Ersetze bitte die Gruppen- und Benutzer-ID 2001 mit einer Nummer, die auf Deinem System noch verfügbar ist:

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

4 MySQL Datenbank für PureFTPd erstellen

Wir erstellen eine Datenbank mit dem Namen pureftpd sowie einen MySQL Benutzer mit dem gleichen Namen pureftpd. Diesen wird der PureFTPd Dämon später benötigen, 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 die Zeile ftpdpass mit einem beliebigen Passwort für den MySQL Benutzer pureftpd. Wir befinden uns immer noch auf der MySQL Kommandozeile, wo wir die benötigte Datenbank Tabelle einrichten - es gibt tatsächlich 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 Du sicherlich bemerkt hast, haben wir nun mit dem Befehl quit; die MySQL Kommandozeile verlassen und sind zurück auf der Linux Kommandozeile.

Übrigens: (Ich gehe davon aus, dass der Hostname Deines FTP-Servers server1.example.com ist) Du kannst auf phpMyAdmin unter http://server1.example.com/phpMyAdmin/ zugreifen. Du kannst anstatt server1.example.com auch die IP-Adresse im Browser eingeben und Dich mit dem Benutzer pureftpd anmelden, um die die Datenbank zunächst einmal anzuschauen. Später kannst Du phpMyAdmin nutzen, um Deinen PureFTPd Server zu verwalten.

5 PureFTPd konfigurieren

Editiere /etc/pure-ftpd/pure-ftpd.conf und überprüfe ob die Zeilen ChrootEveryone, MySQLConfigFile, und CreateHomeDir aktiv sind und folgendermassen aussehen:

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

[...]
ChrootEveryone yes [...] MySQLConfigFile /etc/pure-ftpd/pureftpd-mysql.conf [...] CreateHomeDir yes [...]
Die Einstellung ChrootEveryone bringt PureFTPd dazu, jeden virtuellen Benutzer in seinem Home-Verzeichnis zu chrooten, so dass er nicht auf Dateien oder Verzichnisse ausserhalb seines eigenen Home-Verzeichnisses zugreifen kann. Die Zeile CreateHomeDir wird PureFTD dazu bringen für den Benutzer, der sich gerade einloggt, ein Home-Verzeichnis zu erstellen, sollte dieser noch nicht vorhanden sein.

Anschliessend editieren wir /etc/pure-ftpd/pureftpd-mysql.conf. Es sollte folgendermassen 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")
Bitte überprüfe ob die Zeile ftpdpass mit Deinem echten Passwort für den MySQL Benutzer pureftpd in der Zeile MYSQLPassword ersetzt wurde! Beachte bitte, dass wir md5 als MYSQLCrypt Methode benutzen, was als MD5 Zeile in der Datenbank eine weitaus sicherere Methode als die benutzung unverschlüsselter Passwörter ist.

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 Datenbank füllen und testen

Um die Datenbank zu befüllen kannst Du die MySQL Kommandozeile nutzen:

mysql -u root -p

USE pureftpd;

Nun erstellen wir den Benutzer exampleuser mit dem Status 1 (das bedeutet er hat einen aktiven FTP Konto), das Passwort lautet secret (wird verschlüsselt mit MySQLs MD5 Funktion), das UID und GID 2001 (bitte nutze hier den Benutzer- sowie die Gruppenidentität des Benutzers/Gruppe, die Du am Ende des zweiten Schrittes erstellt hast!), das Home-Verezeichins /home/www.example.com, eine Upload- und Downloadbandbreite 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 herzliche Glückwunsche! Wenn nicht, ist etwas schief gelaufen, überprüfe also Deine einzelnen Schritte.

Wenn du Folgendes ausführst:

ls -l /home

... sollte das Verzeichnis /home/www.example.com (exampleuser's Home Verzeichnis) erstellt werden. Es sollte dem ftpuser und der ftpgroup zugeschrieben sein, also dem Benutzer bzw. der Gruppe die am Ende des zweiten Schrittes eingerichtet wurden.

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

7 Datenbank Verwaltung

Die meisten empfinden es als Vereinfachung, eine graphische Oberfläche wie MySQL zu nutzen, daher kann man auch phpMyAdmin nutzen (in diesem Beispiel unter http://server1.example.com/phpMyAdmin/) um die to pureftpd Datenbank zu verwalten .


Bei der Erstellung einen neuen Benutzers muss ein neuer Eintrag in die ftpd Tabelle erstellt werden, daher werde ich den Aufbau dieser Tabelle hier erklären:

ftpd Tabelle:

  • User: Der Name des virtuellen PureFTPd Benutzers (z.B. exampleuser).
  • status: 0 oder 1. 0 bedeutet das Konto ist deaktiviert und der Benutzer kann sich nicht einloggen.
  • Password: Das Passwort des virtuellen Benutzers. Bitte überprüfe ob Du MySQL's MD5 Funktion nutzt um die Passwörter als MD5 String zu verschlüsseln:
  • 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 ausserhalb 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/var/ftp nach/home (es sei denn, Du möchtest /var/ftp nutzen):

mv /var/ftp /home

Danach erstellen wir das Verzeichnis /home/ftp/incoming, welches anonymen Benutzern erlaubt Dateien hochzuladen. Wir weisen dem Verzeichnis /home/ftp/incoming die Berechtigungen von 311 zu, so dass die Benutzer Dateien hochladen, aber innerhalb dieses Verzeichnisses keine weitere Dateien einsehen oder herunterladen können. Das /home/ftp Verzeichnis wird die Berechtigung 555 haben, welche die Ansicht und das Herunterladen von Dateien erlaubt:

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

(Wenn Du /var/ftp nutzen möchtest, ersetze in der obigen Zeile /home/ftp mit /var/ftp.)

Anonyme Benutzer können sich nun einloggen und dürfen von /home/ftp Dateien herunterladen, jedoch werden Uploads auf /home/ftp/incoming limitiert. Wird eine Datei nach /home/ftp/incoming hochgeladen, kann es von dort aus weder gelesen noch heruntergeladen werden, der Administrator des Servers muss es erst nach /home/ftp ziehen, um es anderen Benutzern zugänglich zu machen.

Wir konfigurieren jetzt PureFTPd für das anonyme FTP. Öffne /etc/pure-ftpd/pure-ftpd.conf und überprüfe ob folgende Einstellungen darin enthalten sind:

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

[...]
NoAnonymous no [...] AntiWarez no [...] AnonymousBandwidth 8 [...] AnonymousCantUpload no [...]
Die Einstellung AnonymousBandwidth ist optional - es ermöglicht eine Bandbreitenbeschränkung für den Upload/Download anonymer Nutzer, 8 bedeutet 8 KB/Sek. Es kann ein beliebiger Wert eingestellt werden. Falls eine Limitierung nicht erwünscht ist, kann die Zeile auskommentiert werden.

PureFTPd wird neu gestartet:

/etc/init.d/pure-ftpd restart


9 Links

0 Kommentar(e)

Zum Posten von Kommentaren bitte