Virtuelles Hosting mit Proftpd und MySQL (inkl. Quota) auf Debian Etch

Version 1.0
Author: Falko Timme


Diese Anleitung veranschaulicht, wie man einen Proftpd Server installiert, der virtuelle Benutzer einer MySQL Datenbank verwendet anstelle von wirklichen Benutzern. 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 in diesem Setup beschreiben.

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 Debian Etch (Debian 4.0). Du solltest ein Debian Etch Basissystem bereits installiert haben, was in den ersten sechs Kapiteln dieser Anleitung beschrieben wird: http://www.howtoforge.com/perfect_setup_debian_etch
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 werden von Deinen abweichen, Du musst sie also an entsprechender Stelle anpassen.

2 Installation von MySQL und phpMyAdmin

Das kann alles mit nur einem Befehl installiert werden:

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

Richte ein Passwort für den MySQL Benutzer root an (ersetze yourrootsqlpassword mit einem Passwort Deiner Wahl):

mysqladmin -u root password yourrootsqlpassword

Überprüfe dann mit:

netstat -tap | grep mysql

...auf welchen Adressen MySQL hört. Wenn die Ausgabe wie folgt aussieht:

tcp 0 0 localhost.localdo:mysql *:* LISTEN 2713/mysqld

was bedeutet, dass MySQL nur auf localhost.localdomain hört, dann ist Dein Passwort, das Du zuvor eingerichetet hast, sicher. Sieht die Ausgabe allerdings so aus:

tcp 0 0 *:mysql *:* LISTEN 2713/mysqld

solltest Du auch für Deinen Hostnamen ein MySQL Passwort anlegen, da sonst jeder Zugriff auf Deine Datenbank hat und Daten verändern kann:

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


3 Installation von Proftpd mit MySQL Unterstützung

Für Debian ist ein vorkonfiguriertes proftpd-mysql Paket verfügbar. Installiere es als einen standalone Daemon wie folgt:

apt-get install proftpd-mysql

Folgende Frage wird Dir gestellt:

Run proftpd from inetd or standalone? <-- standalone

Dann legen wir eine ftp Gruppe (ftpgroup) und einen Benutzer (ftpuser) an, unter denen, unsere virtuellen Benutzer laufen werden. Ersetze die group- und userid 2001 mit einer Nummer, die auf Deinem System frei ist:

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

4 Die MySQL Datenbank für Proftpd erstellen

Nun erstellen wir eine Datenbank namens ftp und einen MySQL Benutzer namens proftpd, den der proftpd Daemon später verwenden wird, um sich mit der ftp Datenbank zu verbinden:

mysql -u root -p


create database ftp;
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'proftpd'@'localhost' IDENTIFIED BY 'password';
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'proftpd'@'localhost.localdomain' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;

Ersetze die Zeichenfolge password mit einem Passwort, das Du für den MySQL Benutzer proftpd verwenden möchtest. Immer noch in der MySQL Kommandozeile, erstellen wir die Datenbanktabellen, die wir benötigen:

USE ftp;


CREATE TABLE ftpgroup (
groupname varchar(16) NOT NULL default '',
gid smallint(6) NOT NULL default '5500',
members varchar(16) NOT NULL default '',
KEY groupname (groupname)
) TYPE=MyISAM COMMENT='ProFTP group table';

CREATE TABLE ftpquotalimits (
name varchar(30) default NULL,
quota_type enum('user','group','class','all') NOT NULL default 'user',
per_session enum('false','true') NOT NULL default 'false',
limit_type enum('soft','hard') NOT NULL default 'soft',
bytes_in_avail int(10) unsigned NOT NULL default '0',
bytes_out_avail int(10) unsigned NOT NULL default '0',
bytes_xfer_avail int(10) unsigned NOT NULL default '0',
files_in_avail int(10) unsigned NOT NULL default '0',
files_out_avail int(10) unsigned NOT NULL default '0',
files_xfer_avail int(10) unsigned NOT NULL default '0'
) TYPE=MyISAM;

CREATE TABLE ftpquotatallies (
name varchar(30) NOT NULL default '',
quota_type enum('user','group','class','all') NOT NULL default 'user',
bytes_in_used int(10) unsigned NOT NULL default '0',
bytes_out_used int(10) unsigned NOT NULL default '0',
bytes_xfer_used int(10) unsigned NOT NULL default '0',
files_in_used int(10) unsigned NOT NULL default '0',
files_out_used int(10) unsigned NOT NULL default '0',
files_xfer_used int(10) unsigned NOT NULL default '0'
) TYPE=MyISAM;

CREATE TABLE ftpuser (
id int(10) unsigned NOT NULL auto_increment,
userid varchar(32) NOT NULL default '',
passwd varchar(32) NOT NULL default '',
uid smallint(6) NOT NULL default '5500',
gid smallint(6) NOT NULL default '5500',
homedir varchar(255) NOT NULL default '',
shell varchar(16) NOT NULL default '/sbin/nologin',
count int(11) NOT NULL default '0',
accessed datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (id),
UNIQUE KEY userid (userid)
) TYPE=MyISAM COMMENT='ProFTP user table';

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 kannst Du auf (ich gehe davon aus, dass der Hostname Deines ftp Server Systems server1.example.com ist) phpMyAdmin unter http://server1.example.com/phpmyadmin/ (Du kannst die IP Adresse anstelle von server1.example.com verwenden) in einem Browser zugreifen und Dich als proftpd anmelden. Dann kannst Du Dir die Datenbank ansehen. Später kannst Du phpMyAdmin verwenden, um Deinen Proftpd Server zu verwalten.

5 Konfiguriere Proftpd

Öffne /etc/proftpd/proftpd.conf und deaktiviere IPv6 indem Du UseIPv6 auf off setzt:

vi /etc/proftpd/proftpd.conf


[...]
UseIPv6 off [...]
Füge in der gleichen Datei folgende Zeilen hinzu:
[...]
DefaultRoot ~ # The passwords in MySQL are encrypted using CRYPT SQLAuthTypes Plaintext Crypt SQLAuthenticate users groups # used to connect to the database # databasename@host database_user user_password SQLConnectInfo ftp@localhost proftpd password # Here we tell ProFTPd the names of the database columns in the "usertable" # we want it to interact with. Match the names with those in the db SQLUserInfo ftpuser userid passwd uid gid homedir shell # Here we tell ProFTPd the names of the database columns in the "grouptable" # we want it to interact with. Again the names match with those in the db SQLGroupInfo ftpgroup groupname gid members # set min UID and GID - otherwise these are 999 each SQLMinID 500 # create a user's home directory on demand if it doesn't exist SQLHomedirOnDemand on # Update count every time user logs in SQLLog PASS updatecount SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser # Update modified everytime user uploads or deletes a file SQLLog STOR,DELE modified SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser # User quotas # =========== QuotaEngine on QuotaDirectoryTally on QuotaDisplayUnits Mb QuotaShowQuotas on SQLNamedQuery get-quota-limit SELECT "name, quota_type, per_session, limit_type, bytes_in_avail, bytes_out_avail, bytes_xfer_avail, files_in_avail, files_out_avail, files_xfer_avail FROM ftpquotalimits WHERE name = '%{0}' AND quota_type = '%{1}'" SQLNamedQuery get-quota-tally SELECT "name, quota_type, bytes_in_used, bytes_out_used, bytes_xfer_used, files_in_used, files_out_used, files_xfer_used FROM ftpquotatallies WHERE name = '%{0}' AND quota_type = '%{1}'" SQLNamedQuery update-quota-tally UPDATE "bytes_in_used = bytes_in_used + %{0}, bytes_out_used = bytes_out_used + %{1}, bytes_xfer_used = bytes_xfer_used + %{2}, files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4}, files_xfer_used = files_xfer_used + %{5} WHERE name = '%{6}' AND quota_type = '%{7}'" ftpquotatallies SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" ftpquotatallies QuotaLimitTable sql:/get-quota-limit QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally RootLogin off RequireValidShell off [...]
Pass auf, dass Du die Zeichenfolge password mit dem richtigen Passwort für den MySQL Benutzer proftpd in der Zeile SQLConnectInfo ersetzt!

Öffne dann /etc/proftpd/modules.conf und kommentiere die LoadModule mod_sql_postgres.c Zeile aus:

vi /etc/proftpd/modules.conf


[...]
#LoadModule mod_sql_postgres.c [...]
Starte dann Proftpd neu:

/etc/init.d/proftpd restart

6 Kommentar(e)

Zum Posten von Kommentaren bitte

Kommentare

Von: Zelda

Hallo leute, es funktioniert alle... ;-)
Cool


Von: wuiso

Also ich würde sagen, dass dieses Horto nicht funktioniert. Das ganze habe ich auf mein Debian Etch mehrmals ausprobiert und es hat nicht im geringsten funktioniert.
MfG

Wuiso


Von: Zelda

Hallo,
ich will nicht an /home/username zugreifen, sondern am anderen Ordner Strukture z.B. /var/www/website?
Die Verbindung funktioniert perfekt aber nicht der Zugriff auf anderen Ordner Strukturen!


Von: grubby

also ich bekomme beim einlesen der SQL Tabellen immer einen Syntax fehler...
kann mir vielleicht jemand seine ftp tabllen zuschicken? oder was mache ich falsch?


Von: SimonimNetz

Ich hab da einen Fehler gefunden:
useradd -u 2001 -s /bin/false -d /bin/null -c “proftpd user” -g ftpgroup ftpuser
das sind keine " sondern irgendwelche Unicode-/UTF-/Sonstwas-Zeichen, die natürlich nicht im Terminal funzen, wenn man pastet.


Von: SimonimNetz

und beim Kommentar wird das falsche Anführungszeichen (bei deutschen Tastaturlayouts auf der 2) durch ein richtiges ersetzt (siehe letzter post), ich denke mal, das ist evt. im Beitrag der selbe Fehler.