28.
Januar
2010
Es ist schon ein wenig her das ich einen FTP-Server unter
Linux neu einrichten musste. Meine alte Anleitung zum
pure-ftpd(stammt aus dem Jahr 2002) hat mir stets
gute Dienste erwiesen.
Per Zufall bin ich heute auf das grafische Tool für den
pure-ftpd gestoßen: PureAdmin und wenige Minuten später
auch auf ein häufig beschriebenes Problem: Es
funktioniert nicht. ![]()
Halt, Stopp! Bevor sich jemand schon nach dem Lesen
dieser paar ersten Zeilen abschrecken lässt: Es geht noch
weiter auf dieser Seite und ich habe für all jene, welche
eine Suchmaschine auf der Suche nach einer Lösung für ihr
Problem mit PureAdmin hierher geführt hat, eventuell auch
eine Lösung parat.
Zunächst jedoch als ersten Eindruck die grafische
Oberfläche von PureAdmin in der Version 0.4:

Herausragendes Merkmal von PureAdmin ist meiner Meinung
nach die wirklich gut gelungene grafische Administration
der virtuellen Benutzer, welche sich einfach ohne großen
Aufwand mit der von pure-ftpd selbst verwalteten
Userdatenbank für virtuelle Benutzer realisieren
lässt.
PureAdmin setzt dort an, wo es vielen an der Konsole zu
mühsam wurde: Einfach und intuitiv zu bedienen und
obendrein auch noch zuverlässig (das Bild anklicken um es
in voller Größe betrachten zu können):
Nun jedoch zum Problem, welches ich nach den anfänglich
positiven Eindrücken von PureAdmin entdecken
musste.
Was noch funktioniert ist das bequeme (und fehlerfreie)
Anlegen von neuen virtuellen Benutzern per GUI. Man kann
auch per Mausklick einfach den Server beenden und neu
starten.
Jedoch erhält man (unter Ubuntu und Linux Mint) stets die
selbe Fehlermeldung im Log von pure-ftpd beim Versuch
sich einzuloggen:
[INFO] PAM_RHOST enabled. Getting the peer address [WARNING] Authentication failed for user [USERNAME]
Normalerweise schreibt man sein Fazit nachdem man etwas
bewiesen oder widerlegt hat. Ich ziehe jedoch das Fazit
vor, denn den (Leidens)Weg, welchen ich mit PureAdmin
hatte, sollte man sich eigentlich nur noch durchlesen um
zu verstehen wie ich zu meinem Fazit gelangt bin.
Für mich stellt PureAdmin lediglich ein nützliches Tool
in Form einer GUI für die virtuellen Benutzer dar. Die
Administration der Benutzer ist einfach, intuitiv und vor
allem für Neulinge, welche einfach nur einen FTP-Server
unter Linux aufsetzen wollen hervorragend
gestaltet.
Aber das war's dann auch schon.
Was PureAdmin meiner Meinung nach fehlt ist eine
ausführliche Dokumentation wo und wie pure-ftpd durch
PureAdmin angesprochen wird. Es fehlt sowohl auf der
Website wie auch direkt in der Hilfe des Programms
(welche lediglich aus zwei Links zur nicht wirklich
informativen Website besteht) meiner Meinung nach von
vorne bis hinten an Informationen. Kein Wunder also das
Benutzer, welche eine einfach zu bedienende GUI erwarten,
bitter enttäuscht und schnell frustriert sind.
Insbesondere dann, wenn das Programm nicht unter dem
sonst einfach zu bedienenden Ubuntu (oder in meinem Fall
Linux Mint) so funktioniert, wie man es sich
wünscht.
Wie pure-ftpd funktioniert (Konfiguration über eine Zeile
beziehungsweise den Programmaufruf) bekommt der Neuling
für den Server leider nicht erklärt und selbst mir als
»alten Hasen« was es pure-ftpd anbelangt bleibt die Hilfe
die Antwort auf die Frage schuldig »Wo zur Hölle findet
eigentlich die Konfiguration statt und wie kann ich sie
meinen Wünschen nach anpassen?«
Wer sich mit einem einfachen FTP-Server mit eigentlich
hervorragender Verwaltung der virtuellen Benutzer
beschäftigen möchte, kann mit PureAdmin einfach und
bequem diese Benutzer anlegen.
Die weitere Konfiguration samt Programmaufruf sollte
zunächst »klassisch« vorgenommen werden. Wer die Schalter
versteht, wird auch die beiden eigentlich simplen und
leider sehr fatalen Fehler der Standardkonfiguration
schnell gefunden haben.
Zunächst einmal fehlt im Standardpaket für Ubuntu der
Aufruf für die Authentifizierung der virtuellen Benutzer.
Diese kann mittels dieses Einzeilers eingefügt werden:
sudo ln -s /etc/pure-ftpd/conf/PureDB /etc/pure-ftpd/auth/45puredb
Weiterhin ein Fehler in der Konfiguration: Der verwendete
Wert für MinUID steht auf 1000 statt
auf 100.
Dies ist einfach durch eine Korrektur in der Datei
/etc/pure-ftpd/conf/MinUID zu beheben:
sudo su - echo "100" > /etc/pure-ftpd/conf/MinUID exit
Mit dem Hintergrundwissen, wie die Konfiguration des
Servers abläuft, konnte ich die Probleme relativ schnell
finden und lösen.
Durch die vermeindliche »Hilfestellung« in Form von
Postings im Internet wurde ich erst einmal völlig in die
Irre geführt. Daher an dieser Stelle wie ich letztenendes
zur Lösung gekommen bin (und dem Lesen vom »Leidensweg«
ein letztes Mal vorweg greife):
Mit pureadmin wird die GUI gestartet, welche
ihrerseits wieder auf das Script
/etc/init.d/pure-ftpd zurückgreift. Natürlich
kann man auch ohne pureadmin direkt das Script
aufrufen. Man erhält in diesem Fall eine kurze
Statusmeldung in Form des Aufrufs von pure-ftpd
samt der Switches. Als Beispiel (mit dem fehlerhaften
Wert für die UID-Sperre):
/etc/init.d/pure-ftpd restart Restarting ftp server: Running: /usr/sbin/pure-ftpd -l puredb:/etc/pure-ftpd/pureftpd.pdb -O clf:/var/log/pure-ftpd/transfer.log -B -8 UTF-8 -A -u 1000
Anhand der in der manpage dokumentierten Switches kann
man nun den Aufruf überprüfen und durch entsprechende
Kommentare im Konfigurationsverzeichnis Einfluss nehmen.
Mehr dazu am Ende des »Leidenswegs«... Sofern das alles
jemand überhaupt lesen möchte.
Irritierend war für mich, dass ich lediglich eine einzige Fehlermeldung im Log als Ausgangsbasis zur Problemlösung hatte:
[INFO] PAM_RHOST enabled. Getting the peer address
Wieso eine PAM-Authentifizierung, wenn es eigentlich
schlicht und ergreifend in die Datenbank mit den
virtuellen Benutzern gehen soll? Genau diese wird doch
von PureAdmin angelegt?
Mein erster Versuch führte prompt zum Erfolg: Ich habe
per PureAdmin den Server beendet und per Hand von der
Konsole aus neu gestartet – ohne PAM:
sudo pure-ftpd -j -l puredb:/etc/pure-ftpd/pureftpd.pdb
Verwendet wurde somit die von PureAdmin angelegte
Datenbank für die virtuellen Benutzer. Der erste Test
verlief erfolgreich. Ohne PAM war sofort das Einloggen
mit dem unter PureAdmin gerade erst frisch erstellten
virtuellen Benutzer möglich.
Mein erster Verdacht fiel also darauf, dass ich irgendwie
den Aufruf der PAM-Authentifizierung eliminieren muss.
Die Konfiguration vom pure-ftpd wird normalerweise mit
einem einzeiligen Aufruf erledigt. Durch die Übergabe von
Optionen in Form von »Switches« wird der Server
konfiguriert. Bei der Verwendung von PureAdmin wird auf
eine Art Konfigurationsverzeichnis mit Textdateien
zurückgegriffen. Unter /etc/pure-ftpd/conf
befinden sich mehrere Dateien:
-rw-r--r-- 1 root root 36 2009-05-07 00:04 AltLog -rw-r--r-- 1 root root 6 2009-05-07 00:04 FSCharset -rw-r--r-- 1 root root 5 2009-05-07 00:04 MinUID -rw-r--r-- 1 root root 4 2009-05-07 00:04 NoAnonymous -rw-r--r-- 1 root root 3 2010-01-28 21:35 PAMAuthentication -rw-r--r-- 1 root root 28 2009-05-07 00:04 PureDB -rw-r--r-- 1 root root 3 2009-05-07 00:04 UnixAuthentication
In der Datei PAMAuthentication ist der Wert
yes hinterlegt. Eigentlich sollte man davon
ausgehen, das ein Ändern dieses Wertes in no
nach einem Neustart des Servers zur Folge hat, dass
dieser ohne PAM-Authentifizierung gestartet wird.
Insbesondere dann, wenn sich in der Datei PureDB
der korrekte Pfad zur eigenen Datenbank für virtuelle
Benutzer des pureftpd befindet.
Ein Blick in die Logdatei gibt aber klar zu erkennen,
dass die PAM-Abfrage weiterhin stattfindet. Warum
nur?
Die Suche nach Problemlösungen im Internet lockte mich
wie bereits erwähnt zunächst in eine völlig falsche
Richtung. Ich bin auf ein paar Anleitungen gestoßen,
welche das Problem beheben wollten. Jedoch war es eher
ein herumprobieren von ein paar Beteiligten ohne zu
erwähnen, welche Distribution bei ihnen überhaupt zum
Einsatz kommt.
Die Antwort weshalb die PAM-Fehlermeldung erscheint ist
sehr simpel: Die Authentifizierung über die Datenbank von
Systembenutzern ist von Haus aus deaktiviert. Übergibt
man pure-ftpd beim Start keine andere Möglichkeit, so
versucht er es mit der PAM-Authentifizierung. Diese
schlägt natürlich dann fehl wenn überhaupt nichts
dementsprechend konfiguriert wurde.
Selbst nach dem (in einigen Threads vorgegebenen) Löschen
der Datei wird pure-ftpd von beim Starten von PureAdmin
mit der Option PAM-Authentifizierung gestartet.
Aufgrund meiner geringfügigen Erfahrung mit einem
SuSE-System und der dort verwendeten Konfigurationsdatei
hatte ich fälschlicherweise angenommen, in
/etc/pure-ftpd/conf würden sich alle relevanten
Dateien befinden und der Reihe nach abgearbeitet werden.
Dies ist jedoch nicht der Fall. Der Aufruf der
Authentifizierungsmethode erfolgt über das Verzeichnis
/etc/pure-ftpd/auth beziehungsweise der sich
darin befindenden Symlinks.
Nachdem ich dies entdeckt hatte (wirklich entdeckt, denn
dokumentiert ist nichts), habe ich mittels dem Aufruf
ls -la mir die Symlinks an der Konsole
ausgeben lassen:
70pam -> ../conf/PAMAuthentication
Nach kurzem Nachdenken fiel mir auf, dass im Verzeichnis gar kein Symlink für den Aufruf der Informationen zur Datenbank in der Datei ../conf/PureDb existiert. Durch das Hinzufügen eines entsprechenden Symlinks war der erste Fehler in der Konfiguration behoben:
sudo ln -s /etc/pure-ftpd/conf/PureDB /etc/pure-ftpd/auth/45puredb
Und siehe da, schon ist die Fehlermeldung bezüglich der PAM-Authentifizierung verschwunden. Ich konnte mich mit dem zuvor angelegten virtuellen Benutzer schon ein wenig weiter anmelden. Jedoch erhielt ich nun die nächste Fehlermeldung im Fenster meines FTP-Clients:
530 Sorry, but I can't trust you
Die Logdatei vom pure-ftpd vermerkte:
[WARNING] Can't login as [USERNAME]: account disabled
Mir war klar, dass die Fehlermeldung damit zu tun hat,
dass der Benutzer durch pure-ftpd aufgrund seiner UID
nicht zugelassen wird. Beim ersten Blick in die
/etc/pure-ftpd/conf/MinUID konnte ich jedoch
keinen Fehler entdecken. Mit einer UID über 1000 ist doch
eigentlich alles in Ordnung?
Eigentlich ja – würde PureAdmin nicht einfach die
nächstliegenden UID und GID für ftpuser und ftpgroup ab
100 verwenden. So hatte ich die Werte 112
(ftpuser) und 116 (ftpgroup) auf meinem System –
dank PureAdmin. Das beide Werte offensichtlich unter 1000
liegen, brauche ich wohl nicht extra zu betonen. ![]()
Daher habe ich umgehend den entsprechenden Wert
angepasst:
sudo su - echo "100" > /etc/pure-ftpd/conf/MinUID exit
Erst nachdem ich diese Änderung vorgenommen habe und mittels Google nach »PureAdmin MinUID« gesucht habe, wurde ich darauf aufmerksam gemacht, dass ich zum Debuggen auch »einfach« den von PureAdmin verwenden Aufruf eines Skripts hätte verwenden können – /etc/init.d/pure-ftpd:
Usage: /etc/init.d/pure-ftpd {start|stop|restart|force-reload|status}
Anschließend konnte ich recht zügig die Konfiguration meinen Wünschen nach anpassen und hatte sowohl funktionierende virtuelle Benutzer wie auch einen begrenzten maximalen Upload – eben meine gewünschte Standardkonfiguration.
In einem Forum bin ich auf eine mutmaßlich vollständige Liste der zu interpretierenden Einträge im Konfigurationsverzeichnis gestoßen:
'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'],
'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],
'VerboseLog' => ['-d'],
'FsCharset' => ['-8 %s', \&parse_string],
'ClientCharset' => ['-9 %s', \&parse_string],
);
my %authconf = ('ExtAuth' => ['extauth:%s', \&parse_sockname],
'LDAPConfigFile' => ['ldap:%s', \&parse_filename, 0,
'ldap'],
'MySQLConfigFile' => ['mysql:%s', \&parse_filename, 0,
'mysql'],
'PGSQLConfigFile' => ['pgsql:%s', \&parse_filename, 0,
'postgresql'],
'PAMAuthentication' => ['pam'],
'PureDB' => ['puredb:%s', \&parse_filename],
'UnixAuthentication' => ['unix'],
);
Mein bereits aus meiner alten Dokumentation von 2002 bekannter Aufruf sieht wie folgt aus:
pure-ftpd -B -A -E -j -k 80 -l puredb:/etc/pureftpd.pdb
Wenn die Angaben stimmen, müsste ich folgende Werte verwenden:
/etc/pure-ftpd/conf/Daemonize yes /etc/pure-ftpd/conf/ChrootEveryone yes /etc/pure-ftpd/conf/NoAnonymous yes /etc/pure-ftpd/conf/CreateHomeDir yes /etc/pure-ftpd/conf/MaxDiskUsage 80
Der Aufruf der Authentifizierungsvariante ist
seltsamerweise nicht über -l gelöst worden,
sondern separat. Dafür wurde der Switch -l für
LogPID verwendet, welches nicht der
Dokumentation gemäß der manpage von pure-ftpd entspricht.
Dies sei jedoch nur sicherheitshalber am Rande
erwähnt.
Der erste (von mir herausgesuchte) Eintrag ist prompt
überflüssig gewesen, denn »Daemonize« ist immer schon im
Aufruf durch das Script enthalten. Überprüft werden kann
die selbst angepasste Konfiguration über den bereits
erwähnten Skriptaufruf von
/etc/init.d/pure-ftpd.
Das Script gibt auch Fehlermeldungen im Falle eines
falschen beziehungsweise nicht kompatiblen Wertes in den
Textdateien aus.
Abschließend zum heitigen Tage ein weiteres Problem, über
welches mancher stolpern könnte: Wenn der Nutzer vom
FTP-Service keinen vernünftigen FTP-Client sondern den
(unsäglichen) Windows Explorer aus Faulheit verwenden
möchte, wird er unter Umständen niemals eine Verbindung
erhalten.
Nachdem der mit PureAdmin nun endlich funktionierende
pure-ftpd von mir lokal getestet und für gut befunden
wurde, sollte ein Bekannter Bilder auf eine Freigabe
hochladen. Jedoch meldete er mir über ICQ zurück, der
Server sei nicht erreichbar.
Dies passiert nicht nur beim Einsatz vom Windows
Explorer, sondern auch bei manchen Browsern. Lediglich
Opera meldete mir beim Test über localhost artig zurück,
was ihm der FTP-Server meldet:
530 Login authentication failed
Beziehungsweise was Opera ausgibt:
421 Unable to set up secure anonymous FTP
Die Browser haben die unangenehme Eigenart, nicht nach
Benutzername und Passwort zu fragen bevor sie eine
Verbindung mit dem Server aufnehmen wollen. Sie ergänzen
für die bequemen Nutzer einfach anonymous:WERT
und versuchen sich anonym einzuloggen. Dies mag es bei
den meisten FTP-Servern vereinfachen, da diese für einen
Zugang per Anonymous konfiguriert sind.
Ist der Zugriff per Anonymous untersagt (so wie bei
meinem pure-ftpd), so wird die Fehlermeldung 421
zurückgegeben. Der werte Explorer meldet jedoch nicht die
Rückgabe dem Benutzer weiter, sondern behauptet
lediglich, es könne keine FTP-Verbindung erstellt
werden.
Die Fehlermeldung ist sicherlich nicht verkehrt, aber
eben nicht ausführlich genug. Anstatt zu erfahren, dass
kein Zugriff per Anonymous möglich ist, schließt der
Anwender aus dem Verhalten des Browsers, dass gar keine
Verbindung hergestellt werden konnte.
Wie oben schon erwähnt, gibt Opera (in meinem Fall
Version 10.10) die Meldung des FTP-Servers aus. Firefox
(Version 3.6) meldet sich übrigens mit der Eingabemaske
für Benutzername und Kennwort.
Erfolgt der Aufruf im Explorer über
ftp://username@hostname, schließt sich die
Aufforderung das Passwort einzugeben an.
X_FISH
Das Generieren dieser Seite dauerte genau 3.15272 Sekunden.