Hetzner - DokuWiki

PureFTPd

Inhaltsverzeichnis

Pureftpd mit mysql und TLS Unterstützung

Changes

  • 11.02.2010 Ergänzungen für Debian Lenny
  • 23.07.2008 Anpassung an Etch Installation, markieren defaults bei Debian

Author: Jan Scholten

devnull [at] rootsvr [dot] de

Copyright und Lizenz

Some Rights Reserved.gif

Dieser Inhalt ist unter einer Creative-Commons Lizenz lizensiert.

Feedback

Feedback zu diesem Dokument ist natürlich willkommen, einfach eine Mail an den Autor schicken.

Einleitung / Abstrakt

Fast jeder Serverbetreiber wird (zumindest wenn er Kunden hat) einen FTP Server nutzen wollen oder müssen.
Der Datenverkehr beim FTP ist standardmäßig nicht verschlüsselt, auch Passwörter gehen unverschlüsselt über die Leitung. Um diese potentielle Schwachstelle zu schliessen kann man einen FTP Server nutzen, der zumindest den Kanal auf dem die Passwörter übertragen werden verschlüsselt.

In diesem Howto möchte ich die Installation von Pure-FTPd erklären. Dabei wird soweit wie möglich auf Debian Pakete gesetzt, die einzelnen in meinen Augen sinnvollen Parameter erklärt.

Es wird die Unterstützung von mysql benutzt, so können User über ein Webinterface angelegt und gelöscht werden, was in Hostingumgebungen sinnvoll ist.

Ich benutze diese Konfiguration in einer suExec + FastCGI Konfiguration, das heißt jede Domain läuft unter einem User.

Die angelegten User sind weitestgehend unabhängig von Systemusern. Eine Idee für ein virtuelle User Setup findet sich weiter hinten.

Installation

Wir installieren das pure-ftpd-mysql paket. Die Konfiguration erfolgt über einzelne Dateien die in /etc/pure-ftpd/conf liegen, jede Datei ist benannt nach dem Parameter den sie repräsentiert und hat als Inhalt die nötigen Werte.

cerberus# apt-get install pure-ftpd-mysql

Wir legen im /etc/pure-ftpd/conf folgende Dateien an, nach dem :

cd /etc/pure-ftpd/conf
echo yes > ChrootEveryone
echo yes > CreateHomeDir
echo 50 > MaxClientsNumber
echo 5  > MaxClientsPerIP
echo 95 > MaxDiskUsage
echo 1 > TLS
echo 117 007 > Umask
echo no > UnixAuthentication
echo no > PAMAuthentication

defaults bei Debain (braucht man nicht ändern):

echo clf:/var/log/pure-ftpd/transfer.log > AltLog
echo 1000 > MinUID
echo /etc/pure-ftpd/db/mysql.conf > MySQLConfigFile
echo yes > NoAnonymous
echo /etc/pure-ftpd/pureftpd.pdb > PureDB

Damit erzeugen wir homedirs, die nicht exitieren, beschränken jeden User auf sein Verzeichnis, erlauben 50 parallel Connections aber nicht mehr als 5 pro IP Adresse, die Minimun GID ist 1000 (zumindest bei nem suExec Apache/fcgi ansonsten sollte man MinUID auf 33 setzen (Standard www-data Account bei Debian). Anonymen Login verbieten wir ebenso wie Unix Authentifizierung, sondern authentifizieren nur User aus der DB. Der MaxDiskUsage Paramter verhindert das der FTP mehr als 95% der Disk befüllen kann.

pureftpd-mysql

In der Datei /etc/pure-ftpd/db/mysql.conf editieren wir die Daten für unsere DB.

vi /etc/pure-ftpd/db/mysql.conf
#MYSQLServer     localhost
#MYSQLPort       3306
MYSQLSocket     /var/run/mysqld/mysqld.sock
MYSQLUser       pureftpd-user
MYSQLPassword   DasistunserPW!
MYSQLDatabase   pureftpd
MYSQLCrypt      crypt
MYSQLGetPW      SELECT Password FROM users WHERE User="\L"
MYSQLGetUID     SELECT Uid FROM users WHERE User="\L"
MYSQLGetGID     SELECT Gid FROM users WHERE User="\L"
MYSQLGetDir     SELECT Dir FROM users WHERE User="\L"
MySQLGetQTAFS   SELECT QuotaFiles FROM users WHERE User="\L"
MySQLGetQTASZ   SELECT QuotaSize FROM users WHERE User="\L"
MySQLGetBandwidthUL SELECT ULBandwidth FROM users WHERE User="\L"
MySQLGetBandwidthDL SELECT DLBandwidth FROM users WHERE User="\L"

Mysqluser und Tabellenstruktur

Wir legen uns im mysql Server einen User und eine Datenbank an:

Mysqluser anlegen

mysql -u root -p
CREATE DATABASE pureftpd;
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
    ON pureftpd.* TO 'pureftpd-user'@'localhost'
    IDENTIFIED BY 'DasistunserPW!';
FLUSH PRIVILEGES;
quit;

Tabellenstruktur

USE pureftpd;
CREATE TABLE users (
 User varchar(16) NOT NULL default ,
 Password varchar(64) NOT NULL default ,
 Uid int(11) NOT NULL default '-1',
 Gid int(11) NOT NULL default '-1',
 Dir varchar(128) NOT NULL default ,
 QuotaFiles int(11) NOT NULL default '10000',
 QuotaSize int(11) NOT NULL default '1000',
 ULBandwidth int(11) NOT NULL default '500',
 DLBandwidth int(11) NOT NULL default '500',
 PRIMARY KEY  (User)
)
FLUSH PRIVILEGES;
quit;

Test

Kurz testen ob sich der User einloggen kann:

mysql -u pureftpd-user -p pureftpd
DasistunserPW!
select * from users;

absichern

Danach sicherstellen das die Datein nur für root lesbar ist, da dort ja Datenbank Passwörter stehen.

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

SSL Zertifikat für TLS erstellen

Das SSL Zertifikat wird unter /etc/ssl/private/pure-ftpd.pem erwartet, wer schon eins für den Apache hat kann es einfach kopieren und auch dafür nutzen, wer sich selber eins machen will:

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

User hinzufügen

Einträge macht man per phpmyadmin oder einem selbstgeschriebenen Script ..

PhpMyAdmin einloggen als pureftpd-user neue Zeile in der Tabelle Users machen:

Username
Password('DasPasswordDesUsers')  ("Encrypt" im Dropdown wählen)
UID/GID     vom Account, bei "einfachen" Setups 33 (www-data), bei fastcgi/suexec oder suPHP der User der Domain
dir         im Normalfall /var/www/domain
Quotafiles  max Anzahl der Dateien
Quotasize   max Größe aller Files in MB
Bandwidth UPload/DownLoad Begrenzung in kb/s

Über mysql auf der Kommandozeile:

mysql -u pureftpd-user -p
use pureftpd;
insert into users (User, Password, UID, GID, dir, Quotafiles,  Quotasize) \
Values ('TestUsername', ENCRYPT('TestseinPW'), 33,33,'/var/www/testdomain.de',1000,1000);

Die Passwortabfrage kann man mittels entsprechender my.cf erledigen und die Datenbank kann man angeben. So lassen sich Sachen auch per Script direkt in mysql blasen.

Bedenke root geht nicht!

If a MySQL user entry has a root (0) uid and/or gid, Pure-FTPd will refuse to log him in.
Without this preventive restriction, if your MySQL server ever gets
compromised, the attacker could also easily compromise the FTP server.
Security barriers are also implemented to avoid bad implications if wrong data types (eg. binary blobs instead of plain text) are fetched with SQL queries.

Client konfigurieren

Tja jetzt braucht man noch einen TLS kompatiblen Client (z.B. SmartFTP/FileZilla) und schon kann es losgehen.

Wie man seinen FTP Client einstellt und welcher TLS unterstützt liest man am besten nach oder probiert es aus. http://download.pureftpd.org/pub/pure-ftpd/doc/README.TLS

Weitere Kommentare

Wählt man MD5 oder mysql Password als Passwortverschlüsselung ist das selbstverständlich anzupassen (im /etc/pure-ftpd-mysql/db/mysql.conf und in den angelegten Usern, ggf versucht man einfach "any" und hofft das pureftpd schon das richtige PW findet..

Fehlersuche

Bei mir wollte der Weg über inetd nicht funktionieren, bzw. ist der im Debian-minimal nicht installiert. Man ändert dann

/etc/default/pure-ftpd-common
 STANDALONE_OR_INETD=inetd

auf

 STANDALONE_OR_INETD=standalone

Startet man dann /etc/init.d/pure-ftpd-mysql sollte dieser als Daemon gestartet werden und auf port 21 lauschen (netstat -plaunt), wenn nicht

less /var/log/syslog

Virtuelle User

Nutzt man das ganze mit suexec/php will man das folgende nicht, da es ziemlich wichtig ist das man seperate User hat.

Es wird niemand gezwungen unterschiedliche UIDs für die User zu nehmen. Für ein virtuelles Setup geht man (vermutlich -selbst nicht getestet) so vor:

adduser ftpuser
mkdir /var/ftp
chown ftpuser:ftpuser /var/ftp

Man liest die UID/GID aus /etc/passwd bzw. /etc/group und legt neue User mit dieser UID/GID an und setzt ihr homedir auf /var/ftp/user1 oder /var/www/user2

Beim ersten einloggen werden die Userverzeichnisse erstellt und die User dort hinein chrootet. (Ungetestet mit bitte um Feedback)

ggf muß man in /etc/default/pure-ftpd-common noch virtualchroot auf yes setzen.



© 2014. Hetzner Online AG. Alle Rechte vorbehalten.