ProFTPd mit mySQL-Anbindung auf Ubuntu einsetzen
ProFTPd ist einer der meistgenutzten FTP-Server auf Ubuntu-Systemen. Aus der Dose kann er jedoch nur mit Systembenutzern umgehen, was mitunter einen recht großen Pflegeaufwand mit sich bringt. Daher erfreut sich die MySQL-basierte Variante großer Beliebtheit. Noch einfacher in der Bedienung wird es, wenn man dem ProFTPd gleich die GID und UID des Webservers (meistens Apache2) übergibt, sodass die Dateirechte von Anfang an stimmen. Die Installation ist mit wenigen Schritten durchgeführt: Schritt 1: Die benötigten Pakete installieren
sudo apt-get install proftpd-basic proftpd-mod-mysql
Schritt 2: Apassungen in /etc/proftpd/proftpd.conf I.d.R. verlangt ProFTPd Systembenutzer, diese Abhängigkeit muss aufgelöst und ProFTPd der Umgang mit MySQL beigebracht werden. Dazu müssen die folgenden Zeilen in der mitgelieferten Konfiguration einkommentiert werden.
DefaultRoot ~ Include /etc/proftpd/sql.conf RequireValidShell off # SQLMinID legt die kleinste mögliche ID fest. Um ProFTPd mit dem Apache2 zu verknüpfen und dessen GID und UID meistens "33" lautete, muss dieser Wert # explizit definiert werden, Standard = 999. Ohne diesen Eintrag wären Uploads und Änderungen nicht möglich das sie zu Fehlern in der Berechtitigung führen würden und nur # über ein chmod 777 umgangen werden könnten SQLMinID 33
Schritt 3: Die Datenbank vorbereiten Man legt nun eine MySQL-Datenbank an, z.B. „proftpd“
CREATE DATABASE `proftp` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
In dieser Datenbank werden zwei Tabellen angelegt, eine für die Benutzergruppen, eine für die Benutzer selbst
CREATE TABLE IF NOT EXISTS `ftpgroup` ( `groupname` varchar(16) NOT NULL DEFAULT '', `gid` smallint(6) NOT NULL DEFAULT '33', `members` varchar(16) NOT NULL DEFAULT '', KEY `groupname` (`groupname`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='ProFTP Benutzergruppen';
CREATE TABLE IF NOT EXISTS `ftpuser` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `userid` varchar(32) NOT NULL DEFAULT '', `passwd` varchar(32) NOT NULL DEFAULT '', `uid` smallint(6) NOT NULL DEFAULT '33', `gid` smallint(6) NOT NULL DEFAULT '33', `homedir` varchar(255) NOT NULL DEFAULT '', `shell` varchar(16) NOT NULL DEFAULT '/sbin/nologin', `count` int(11) NOT NULL DEFAULT '0', `accessed` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified` timestamp NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`id`), UNIQUE KEY `userid` (`userid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='ProFTP user table' AUTO_INCREMENT=3 ;
Sinnvollerweise definiert man für die soeben angelegte Datenbank einen exklusiven Benutzer, z.B. „proftpd“ Schritt 4: Module in ProFTPd einbinden In /etc/proftpd/modules.conf müssen nun die folgenden Zeilen einkommentiert werden
LoadModule mod_sql.c LoadModule mod_sql_mysql.c
Es ist in diesem Schritt ebenfalls sinnvoll, die Zeile
#LoadModule mod_copy.c
auszukommentieren, da sich in diesem Modul eine Anfälligkeit für den „Propane“-Exploit versteckt, die Funktionalität dieses Moduls jedoch so gut wie nie genutzt wird.
Schritt 5: ProFTPd die Kommunikation mit MySQL beibringen In der Modulkonfiguration /etc/proftpd/sql.conf (diese enthält bei einer Installation aus dem Repository schon jede Menge auskommentierte Einträge, die man getrost ignorieren kann) werden nun innerhalb des Abschnitts […] die notwendigen Optionen definiert:
SQLBackend mysql SQLAuthTypes Crypt SQLConnectInfo [Datenbankname]@localhost [Benutzername] [Passwort] SQLUserInfo ftpuser userid passwd uid gid homedir shell SQLGroupInfo ftpgroup groupname gid members # Den Zeitpunkt des letzten Logins aktualisieren SQLLog PASS updatecount SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser SQLLog STOR,DELE modified SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser
Schritt 6: Benutzer anlegen Die beiden Tabellen mit einer Benutzergruppe und einem Benutzer füllen (hier am Beispiel des Benutzers www-data für den Apache2).
INSERT INTO `ftpgroup` (`groupname`, `gid`, `members`) VALUES ('www-data', 33, 'www-data'); INSERT INTO `ftpuser` (`id`, `userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`) VALUES ('', 'ftpuser', ENCRYPT('password'), 33, 33, '/var/www/default/', '/sbin/nologin', 0, '', '');
Damit kann sich der Benutzer „ftpuser“ nun mit dem Passwort „password“ anmelden und erhält Zugriff auf /var/www/default/ und dessen Unterverzeichnisse. Schritt 7: ProFTPd neu starten
sudo /etc/init.d/proftpd restart
Sollte ProFTPd nicht neu starten, kann man es mithilfe von
proftpd -nd6
manuell starten. So erhält man Debug-Informationen die einem bei der Ursachenforschung helfen können. Ansonsten sind auch die Einträge im ProFTPd-Log unter
/var/log/proftpd/proftpd.log
mitunter sehr hilfreich.