Le but de cet article est de mettre en place un serveur FTP , je vais partir sur proftpd . De plus de cela j’ai décidé de me lancer en mettant en place un serveur LDAP (que je ne maitrise que très peu) .
Les tests ont été faits depuis une debian Squeeze .
On commence par mettre en place la partie FTP
apt-get install proftpd-mod-ldap proftpd-basic
La configuration est plutôt simple. J’ai rajouté les options suivantes
AllowStoreRestart on PassivePorts 50000 50400 TransferLog /var/log/proftpd/xferlog SystemLog /var/log/proftpd/proftpd.log Include /etc/proftpd/ldap.conf Include /etc/proftpd/tls.conf
- AllowStoreRestart : On autorise le reprise de téléchargement
- PassivePorts : Plage des ports passifs
- Fichier include pour le TLS et LDAP
La configuration TLS est également très simpliste
# grep -v ^# tls.conf <IfModule mod_tls.c> TLSEngine on TLSLog /var/log/proftpd/tls.log TLSProtocol SSLv23 TLSRSACertificateFile /etc/ssl/certs/proftpd.crt TLSRSACertificateKeyFile /etc/ssl/private/proftpd.key TLSOptions NoCertRequest TLSVerifyClient off TLSRequired on </IfModule>
Le fichier de conf tls.conf propose déjà la ligne de commande pour la génération du certificat .
openssl req -x509 -newkey rsa:1024 -keyout /etc/ssl/private/proftpd.key -out /etc/ssl/certs/proftpd.crt \ -nodes -days 365
Pour la partie LDAP
# grep -v ^# ldap.conf LDAPServer "127.0.0.1:389" LDAPUseTLS off LDAPDoAuth on ou=users,dc=domain,dc=com LDAPDoUIDLookups on ou=users,dc=domain,dc=com LDAPDoGIDLookups on ou=users,dc=domain,dc=com LDAPAuthBinds on PersistentPasswd off AuthPAM off
Il faut maintenant installer le serveur LDAP . Nous allons également utiliser un frontend pour l’administration qui est phpldapadmin
apt-get install ldap-utils php5-ldap phpldapadmin slapd
Pour la configuration cela il faut créer le fichier slapd.conf dans /etc/ldap/
cp /usr/share/doc/slapd/examples/slapd.conf /etc/ldap/ # Where the dynamically loaded modules are stored modulepath /usr/lib/ldap moduleload back_hdb backend hdb suffix "dc=domain,dc=com" rootdn "cn=admin,dc=domain,dc=com" rootpw "votre clé ici" access to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=domain,dc=com" write by anonymous auth by self write by * none access to * by dn="cn=admin,dc=domain,dc=com" write by * read
Pour générer la clé pour la variable « rootpw »
slappasswd -h {SSHA}
Pour le fichier ldap.conf
# grep -v ^# ldap.conf BASE dc=domain,dc=com URI ldap://localhost
Le fichier /etc/default/slapd
# grep -v ^# /etc/default/slapd SLAPD_CONF= SLAPD_USER="openldap" SLAPD_GROUP="openldap" SLAPD_PIDFILE= SLAPD_SERVICES="ldap://127.0.0.1:389/ ldapi:///" SLAPD_SENTINEL_FILE=/etc/ldap/noslapd SLAPD_OPTIONS=""
Si vous avez un firewall en place il faut ouvrir le port 21
${IPT} -A INPUT -i ${IFPUB} -p tcp --dport 21 -j ACCEPT
- IPT : Path de iptables
- IFPUB : Interface ou est montée l’ip publique
Il faut chargé les modules pour le mode passif
modprobe nf_nat_ftp modprobe nf_conntrack_ftp
Si vous utilisez un script pensez à charger ces modules .
A ce stade nous avons un serveur FTP en place capable de faire du SSL et de s’authentifier sur un serveur LDAP . Mais il manque quand mêmes des users non ?
Modifier le fichier /etc/phpldapadmin/config.php
$servers->setValue('server','name','LDAP NameServer'); $servers->setValue('server','base',array('dc=domain,dc=com'));
Il vous reste plus à vous connecter http://serveur/phpldapadmin/
Il faut commencer par créer un groupe dans le cas ou vous avez une erreur il y a un bug dans les templates fournit par debian .
Il faut donc modifier 2 templates
/etc/phpldapadmin/templates/creation/posixAccount.xml <attribute id="uidNumber"> <display>UID Number</display> <icon>terminal.png</icon> <order>6</order> <page>1</page> <!-- <readonly>1</readonly> --> <value>=php.GetNextNumber(/;uidNumber)</value> </attribute> /etc/phpldapadmin/templates/creation/posixGroup.xml <attribute id="gidNumber"> <display>GID Number</display> <order>2</order> <page>1</page> <!-- <readonly>1</readonly> --> <spacer>1</spacer> <value>=php.GetNextNumber(/;gidNumber)</value> <!-- <value><![CDATA[=php.GetNextNumber(/;gidNumber;false;(&(objectClass=posixGroup));*2,+1000)]]></value> --> </attribute>
Vous pourrez par la suite créer un groupe puis des utilisateurs associés à ce groupe .
Nous avons un FTP fonctionnel avec un LDAP également comme dans pure-ftpd j’avais proposé de mettre en place un scan antivirus. Parce qu’il faut un minimum de sécurité nous allons scanner ce que dépose les users sur le serveur FTP . Pour cela il faut ajouter le module ClamAV
Malheureusement celui-ci n’est pas encore packagé dans la stable de debian . Cependant dans la Sid ce paquet est disponible .
~# cat /etc/debian_version wheezy/sid apt-cache search clamav proftpd-mod-clamav - ProFTPD module mod_clamav
Sur le serveur ou j’effectue mes tests je suis en Squeeze donc nous allons devoir re-paquager le paquet debian afin d’y intégrer ce module .
Pour commencer
apt-get install clamav clamav-daemon libclamav-dev
Puis
dpkg-reconfigure clamav-base
Il faut répondre comme ceci dans le cas contraire les options par défaut.
Socket type: <-- TCP TCP port clamd will listen on: <-- 3310 IP address clamd will listen on: <-- 127.0.0.1
Pourquoi modifier le fonctionnement de clamav je me suis basé sur ceci
« Now we must reconfigure ClamAV so that Clamd uses TCP connections instead of a local Unix socket. It is highly recommended that Unix socket connections are avoided when using the Chroot feature of ProFTPd (DefaultRoot ~). The reason is that if mod_clamav needs to connect to Clamd, the Unix socket is not available in the chroot environment. »
Passons maintenant à la reconfiguration de proftpd
apt-get install build-dep libpam-dev
Récupérer les sources de proftpd . Vérifier que vous avez ceci dans votre sources.list dans le cas contraire ajoutez le puis apt-get update
deb-src http://ftp.fr.debian.org/debian/ squeeze main contrib non-free cd /data/src/ apt-get source proftpd-basic
Vous devriez avoir ceci dans votre répertoire
# ls -l total 4752 drwxr-xr-x 3 root root 4096 Oct 10 12:19 . drwxr-xr-x 17 root root 4096 Oct 10 12:17 .. drwxr-xr-x 14 root root 4096 Oct 10 12:19 proftpd-dfsg-1.3.3a -rw-r--r-- 1 root root 108182 Nov 18 2011 proftpd-dfsg_1.3.3a-6squeeze4.diff.gz -rw-r--r-- 1 root root 1426 Nov 18 2011 proftpd-dfsg_1.3.3a-6squeeze4.dsc -rw-r--r-- 1 root root 4718833 Jul 5 2010 proftpd-dfsg_1.3.3a.orig.tar.gz
On récupére le module puis on le détarre
wget --no-check-certificate https://secure.thrallingpenguin.com/redmine/attachments/download/1/mod_clamav-0.11rc.tar.gz tar xzvf mod_clamav-0.11rc.tar.gz cp mod_clamav-0.11rc/mod_clamav.* proftpd-dfsg-1.3.3a/contrib
On applique le patch
cd proftpd-dfsg-1.3.3a patch -p1 < ../mod_clamav-0.11rc/proftpd.patch
Résultat
patching file modules/mod_xfer.c Hunk #1 succeeded at 52 with fuzz 1 (offset 10 lines). Hunk #2 succeeded at 1731 (offset 147 lines).
On modifie le debian/rules et on y ajoute ceci
--with-modules=mod_clamav
Vous devriez avoir ceci
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=mo d_readme \ --enable-ipv6 --enable-nls --with-modules=mod_clamav
On reconstruit le paquet
dpkg-buildpackage
Quand on retourne au niveau de /data/src/ . On peut voir l’apparition des fichiers .deb
-rw-r--r-- 1 root src 5115 Oct 2 09:58 mod_clamav-0.11rc.tar.gz -rw-r--r-- 1 root src 2335700 Oct 2 10:07 proftpd-basic_1.3.3a-6squeeze4_i386.deb -rw-r--r-- 1 root src 833722 Oct 2 10:07 proftpd-dev_1.3.3a-6squeeze4_i386.deb drwxr-xr-x 15 root root 4096 Oct 2 10:07 proftpd-dfsg-1.3.3a -rw-r--r-- 1 root src 112208 Oct 2 10:04 proftpd-dfsg_1.3.3a-6squeeze4.diff.gz -rw-r--r-- 1 root src 1180 Oct 2 10:04 proftpd-dfsg_1.3.3a-6squeeze4.dsc -rw-r--r-- 1 root src 4502 Oct 2 10:07 proftpd-dfsg_1.3.3a-6squeeze4_i386.changes -rw-r--r-- 1 root src 4718833 Jul 5 2010 proftpd-dfsg_1.3.3a.orig.tar.gz -rw-r--r-- 1 root src 1509010 Oct 2 10:07 proftpd-doc_1.3.3a-6squeeze4_all.deb -rw-r--r-- 1 root src 354234 Oct 2 10:07 proftpd-mod-ldap_1.3.3a-6squeeze4_i386.deb -rw-r--r-- 1 root src 345704 Oct 2 10:07 proftpd-mod-mysql_1.3.3a-6squeeze4_i386.deb -rw-r--r-- 1 root src 347204 Oct 2 10:07 proftpd-mod-odbc_1.3.3a-6squeeze4_i386.deb -rw-r--r-- 1 root src 345522 Oct 2 10:07 proftpd-mod-pgsql_1.3.3a-6squeeze4_i386.deb -rw-r--r-- 1 root src 344882 Oct 2 10:07 proftpd-mod-sqlite_1.3.3a-6squeeze4_i386.deb
Il vous reste plus qu’à installer les paquets dont vous avez besoins avec dpkg -i .
Pour tester que nous n’avons pas fait tout ceci pour rien . Il faut aller sur cette page :
name proftpd[16326] name-01.domain.com (xxx.x.xx.xxx.rev.toto.net[::ffff:xx.x.xxx.xx]): mod_clamav/0.11rc: Virus 'Eicar-Test-Signature' found in '/path/de/chroot/user/eicar.txt'
Dans les logs de filezilla
commande : STOR eicar.txt Réponse : 150 Opening ASCII mode data connection for eicar.txt Réponse : 550 Virus Detected and Removed: Eicar-Test-Signature Erreur : Echec du transfert du fichier
SOURCES
http://www.howtoforge.com/how-to-integrate-clamav-through-mod_clamav-into-proftpd-for-virus-scanning-on-debian-lenny
http://wiki.debian.org/PhpLdapAdmin
http://irp.nain-t.net/doku.php/205ftp:900pureftpd:30_ftp_iptables
http://www.openldap.org/doc/admin24/backends.html
Remarque
Dans la configuration LDAP il semblerait que le backend bdb soi recommandé à la place de la hdb .
CONCLUSION
Proftpd est un serveur FTP plutôt simple à mettre en place avec une documentation claire . Son intégration avec LDAP se fait aisément même sans trop connaissance avancés . Par rapport à d’autres serveurs FTP comme pure-ftpd , ils se valent aux points de vue des options . Cependant la documentation coté proftpd est plus nette et plus complète . La communauté semble également être plus présente . En ce qui concerne vsftpd je ne le connais pas .
A mon avis tous les serveurs FTP se valent par contre ce qui pourra les dé-partager est la sécurité.
La dernière faille connu sur proftpd est décrite ici
http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-635/CERTA-2011-AVI-635.html