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