PureFTPd + TLS + Clamav sur Debian Lenny

 

Voici le parallèle de cet article http://blog.cheramy.name/2010/11/06/proftpd-tls-clamav-sur-debian-lenny/ avec PureFTPd.

Cette fois-ci j'utilise MySQL pour stocker les comptes utilisateurs.

Installation de MySQL et PureFTPd

# apt-get install mysql-server mysql-client pure-ftpd-mysql

 

On va créer une base et un utilisateur pour pureftpd :

mysql> create database pureftpd character set utf8 ;
mysql> grant SELECT, INSERT, UPDATE, DELETE, CREATE, DROP on pureftpd.* to 'pureftpd_uzer'@'localhost' identified by 'azerty' ;

 

On crée ensuite une table qui va contenir les informations des utilisateurs.

mysql> use pureftpd ;
mysql> CREATE TABLE ftpd (
    -> User varchar(16) NOT NULL default '',
    -> status enum('0','1') NOT NULL default '0',
    -> Password varchar(64) NOT NULL default '',
    -> Uid varchar(11) NOT NULL default '-1',
    -> Gid varchar(11) NOT NULL default '-1',
    -> Dir varchar(128) NOT NULL default '',
    -> ULBandwidth smallint(5) NOT NULL default '0',
    -> DLBandwidth smallint(5) NOT NULL default '0',
    -> comment tinytext NOT NULL,
    -> ipaccess varchar(15) NOT NULL default '*',
    -> QuotaSize smallint(5) NOT NULL default '0',
    -> QuotaFiles int(11) NOT NULL default 0,
    -> PRIMARY KEY (User),
    -> UNIQUE KEY User (User)
    -> ) TYPE=MyISAM;

 

Configuration de PureFTPD

On commence par configurer l'accès à la base de données dans le fichier /etc/pure-ftpd/db/mysql.conf :

MYSQLSocket      /var/run/mysqld/mysqld.sock
MYSQLServer     localhost
MYSQLPort       3306
MYSQLUser       pureftpd_uzer
MYSQLPassword   azerty
MYSQLDatabase   pureftpd
MYSQLCrypt      md5
MYSQLGetPW      SELECT Password FROM ftpd WHERE User="L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "R")
MYSQLGetUID     SELECT Uid FROM ftpd WHERE User="L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "R")
MYSQLGetGID     SELECT Gid FROM ftpd WHERE User="L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "R")
MYSQLGetDir     SELECT Dir FROM ftpd WHERE User="L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "R")
MySQLGetBandwidthUL SELECT ULBandwidth FROM ftpd WHERE User="L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "R")
MySQLGetBandwidthDL SELECT DLBandwidth FROM ftpd WHERE User="L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "R")
MySQLGetQTASZ   SELECT QuotaSize FROM ftpd WHERE User="L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "R")
MySQLGetQTAFS   SELECT QuotaFiles FROM ftpd WHERE User="L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "R")

 

On veut que chaque utilisateur soit chrooté dans son homeDirectory avec une création automatique de celui-ci si il n'exisste pas :

# echo "yes" > /etc/pure-ftpd/conf/ChrootEveryone
# echo "yes" > /etc/pure-ftpd/conf/CreateHomeDir

 

On veut que le service FTP soit gérer en tant que démon et non pas par inetd, donc on change la valeur de STANDALONE_OR_INETD dans le fichier /etc/default/pure-ftpd-common :

STANDALONE_OR_INETD=standalone

Il faut commanter la ligne :

#:STANDARD: These are standard services.
#ftp    stream  tcp     nowait  root    /usr/sbin/tcpd /usr/sbin/pure-ftpd-wrapper

dans /etc/inetd.conf

On peut maintenant démarrer le service :

# /etc/init.d/openbsd-inetd restart
# /etc/init.d/pure-ftpd-mysql start

 

Créer un utilisateur et tester

mysql> NSERT INTO `ftpd` (`User`, `status`, `Password`, `Uid`, `Gid`, `Dir`, `ULBandwidth`, `DLBandwidth`, `comment`, `ipaccess`, `QuotaSize`, `QuotaFiles`) 
VALUES ('guillaume', '1', MD5('secret'), '2001', '2001', '/home/guillaume', '100', '100', '', '*', '50', '0');

 

SSL

On va sécuriser la connexion et le transfert des données par une connexion SSL. On a plusieurs alternatives :
* soit on autorise le FTP en clair et en SSL :

# echo 1 > /etc/pure-ftpd/conf/TLS

* soit on autorise seulement le FTPs

# echo 2 > /etc/pure-ftpd/conf/TLS

* soit on désactive complètement le SSL :

# echo 0 > /etc/pure-ftpd/conf/TLS

 

La seconde chose à faire est de se créer un certificat, pour cela voir cet article : http://blog.cheramy.name/2010/01/13/mise-en-place-dune-infrastructure-pki/

On génère une clé et un certificat. On concatène les deux fichiers en un seul :

# cat /etc/ssl/PKI_guidtz/ftp.guidtz-intra.org.key.pem /etc/ssl/PKI_guidtz/ftp.guidtz-intra.org.pem > /etc/ssl/private/pure-ftpd.pem
# chmod 600 /etc/ssl/private/pure-ftpd.pem

 

On redémarre le serveur et on teste avec un client comme Filezilla :

# /etc/init.d/pure-ftpd-mysql restart

 

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.

 

Clamav

On install els paquets nécessaires pour clamav :

# apt-get install clamav clamav-daemon

 

On paramètre pureftpd :

# echo "yes" > /etc/pure-ftpd/conf/CallUploadScript

 

On crée un script qui va être exécuté à chaque chargement de fichier :

# vi /etc/pure-ftpd/clamav_check.sh
#!/bin/sh
/usr/bin/clamdscan --remove --quiet --no-summary "$1"
# chmod +x /etc/pure-ftpd/clamav_check.sh

 

Il faut enfin modifier le fichier /etc/default/pure-ftpd-common

UPLOADSCRIPT=/etc/pure-ftpd/clamav_check.sh

 

Puis on redémarre le serveur pour activer ce nouveau paramétrage.

 

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