FTP Server einrichten mit MySQL

Admin

=Installation MySQL=

Wir möchten den MySQL Server installieren und mit dem System starten lassen.

zypper in mysql chkconfig -a mysql chkconfig mysql on

Erstelle ein Passwort für den MySQL Benutzer root (ersetze yourrootsqlpassword mit dem Passwort, das Du verwenden möchtest):

mysqladmin -u root password yourrootsqlpassword mysqladmin -h server1.example.com -u root password yourrootsqlpassword

=Installation von Pure-FTPd mit MySQL Unterstützung=

SuSEs PureFTPd Paket unterstützt zahlreiche Backends, wie zum Beispiel MySQL, PostgreSQL, LDAP, etc. Daher brauchen wir lediglich das normale PureFTPd Paket installieren:

zypper in pure-ftpd

Dann erstellen wir eine ftp Gruppe (ftpgroup) und einen Benutzer (ftpuser), mit dem alle unsere virtuellen Benutzer verknüpft werden. Ersetze die Gruppen- und BenutzerID 2001 mit einer Nummer, die auf Deinem System frei ist:

groupadd -g 2001 ftpgroup useradd -u 2001 -s /bin/false -d /bin/null -c “pureftpd user” -g ftpgroup ftpuser

=Erstelle die MySQL Datenbank für PureFTPd=

Nun erstellen wir eine Datenbank mit der Bezeichnung pureftpd und einem MySQL Benuzter mit der Bezeichnung pureftpd den der PureFTPd Daemon später verwenden wird, um sich mit der pureftpd Datenbank in Verbindung zu setzen:

mysql -u root -p

CREATE DATABASE pureftpd; GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON pureftpd.* TO 'pureftpd'@'localhost' IDENTIFIED BY 'ftpdpass'; GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON pureftpd.* TO 'pureftpd'@'localhost.localdomain' IDENTIFIED BY 'ftpdpass'; FLUSH PRIVILEGES;

Ersetze die Zeichenfolge ftpdpass mit dem Passwort, das Du für den MySQL Benutzer pureftpd verwenden möchtest. Immer noch in der MySQL Kommandozeile, erstellen wir die benötigte Datenbanktabelle (ja, es gibt nur eine Tabelle!):

USE pureftpd;

CREATE TABLE ftpd ( User varchar(16) NOT NULL default , status enum('0','1') NOT NULL default '0', Password varchar(64) NOT NULL default , Uid varchar(11) NOT NULL default '-1', Gid varchar(11) NOT NULL default '-1', Dir varchar(128) NOT NULL default '', ULBandwidth smallint(5) NOT NULL default '0', DLBandwidth smallint(5) NOT NULL default '0', comment tinytext NOT NULL, ipaccess varchar(15) NOT NULL default '*', QuotaSize smallint(5) NOT NULL default '0', QuotaFiles int(11) NOT NULL default 0, PRIMARY KEY (User), UNIQUE KEY User (User) ) TYPE=MyISAM;

quit;

=Konfiguration von PureFTPd=

Bearbeite /etc/pure-ftpd/pure-ftpd.conf und vergewissere Dich, dass die ChrootEveryone, MySQLConfigFile und CreateHomeDir Zeilen aktiviert sind und wie folgt aussehen:

ChrootEveryone             yes BrokenClientsCompatibility no MaxClientsNumber            10 Daemonize                  yes MaxClientsPerIP            3 VerboseLog                 no AllowDotFiles               yes DisplayDotFiles            yes AnonymousOnly              no NoAnonymous                 yes SyslogFacility             ftp DontResolve                yes MaxIdleTime                15 MySQLConfigFile              /etc/pure-ftpd/pureftpd-mysql.conf LimitRecursion             2000 8 AnonymousCanCreateDirs     no MaxLoad                     4 PassivePortRange               30000 30100 AntiWarez                  yes Umask                      177:077 MinUID                     40 AllowUserFXP               no AllowAnonymousFXP           no ProhibitDotFilesWrite       yes ProhibitDotFilesRead       no AutoRename                  yes AnonymousCantUpload        yes CreateHomeDir              yes MaxDiskUsage              99 NoRename                 yes CustomerProof             yes

Mit der ChrootEveryone Eingtellung wird jeder virtuelle Benutzer von PureFTPd in sein Home Verzeichnis gechrootet und ist nicht mehr in der Lage, Verzeichnisse und Datein außerhalb seines Verzeichnissen zu durchsuchen. Die CreateHomeDir Zeile bewirkt, dass PureFTPd ein neues Benutzer- Home Verzeichnis erstellt, wenn sich der Benutzer einloggt und das Home Verzeichnis noch nicht vorhanden ist.

Dann erstellen wir /etc/pure-ftpd/pureftpd-mysql.conf. So sollte es aussehen:

MYSQLSocket     /var/run/mysql/mysql.sock MYSQLServer    localhost MYSQLPort      3306 MYSQLUser      pureftpd MYSQLPassword  ftpdpass MYSQLDatabase  pureftpd MYSQLCrypt     md5 MYSQLGetPW     SELECT Password FROM ftpd WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R") MYSQLGetUID    SELECT Uid FROM ftpd WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R") MYSQLGetGID    SELECT Gid FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R") MYSQLGetDir    SELECT Dir FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R") MySQLGetBandwidthUL SELECT ULBandwidth FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R") MySQLGetBandwidthDL SELECT DLBandwidth FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R") MySQLGetQTASZ  SELECT QuotaSize FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R") MySQLGetQTAFS  SELECT QuotaFiles FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
 * 1) MYSQLCrypt md5, cleartext, crypt or password - md5 is VERY RECOMMENDABLE uppon cleartext

Pass auf, dass Du die Zeichenfolge ftpdpass mit dem richtigen Passwort für den MySQL Benutzer pureftpd in der MYSQLPassword Zeile ersetzt! Bitte beachte, dass wir die md5 as MYSQLCrypt Methode verwenden, was bedeutet, dass wir das Passwort des Benutzers als MD5 Zeichenfolge in der Datenbank ablegen, was weitaus sicherer ist als das Verwenden von einfachen Passwörtern!

Nun erstellen wir die System Startup Links für PureFTPd und starten es:

chkconfig -a pure-ftpd chkconfig pure-ftpd on rcpure-ftpd start

=Die Datenbank füllen und testen=

Um die Datenbank zu füllen, kannst Du die MySQL Kommandozeile verwenden:

mysql -u root -p

USE pureftpd;

Nun erstellen wir den Benutzer exampleuser mit dem Status 1 (was bedeutet, sein ftp Konto ist aktiv), das Passwort secret (das verschlüsselt mittels MySQL MD5 Funktion abgelegt wird), die BenutzerID und GruppenID 2001 (verwende die BenutzerID und GruppenID des Benutzers/der Gruppe, den Du am Ende von Schritt 2 angelegt hast!), das Home Verzeichnis /home/www.example.com, ein Upload und Download Bandbreite von 100 KB/sec. (Kilobytes pro Sekunde) und eine Quota von 50 MB:

INSERT INTO `ftpd` (`User`, `status`, `Password`, `Uid`, `Gid`, `Dir`, `ULBandwidth`, `DLBandwidth`, `comment`, `ipaccess`, `QuotaSize`, `QuotaFiles`) VALUES ('user', '1', MD5('userpassword'), '2001', '2001', '/home/ftp/user', '100000' quit;

Öffne nun auf Deinem Arbeitsplazt Dein FTP Client Programm (etwas wie WS_FTP oder SmartFTP wenn Du Dich auf einem Windows System befindest oder gFTP auf einem Linux Desktop) und versuche Dich zu verbinden. Als Hostname verwendest Du server1.example.com (oder die IP Adresse des Systems), der Benutzername ist exampleuser und das Passwort ist secret.

Wenn Du Dich verbinden kannst, dann Herzlichen Glückwunsch! Wenn nicht, ist etwas schief gelaufen.

Wenn Du nun Folgendes ausführst

ls -l /home/ftp/

solltest Du feststellen, dass das Verzeichnis /home/ftp/user (exampleusers Home Verzeichnis) automatisch erstellt wurde und dass es dem ftpuser und der ftpgroup (der Benutzer/die Gruppe, die wir am Ende von Schritt 2 angelegt haben) gehört:

[root@server1 ~]# ls -l /home/ftp/ total 4 drwxr-xr-x 2 ftpuser ftpgroup 4096 2007-07-04 01:50 user [root@server1 ~]#

User soll auf Webseite zugreifen können
Zuerst fügen wir den ftpuser der Gruppe www hinzu.

usermod -A www ftpuser

Nun fügen wir den User zur Datenbank hinzu.

INSERT INTO `ftpd` (`User`, `status`, `Password`, `Uid`, `Gid`, `Dir`, `ULBandwidth`, `DLBandwidth`, `comment`, `ipaccess`, `QuotaSize`, `QuotaFiles`) VALUES ('user', '1', MD5('userpassword'), '2001', 'GID von Gruppe www', '/home/www/', '100000', '100000', '', '*', '50', '0');

Nun sollte der User über seinen FTP-Client seine Daten hochladen können und seine Änderungen sollten im Browser sofort zu sehen sein, sofern der Apache richtig eingestellt ist.

Falls es noch Probleme gibt sollte der Owner des Verzeichnisses geprüft werden.

=Anonymes FTP Konto=

Wenn Du ein anonymes FTP Konto erstellen möchtest (ein FTP Konto, in das sich jeder ohne Passwort einloggen kann), dann brauchst Du einen Benutzer und ein Gruppe mit der Bezeichnung ftp. Beide wurden automatisch erstellt als Du das pure-ftpd Paket installiert hast, Du musst sie also nicht manuell erstellen. Jedoch ist ftps Homedir standardmäßig /var/ftp, ich möchte das anonyme FTP Verzeichnis aber in /home/ftp (die normalen FTP Verzeichnisse des Benutzers befinden sich auch in /home, z.B. /home/ftp/user) erstellen. Selbstverständlich kannst Du auch das /var/ftp Verzeichnis für anonyme FTP Konten verwenden, wenn Du dies bevorzugst.

Wenn Du /home/ftp verwenden möchtest, öffne /etc/passwd und ändere die Homedir des ftp Benutzers von /var/ftp zu /home/ftp (tu dies nicht, wenn Du /var/ftp verwenden möchtest):

vi /etc/passwd

[...] #ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin ftp:x:14:50:FTP User:/home/ftp:/sbin/nologin [...]

Verschiebe dann /var/ftp nach /home (tu dies nicht, wenn Du /var/ftp verwenden möchtest):

mv /var/ftp /home

Dann erstellen wir das Verzeichnis /home/ftp/incoming, was anonymen Benutzern erlaubt, Dateien hochzuladen. Wir geben dem Home Verzeichnis /home/ftp/incoming Berechtigungen von 311, damit Benutzer Hochladen, aber Dateien in diesem Verzeichnis nicht sehen oder hochladen können. Das /home/ftp Verzeichnis wird die Berechtigungen von 555 haben, wobei Datein runter geladen und gesehen werden können:

chown ftp:nobody /home/ftp cd /home/ftp mkdir incoming chown ftp:nobody incoming/ chmod 311 incoming/ cd ../ chmod 555 ftp/

(Wenn Du stattdessen /var/ftp verwenden möchtest, ersetze /home/ftp with /var/ftp in den obigen Befehlen.)

Anonyme Benutzer werden in der Lage sein, sich anzumelden und dürfen Dateien von /home/ftp runterladen, Uploads werden allerdings auf /home/ftp/incoming (und wenn eine Datei einmal nach /home/ftp/incoming hochgeladen wurde, kann sie von dort aus weder gelesen noch runter geladen werden; der Server Admin muss sie in /home/ftp setzen, um sie anderen zur Verfügung zu stellen) beschränkt.

Nun müssen wir PureFTPd für das anonyme FTP Konto konfigurieren. Öffne /etc/pure-ftpd/pure-ftpd.conf und vergewissere Dich, dass folgende Einstellungen darin enthalten sind:

vi /etc/pure-ftpd/pure-ftpd.conf

[...] NoAnonymous                no [...] AntiWarez                  no [...] AnonymousBandwidth           8 [...] AnonymousCantUpload        no [...]

(Die AnonymousBandwidth Einstellung ist optional - sie erlaubt Dir Upload und Download Bandbreiten für anonyme Benutzer zu begrenzen. 8 bedeutet 8 KB/sec. Verwende irgendeinen Wert oder kommentiere die Zeile aus, wenn Du keine Bandbreiten begrenzen möchtest.)

Schließlich starten wir PureFTPd neu:

/etc/init.d/pure-ftpd restart