Dieses Dokument beschreibt, wie Sie einen Proftpd-Server installieren, der virtuelle Benutzer aus einer MySQL-Datenbank anstelle von echten Systembenutzern verwendet. Dies ist viel leistungsfähiger und ermöglicht es, Tausende von FTP-Benutzern auf einem einzigen Computer zu haben. Darüber hinaus werde ich die Verwendung von Quota mit diesem Setup zeigen.
Für die Verwaltung der MySQL-Datenbank können Sie webbasierte Tools wie phpMyAdmin verwenden, die ebenfalls in diesem Howto installiert werden. phpMyAdmin ist eine komfortable grafische Oberfläche, was bedeutet, dass Sie sich nicht mit der Befehlszeile herumschlagen müssen.
Dieses Tutorial basiert auf Ubuntu 8.10. Sie sollten bereits ein grundlegendes Ubuntu 8.10-Serversystem eingerichtet haben, wie in den ersten acht Kapiteln dieses Tutorials beschrieben:https://www.howtoforge.com/perfect-server-ubuntu-8.10
Dieses Howto ist als praktischer Leitfaden gedacht; es deckt nicht die theoretischen Hintergründe ab. Sie werden in vielen anderen Dokumenten im Internet behandelt.
Dieses Dokument wird ohne jegliche Gewährleistung geliefert! Ich möchte sagen, dass dies nicht die einzige Möglichkeit ist, ein solches System einzurichten. Es gibt viele Wege, dieses Ziel zu erreichen, aber ich gehe diesen Weg. Ich gebe keine Garantie dafür, dass dies bei Ihnen funktioniert!
1 Vorbemerkung
In diesem Tutorial verwende ich den Hostnamen server1.example.com mit der IP-Adresse 192.168.0.100. Diese Einstellungen können für Sie unterschiedlich sein, daher müssen Sie sie gegebenenfalls ersetzen.
Stellen Sie sicher, dass Sie als root angemeldet sind:
sudo su
1.1 Ändern Sie die Standard-Shell
/bin/sh ist ein symbolischer Link zu /bin/dash, wir brauchen jedoch /bin/bash, nicht /bin/dash. Deshalb machen wir das:
ln -sf /bin/bash /bin/sh
1.2 AppArmor deaktivieren
AppArmor ist eine Sicherheitserweiterung (ähnlich wie SELinux), die erweiterte Sicherheit bieten soll. Meiner Meinung nach brauchen Sie es nicht, um ein sicheres System zu konfigurieren, und es verursacht normalerweise mehr Probleme als Vorteile (denken Sie daran, nachdem Sie eine Woche lang Fehler behoben haben, weil ein Dienst nicht wie erwartet funktioniert hat, und dann Sie feststellen, dass alles in Ordnung war, nur AppArmor verursachte das Problem). Deshalb deaktiviere ich es.
Wir können es wie folgt deaktivieren:
/etc/init.d/apparmor stop
update-rc.d -f apparmor remove
apt-get remove apparmor apparmor-utils
2 Installieren Sie MySQL und phpMyAdmin
Dies alles kann mit einem einzigen Befehl installiert werden:
apt-get install mysql-server mysql-client phpmyadmin apache2
Sie werden aufgefordert, ein Passwort für den MySQL-Root-Benutzer anzugeben – dieses Passwort gilt sowohl für den Benutzer [email protected] als auch für [email protected], sodass wir später kein MySQL-Root-Passwort manuell angeben müssen:
Neues Passwort für den MySQL-„root“-Benutzer:<-- yourrootsqlpassword
Wiederholen Sie das Passwort für den MySQL-„root“-Benutzer:<-- yourrootsqlpassword
Darüber hinaus sehen Sie die folgende Frage:
Automatisch neu zu konfigurierender Webserver:<-- apache2
3 Installieren Sie Proftpd mit MySQL-Unterstützung
Für Ubuntu ist ein vorkonfiguriertes Paket proftpd-mod-mysql verfügbar. Installieren Sie ihn wie folgt als eigenständigen Daemon:
apt-get install proftpd-mod-mysql
Ihnen wird die folgende Frage gestellt:
Führen Sie proftpd:<-- standalone
ausDann erstellen wir eine FTP-Gruppe (ftpgroup) und einen Benutzer (ftpuser), denen alle unsere virtuellen Benutzer zugeordnet werden. Ersetzen Sie die Gruppen- und Benutzerkennung 2001 durch eine auf Ihrem System freie Nummer:
groupadd -g 2001 ftpgroup
useradd -u 2001 -s /bin/false -d /bin/null -c "proftpd-Benutzer" -g ftpgroup ftpuser
4 Erstellen Sie die MySQL-Datenbank für Proftpd
Jetzt 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;
GEWÄHREN SIE SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'proftpd'@'localhost' IDENTIFIED BY 'password';
GEWÄHREN SIE SELECT, INSERT, UPDATE, DELETE ON ftp.* AN 'proftpd'@'localhost.localdomain', IDENTIFIZIERT DURCH 'password';
FLUSH PRIVILEGES;
Ersetzen Sie die Zeichenfolge password durch das Passwort, das Sie für den MySQL-Benutzer proftpd verwenden möchten. Immer noch auf der MySQL-Shell erstellen wir die Datenbanktabellen, die wir brauchen:
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 Gruppenname (Gruppenname)
) TYPE=MyISAM COMMENT='ProFTP-Gruppentabelle';
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 bigint(20) unsigned NOT NULL Standard '0',
bytes_out_avail bigint(20) ohne Vorzeichen NOT NULL Standard '0',
bytes_xfer_avail bigint(20) ohne Vorzeichen NOT NULL Standard '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 bigint(20) unsigned NOT NULL default '0',
bytes_out_used bigint(20) unsigned NOT NULL default '0',
bytes_xfer_used bigint(20) unsigned NOT NULL default '0',
files_in_used int(10) unsigned NOT NULL Standard '0',
files_out_used int(10) unsigned NOT NULL Standard '0',
files_xfer_used int(10) unsigned NOT NULL Standard '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',
zugegriffen 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-Benutzertabelle';
quit;
Wie Sie vielleicht bemerkt haben, mit dem Beenden; Befehl haben wir die MySQL-Shell verlassen und befinden uns wieder auf der Linux-Shell.
Übrigens (ich gehe davon aus, dass der Hostname Ihres FTP-Serversystems server1.example.com ist) Sie können auf phpMyAdmin unter http://server1.example.com/phpmyadmin/ zugreifen (Sie können die IP-Adresse anstelle von server1 verwenden. example.com) in einem Browser und melden Sie sich als proftpd an. Dann können Sie einen Blick in die Datenbank werfen. Später können Sie phpMyAdmin verwenden, um Ihren Proftpd-Server zu verwalten.
5 Proftpd konfigurieren
Öffnen Sie /etc/proftpd/modules.conf...
vi /etc/proftpd/modules.conf
... und aktivieren Sie die folgenden drei Module:
[...] # Install proftpd-mod-mysql or proftpd-mod-pgsql to use this LoadModule mod_sql.c [...] # Install proftpd-mod-mysql to use this LoadModule mod_sql_mysql.c [...] # Install proftpd-mod-pgsql or proftpd-mod-mysql to use this LoadModule mod_quotatab_sql.c [...] |
Öffnen Sie dann /etc/proftpd/proftpd.conf und fügen Sie die folgenden Zeilen hinzu:
[...] # Choose a SQL backend among MySQL or PostgreSQL. # Both modules are loaded in default configuration, so you have to specify the backend # or comment out the unused module in /etc/proftpd/modules.conf. # Use 'mysql' or 'postgres' as possible values. # #<IfModule mod_sql.c> # SQLBackend mysql #</IfModule> DefaultRoot ~ SQLBackend mysql # The passwords in MySQL are encrypted using CRYPT SQLAuthTypes Plaintext Crypt SQLAuthenticate users groups # used to connect to the database # [email protected] database_user user_password SQLConnectInfo [email protected] 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 CreateHome 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 [...] |
Achten Sie darauf, dass Sie in der Zeile SQLConnectInfo!
den String password durch das echte Passwort für den MySQL-Benutzer proftpd ersetzenKommentieren Sie weiter unten in der Datei den Quota-Abschnitt aus:
[...] #<IfModule mod_quotatab.c> #QuotaEngine off #</IfModule> [...] |
Starten Sie dann Proftpd neu:
/etc/init.d/proftpd restart
6 Datenbank füllen und testen
Um die Datenbank zu füllen, können Sie die MySQL-Shell verwenden:
mysql -u root -p
USE ftp;
Zuerst erstellen wir einen Eintrag in der Tabelle ftpgroup. Es enthält den Gruppennamen, die Gruppen-ID und den Benutzernamen der FTP-Gruppe/des Benutzers, die wir am Ende von Schritt zwei erstellt haben (ersetzen Sie die Gruppen-ID entsprechend, wenn Sie eine andere als 2001 verwenden):
INSERT INTO `ftpgroup` (`groupname`, `gid`, `members`) VALUES ('ftpgroup', 2001, 'ftpuser');
Jetzt sind wir mit der Tabelle ftpgroup fertig. Hier müssen wir keine weiteren Einträge erstellen. Immer wenn Sie einen neuen virtuellen FTP-Benutzer anlegen, tun Sie dies in den Tabellen ftpquotalimits und ftpuser. Lassen Sie uns also unseren ersten Benutzer exampleuser mit einem Kontingent von 15 MB und dem Passwort secret erstellen (wir befinden uns immer noch in der MySQL-Shell):
INSERT INTO `ftpquotalimits` (`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`) VALUES ('exampleuser', 'user', 'true', 'hard', 15728640, 0, 0, 0, 0, 0);
INSERT INTO `ftpuser` (`id`, `userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`) VALUES (1, 'exampleuser', 'secret', 2001, 2001, '/home/www.example.com', '/sbin/nologin', 0, '', '');
quit;
(Vergessen Sie nicht, die Gruppen- und Benutzer-ID 2001 im letzten INSERT-Statement entsprechend zu ersetzen, wenn Sie andere Werte als in diesem Tutorial verwenden!)
Öffnen Sie nun Ihr FTP-Client-Programm auf Ihrer Workstation (etwa FileZilla, WS_FTP, SmartFTP oder gFTP) und versuchen Sie, eine Verbindung herzustellen. Als Hostname verwenden Sie server1.example.com (oder die IP-Adresse des Systems), der Benutzername ist exampleuser und das Passwort ist secret.
Wenn Sie sich verbinden können - herzlichen Glückwunsch! Wenn nicht, ist etwas schief gelaufen.
Nun, wenn Sie laufen
ls -l /home/
Sie sollten sehen, dass das Verzeichnis /home/www.example.com (das Home-Verzeichnis des Beispielbenutzers) automatisch erstellt wurde und im Besitz von ftpuser und ftpgroup ist (dem Benutzer/der Gruppe, die wir am Ende von Schritt zwei erstellt haben):
[E-Mail-geschützt]:~# ls -l /home/
insgesamt 12
drwxr-xr-x 2 Administrator Administrator 4096 2008-11-04 15:48 Administrator
drwxr-xr-x 2 ftp nogroup 4096 2009-01-06 15:15 ftp
drwx------ 2 ftpuser ftpgroup 4096 2009-01-06 16:05 www.example.com
[email protected]:~#
7 Datenbankverwaltung
Für die meisten Leute ist es einfacher, wenn sie ein grafisches Frontend für MySQL haben; daher können Sie auch phpMyAdmin (in diesem Beispiel unter http://server1.example.com/phpmyadmin/) verwenden, um die FTP-Datenbank zu verwalten.
Wenn Sie einen neuen Benutzer erstellen, müssen Sie nur Einträge in den Tabellen ftpquotalimits und ftpuser erstellen, daher erkläre ich die Spalten dieser Tabellen hier:
ftpuser-Tabelle:
Die wichtigen Spalten sind diese (die anderen werden von MySQL oder Proftpd automatisch gehandhabt, also füllen Sie diese nicht manuell aus!):
- userid:Der Name des virtuellen Proftpd-Benutzers (z. B. exampleuser).
- passwd:Das unverschlüsselte (d. h. unverschlüsselte) Passwort des Benutzers.
- uid:Die Benutzer-ID des FTP-Benutzers, den Sie am Ende von Schritt zwei erstellt haben (z. B. 2001).
- gid:Die Gruppen-ID der FTP-Gruppe, die Sie am Ende von Schritt zwei erstellt haben (z. B. 2001).
- homedir:Das Heimatverzeichnis des virtuellen Proftpd-Benutzers (z. B. /home/www.example.com). Wenn es nicht vorhanden ist, wird es erstellt, wenn sich der neue Benutzer zum ersten Mal über FTP anmeldet. Der virtuelle Benutzer wird in dieses Home-Verzeichnis eingesperrt, d.h. er kann nicht auf andere Verzeichnisse außerhalb seines Home-Verzeichnisses zugreifen.
- Shell:Es ist in Ordnung, wenn Sie hier standardmäßig /sbin/nologin eingeben.
ftpquotalimits-Tabelle:
Die wichtigen Spalten sind diese (die anderen werden von MySQL oder Proftpd automatisch gehandhabt, also füllen Sie diese nicht manuell aus!):
- name:Der Name des virtuellen Proftpd-Benutzers (z. B. exampleuser).
- quota_type:Benutzer oder Gruppe. Normalerweise verwenden wir hier user.
- per_session:wahr oder falsch. true bedeutet, dass die Kontingentgrenzen nur für eine Sitzung gültig sind. Wenn der Benutzer beispielsweise ein Kontingent von 15 MB hat und während der aktuellen Sitzung 15 MB hochgeladen hat, kann er nichts mehr hochladen. Meldet er sich aber ab und wieder an, stehen ihm wieder 15 MB zur Verfügung. false bedeutet, dass der Benutzer 15 MB hat, egal ob er sich ab- und wieder anmeldet.
- limit_type:hart oder weich. Ein hartes Kontingentlimit ist ein nie zu überschreitendes Limit, während ein weiches Kontingent vorübergehend überschritten werden kann. Normalerweise benutzt man hier kräftig.
- bytes_in_avail:Upload-Limit in Bytes (z. B. 15728640 für 15 MB). 0 bedeutet unbegrenzt.
- bytes_out_avail:Download-Limit in Bytes. 0 bedeutet unbegrenzt.
- bytes_xfer_avail:Übertragungslimit in Bytes. Die Summe der Uploads und Downloads, die ein Benutzer durchführen darf. 0 bedeutet unbegrenzt.
- files_in_avail:Upload-Limit in Dateien. 0 bedeutet unbegrenzt.
- files_out_avail:Download-Limit in Dateien. 0 bedeutet unbegrenzt.
- files_xfer_avail:Übertragungslimit in Dateien. 0 bedeutet unbegrenzt.
Die ftpquotatallies-Tabelle wird von Proftpd intern zur Verwaltung von Kontingenten verwendet, sodass Sie dort keine Einträge vornehmen müssen!
8 Anonymes FTP
Wenn Sie ein anonymes FTP-Konto erstellen möchten (ein FTP-Konto, bei dem sich jeder ohne Passwort anmelden kann), können Sie dies folgendermaßen tun:
Zuerst erstellen wir einen Benutzer und eine Gruppe mit dem Namen anonymous_ftp. Der Benutzer hat das Heimatverzeichnis /home/anonymous_ftp:
groupadd -g 2002 anonymer_ftp
useradd -u 2002 -s /bin/false -d /home/anonymer_ftp -m -c "Anonymer FTP-Benutzer" -g anonymer_ftp anonymer_ftp
(Ersetzen Sie 2002 durch eine Gruppen-/Benutzerkennung, die auf Ihrem System frei ist.)
Dann erstellen wir das Verzeichnis /home/anonymous_ftp/incoming, das es anonymen Benutzern ermöglicht, Dateien hochzuladen:
mkdir /home/anonymous_ftp/incoming
chown anonymous_ftp:nogroup /home/anonymous_ftp/incoming
Öffnen Sie schließlich /etc/proftpd/proftpd.conf und hängen Sie die folgenden Anweisungen an:
vi /etc/proftpd/proftpd.conf
[...] <Anonymous ~anonymous_ftp> User anonymous_ftp Group nogroup # We want clients to be able to login with "anonymous" as well as "ftp" UserAlias anonymous anonymous_ftp # Cosmetic changes, all files belongs to ftp user DirFakeUser on anonymous_ftp DirFakeGroup on anonymous_ftp RequireValidShell off # Limit the maximum number of anonymous logins MaxClients 10 # We want 'welcome.msg' displayed at login, and '.message' displayed # in each newly chdired directory. DisplayLogin welcome.msg DisplayChdir .message # Limit WRITE everywhere in the anonymous chroot <Directory *> <Limit WRITE> DenyAll </Limit> </Directory> # Uncomment this if you're brave. <Directory incoming> # Umask 022 is a good standard umask to prevent new files and dirs # (second parm) from being group and world writable. Umask 022 022 <Limit READ WRITE> DenyAll </Limit> <Limit STOR> AllowAll </Limit> </Directory> </Anonymous> |
Zum Schluss Proftpd neu starten:
/etc/init.d/proftpd restart
Jetzt können sich anonyme Benutzer anmelden und Dateien von /home/anonymous_ftp herunterladen, aber Uploads sind auf /home/anonymous_ftp/incoming beschränkt (und sobald eine Datei in /home/anonymous_ftp/incoming hochgeladen wurde, kann sie weder gelesen noch heruntergeladen werden dort; der Serveradministrator muss es zuerst nach /home/anonymous_ftp verschieben, um es anderen zur Verfügung zu stellen).
(Achtung:Sie können nur einen anonymen FTP-Account pro IP-Adresse haben!)
9 Referenzen
Mandrake 10.1 – Proftpd + MySQL-Authentifizierung + Quoten Howto:http://www.khoosys.net/single.htm?ipg=848
10 Links
- Proftpd:http://www.proftpd.org
- MySQL:http://www.mysql.com
- phpMyAdmin:http://www.phpmyadmin.net
- Ubuntu:http://www.ubuntu.com