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 |
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.
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...).
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 :