Proftpd avec authentification LDAP

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

Related posts

2 Thoughts to “Proftpd avec authentification LDAP”

  1. mecanotox

    Juste par rapport à TLS, n’as tu pas des problèmes pour transfére en TLS des données ?

    Pour ma part j’arrive bien a avoir le canal de contrôle et d’authentification en mode SSL (Donc authentification SSL fonctionne) par contre impossible de transférer (canal data) des données en SSL.

  2. Je n’ai pas rencontré de problème particulier . Quel est le message d’erreur ?

Leave a Comment