Virtual Hosting mit PureFTPd und MySQL (Inkl. Quota- und Bandbreitenmanagement) unter Ubuntu 12.04

Version 1.0
Author: Falko Timme <ft [at] falkotimme [dot] com>
Follow me on Twitter

Dieses Tutorial erklärt, wie man einen PureFTPd Server installiert, welcher virtuelle Benutzer aus einer MySQL Datenbank anstatt echte Systembenutzer benutzt. Dies erbringt ein besseres Leistungsverhältnis und erlaubt es, tausende FTP Benutzer auf einer einzigen Maschine zu haben. Zusätzlich wird der Nutzen von Quota und Upload-/Downloadbandbreitenlimits mit diesem Setup gezeigt. Passwörter werden, verschlüsselt als MD5 Strings, in der Datenbank gespeichert. Das Tutorial basiert auf Ubuntu 12.04.

Zur Administration der MySQL Datenbank können Sie webbasierte Tools wie phpMyAdmin benutzen, welches ebenfalls in diesem Howto installiert wird. phpMyAdmin ist eine komfortable grafische Oberfläche, Sie müssen sich also nicht mit der Kommandozeile herumplagen.

Dieses Tutorial ist als praktischer Leitfaden gedacht und behandelt keine theoretischen Hintergründe. Diese werden in einer Vielzahl von anderen Dokumenten im Internet behandelt.

Für die Richtigkeit der Inhalte dieses Tutorials gebe ich keinerlei Garantie. Der hier gezeigte Weg ist nicht der einzige um ein solches System aufzusetzen, es ist lediglich, der, den ich bevorzuge.

1 Vorbemerkung

Ich benutze in diesem Tutorial den Hostnamen server1.example.com mit der IP-Adresse 192.168.0.100. Diese Einstellungen werden sich von Ihren unterscheiden, ersetzen Sie sie also an den entsprechenden Stellen.

Stellen Sie sicher, dass Sie als root angemeldet sind (geben Sie

sudo su

ein um sich als root anzumelden), da Sie alle Schritte dieses Tutorials als root ausführen müssen.

2 Installation von MySQL und phpMyAdmin

Diese können mit einem einzigen Befehl installiert werden:

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

Sie werden folgende Fragen gefragt werden:

New password for the MySQL „root“ user: <– IhrrootMySQLPasswort
Repeat password for the MySQL „root“ user: <– IhrrootMySQLPasswort
Web server to reconfigure automatically: <– apache2
Configure database for phpmyadmin with dbconfig-common? <– No

3 Installation von PureFTPd mit MySQL Unterstützung

Für Ubuntu 12.04 ist ein vorkonfiguriertes pure-ftpd-mysql Paket verfügbar. Installieren Sie es wie folgt:

apt-get install pure-ftpd-mysql

Anschließend erstellen Sie eine ftp Gruppe (ftpgroup) und einen Benutzer (ftpuser) auf die alle virtuellen Benutzer gemapt werden. Ersetzen Sie die Gruppen- und Benutzer-ID 2001 mit einer Nummer, die auf Ihrem 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 Erstellen der MySQL Datenbank für PureFTPd

Erstellen Sie nun eine Datenbank namens pureftpd und einen MySQL Benutzer namens pureftpd, welchen der PureFTPd Daemon später benutzen 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;

Ersetzen Sie den String ftpdpass mit dem Passwort, das Sie für den MySQL Benutzer pureftpd benutzen möchten. Immernoch auf der MySQL Shell erstellen Sie nun die Datenbanktabelle (ja, 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)
) ENGINE=MyISAM;

quit;

Mit dem quit; Befehl haben Sie die MySQL Shell verlassen und befinden sich nun wieder auf der Linux Shell.

Übrigens können Sie (Ich nehme hier an, dass der Hostname Ihres FTP Serversystems server1.example.com ist) phpMyAdmin auch unter http://server1.example.com/phpmyadmin/ (Sie können auch die IP-Adresse anstatt server1.example.com benutzen) in einem Browser erreichen und sich mit dem Benutzer pureftpd anmelden. Dort können Sie sich Ihre Datenbank ansehen. Später können Sie phpMyAdmin benutzen um Ihren PureFTPd Server zu administrieren.

5 Konfiguration von PureFTPd

Editieren Sie /etc/pure-ftpd/db/mysql.conf. Die Datei 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")

Stellen Sie sicher, dass Sie den String ftpdpass mit dem wirklichen Passwort des MySQL Benutzers pureftpd in der Zeile MYSQLPassword ersetzen! Beachten Sie bitte, dass md5 als MYSQLCrypt Methode eingesetzt wird, was bedeutet, dass die Benutzerpassworte als MD5 String in der Datenbank gespeichert werden, was sehr viel sicherer ist, als sie als einfachen Text zu speichern!

Erstellen Sie dann die Datei /etc/pure-ftpd/conf/ChrootEveryone, welche einfach nur den String yes enthält:

echo „yes“ > /etc/pure-ftpd/conf/ChrootEveryone

Dies lässt PureFTPd jeden virtuellen Benutzer in seinem home Verzeichnis chrooten, sodass er keine Verzeichnisse außerhalb des home Verzeichnisses betreten kann.

Erstellen Sie außerdem die Datei /etc/pure-ftpd/conf/CreateHomeDir, welche erneut einfach nur yes enthält:

echo „yes“ > /etc/pure-ftpd/conf/CreateHomeDir

Dies lässt PureFTPd ein home Verzeichnis erstellen, wenn sich ein Benutzer anmeldet und das home Verzeichnis noch nicht existiert.

Erstellen Sie dann die Datei /etc/pure-ftpd/conf/DontResolve, wieder nur mit dem Inhalt yes:

echo „yes“ > /etc/pure-ftpd/conf/DontResolve

Dies verhindert, dass PureFTPd nicht nach Hostnamen sucht, was Verbindungen signifikant beschleunigen und Bandbreitennutzung verringern kann.

Starten Sie PureFTPd anschließend neu:

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

6 Datenbank bevölkern und testen

Um die Datenbank zu bevölkern können Sie die MySQL Shell benutzen:

mysql -u root -p

USE pureftpd;

Erstellen Sie nun den Benutzer exampleuser mit dem Status 1 (was bedeutet, dass sein FTP Konto aktiv ist), dem Passwort secret (welches durch MySQLs MD5 Funktion verschlüsselt gespeichert wird), der UID und GID 2001 (benutzen Sie die Benutzer- und Gruppen-ID des Benutzers/der Gruppe, die Sie in Schritt zwei erstellt haben!), dem home Verzeichnis /home/www.example.com, einer Upload- und Downloadbandbreite von 100 KB/Sek. (Kilobytes pro Sekunde) und einer 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;

Öffnen Sie nun das FTP Client Programm auf Ihrem Arbeitscomputer (etwas wie FileZilla, WS_FTP, SmartFTP oder gFTP) und versuchen sich mit dem Server zu verbinden. Als Hostnamen benutzen Sie server1.example.com (oder die IP-Adresse des Systems), der Benutzername ist exampleuser und das Passwort secret.

Können Sie sich verbinden – Herzlichen Glückwunsch! Wenn nicht, ist etwas schiefgelaufen.

Wenn Sie nun

ls -l /home

benutzen sollten Sie sehen können, dass das Verzeichnis /home/www.example.com (exampleusers home Verzeichnis) automatisch erstellt wurde und ftpuser und ftpgroup gehört (der Benutzer/die Gruppe, die Sie in Schritt zwei erstellt haben):

root@server1:~# ls -l /home
total 8
drwxr-xr-x 3 administrator administrator 4096 Apr 27 11:54 administrator
drwxr-xr-x 2 ftpuser       ftpgroup      4096 Jul  3 22:23 www.example.com
root@server1:~#

7 Datenbankadministration

Für die meisten Leute ist es einfacher MySQL über eine grafische Oberfläche zu bedienen; Sie können hierzu phpMyAdmin  benutzen (in diesem Beispiel unter http://server1.example.com/phpmyadmin/ zu finden).

Wann immer Sie einen neuen Benutzer anlegen wollen, müssen Sie einen neuen Eintrag in der Tabelle ftpd anlegen, deshalb werde ich im folgenden die Felder der Tabelle erklären:

ftpd Tabelle:

  • 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. Stellen Sie sicher, dass Sie MySQLs MD5 Funktion benutzen, um das Passwort als MD5 String verschlüsselt zu speichern:
  • UID: Die Benutzer-ID des FTP Benutzers, die Sie am Ende von Schritt 2 erstellt haben (z.B. 2001).
  • GID: Die Gruppen-ID der FTP Gruppe, die Sie am Ende von Schritt 2 erstellt haben (z.B. 2001).
  • Dir: Das home Verzeichnis des virtuellen PureFTPd Benutzers (z.B. /home/www.example.com). Existiert dieses nicht, wird es erstellt wenn der Benutzer sich das erste Mal über FTP anmeldet. Der virtuelle Benutzer wird an dieses home Verzeichnis gebunden, das heißt, er kann auf keine Verzeichnisse außerhalb dieses Verzeichnisses zugreifen.
  • ULBandwidth: Uploadbandbreite des virtuellen Benutzers in KB/Sek. (Kilobytes pro Sekunde). 0 bedeutet unbegrenzt.
  • DLBandwidth: Downloadbandbreite des virtuellen Benutzers in KB/Sek. (Kilobytes pro Sekunde). 0 bedeutet unbegrenzt.
  • comment: Hier können Sie ein beliebiges Kommentar einfügen (z.B. für Ihre interne Administration). Normalerweise wird das Feld leer gelassen.
  • ipaccess: Geben Sie hier IP-Adressen an, denen es erlaubt sein soll, sich mit dem FTP Konto zu verbinden. * bedeutet, dass sich jede IP-Adresse verbinden darf.
  • QuotaSize: Speicherplatz in MB (nicht KB, wie bei ULBandwidth und DLBandwidth!), der dem virtuellen Benutzer auf dem FTP Server zur Verfügung steht. 0 bedeutet unbegrenzt.
  • QuotaFiles: Anzahl Dateien, die dem virtuellen Benutzer erlaubt ist, auf dem FTP Server zu speichern. 0 bedeutet unbegrenzt.

8 Anonymes FTP

Wollen Sie ein anonymes FTP Konto erstellen (ein FTP Konto, mit dem sich jeder ohne Passwort anmelden kann), können Sie dies wie folgt bewerkstelligen:

Erstellen Sie zunächst den Benutzer ftp (mit dem home Verzeichnis /home/ftp) und die Gruppe ftp:

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

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

echo „no“ > /etc/pure-ftpd/conf/NoAnonymous

Mit dieser Konfiguration wird PureFTPd anonyme Logins erlauben.

Starten Sie PureFTPd neu:

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

Erstellen Sie nun das Verzeichnis /home/ftp/incoming, welches anonymen Benutzern erlauben wird, Daten hochzuladen. Geben Sie dem /home/ftp/incoming Verzeichnis die Zugriffsrechte 311, sodass Benutzer Daten hochladen, jedoch nicht sehen oder herunterladen können. Das /home/ftp Verzeichnis wird die Zugriffsrechte 555 haben, was sehen und herunterladen erlaubt:

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

Nun können sich anonyme Benutzer anmelden und von /home/ftp Daten herunterladen, Daten jedoch nur nach /home/ftp/incoming hochladen (und sobald eine Datei nach /home/ftp/incoming hochgeladen wurde, kann sie nicht mehr gelesen oder von dort heruntergeladen werden; der Server Administrator muss sie dann erst nach /home/ftp verschieben, sodass andere darauf zugreifen können).

9 Links

Das könnte dich auch interessieren …