GNU/Linux >> LINUX-Kenntnisse >  >> Ubuntu

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

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 12.10.

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 dash

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

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-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)
) 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';

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 one of proftpd-mod-mysql, proftpd-mod-pgsql or any other
# SQL backend engine to use this module and the required backend.
# This module must be mandatory loaded before anyone of
# the existent SQL backeds.
LoadModule mod_sql.c [...] # Install proftpd-mod-mysql and decomment the previous
# mod_sql.c module to use this.
LoadModule mod_sql_mysql.c [...] # Install one of the previous SQL backends and decomment
# the previous mod_sql.c module to use this
LoadModule mod_quotatab_sql.c [...]
zu 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 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 (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 8
drwxr-xr-x 3 Administrator Administrator 4096 19. Okt 13:08 Administrator
drwx------ 2 ftpuser       ftpgroup      4096 Apr 18 18:13 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.)

Einige Dateien, die mit einer . wurden durch den letzten Befehl (useradd) im Verzeichnis /home/anonymous_ftp erstellt. Wir brauchen sie nicht, also löschen wir sie:

cd /home/anonymous_ftp
rm -f .bash_logout
rm -f .profile
rm -f .bashrc

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 SITE_CHMOD>
      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 SITE_CHMOD>
             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/
  • Ubuntu:http://www.ubuntu.com/

Ubuntu
  1. Virtuelle Benutzer und Domänen mit Postfix, Courier, MySQL und SquirrelMail (Ubuntu 14.04LTS)

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

  3. Virtuelle Benutzer und Domains mit Postfix, Courier, MySQL und SquirrelMail (Ubuntu 13.10)

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

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

Virtuelle Benutzer und Domains mit Postfix, Courier, MySQL und SquirrelMail (Ubuntu 12.10)

Virtuelles Hosting mit vsftpd und MySQL auf Ubuntu 12.10

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

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

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

Virtuelles Hosting mit vsftpd und MySQL auf Debian Squeeze