FTP Server PureFTPd mit MySQL und TLS Unterstützung
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
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.
5 Kommentare
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.
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
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.
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
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…