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.

Schreibe einen Kommentar