MINI HOWTO PROFTPD + OPENLDAP

Détails :

Le serveur FTP se trouve dans une DMZ, la base LDAP principale elle, est positionnée sur le LAN, nous allons donc utiliser un réplica d'une partie de l'arborescence de la base principale.que l'on installera directement sur le serveur FTP. La replication maitre-esclave se fera via une connection encapsulée TLS

Versions :

- openLDAP 2.2.23-8 / Debian package slapd
- libnss for ldap 238-1 / Debian Package libnss-ldap
- proftpd-1.2.10 / Custom Build or Debian package proftpd-ldap

Plan Architecture

OpenLDAP

Pour installer le daemon slapd :

server-ftp:~# apt-get install slapd

Nous allons éditer les fichiers de configurations du démon slapd un peu plus tard.
L'arborescence du réplica LDAP se présente comme cela :

dc=masociete,dc=fr
      |-ou=ldap // on stocke ici les identifiants de connection pour les différents type d'accés
      |     |-uid=nss // identifiant pour l'accés de la lib NSS
      |     |-uid=proftp // identifiant pour le demon proftpd
      |     |-uid=sync // identifiant pour la base ldap principale
      |-ou=comptes // Une sous arborescence pour les informations de comptes
            |-ou=groupes
            |    |-cn=mongroupe
            |-ou=utilisateurs	
                 |-uid=monutilisateur 

Bien entendu vous êtes libre de choisir d'organiser l'arborescence LDAP comme bon vous semble, c'est juste un exemple.
Proftpd utilise l'objet posixAccount des schémas par défaut d'OpenLDAP pour authentifier les utilisateurs. Mais si vous voulez gérer les quotas ou rajouter des informations spécifiques à vos utilisateurs FTP vous pouvez aussi recréer vos propres types d'objets. Dans mon cas j'ai créé les objets et attributs suivants :

#####################################################
attributetype ( 1.1.29.8.1978.10 NAME 'ftpQuota'
DESC 'Proftp User Quota Definition'
EQUALITY caseExactIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE ) attributetype ( 1.1.29.8.1978.20 NAME 'ftpType' DESC 'FTP Type Definition' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) objectclass ( 1.1.29.8.1978.30 NAME 'localftpUser' DESC 'FTP User' SUP top MUST ( ftpType ) MAY ( ftpQuota ) ) #####################################################

ftpQuota contiendra une chaine de caractère pour la gestion des quotas, voir le site de l'auteur pour les détails. L'attribut ftpType, lui, est spécifique à mon implémentation et sert uniquement pour un usage interne (il s'agit d'identifier les comptes FTP accessibles aussi depuis un browser classique avec le protocole HTTP). Enfin notre objet principal localftpUser représente l'utilisateur en lui même et ses attributs il sera donc couplé un un objet de type posixAccount dans la base LDAP pour avoir un compte d'utilisateur FTP complet.
Vous pouvez recopier ces définitions dans un fichier proftpd.schema et placer ce fichier dans le répertoire des schémas par défaut de slapd /etc/ldap/schema.

Maintenant, il faut éditer les fichiers de configuration de LDAP pour l'adapter à nos besoin, ça se passe dans /etc/ldap.
Voici les extraits importants du fichier slapd.conf.

#####################################################
# On inclut les schemas par défaut de openldap
# Ainsi que nos definitions dans le fichier proftpd.schema
include /etc/ldap/schema/core.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/inetorgperson.schema
include /etc/ldap/schema/proftpd.schema

# Certificat et clé pour la connection TLS
TLSCertificateFile      /etc/ldap/serveur_ftp_crt.pem
TLSCertificateKeyFile   /etc/ldap/serveur_ftp_key.pem
TLSCACertificateFile    /etc/ldap/cacert.pem

# On desactive le bind anonyme
disallow bind_anon
  
# On declare que ce serveur est un replica pour la branche correspondante
updatedn "uid=sync,ou=ldap,ou=ftp,dc=masociete,dc=fr"

# dn et mot de passe pour l'acces root
rootdn "cn=admin,dc=masociete,dc=fr"
rootpw {SSHA}secret

index           objectClass eq
index           uidNumber,gidNumber eq
index           uid,ftpType eq

# On autorise le demon proftpd et la libnss-ldap a lire les informations des comtpes ftp
access to dn.subtree=" ou=comptes,ou=ftp,dc=masociete,dc=fr"
by dn.base="uid=proftp,ou=ldap,ou=ftp,dc=masociete,dc=fr" read
by dn.base="uid=nss,ou=ldap,ou=ftp,dc=masociete,dc=fr" read
by * auth

# On autorise le serveur ldap maitre (sync) a modifier cette branche
access to dn.subtree="ou=ftp,dc=masociete,dc=fr"
by dn.base="uid=sync,ou=ldap,ou=ftp,masociete,dc=fr" write
by * auth
 
# Acces au password pour authentification pour tout le monde 
access to attr=userPassword by * auth
#####################################################

Vous pouvez tester et corriger les problèmes de votre installation en augmentant les logs avec l'instruction loglevel 256, je ne m'attarde pas sur la creation des certificats pour la connection TLS vous pouvez trouvez plus d'infos ici -> http://www.openssl.org/docs/HOWTO/. Il faudra aussi certainement désactiver le réplica en commentant la ligne updatedn pour créer la base de l'arborescence ( dc=masociete,dc=fr), puis la réactiver ensuite pour créer tous le reste depuis la base LDAP principale, tous les changements se répercuteront alors sur l'esclave.

Il faut ensuite modifier le fichier ldap.conf qui sert pour la partie cliente et les utilitaires LDAP, notamment ldapadd et ldapsearch
Voici à quoi doit ressembler votre fichier de configuration :

BASE    dc=masociete, dc=fr
URI     ldap://127.0.0.1:389
 
# Options TLS
TLS_CACERT      /etc/ldap/cacert.pem
TLS_REQCERT     demand

Une fois quelques utilisateurs créé dans la base LDAP avec ldapadd (sur la base principale dans le cas d'une configuration maitre-esclave) comme par exemple l'utilisateur suivant au format LDIFF:

dn: uid=ftpuser1,ou=utilisateurs,ou=comptes,ou=ftp,dc=masociete,dc=fr
uid: ftpuser1
cn: Mon User Ftp
userPassword:: secret
uidNumber: 30000
gidNumber: 30000
homeDirectory: /home/ftp/ftpuser1
ftpType: 0
ftpQuote : false,hard,100,100,100,100,100,100
objectClass: top
objectClass: localftpUser
objectClass: posixAccount
structuralObjectClass: localftpUser

Vous pouvez ensuite tester le réplica en interrogeant la base via lpdasearch pour voir si tout fonctionne bien.



Nsswitch

Pour installer le module libnss-ldap :

server-ftp:~# apt-get install libnss-ldap

Je ne m'arrete pas sur les questions posés par debconf car nous allons éditer les fichiers de configuration à la main.
Dans /etc nous editons le fichier nsswitch.conf pour dire au système que nous voulons qu'il interroge la base LDAP en plus des fichiers classiques password et group :

#####################################################
# On rajoute ldap sur les lignes passwd et group
# L'ordre est important - ici on consulte les fichiers classiques du système puis la base LDAP
passwd:         compat ldap
group:          compat ldap
#####################################################

Ensuite on modifie le fichier libnss-ldap.conf pour renseigner les paramêtres necessaires à la connection :

#####################################################
# L'adresse ou le nom DNS de la base (ici le replica local)
host 127.0.0.1
# La base de l'arborescence pour la recherche des informations
base ou=comptes,ou=ftp,dc=masociete,dc=fr
# dn et mot de passe pour l'acces à la base pour le module ldap de nss
binddn uid=nss,ou=ldap,ou=ftp,dc=masociete,dc=fr
bindpw secret
#####################################################

Vérifier que cela fonctionne avec la commande :

server-ftp:~# getent passwd
 
... 
slapd:x:1001:1001::/dev/null:/bin/false
proftpd:x:20101:30002::/dev/null:/bin/false
ftpuser1:x:30000:30000:ftpgroup1:/home/ftp/ftpuser1:/bin/false

Cette commande doit afficher la liste des utilisateurs du fichier /etc/password puis celle de la base LDAP, si ce n'est pas le cas aller donc jeter un coup d'oeil dans les logs du système pour identifier le problème (mauvais dn, mauvais password, etc...).



Proftp

On installe le démon proftpd :

server-ftp:~# apt-get install proftpd-ldap

Lorsque j'ai utilisé pour la première fois proftp et ldap, il y avait un problème avec le module ldap de proftpd et la version 3 de ldap notamment, j'ai donc utilisé les sources et recompilé avec l'aide de l'auteur une version fonctionnelle, la version fourni avec la sarge aujourd'hui devrait fonctionner normalement. Sinon récupérer les dernieres sources à cette adresse -> http://proftpd.org/ et utiliser au moins les options suivantes :

./configure  --with-modules=mod_ldap:mod_quotatab:mod_quotatab_file:mod_quotatab_ldap

Editer ensuite le fichier de configuration de proftpd dans /etc, il s'agit de proftpd.conf
Voici les options importantes dans notre cas :


# On autorise l'authentification seulement depuis la base LDAP  
AuthOrder mod_ldap.c
 
RequireValidShell off
LDAPProtocolVersion 3
LDAPServer 127.0.0.1:389
 
# L'identifiant et le mot de passe de connection pour le demon proftpd
LDAPDNInfo uid=proftp,ou=ldap,ou=ftp,dc=masociete,dc=fr secret
 
# La base de la recherche et les options (le ftpType=0 est spécifique à mon implémentation)
LDAPDoAuth on ou=comptes,ou=ftp,dc=masociete,dc=fr "(&(uid=%v)(objectclass=posixAccount)(ftpType=0))"

# L'authentification se fera via le processus d'authentification LDAP (on ne récupère pas le password)
LDAPAuthBinds on

Pour les quotas plus d'informations sont disponibles ici -> http://www.castaglia.org/proftpd/modules/mod_quotatab.html#Installation . Créer ensuite les répértoires de vos utilisateurs sur le système (par exemple /home/ftpuser1) et essayer de vous connecter avec votre client FTP préféré. Si tout se passe mal, les logs sont vos amis comme d'habitude :)

Références :

- Le site de proftp
- Celui de openldap