Installer Proftpd avec MySQL et TLS sur Ubuntu
De Captaine's Wiki.
Installation
Installation des paquets :
apt-get install proftpd-mysql openssl
Il faut ensuite créer les bases SQL qui vont contenir nos utilisateurs et nos groupes :
CREATE DATABASE `proftpd`;
USE proftpd;
--
-- Table structure for table `ftpgroup`
--
CREATE TABLE `ftpgroup` (
`groupname` varchar(16) NOT NULL default '',
`gid` smallint(6) NOT NULL default '5500',
`members` varchar(16) NOT NULL default '',
KEY `groupname` (`groupname`)
) TYPE=MyISAM COMMENT='Table des groupes ProFTPD';
--
-- Table structure for table `ftpuser`
--
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 '5500',
`gid` smallint(6) NOT NULL default '5500',
`email` varchar(255) NOT NULL,
`homedir` varchar(255) NOT NULL default '',
`shell` varchar(16) NOT NULL default '/bin/false',
`count` int(11) NOT NULL default '0',
`accessed` datetime NOT NULL default '0000-00-00 00:00:00',
`dl_bytes` bigint(20) NOT NULL,
`dl_count` bigint(20) NOT NULL,
`ul_bytes` bigint(20) NOT NULL,
`ul_count` bigint(20) NOT NULL,
`modified` datetime NOT NULL default '0000-00-00 00:00:00',
`LoginAllowed` enum('true','false') NOT NULL default 'true',
PRIMARY KEY (`id`)
) ENGINE=MyISAM COMMENT='Table des utlisateurs ProFTPD' ;
Ensuite il faut créer un nouvel utilisateur (ex : proftpd) avec un mot de passe (ex : password) qui a seulement les droits de lire les données de la base proftpd:
GRANT USAGE ON proftpd.localhost TO proftpd@'localhost' IDENTIFIED BY password WITH GRANT OPTION;
On crée ensuite les certificats pour le mode TLS :
openssl req -new -x509 -days 365 -nodes -out /etc/proftpd/ssl/proftpd.cert.pem -keyout /etc/proftpd/ssl/proftpd.key.pem
On édite ensuite le fichier /etc/proftpd/proftpd.conf :
# # /etc/proftpd/proftpd.conf -- This is a basic ProFTPD configuration file. # To really apply changes reload proftpd after modifications. # # Includes DSO modules Include /etc/proftpd/modules.conf # Set off to disable IPv6 support which is annoying on IPv4 only boxes. UseIPv6 on ServerName "Mon serveur FTP" ServerType standalone ServerIdent on "Bienvenue sur mon ftp. Veuillez-vous identifiez" DeferWelcome on MultilineRFC2228 on DefaultServer on ShowSymlinks on TimeoutNoTransfer 600 TimeoutStalled 600 TimeoutIdle 1200 DisplayLogin welcome.msg DisplayFirstChdir .message ListOptions "-l" DenyFilter \*.*/ # Use this to jail all users in their homes DefaultRoot ~ # Users require a valid shell listed in /etc/shells to login. # Use this directive to release that constrain. RequireValidShell off # Port 21 is the standard FTP port. Port 21 # In some cases you have to specify passive ports range to by-pass # firewall limitations. Ephemeral ports can be used for that, but # feel free to use a more narrow range. PassivePorts 19200 19250 # If your host was NATted, this option is useful in order to # allow passive tranfers to work. You have to use your public # address and opening the passive ports used on your firewall as well. MasqueradeAddress mon.domaine.fr # To prevent DoS attacks, set the maximum number of child processes # to 30. If you need to allow more than 30 concurrent connections # at once, simply increase this value. Note that this ONLY works # in standalone mode, in inetd mode you should use an inetd server # that allows you to limit maximum number of processes per service # (such as xinetd) MaxInstances 30 # Set the user and group that the server normally runs at. User proftpd Group nogroup # Umask 022 is a good standard umask to prevent new files and dirs # (second parm) from being group and world writable. Umask 022 022 # Normally, we want files to be overwriteable. AllowOverwrite on # Uncomment this if you are using NIS or LDAP to retrieve passwords: # PersistentPasswd off # Be warned: use of this directive impacts CPU average load! # Uncomment this if you like to see progress and transfer rate with ftpwho # in downloads. That is not needed for uploads rates. # # UseSendFile off # Choose a SQL backend among MySQL or PostgreSQL. # Both modules are loaded in default configuration, so you have to specify the backend # or comment out the unused module in /etc/proftpd/modules.conf. # Use 'mysql' or 'postgres' as possible values. # SQLBackend mysql TransferLog /var/log/proftpd/xferlog SystemLog /var/log/proftpd/proftpd.log #Mise en place du mode TLS TLSEngine on TLSLog /var/log/proftpd/tls.log TLSProtocol SSLv23 TLSOptions NoCertRequest TLSRSACertificateFile /etc/proftpd/ssl/proftpd.cert.pem TLSRSACertificateKeyFile /etc/proftpd/ssl/proftpd.key.pem TLSVerifyClient off #TLS non obligatoire (pour les clients qui ne sont pas compatibles) TLSRequired off QuotaEngine on Ratios on # Delay engine reduces impact of the so-called Timing Attack described in # http://security.lss.hr/index.php?page=details&ID=LSS-2004-10-02 # It is on by default. DelayEngine on ControlsEngine on ControlsMaxClients 2 ControlsLog /var/log/proftpd/controls.log ControlsInterval 5 ControlsSocket /var/run/proftpd/proftpd.sock AdminControlsEngine on # Mod MySQL # ========= # Les mots de passe sont cryptés dans la base avec la fct ENCRYPT (MySQL) SQLAuthTypes Crypt SQLAuthenticate users* groups* # Modifiez cette ligne selon l'utilisateur et le mot de passe définis plus haut SQLConnectInfo nom_de_la_base@localhost utilisateur mot_de_passe # On donne à ProFTPD le nom des colonnes de la table usertable SQLUserInfo ftpuser userid passwd uid gid homedir shell SQLUserWhereClause "LoginAllowed = 'true'" # On donne à ProFTPD le nom des colonnes de la table "grouptable" SQLGroupInfo ftpgroup groupname gid members # Crée le répertoire home de l'utilisateur si il n'existe pas SQLHomedirOnDemand on # Met jour les compteurs chaque connection d'un utilisateur SQLLog PASS updatecount SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser #Met jour les compteurs chaque upload ou download d'un utilisateur SQLLog STOR,DELE modified SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser # Met à jour le nombre de bytes downloadés SQLLog RETR dlbytescount SQLNamedQuery dlbytescount UPDATE "dl_bytes=dl_bytes+%b WHERE userid='%u'" ftpuser #Met à jour le nombre de téléchargements SQLLog RETR dlcount SQLNamedQuery dlcount UPDATE "dl_count=dl_count+1 WHERE userid='%u'" ftpuser #Met à jour le nombre de bytes uploadés SQLLog STOR ulbytescount SQLNamedQuery ulbytescount UPDATE "ul_bytes=ul_bytes+%b WHERE userid='%u'" ftpuser #Met à jour le nombre d'uploads SQLLog STOR ulcount SQLNamedQuery ulcount UPDATE "ul_count=ul_count+1 WHERE userid='%u'" ftpuser # On désactive le login root RootLogin off # Gestion des logs # ================ # Enregistre les reques SQL dans /var/log/proftpd/mysql.log SQLLogFile /var/log/proftpd/mysql.log # Enregistre les authentifications LogFormat auth "%v [%P] %h %t \"%r\" %s" ExtendedLog /var/log/proftpd/auth.log AUTH auth # Enregistre les acc aux fichiers LogFormat write "%h %l %u %t \"%r\" %s %b" ExtendedLog /var/log/proftpd/access.log WRITE,READ write # Recupere le nom partir de l'ip de la machine de l'utilisateur ( resolution DNS ) IdentLookups on
Maintenant vous pouvez redémarrez le serveur ProFTPd pour appliquer la configuration :
/etc/init.d/proftpd restart
On crée ensuite un utilisateur dans la base de données :
INSERT INTO `ftpuser` ( `id`, `userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed` , `modified`, `LoginAllowed`, `email` ) VALUES ('', 'test', ENCRYPT('pwd'), '5500', '5500', '/home/ftp/test', '/bin/false', '', '', '', 'true', 'test@domaine.tld' );
On teste ensuite le compte avec Filezilla. Pour utiliser le mode TLS dans Filezilla, il faut utiliser le mode FTPES.
Pour curl :
curl --ftp-ssl-reqd -k -u utilisateur:mot_de_passe -T nom_fichier ftp://mon.domaine.tld/path/
On peut ensuite utilise l'interface web ProFTPdAdmin pour gérer les utilisateurs et les groupes FTP (Attention les sources disponibles sur le site du projet ne fonctionnent que partiellement avec cette configuration. Voici la même chose mais modifiée par mes soins pour que tout fonctionne : lien ) :
ProFTPd Admin



