Installer Proftpd avec MySQL et TLS sur Ubuntu

Ce tutoriel est inspiré de ces tutos : http://www.lea-linux.org/cached/index/Reseau-partfic-proftpd_mysql.html et http://howtoforge.com/proftpd-tls-debian-etch
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 : cliquez ici pour le télécharger
#
# /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.
#

<ifmodule mod_sql.c>

SQLBackend mysql

</ifmodule>


TransferLog /var/log/proftpd/xferlog

SystemLog /var/log/proftpd/proftpd.log


#Mise en place du mode TLS

<ifmodule mod_tls.c>

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

</ifmodule>


<ifmodule mod_quota.c>

QuotaEngine on

</ifmodule>


<ifmodule mod_ratio.c>

Ratios on

</ifmodule>



# 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.

<ifmodule mod_delay.c>

DelayEngine on

</ifmodule>


<ifmodule mod_ctrls.c>

ControlsEngine on

ControlsMaxClients 2

ControlsLog /var/log/proftpd/controls.log

ControlsInterval 5
ControlsSocket /var/run/proftpd/proftpd.sock

</ifmodule>


<ifmodule mod_ctrls_admin.c>

AdminControlsEngine on

</ifmodule>




# 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

CreateHome 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.

http://img411.imageshack.us/img411/8476/filezillajc3.jpg

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

Vus : 1478
Publié par Captaine74 : 14