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 Quoten mit diesem Setup zeigen. Dieses Tutorial basiert auf Ubuntu 14.04LTS.
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 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:
dpkg-reconfigure Bindestrich
Dash als /bin/sh installieren? <-- Nein
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 folgenden Fragen:
Webserver zur automatischen Neukonfiguration:<-- apache2
Datenbank für phpmyadmin mit dbconfig-common konfigurieren? <-- Nein
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 user" -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:
Verwenden Sie 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)
) ENGINE=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 Standard '0',
files_out_avail int(10) unsigned NOT NULL Standard '0',
files_xfer_avail int(10) unsigned NOT NULL Standard '0'
) ENGINE=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'
) ENGINE=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)
) ENGINE =MyISAM COMMENT='ProFTP-Benutzertabelle';
beenden;
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 one of proftpd-mod-mysql, proftpd-mod-pgsql or any otherzu verwenden |
Öffnen Sie dann /etc/proftpd/proftpd.conf und kommentieren Sie die folgenden Zeilen aus:
vi /etc/proftpd/proftpd.conf
[...] #<IfModule mod_quotatab.c> #QuotaEngine off #</IfModule> [...] |
Fügen Sie weiter unten in der Datei die folgenden Zeilen hinzu:
[...] # # Alternative authentication frameworks # #Include /etc/proftpd/ldap.conf #Include /etc/proftpd/sql.conf 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 ersetzenStarten Sie dann Proftpd neu:
/etc/init.d/proftpd Neustart