Proftpd + TLS + Clamav sur Debian Lenny

 

Le but de cet article est de mettre en place un serveur FTP un tant soit peu sécurisé sur une Debian Lenny.

On va donc utiliser proftpd avec une obligation d'utiliser une connexion SSL et on va utiliser un module utilisant clamav pour scruter si il y a des virus dans les fichiers, si clamav détecte un virus dans le fichier, celui-ci sera automatiquement effacé.

Installation et configuration de proftpd

Comme d'habitude l'installation sur une Debian est trop dure :

# apt-get install proftpd

 

Voici un exemple de fichier de configuration de proftpd qui marche pas trop mal, il permet de définir un chroot de l'espace FTP de l'utilisateur et quelques bases de sécurité pour les transferts de fichiers :

# Includes DSO modules
Include /etc/proftpd/modules.conf

# Set off to disable IPv6 support which is annoying on IPv4 only boxes.
UseIPv6                         no

ServerName                      "Debian FTP Server"
ServerType                      standalone
DeferWelcome                    off

MultilineRFC2228                on
DefaultServer                   on
ShowSymlinks                    on

TimeoutNoTransfer               600
TimeoutStalled                  600
TimeoutIdle                     1200

DisplayLogin                    welcome.msg
DisplayChdir                    .message true
ListOptions                     "-l"
DenyFilter                      *.*/

# message de bienvenue
AccessGrantMsg "Bonjour user %u"
# reprise des transfert
AllowStoreRestart               on
AllowRetrieveRestart            on
# test de securite a la connexion
UseReverseDNS                   on
IdentLookups                    off
# pas d'annonce de version du soft
ServerIdent                     off
# on chroot les utilisateurs dans le repertoire
DefaultRoot                     ~
# interdire la connection d'un utilisateur root
RootLogin                       off

# 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

# 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

# pour reduire les DOS
MaxClientsPerUser               8
MaxclientsPerHost               16
MaxHostsPerUser                 2
MaxClients                      16


# 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


# Fichiers de logs
TransferLog /var/log/proftpd/xferlog.log
SystemLog   /var/log/proftpd/proftpd.log

# Formats de logs
LogFormat default "%h %l %u %t "%r" %s %b"
LogFormat auth "%v [%P] %h %t "%r" %s"
LogFormat write "%h %l %u %t "%r" %s %b"

# Enregistre les acces sur les fichiers et repertoires.
ExtendedLog /var/log/proftpd/access.log WRITE,READ write

# Enregistre tout les logins.
ExtendedLog /var/log/proftpd/auth.log AUTH auth

# Cache les liens symboliques.
ShowSymlinks off

# Modules
<IfModule mod_quotatab.c>
QuotaEngine off
</IfModule>

<IfModule mod_ratio.c>
Ratios off
</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        off
ControlsMaxClients    2
ControlsLog           /var/log/proftpd/controls.log
ControlsInterval      5
ControlsSocket        /var/run/proftpd/proftpd.sock
</IfModule>

<IfModule mod_ctrls_admin.c>
AdminControlsEngine off
</IfModule>

 

On redémarre le service FTP :

# /etc/init.d/proftpd restart

et on vérifie qu'il fonctionne bien :

# ps auxf | grep proftpd
proftpd   9789  0.0  0.4  64080  1624 ?        S<s  17:09   0:00 proftpd: (accepting connections)

 

Pour tester on se crée un utilisateur :

# useradd -s /bin/false -m guillaume

Le petit "truc" ici est de créer un utilisateur qui ne peut pas se connecter sur la machine, cependant il faut faire attention que l'exécutable /bin/false se trouve dans le fichier des shells autorisés /etc/shells si non le rajouter.

Il suffit maintenant de tester avec un client FTP comme Filezilla par exemple.

 

Sécuriser avec TLS

Le protocole FTP est reconnu comme pas du tout sécurisé, i.e. toutes les informations passent en clair sur le réseau. On va donc rajouter une couche SSL pour faire en sorte que la communication soit authentifiée et cryptée.

On commence par installer openssl :

# apt-get install openssl

Je vous invite à lire mon article sur la mise en place d'une autorité de certification et sur la création de certificats : http://blog.cheramy.name/2010/01/13/mise-en-place-dune-infrastructure-pki/

On crée ensuite un répertoire ssl dans /etc/proftpd dans lequel on place la clé et le certificat :

/etc/proftpd/ssl# ls -la
total 20
drwxr-xr-x 2 root root 4096 nov  6 18:01 .
drwxr-xr-x 3 root root 4096 nov  6 17:31 ..
-rw-r----- 1 root root 5631 nov  6 17:58 debian-ftp.guidtz-intra.org.crt
-rw------- 1 root root 3243 nov  6 17:58 debian-ftp.guidtz-intra.org.key.pem

 

Reste à configurer le module SSL pour proftpd :

<IfModule mod_tls.c>
TLSEngine                  on
TLSLog                     /var/log/proftpd/tls.log
TLSProtocol                SSLv3
TLSOptions                 NoCertRequest
TLSRSACertificateFile      /etc/proftpd/ssl/debian-ftp.guidtz-intra.org.crt
TLSRSACertificateKeyFile   /etc/proftpd/ssl/debian-ftp.guidtz-intra.org.key.pem
TLSVerifyClient            off
TLSRequired                on
</IfModule>

 

Pour tester, il va falloir configurer le client FTP comme ceci :

 

Le paramètre TLSRequired force l'utilisation de la connexion TLS, si le client n'est pas paramétré pour la connexion sera refusée.
Vérifiez et acceptez le certificat et maintenant la connexion au FTP est sécurisée.

 

Mise en place de l'antivirus

Installation de Clamav

De façon à bénéficier des dernières versions de clamav, il est vivement conseillé d'utiliser les dépôts Debian Volatile, dans votre /etc/apt/sources.list :

deb http://volatile.debian.org/debian-volatile lenny/volatile main contrib non-free
deb-src http://volatile.debian.org/debian-volatile lenny/volatile main contrib non-free

On installe donc clamav :

# apt-get install clamav clamav-daemon libclamav-dev

 

Par défaut clamav est en écoute sur un socket Unix, cependant notre configuration fait en sorte que la connexion des utilisateurs via FTP est chrootée, ce qui veut dire que l'environnement de l'utilisateur ne "verra" pas le socket Unix, il faut donc faire écouter clamav sur un port TCP "classique", on reconfigure donc clamav en choisissant TCP et en faisant "écouter" clamav sur l'adresse locale, pour le reste je vous laisse aviser des différents paramètres pour votre installation :

# dpkg-reconfigure clamav-base

profitons-en aussi pour configurer freshclam :

# dpkg-reconfigure freshclam

Enfin on redémarre les démons clamav :

# /etc/init.d/clamav-daemon restart
# /etc/init.d/clamav-freshclam restart

 

Installation du module mod_clamav

Malheuresement pour nous il n'existe pas de paquets intégrant le module clamav pour proftpd, il va donc nous falloir recompiler proftpd avec ce module.

On commence par installer les outils et les dépendances :

# apt-get install build-essential
# cd /usr/src
# apt-get build-dep proftpd
# apt-get source proftpd

 

On télécharge et on met en place le module :

# wget http://www.thrallingpenguin.com/resources/mod_clamav-0.10.tar.gz
# tar xvzf mod_clamav-0.10.tar.gz
# cp mod_clamav-0.10/mod_clamav.* proftpd-dfsg-1.3.1/contrib/
# cd proftpd-dfsg-1.3.1/
# patch -p1 < ../mod_clamav-0.10/proftpd.patch

Il reste plus qu'à configurer la règle de compilation (on rajoute mod_clamav dans la variable CONF_ARGS) pour créer un nouveau paquet proftpd avec le module clamav :

# vi debian/rules
CONF_ARGS := --prefix=/usr 
             --with-includes=$(shell pg_config --includedir):$(shell mysql_config --include|
             sed -e 's/-I//') --mandir=/usr/share/man --sysconfdir=/etc/$(NAME) --localstatedir=
             /var/run --libexecdir=/usr/lib/$(NAME) --enable-sendfile --enable-facl --enable-dso 
             --enable-autoshadow --enable-ctrls --with-modules=mod_readme --enable-ipv6 --enable-nls
             --with-modules=mod_clamav

# dpkg-buildpackage

 

Après quelques minutes de compilation on se retrouve avec des fichiers *.deb dans le répertoire /usr/src, suffit de les installer :

# cd /usr/src
# dpkg -i proftpd*.deb

 

Configuration de proftpd

On rajoute ceci dans notre fichier de configuration :

<IfModule mod_clamav.c>
   ClamAV on
   ClamServer 127.0.0.1
   ClamPort 3310
</IfModule>

 

Tester

Pour tester, on peut récupérer des fichiers de test à cette adresse : http://www.eicar.org/anti_virus_test_file.htm

Si tout est bien configuré, lorsqu'on essaie de transférer un de ces fichiers, celui-ci est automatiquement effacé.