server:pure-ftpd

Pure-ftpd

Vorteil: sperrt standardmäßig User ein (chroot)

  • Gruppe und Benutzer für FTP-User anlegen:
    groupadd ftpgroup
      useradd -g ftpgroup -d /dev/null -s /usr/bin/false ftpuser
  • Verzeichnis für FTP-User anlegen:
    mkdir -p /srv/ftp
      chown ftpuser:ftpgroup /srv/ftp

Das Handbuch (man pure-pw) zeigt eine Menge Optionen:

NAME
       pure-pw - Manage virtual users files for Pure-FTPd

SYNTAX
       pure-pw useradd login [-f passwd_file] [-F puredb_file] -u uid [-g gid]
                       -D/-d home_directory [-c gecos]
                       [-t download_bandwidth] [-T upload_bandwidth]
                       [-n max number_of_files] [-N max_Mbytes]
                       [-q upload_ratio] [-Q download_ratio]
                       [-r <allow client host>/<mask>[,<ip>/<mask>]...] [-R <deny client host>/<mask>[,<ip>/<mask>]...]
                       [-i <allow local host>/<mask>[,<ip>/<mask>]...] [-I <deny local host>/<mask>[,<ip>/<mask>]...]
                       [-y <max number of concurrent sessions>]
                       [-z <hhmm>-<hhmm>] [-m]
       pure-pw usermod login [-f passwd_file] [-F puredb_file] [-u uid] [-g gid]
                       -D/-d home_directory -[c gecos]
                       [-t download_bandwidth] [-T upload_bandwidth]
                       [-n max_number_of_files] [-N max_Mbytes]
                       [-q upload_ratio] [-Q download_ratio]
                       [-r <allow client host>/<mask>[,<ip>/<mask>]...] [-R <deny client host>/<mask>[,<ip>/<mask>]...]
                       [-i <allow local host>/<mask>[,<ip>/<mask>]...] [-I <deny local host>/<mask>[,<ip>/<mask>]...]
                       [-y <max number of concurrent sessions>]
                       [-z <hhmm>-<hhmm>] [-m]
       pure-pw userdel login [-f passwd_file] [-F puredb_file] [-m]
       pure-pw passwd  login [-f passwd_file] [-F puredb_file] [-m]
       pure-pw show    login [-f passwd_file] [-m]
       pure-pw mkdb    [<puredb_database_file> [-f passwd_file]] [-F puredb_file]
       pure-pw list    [-f passwd_file]

Die Optionen werden (etwas ungewöhlich) durch ein wrapper-Script geparst: /usr/sbin/pure-ftpd-wrapper, siehe man-page:

man pure-ftpd-wrapper

Benutzerdatenbank aktivieren

Die unterstützten Mechanismen sind in /etc/pure-ftpd/auth per Symlink aktiviert. Standardmäßig sind unix und PAM aktiviert

65unix -> ../conf/UnixAuthentication
70pam -> ../conf/PAMAuthentication

Soll pure-ftpd lediglich mit der pureDB laufen, dann müssen diese Symlinks gelöscht werden und ein neuer Symlink mit Ziel auf ../conf/PureDB angelegt werden (ln -s ../conf/PureDB). In dieser Datei steht dann der Ort der PureDB (standardmäßig: /etc/pure-ftpd/pureftpd.pdb).

Benutzer auflisten

pure-pw list [USER]

FTP-Benutzer hinzufügen

  1. Heimatverzeichnis des neuen Benutzer erzeugen (kann auch automatisch erfolgen wenn CreateHomeDir=yes gesetzt ist):
    mkdir -p /srv/ftp/USER
    chgrp ftpgroup /srv/ftp/USER
  2. Benutzer zur pure-ftpd-Datenbank hinzufügen:
    pure-pw useradd USER -u ftpuser -d /srv/ftp/USER

Ein komplexeres Beispiel: Der Benutzer Adam mit der Benutzer-ID „AdamBinIch“ und der Gruppe „Mensch“ mit dem Homeverzeichnis /srv/www/Adam anzulegen:

pure-pw useradd Adam -u AdamBinIch -g Mensch -d /srv/www/Adam

Neue Benutzer lassen sich auch über Script hinzufügen: die doppelte Bestätigung von pure-pw lässt sich mit einer Datei steuern die zwei mal das Passwort enthält.

Beispiel: Die Datei Passwortdatei „Passwort.txt“ enthält 2x das Passwort:

geheimes Passwort
geheimes Passwort

nun leiten wir die Datein auf die Standardeingabe (stdin) von pure-pw:

pure-pw useradd Adam -u AdamBinIch -g Mensch -d /srv/www/Adam < Passwort.txt 

FTP-Benutzer entfernen

pure-pw userdel BENUTZER
pure-pw mkdb

FTP-Benutzer - Passwort ändern

pure-pw passwd BENUTZER
pure-pw mkdb

Benutzer-Datenbank aktualisieren

:!: Nach jeder Änderung muss IMMER dieser Befehl ausgeführt werden (vorher werden keine Änderungen aktiv):

pure-pw mkdb

Zwischen standalone oder daemon wechseln (Debian/Ubuntu):

dpkg-reconfigure pure-ftpd-common

manueller Start:

/usr/sbin/pure-ftpd -A -B -i -s -l puredb:/etc/pure-ftpd/pureftpd.pdb -u 1000 -O clf:/var/log/pure-ftpd/transfer.log
Parameter Wirkung
-u [UID] login nicht unter UID (Zahlenwert) erlauben
-c [Zahl] max. clients, Standard ist 50
-C [Zahl] max. connections per ip
-A chroot everyone but root
-B start in background (daemonize)
-k percentage → Disallow upload if the partition is more than percentage full
-w Enable support for the FXP protocol (for non-anonymous users only)
-E Only allow authenticated login. Anonymous users are prohibited.
-Y 1 SSL aktiviert, pem-Datei wird als /etc/ssl/private/pure-ftpd.pem erwartet.

FIXME (Übersetzung)

  • -e → Only allow anonymous users to log in. leave out if usual users should login
  • -i → Disallow upload for anonymous users
  • -s → Don't allow anonymous users to retrieve files owned by „ftp“ (other anonymous users)

Anonymous users are authenticated in any of three ways:

  1. The user logs in as „ftp“ or „anonymous“ and there is an account called „ftp“ with an existing home directory. This server does not ask anonymous users for an email address or other password.
  2. The user connects to an IP address which resolves to the name of a directory in /etc/pure-ftpd (or a symlink in that directory to a real directory), and there is an account called „ftp“ (which does not need to have a valid home directory). Ftpd does a chroot(2) to the relevant base directory when an anonymous user logs in.

Note that ftpd allows remote users to log in as root if the password is known and -u not used.

  1. Zertifikat und Schlüssel in einer .pem-Datei nach /etc/ssl/private/pure-ftpd.pem kopieren
  2. echo 1 > /etc/pure-ftpd/conf/TLS
  3. /etc/init.d/pure-ftpd restart (Bei den Startparametern sollte -Y 1 stehen)

Mit -Y 2 oder -Y 3 kann man TLS durchdrücken, siehe README.TLS

Zumindest auf Debian ist es möglich per Textdateien die Startparameter von pure-ftpd zu beeinflussen. Die Konfigurationsdateien liegen unterhalb /etc/pure-ftpd/ im „conf“ und „auth“ Ordnern.

Das Perl-Skript /usr/sbin/pure-ftpd-wrapper kümmert sich um die Auswertung, hier finden sie auch mögliche Dateinamen. Z. B. legt man /etc/pure-ftpd/conf/TLS mit dem Inhalt „1“ an, daraus macht der Wrapper „-Y 1“. Einige Parameter heißen auch anders (z. B. MaxDiskUsage) deshalb kann man im Skript selber nachschauen was alles ausgewertet wird.

In /etc/pure-ftpd/conf/ können dies bei Debian Lenny folgende Namen sein (nach dem Pfeil sieht das den wirklichen Parameter, mögliche Werte finden sich in man pure-ftpd):

AllowAnonymousFXP' => ['-W'],
AllowDotFiles' => ['-z'],
AllowUserFXP' => ['-w'],
AltLog' => ['-O %s', \&parse_string],
AnonymousBandwidth' => ['-t %s', \&parse_number_1_2],
AnonymousCanCreateDirs' => ['-M'],
AnonymousCantUpload' => ['-i'],
AnonymousOnly', => ['-e'],
AnonymousRatio' => ['-q %d:%d', \&parse_number_2],
AntiWarez' => ['-s'],
AutoRename' => ['-r'],
Bind' => ['-S %s', \&parse_string],
BrokenClientsCompatibility' => ['-b'],
CallUploadScript' => ['-o'],
ChrootEveryone' => ['-A'],
CreateHomeDir' => ['-j'],
CustomerProof' => ['-Z'],
Daemonize' => ['-B'],
DisplayDotFiles' => ['-D'],
DontResolve' => ['-H'],
ForcePassiveIP' => ['-P %s', \&parse_string],
FortunesFile' => ['-F %s', \&parse_filename],
IPV4Only' => ['-4'],
IPV6Only' => ['-6'],
KeepAllFiles' => ['-K'],
LimitRecursion' => ['-L %d:%d', \&parse_number_2],
LogPID' => ['-1'],
MaxClientsNumber' => ['-c %d', \&parse_number_1],
MaxClientsPerIP' => ['-C %d', \&parse_number_1],
MaxDiskUsage' => ['-k %d', \&parse_number_1],
MaxIdleTime' => ['-I %d', \&parse_number_1],
MaxLoad' => ['-m %d', \&parse_number_1],
MinUID' => ['-u %d', \&parse_number_1],
NATmode' => ['-N'],
NoAnonymous' => ['-E'],
NoChmod' => ['-R'],
NoRename' => ['-G'],
NoTruncate' => ['-0'],
PassivePortRange' => ['-p %d:%d', \&parse_number_2],
PerUserLimits' => ['-y %d:%d', \&parse_number_2],
ProhibitDotFilesRead' => ['-X'],
ProhibitDotFilesWrite' => ['-x'],
Quota' => ['-n %d:%d', \&parse_number_2],
SyslogFacility' => ['-f %s', \&parse_word, 99],
TLS' => ['-Y %d', \&parse_number_1],
TrustedGID' => ['-a %d', \&parse_number_1],
TrustedIP' => ['-V %s', \&parse_ip],
Umask' => ['-U %s:%s', \&parse_umask],
UserBandwidth' => ['-T %s', \&parse_number_1_2],
UserRatio' => ['-Q %d:%d', \&parse_number_2],
 ' => ['-d'],

Auf einem virtuellen Server mit OpenVZ oder virtuozzo scheitert der Start von pure-ftpd mit folgender Fehlermeldung:

pure-ftpd: (?@?) [ERROR] Unable to switch capabilities : Operation not permitted

Um das Problem zu lösen muss pure-ftpd ohne capabilities kompiliert werden.

Vorbereitungen: dpkg-dev muss installiert sein (aptitude install dpkg-dev).

  1. mkdir tmp
  2. cd tmp
  3. Source-Paket mit folgendem Befehl herunterladen:
    apt-get source pure-ftpd
  4. cd /pureftpd-1.0.21/debian
  5. nano rules
  6. die Zeile beginnend mit „optflags“ suchen und hinten „--without-capabilities“ dranhängen:
    optflags=--with-everything --with-largefile --with-pam --with-privsep --with-tls --without-capabilities
  7. abspeichern („STRG-X“ und „J“)
  8. cd ..
  9. Das Paket muss neu gebaut werden:
    dpkg-buildpackage
    1. den folgenden Fehler
      sh: dpkg-source: command not found
      Entpack-Befehl »dpkg-source -x pure-ftpd_1.0.21-11.4.dsc« fehlgeschlagen.
      Überprüfen Sie, ob das Paket »dpkg-dev« installiert ist.

      lässt sich schnell durch die Installation von dpkg-dev beheben:

      aptitude install dpkg-dev
    2. Falls gleich eine Fehlermeldung wegen fehlender Abhängigkeiten kommt:
      dpkg-checkbuilddeps: Nicht erfüllte Bauabhängigkeiten: debhelper (>= 4.1.16) libpam-dev libcap-dev libldap2-dev libmysqlclient-dev | libmysqlclient15-dev libpq-dev libssl-dev po-debconf

      also alle diese Pakete nachinstallieren (Liste sortiert):

      aptitude install debhelper libcap-dev libldap2-dev libmysqlclient15-dev libpam-dev libpq-dev libssl-dev po-debconf
  10. erneut dpkg-buildpackage aufrufen
  11. cd ..
  12. Nun können wir das Paket Installieren (Dateinamen können anders lauten!):
    dpkg -i pure-ftpd_1.0.21-11.4_i386.deb pure-ftpd-common_1.0.21-11.4_all.deb
  13. pure-ftpd starten:
    /etc/init.d/pure-ftpd start