Virtuelles Hosting mit PureFTPd und MySQL (inkl. Quota und Bandbreiten-Management) auf Mandriva 2008 Spring

Version 1.0
Author: Falko Timme


Diese Anleitung veranschaulicht, wie man einen PureFTPd Server installiert, der virtuelle Benutzer aus einer MySQL Datenbank anstelle von wirklichen Systembenutzern verwendet. Das ist viel leistungsfähiger und man kann Tausende von ftp Benutzern auf einer einzigen Maschine haben. Weiterhin werde ich die Verwendung von Quota und Upload/Download- Bandbreitenlimits in diesem Setup zeigen. Passwörter werden verschlüsselt asl MD5 Zeichenfolge in der Datenbank gespeichert.

Für die Verwaltung der MySQL Datenbank kannst Du Web-basierte Tools wie phpMyAdmin verwenden, die ebenfallst in dieser Anleitung installiert werden. phpMyAdmin ist ein einfach zu bedienendes grafisches Interface, was bedeutet, Du musst nicht länger mit der Kommandozeile rumhantieren.

Diese Anleitung basiert auf Mandriva 2008 Spring (Mandriva 2008.1). Du solltest bereits ein Mandriva 2008 Spring Basissystem eingerichtet haben, wie zum Beispiel in den ersten sechs Kapiteln dieser Anleitung beschrieben wird: http://www.howtoforge.com/perfect-server-mandriva-2008.1
Diese Anleitung ist ein praktischer Leitfaden; theoretisches Hintergrundwissen wird nicht abgedeckt. Dies wird in zahlreichen anderen Dokumenten im Web 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 dieses Ziel zu erreichen - 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 ersetzen.

2 Installation von MySQL und phpMyAdmin

Das kann alles mit nur einem Befehl installiert werden:

urpmi MySQL MySQL-client phpmyadmin

Der Netzwerkbetrieb ist in Mandriva 2008 Springs MySQL Paket standardmäßig nicht aktiviert. Wir können das ändern, indem wir die Zeile skip-networking in /etc/my.cnf auskommentieren:

vi /etc/my.cnf


[...]
# Don't listen on a TCP/IP port at all. This can be a security enhancement, # if all processes that need to connect to mysqld run on the same host. # All interaction with mysqld must be made via Unix sockets or named pipes. # Note that using this option without enabling named pipes on Windows # (via the "enable-named-pipe" option) will render mysqld useless! # #skip-networking [...]
Danach erstellen wir die System Startup Links für MySQL und Apache...

chkconfig mysqld on
chkconfig httpd on

... und starten beide Dienste:

/etc/init.d/mysqld start
/etc/init.d/httpd restart

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

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

3 Installation von PureFTPd mit MySQL Unterstützung

Mandrivas PureFTPd Paket unterstützt zahlreiche Backends, wie zum Beispiel MySQL, PostgreSQL, LDAP, etc. Wir installieren es wie folgt:

urpmi pure-ftpd pure-ftpd-anon-upload pure-ftpd-anonymous

Dann erstellen wir eine ftp Gruppe (ftpgroup) und einen Benutzer (ftpuser), mit dem all unsere virtuellen Benutzer vernetzt werden. Ersetze die Gruppen- und Benutzer-ID 2001 mit einer Nummer, die auf Deinem System noch nicht vergeben 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 einen MySQL Benutzer namens pureftpd den der PureFTPd Daemon später verwenden 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;

Ersetze die Zeichenfolge ftpdpass mit einem Passwort, das Du für den MySQL Benutzer pureftpd verwenden möchtest. Immer noch in der MySQL Kommandozeile, erstellen wir die Datenbanktabelle, die wir benötigen (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/ (Du kannst auch die IP Adresse anstelle von server1.example.com verwenden) in einem Browser zugreifen und Dich als Benutzer pureftpd anmelden. 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 pass auf, 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 Einstellung chrootet PureFTPd jeden einzelnen virtuellen Benutzer in sein Home Verzeichnis, so dass er nicht in der Lage sein wir, Verzeichnisse und Dateien außerhalb seines Home Verzeichnisses durchsuchen zu können. Die CreateHomeDir Zeile veranlasst PureFTPd ein Home Verzeichnis eines Benutzers anzulegen, wenn sich der Benutzer anmeldet 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 Zeile MYSQLPassword ersetzt! Bitte beachte, dass wir md5 als MYSQLCrypt Methode verwenden, was bedeutet, dass wir die Passwörter der Benutzer als MD5 Zeichenfolge in der Datenbank speichern werden, was weitaus sicherer ist als die Verwendung von Text-Passwörtern!

Nun starten wir PureFTPd:

/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, dass sein ftp Konto aktiv ist), das Passwort secret (das mit MySQLs MD5 Funktion in verschlüsselter Form gespeichert wird), die UID und GID 2001 (verwende die Benutzer- und Gruppen-ID des Benutzers/der Gruppe, die Du am Ende von Schritt zwei erstellt hast), das Home Verzeichnis /home/www.example.com eine 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 Dein FTP Client Programm auf Deinem Arbeitsplatz (wie zum Beispiel WS_FTP, SmartFTP oder FileZilla wenn Du Dich auf einem Windows System befindest oder gFTP oder FileZilla 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 in der Lage bist, Dich zu verbinden - dann Herzlichen Glückwunsch! Wenn nicht, ist etwas schief gelaufen.

Wenn Du nun dies ausführst

ls -l /home

müsstest Du feststellen, dass das Verzeichnis /home/www.example.com (exampleusers Home Verzeichnis) automatisch erstellt worden ist und dem ftpuser und der ftpgroup (der Benutzer/die Gruppe, die wir am Ende von Schritt zwei erstellt haben) gehört:

[root@server1 ~]# ls -l /home
total 8
drwxr-xr-x 3 administrator administrator 4096 2008-04-09 14:58 administrator/
drwxr-xr-x 2 ftpuser ftpgroup 4096 2008-04-11 14:40 www.example.com/
[root@server1 ~]#

7 Verwaltung der Datenbank

For most people it is easier if they have a graphical front-end to MySQL; therefore you can also use phpMyAdmin (in this example under http://server1.example.com/phpmyadmin/) to administrate the pureftpd database.


Whenever you want to create a new user, you have to create an entry in the table ftpd so I will explain the columns of this table here:

ftpd Table:

  • User: The name of the virtual PureFTPd user (e.g. exampleuser).
  • status: 0 or 1. 0 means the account is disabled, the user cannot login.
  • Password: The password of the virtual user. Make sure you use MySQL's MD5 function to save the password encrypted as an MD5 string:
  • UID: The userid of the ftp user you created at the end of step two (e.g. 2001).
  • GID: The groupid of the ftp group you created at the end of step two (e.g. 2001).
  • Dir: The home directory of the virtual PureFTPd user (e.g. /home/www.example.com). If it does not exist, it will be created when the new user logs in the first time via FTP. The virtual user will be jailed into this home directory, i.e., he cannot access other directories outside his home directory.
  • ULBandwidth: Upload bandwidth of the virtual user in KB/sec. (kilobytes per second). 0 means unlimited.
  • DLBandwidth: Download bandwidth of the virtual user in KB/sec. (kilobytes per second). 0 means unlimited.
  • comment: You can enter any comment here (e.g. for your internal administration) here. Normally you leave this field empty.
  • ipaccess: Enter IP addresses here that are allowed to connect to this FTP account. * means any IP address is allowed to connect.
  • QuotaSize: Storage space in MB (not KB, as in ULBandwidth and DLBandwidth!) the virtual user is allowed to use on the FTP server. 0 means unlimited.
  • QuotaFiles: amount of files the virtual user is allowed to save on the FTP server. 0 means unlimited.

8 Anonymous FTP

If you want to create an anonymous ftp account (an ftp account that everybody can login to without a password), you need a user and a group called ftp. Both have been created automatically when you installed the pure-ftpd package, so you don't need to create them manually. However, ftp's homedir is /var/ftp by default, but I'd like to create the anonymous ftp directory in /home/ftp (the normal users' ftp directories are in /home as well, e.g. /home/www.example.com). But of course, you can use the /var/ftp directory for anonymous ftp, if you prefer it.

If you want to use /home/ftp, open /etc/passwd and change the ftp user's homedir from /var/ftp to /home/ftp (don't do this if you want to use /var/ftp):

vi /etc/passwd


[...]
#ftp:x:80:423:system user for pure-ftpd:/var/ftp:/bin/false ftp:x:80:423:system user for pure-ftpd:/home/ftp:/bin/false [...]
Then move /var/ftp to /home (don't do this if you want to use /var/ftp):

mv /var/ftp /home

We use the directories /home/ftp/incoming (which will allow anonymous users to upload files) and /home/ftp/pub (from where anonymous users can download). Both directories exist already. We will give the /home/ftp/incoming directory permissions of 311 so that users can upload, but not see or download any files in that directory. The /home/ftp/pub directory will have permissions of 555 which allows seeing and downloading of files:

chown -R ftp:nogroup /home/ftp
cd /home/ftp
chmod 311 incoming/
chmod 555 pub/
cd ../
chmod 555 ftp/

(If you want to use /var/ftp instead, replace /home/ftp with /var/ftp in the above commands.)

Anonymous users will be able to log in, and they will be allowed to download files from /home/ftp/pub, but uploads will be limited to /home/ftp/incoming (and once a file is uploaded into /home/ftp/incoming, it cannot be read nor downloaded from there; the server admin has to move it into /home/ftp/pub first to make it available to others).

Now we have to configure PureFTPd for anonymous ftp. Open /etc/pure-ftpd/pure-ftpd.conf and make sure that you have the following settings in it:

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


[...]
NoAnonymous no [...] AntiWarez no [...] AnonymousBandwidth 8 [...] AnonymousCantUpload no [...]
(The AnonymousBandwidth setting is optional - it allows you to limit upload and download bandwidths for anonymous users. 8 means 8 KB/sec. Use any value you like, or comment out the line if you don't want to limit bandwidths.)

Finally, we restart PureFTPd:

/etc/init.d/pure-ftpd restart


9 Links

0 Kommentar(e)

Zum Posten von Kommentaren bitte