GNU/Linux >> LINUX-Kenntnisse >  >> Debian

Virtuelles Hosting mit Proftpd und MySQL (inkl. Quote) auf Debian Lenny

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 Debian Lenny (Debian 5.0). Sie sollten bereits ein grundlegendes Debian-Lenny-System eingerichtet haben, wie in den ersten sieben Kapiteln dieses Tutorials beschrieben:https://www.howtoforge.com/perfect-server-debian-lenny-ispconfig2

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 abweichen, daher müssen Sie sie gegebenenfalls ersetzen.

2 Installieren Sie MySQL und phpMyAdmin

Dies alles kann mit einem einzigen Befehl installiert werden:

aptitude 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:

Webserver zur automatischen Neukonfiguration:<-- apache2

3 Installieren Sie Proftpd mit MySQL-Unterstützung

Für Debian ist ein vorkonfiguriertes proftpd-mysql-Paket verfügbar. Installieren Sie ihn wie folgt als eigenständigen Daemon:

aptitude install proftpd-mod-mysql

Ihnen wird die folgende Frage gestellt:

Führen Sie proftpd:<-- standalone

aus

Dann 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;
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;

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 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 bigint(20) unsigned NOT NULL default '0',
bytes_out_avail bigint(20) unsigned NOT NULL default '0',
bytes_xfer_avail bigint(20) 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 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 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 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; kommentieren Sie den Kontingentabschnitt aus und kommentieren Sie die Zeile Include /etc/proftpd/sql.conf aus:

vi /etc/proftpd/proftpd.conf
[...]
#<IfModule mod_quotatab.c>
#QuotaEngine off
#</IfModule>
[...]
#
# Alternative authentication frameworks
#
#Include /etc/proftpd/ldap.conf
Include /etc/proftpd/sql.conf
[...]

Als nächstes öffnen Sie /etc/proftpd/sql.conf und lassen es wie folgt aussehen:

vi /etc/proftpd/sql.conf
#
# Proftpd sample configuration for SQL-based authentication.
#
# (This is not to be used if you prefer a PAM-based SQL authentication)
#

<IfModule mod_sql.c>
#
# 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.
#
#SQLBackend        mysql
#
#SQLEngine on
#SQLAuthenticate on
#
# Use both a crypted or plaintext password
#SQLAuthTypes Crypt Plaintext
#
# Use a backend-crypted or a crypted password
#SQLAuthTypes Backend Crypt
#
# Connection
#SQLConnectInfo [email protected] proftpd_user proftpd_password
#
# Describes both users/groups tables
#
#SQLUserInfo users userid passwd uid gid homedir shell
#SQLGroupInfo groups groupname gid members
#
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

</IfModule>

Achten Sie darauf, dass Sie in der Zeile SQLConnectInfo!

den String password durch das echte Passwort für den MySQL-Benutzer proftpd ersetzen

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 (etwas wie WS_FTP oder SmartFTP, wenn Sie auf einem Windows-System arbeiten, oder gFTP auf einem Linux-Desktop) 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):

server1:~# ls -l /home/
total 12
drwxr-xr-x 2 administrator administrator 4096 2009-02-16 13:18 administrator
drwxr-xr-x 2 ftp           nogroup       4096 2009-06-09 17:37 ftp
drwx------ 2 ftpuser       ftpgroup      4096 2009-06-09 17:59 www.example.com
server1:~#

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.
  • pro Sitzung: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 anonymous_ftp
useradd -u 2002 -s /bin/false -d /home/anonymous_ftp -m -c "Anonymous FTP User" -g anonymous_ftp anonymous_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

  • Proftpd:http://www.proftpd.org
  • MySQL:http://www.mysql.com
  • phpMyAdmin:http://www.phpmyadmin.net
  • Debian:http://www.debian.org

Debian
  1. Virtuelles Hosting mit Proftpd und MySQL (inkl. Quote) auf Ubuntu 14.04LTS

  2. So richten Sie virtuelle Container mit LXC- und Quota-Unterstützung unter Debian 8 ein

  3. Virtuelles Hosting mit PureFTPd und MySQL (inkl. Kontingent- und Bandbreitenverwaltung) auf CentOS 7.0

  4. Virtuelles Hosting mit PureFTPd und MySQL (inkl. Kontingent- und Bandbreitenverwaltung) auf Ubuntu 7.10 (Gutsy Gibbon)

  5. Virtuelles Hosting mit Proftpd und MySQL (inkl. Quote) auf Ubuntu 8.04 LTS

Virtuelles Hosting mit PureFTPd und MySQL (inkl. Kontingent- und Bandbreitenverwaltung) auf Ubuntu 12.10

Virtuelles Hosting mit Proftpd und MySQL (inkl. Quote) auf Ubuntu 12.10

Virtuelles Hosting mit PureFTPd und MySQL (inkl. Kontingent- und Bandbreitenverwaltung) auf Ubuntu 14.04LTS

Installation von Lighttpd mit PHP5- und MySQL-Unterstützung auf Debian Lenny

Virtuelles Hosting mit Proftpd und MySQL (inkl. Quote) auf Debian Lenny

Virtuelles Hosting mit vsftpd und MySQL auf Debian Squeeze