FTP Server PureFTPd mit MySQL und TLS Unterstützung

2009-08-07 - kostaki 5 Kommentare »

Bei Debian gibt es mehrere FTP Server als fertige Pakete. Ich bin seit lange Zeit ein Fan vom proftpd, aber man soll ja ab und an mal über den Tellerrand hinaus schauen und das mache ich jetzt. Für die bessere Verwaltung des Servers möchte ich eine MySQL Anbindung haben um User schnell anlegen zu können. Außerdem sollen, wen schon nicht die Daten selbst, wenigstens die Login Daten verschlüsselt über den Äther gehen. Außerdem muss der FTP Server mit meiner Apache2 Worker mit fcgid und SuExec Konfiguration zusammen arbeiten. Es wird also für jeden vhost ein extra Systemuser angelegt und mit dessen Rechten wird der FTP Account genutzt. In diesem Tutorial wird die Installation und die Konfiguration den PureFTPd Servers auf Debian Lenny erklärt.

Installation

$ aptitude install pure-ftpd-mysql

Konfiguration

Die Konfigurationsdateien findest du unter /etc/pure-ftpd. PureFTPd setzt nicht wie üblich auf eine config Datei in der man alles einstellen kann. Ein Großteil der Konfiguration läuft über Command-Line Optionen. Debian verwendet einen Demon Wrapper (pure-ftpd-wrapper, ein kleines Perl Skript) um die Konfiguration einfacher zu gestalten. So legt man für jede Option eine Datei im /conf/ Ordner an und schreibt den Wert rein.

Beispiel: Die Datei "conf/NoAnonymous" anlegen und "Yes" hinein schreiben. Der Wrapper wandelt das dann in die Option -E um.

Für mehr Informationen einfach in die Man Page gucken oder direkt in das Perl Skript.

$ man pure-ftpd-wrapper
$ nano /usr/sbin/pure-ftpd-wrapper

Nach der Installation erlaubt Pure-FTPd die Authentifizierung per MySQL und PAM (Unix ist abgeschaltet). Da wir nur MySQL erlauben wollen schalten wir PAM auch noch ab.

$ cd /etc/pure-ftpd/conf
$ echo yes > ChrootEveryone
$ echo 50 > MaxClientsNumber
$ echo 2 > MaxClientsPerIP
$ echo 95 > MaxDiskUsage
$ echo 1 > TLS
$ echo yes > DisplayDotFiles
$ echo yes > NoAnonymous
$ echo no > UnixAuthentication
$ echo no > PAMAuthentication
$ echo 137 027 > Umask
$ echo 10000 3 > LimitRecursion
$ echo yes > CustomerProof

Erklärungen:

  • ChrootEveryone: Sperrt jeden in sein Homedir ein
  • MaxDiskUsage: Überprüft ob die Partition bei 95% ist und lässt dann keine Uploads mehr zu.
  • NoAnonymous: Schaltet Anonymous Support ab
  • Umask: Files - Dirs - Setzt die Standard Rechte für zu erstellende Dateien
  • LimitRecursion: Limitiert die Maximalen Dateien und Subdirectorys
  • CustomerProof: So etwas braucht man überall :D

Möchte Man den Port des Servers verlegen nimmt man dafür den Bind Parameter. Der erste Teil ist die IP oder der Hostname des Servers und dann getrennt mit einem Komma der Port.

$ echo IpoderHOSTNAME,21334 > Bind

Die Passive Mode Ports kann man so festlegen.

$ echo 45100 45200 > PassivePortRange

Jetzt passen wir die MySQL Config an.

$ nano /etc/pure-ftpd/db/mysql.conf

Die Datei ist super kommentiert, aber hier die Basics.

#MYSQLServer     localhost
#MYSQLPort       3306
MYSQLSocket     /var/run/mysqld/mysqld.sock
MYSQLUser       pureftpd
MYSQLPassword   DatPW1
MYSQLDatabase   pureftpd
MYSQLCrypt      crypt
MYSQLGetPW      SELECT pass FROM users WHERE user="\L" AND status="1"
MYSQLGetUID     SELECT uid FROM users WHERE user="\L" AND status="1"
MYSQLGetGID     SELECT gid FROM users WHERE user="\L" AND status="1"
MYSQLGetDir     SELECT homedir FROM users WHERE user="\L" AND status="1"

In diesem Beispiel wird MySQLCrypt mit crypt verwandt, aber es ist auch plaintext, MD5, oder mysql password() möglich. Man kann es auch auf any setzen, dann werden alle Versionen geprüft. Mehr dazu gibt es in der pureFTP Doku.

MySQL User und Tabelle anlegen

$ mysql -uroot -pROOTPW
CREATE DATABASE pureftpd;
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
    ON pureftpd.* TO 'pureftpd'@'localhost'
    IDENTIFIED BY 'DatPW1';
FLUSH PRIVILEGES;
USE pureftpd;
CREATE TABLE IF NOT EXISTS `users` (
  `user` varchar(16) NOT NULL,
  `pass` varchar(255) NOT NULL,
  `uid` int(11) NOT NULL default '-1',
  `gid` int(11) NOT NULL default '-1',
  `homedir` varchar(255) NOT NULL,
  `status` tinyint(4) NOT NULL default '1',
  `comment` varchar(255) NOT NULL,
  PRIMARY KEY  (`user`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
quit;

Testen ob man mit dem neuen User auf die Datenbank/Tabelle zugreifen kann.

$ mysql -upureftpd -pDatPW1
USE pureftpd;
SELECT * FROM users;
quit;

Config absichern

Die Datei mit dem MySQL Passwort darf nur von root lesbar sein!

$ chmod 600 /etc/pure-ftpd/db/mysql.conf
$ chown root:root /etc/pure-ftpd/db/mysql.conf

SSL Zertifikat erstellen (TLS Support)

$ mkdir -p /etc/ssl/private/
$ openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout \
 /etc/ssl/private/pure-ftpd.pem \
 -out /etc/ssl/private/pure-ftpd.pem
$ chmod 600 /etc/ssl/private/*.pem

User anlegen

$ mysql -upureftpd -pDatPW1
USE pureftpd;
INSERT INTO
users
SET
user = 'test',
pass = ENCRYPT('dasisteinpw'),
uid = '1000',
gid = '1000',
homedir = '/var/www/vh-example/htdocs',
status = '1',
comment = 'Das ist der User sowieso';
quit;

Natürlich kann man User auch über phpMyAdmin anlegen. Hierbei beim Passwort aus dem DropDown Menü Encrypt auswählen! Andere Hash Funktionen sollte nicht benutzt werden.

$ /etc/init.d/pure-ftpd-mysql restart

Jetzt sollte man den kompletten Kommandozeilenaufruf des Servers sehen. Sollte man gar keine Antwort bekommen muss man noch in der folgenden Datei den Wert auf standalone setzen.

$ nano /etc/default/pure-ftpd-common
STANDALONE_OR_INETD=standalone

Wenn es jetzt immer noch Problem gibt im syslog nach gucken.

$ pure-ftpwho

Damit kann man sehen wer gerade connected ist und was er macht.

Related Links

Ähnliche Artikel

  1. 5 Kommentare

  2. vizzy
    schrieb am 23.09.2009 um 11:47 Uhr

    hi,

    klasse anleitung.
    von mir noch ein hinweis:

    pureftp erlaubt das setzen der benutzten passiven ports, das erlaubt es relativ einfach mittels iptables den traffic ueber diese ports zu zaehlen. das zaehlen von traffic mit iptables wird sonst schnell umstaendlich, denn passiver ftp datenverkehr laeuft ja komplett ueber die highports, ueber 21 werden nach dem connect nur noch steuerbefehle gesendet. da wir die range angeben koennen, kann man damit aber relativ verlaesslich den entstandenen gesamttraffic fuer ftp beobachten.

    zudem bietet pureftp noch die moeglichkeit die download und upload bandbreite anzugeben :)

    statt crypt kann man auch das etwas sicherere md5 nehmen.

    danke und gruss
    v.

  3. Paeddl
    schrieb am 06.04.2010 um 12:49 Uhr

    Super Anleitung, super Seite!

    Beim Einrichten von PureFTPd auf einem Debian-Etch-Server kam es immer wieder zu folgendem Fehler beim Login via FTP:

    Can’t exec “/usr/sbin/pure-ftpd”: No such file or directory at /usr/sbin/pure-ftpd-wrapper line 174

    Die Datei existiert auch wirklich nicht. Dieser Befehl löst das Problem:

    ln -sf /usr/sbin/pure-ftpd-mysql /usr/sbin/pure-ftpd

    Viele Grüße aus Berlin

  4. kostaki
    schrieb am 09.04.2010 um 10:42 Uhr

    Schön wenn es dir geholfen hat. Unter Etch habe ich es noch nicht getestet, aber es scheint ja bis auf das von dir beschriebene Problem gut zu funktionieren.

  5. Dennis
    schrieb am 08.01.2011 um 21:20 Uhr

    Moin,

    danke für dein Tut…
    Jedoch habe ich ein Problem.
    Beim ersten User klappt die Verbindung tadellos. Bei zweiten geht es nicht, also ich kann mich mit dem zweiten namen nicht einloggen. Hier die Meldung vom Filezilla:
    ————-
    Befehl: USER *NAME*
    Antwort: 331 User *NAME* OK. Password required
    Befehl: PASS ********
    Fehler: Verbindung vom Server geschlossen
    Fehler: Herstellen der Verbindung zum Server fehlgeschlagen
    —————

    In den Logs wurde nichts verzeichnet. Hast du oder jemand ein Tipp für mich ?

    Gruß
    Dennis

  6. kostaki
    schrieb am 10.01.2011 um 09:10 Uhr

    Hm. Sorry keine Ahnung warum es nur bei einem User funktioniert. Hab damit noch keine Probleme gehabt auch wenn ich 100 User eingerichtet habe. Es müsste doch auch eigentlich in den Logs stehen wenn die Daten abgelehnt wurden weil sie Falsch sind…

Kommentar schreiben

*

*