PureFTPd et OpenLDAP

 

Dans l'article précédent sur PureFTPd (http://blog.cheramy.name/2010/12/22/pureftpd-tls-clamav-sur-debian-lenny/) j'avais utilisé une base de données MySQL pour gérer les utilisateurs. Cette fois-ci nous allons utiliser un annuaire LDAP pour gérer les utilisateurs.

Par rapport à une base MySQL, nous allons pouvoir utiliser des méthodes de cryptage beaucoup plus "sures" que le MD5, telles que SHA et SSHA.

Je prends pour base que vous ayez déjà un annuaire LDAP fonctionnant avec des comptes posix en utilisant le schéma standard nis.

 

Installation PureFTPd

On va utiliser un paquet spécifique Debian pour PureFTPd avec LDAP :

# apt-get install pure-ftpd-ldap

 

Le fichier de configuration pour PureFTPd est /etc/pure-ftpd/db/ldap.conf :

LDAPServer localhost
LDAPPort   389
LDAPBaseDN ou=People,dc=guidtz,dc=fr
LDAPBindDN cn=admin,dc=guidtz,dc=fr
LDAPBindPW ********
LDAPDefaultUID 1000
LDAPDefaultGID 1000

Rien de bien méchant dans ces paramètres.

Attention, ce fichier contenant le mot de passe de l'admin LDAP, il faut faire attention aux droits sur ce fichiers (600 conseillé).

 

Pour les autres paramètres (chroot, création de répertoires ...) ce reporter à mon article précédent.

 

Modifications côté LDAP

Il est tout à fait possible d'utiliser directement l'annuaire sans modifications. PureFTPd va utiliser les attributs suivants du DN : uid, uidNumber, gidNumber, homeDirectory,userPassword.

Il est cependant intéressant d'utiliser le schéma pureftpd pour ajouter des attributs. On va par exemple pouvoir rajouter les informations suivantes par utilisateur :

FTPStatus: enabled
FTPQuotaFiles: 50
FTPQuotaMBytes: 10
FTPDownloadBandwidth: 50
FTPUploadBandwidth: 50
FTPDownloadRatio: 5
FTPUploadRatio: 1

 

Mise en place du schéma

La première chose à faire est donc de mettre en place le schéma :

# cp /usr/share/doc/pure-ftpd-ldap/pureftpd.schema /etc/ldap/schema

Attention dans le paquet Debian il y a un problème sur la classe d'objet PureFTPdUser. Elle est définie comme ceci :

objectclass ( 1.3.6.1.4.1.6981.11.2.3 NAME 'PureFTPdUser'
DESC 'PureFTPd user with optional quota, throttling and ratio'
MAY ( FTPStatus $ FTPQuotaFiles $ FTPQuotaMBytes $ FTPUploadRatio $
FTPDownloadRatio $ FTPUploadBandwidth $ FTPDownloadBandwidth $
FTPuid $ FTPgid ) )

ce qui va occasionner une erreur car cette classe va être prise comme une classe structurelle alors que chaque utilisateur à déjà sa classe structurelle (pour rappel un enregistrement ne doit avoir qu'une seule classe structurelle). Il faut donc transformer cette classe en classe auxiliaire comme ceci :

objectclass ( 1.3.6.1.4.1.6981.11.2.3 NAME 'PureFTPdUser'
DESC 'PureFTPd user with optional quota, throttling and ratio'
SUP top AUXILIARY
MAY ( FTPStatus $ FTPQuotaFiles $ FTPQuotaMBytes $ FTPUploadRatio $
FTPDownloadRatio $ FTPUploadBandwidth $ FTPDownloadBandwidth $
FTPuid $ FTPgid ) )

 

Modification de slapd.conf

On rajoute le schéma suivant dans le fichier de conf :

include /etc/ldap/schema/pureftpd.schema

 

Reste à rajouter pour chaque utilisateurs les infos nécessaires :

FTPStatus: enabled
FTPQuotaFiles: 50
FTPQuotaMBytes: 10
FTPDownloadBandwidth: 50
FTPUploadBandwidth: 50
FTPDownloadRatio: 5
FTPUploadRatio: 1
objectClass: PureFTPdUser

 

Interdire les utilisateurs locaux

Si on ne veut garder qu'un seul référentiel d'utilisateurs, ie ici notre annuaire LDAP, on va interdire l'accès FTP aux utilisateurs locaux du serveur (ceux qui se trouvent dans /etc/passwd). On modifie donc juste un paramètre de PureFTPd :

# echo no > /etc/pure-ftpd/conf/PAMAuthentication

 

On redémarre slapd et on démarre pureftpd et tou devrait fonctionner.