Let’s say there is a ProFTPd server installed, for example, as I described in this article – Installing and Configuring ProFTPd in Ubuntu
And also installed MySQL server, for example, as I described in this article – Installing and configuring a MySQL server on Ubuntu
Here is an example of setting up ProFTPd using the MySQL user database.
Install an additional package:
sudo apt-get install proftpd-mod-mysql
Open the ProFTPd configuration in any text editor:
sudo nano /etc/proftpd/proftpd.conf
Uncomment or specify:
Include /etc/proftpd/sql.conf DefaultRoot ~ RequireValidShell off
Create a separate system user and group to which virtual users from the MySQL database will be tied:
sudo groupadd -g 2001 ftpgroup sudo useradd -u 2001 -s /bin/false -d /bin/null -c "proftpd user" -g ftpgroup ftpuser
Further it will be necessary to execute sql requests through phpMyAdmin or any mysql client, I will give an example of connection to the local MySQL server:
mysql -u root -p
Performing sql query create any database and user with privileges on it, for example proftpd:
create database proftpd; GRANT SELECT, INSERT, UPDATE, DELETE ON proftpd.* TO 'proftpd'@'localhost' IDENTIFIED BY 'password'; FLUSH PRIVILEGES;
Create in this new database two tables, and also add the group and the FTP user:
use proftpd; CREATE TABLE ftpgroup ( groupname varchar(16) NOT NULL default '', gid smallint(6) NOT NULL default '2001', members varchar(16) NOT NULL default '', KEY groupname (groupname) ) ENGINE=MyISAM COMMENT='ProFTP group table'; CREATE TABLE 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 '2001', gid smallint(6) NOT NULL default '2001', 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 datetime NOT NULL default '0000-00-00 00:00:00', PRIMARY KEY (id), UNIQUE KEY userid (userid) ) ENGINE=MyISAM COMMENT='ProFTP user table'; INSERT INTO `ftpgroup` (`groupname`, `gid`, `members`) VALUES ('ftpgroup', 2001, 'ftpuser'); INSERT INTO `ftpuser` (`id`, `userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`) VALUES (NULL, 'test', 'password')', '2001', '2001', '/srv/ftp/test', '/sbin/nologin', '0', '0000-00-00 00:00:00.000000', '0000-00-00 00:00:00.000000'); exit;
See also – The solution of error “ERROR 1067 (42000) at line 211: Invalid default value for ‘blablabla’”
Open the configuration file of ProFTPd modules in a text editor:
sudo nano /etc/proftpd/modules.conf
Uncomment or specify two lines:
LoadModule mod_sql.c LoadModule mod_sql_mysql.c
Open the configuration file for SQL parameters for ProFTPd:
sudo nano /etc/proftpd/sql.conf
We specify the username and password for connecting to the MySQL database, in fact we will bring it to the following form:
<IfModule mod_sql.c> SQLBackend mysql SQLAuthTypes Crypt SQLConnectInfo proftpd@localhost proftpd password SQLUserInfo ftpuser userid passwd uid gid homedir shell SQLGroupInfo ftpgroup groupname gid members # Update count every time user logs in 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 </IfModule>
Restart ProFTPd to apply the configuration changes:
sudo /etc/init.d/proftpd restart
This completes the ProFTPd configuration using the MySQL user database and you can connect.
I will also give you an example of the contents of the old configuration file, in which proftpd took user data from the mysql billing database:
ServerName "Name" ServerType standalone ServerIdent off DefaultServer on ScoreboardFile /var/run/proftpd.scoreboard Port 21 ServerAdmin admin@example.net Umask 002 MaxInstances 300 CommandBufferSize 512 UseReverseDNS off IdentLookups off RequireValidShell off DefaultAddress 0.0.0.0 PassivePorts 30000 50000 TimesGMT off TimeoutSession 1800 TimeoutStalled 300 User ftp Group ftp CharsetLocal KOI8-U CharsetRemote CP1251 ExtendedLog /var/log/proftpd.log ALL ideal LogFormat ideal "%t %a %U %m %D %f %b %T" TransferLog NONE AllowRetrieveRestart on AllowStoreRestart on DefaultRoot ~ AllowOverwrite off <Limit SITE_CHMOD> DenyAll </Limit> <Limit Write> AllowAll </Limit> <Limit READ> AllowAll </Limit> <Limit DELE RMD XRMD RNFR RNTO> AllowUser myadmin manager DenyAll </Limit> AuthOrder mod_auth_unix.c mod_sql.c SQLAuthTypes Plaintext SQLAuthenticate users SQLConnectInfo base@192.168.0.1:3306 mysqluser password SQLDefaultGID 1003 SQLDefaultUID 1003 SQLDefaultHomedir /ftp SQLUserInfo `abon` `login` `password` "NULL" "NULL" "NULL" "NULL" SQLUserWhereClause "killed!='killed'" #SQLNamedQuery auth SELECT "login,password,1003,1003,'/usr/home/ftp','' from abon where killed!='killed' and login = '%u'" #SQLUserInfo custom:/auth #SQLLogFile /var/log/proftpd_sql.log <Directory ~> </Directory>
See also:
Configuring ProFTPd with virtual users in a file