====== Pam, NSS et LDAP ====== {{tag>pam nss ldap debian vsftpd}} L'objectif de ce rapide article est de stocker la configuration de mon serveur, sur lequel j'ai ramé pour remettre PAM et NSS avec LDAP. Pourquoi ? C'est pourtant pas compliqué... Tout simplement parce que je n'avais pas de copie de cette conf, et qu'a force de bidouiller au lieu de réfléchir, on fout vite la merde dans une config. Bref, tout ça pour dire que, pour les explications, go google. Ici, c'est du brut ! Dedieu ! ===== Slap ton LDAP ===== Slapd sous debian, c'est bien, ca marche bien, et c'est facile a configurer... alors pour un serveur a la maison, c'est pratique. # necessaire pour la retro compatibilite avec postfix entre autres allow bind_v2 include /etc/ldap/schema/core.schema include /etc/ldap/schema/cosine.schema include /etc/ldap/schema/nis.schema include /etc/ldap/schema/inetorgperson.schema pidfile /var/run/slapd/slapd.pid argsfile /var/run/slapd/slapd.args loglevel 0 modulepath /usr/lib/ldap moduleload back_bdb sizelimit 500 tool-threads 1 # les directives qui suivent s'appliqueront a ce backend jusque ce que l'on definisse un autre backend backend bdb database bdb suffix "dc=linuxwall,dc=info" checkpoint 512 30 rootdn "cn=admin,dc=linuxwall,dc=info" # mdp root obtenu avec "slappasswd -h '{SSHA}' -v" rootpw {SSHA}Supermotdepassedelamort directory "/var/lib/ldap" dbconfig set_cachesize 0 2097152 0 dbconfig set_lk_max_objects 1500 dbconfig set_lk_max_locks 1500 dbconfig set_lk_max_lockers 1500 index objectClass eq lastmod on # on definit les ACL access to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=linuxwall,dc=info" write by anonymous auth by self write by * none access to dn.base="" by * read access to * by dn="cn=admin,dc=linuxwall,dc=info" write by * read Voila, avec cela il ne vous reste plus qu'a placer un [[http://phpldapadmin.sourceforge.net/|phpldapadmin]] dans un coin de votre serveur web SSL (évidemment) et d'attaquer la config de vos comptes et groupes. ===== NSS & PAM ===== Je ferais ici un affreux copié collé du site de [[http://jfgiraud.free.fr/programmation/ldapauth/|Jean-Francois Giraud]] (et ceci sans meme demander son autorisation, ce qui est mal) car ce charmant monsieur y a effectué une présentation des modules nécessaires qu'il me semble superflue de paraphraser. //Pour permettre l'authentification auprès d'un annuaire LDAP, vous devez installer les packages suivants :// * //libpam-ldap// * //libnss-ldap// * //libpam-cracklib// * //libpam-pwdb// //Le paquet libnss-ldap fournit un service de nommage qui authorise votre serveur LDAP d'être utilisé comme service de nom. Ceci signifie qu'il fournit les données informatives concernant compte utilisateur, identificateurs, informations machines, alias, groupes réseau et de manière générale, tout ce qui est en général à plat dans les fichiers du répertoire /etc ou NIS.// //Le paquet libpam-ldap permet l'authentification des utilisateurs dans les programmes qui utilisent PAM (Pluggable Authentication Module). S'il est utilisé avec libnss-ldap, vous pouvez remplacer la structure de configuration par fichiers /etc ou NIS avec LDAP.// //Les paquets libpam-cracklib et libpam-pwdb sont utilisés par PAM-LDAP pour l'authentification.// Une fois que l'on a tout cela d'installé, il faut remplir les différents fichiers. ==== NSS config file ==== Le fichier de conf pour LDAP, ya quatres lignes.... # cat /etc/libnss-ldap.conf |grep -v '^#' base dc=linuxwall,dc=info uri ldap://127.0.0.1/ ldap_version 3 rootbinddn cn=admin,dc=linuxwall,dc=info Le mot de passe du serveur LDAP est également nécessaire. # cat /etc/libnss-ldap.secret Supermotdepassedelamort et le fichier de conf pour NSS # cat /etc/nsswitch.conf |grep -v '^#' passwd: compat ldap group: compat ldap shadow: compat ldap hosts: files dns networks: files protocols: db files services: db files ethers: db files rpc: db files netgroup: nis ==== PAM le tux ==== Ici, on a le meme fichier "secret" dans /etc/pam_ldap.secret (note: pensez a la mettre en 0400 quand meme....) puis on a un fichier pam_ldap.conf, pas bien gros lui non plus # cat /etc/pam_ldap.conf |grep -v '^#' base dc=linuxwall,dc=info uri ldap://127.0.0.1/ ldap_version 3 rootbinddn cn=admin,dc=linuxwall,dc=info port 389 scope sub bind_timelimit 30 idle_timelimit 3600 pam_filter objectclass=posixaccount pam_login_attribute uid pam_password crypt Il reste enfin à dire a PAM d'utiliser LDAP pour ses différents services. Sous Debian, ces services appellent géneralement les fichiers communs : * common-auth * common-account * common-session * common-password Ces fichiers reprennent les différents modes que propose PAM : account - provide account verification types of service: has the user´s password expired?; is this user permitted access to the requested service? authentication - authenticate a user and set up user credentials. Typically this is via some challenge-response request that the user must satisfy: if you are who you claim to be please enter your password. Not all authentications are of this type, there exist hardware based authentication schemes (such as the use of smart-cards and biometric devices), with suitable modules, these may be substituted seamlessly for more standard approaches to authentication - such is the flexibility of Linux-PAM. password - this group´s responsibility is the task of updating authentication mechanisms. Typically, such services are strongly coupled to those of the auth group. Some authentication mechanisms lend themselves well to being updated with such a function. Standard UN*X password-based access is the obvious example: please enter a replacement password. session - this group of tasks cover things that should be done prior to a service being given and after it is withdrawn. Such tasks include the maintenance of audit trails and the mounting of the user´s home directory. The session management group is important as it provides both an opening and closing hook for modules to affect the services available to a user. Dans chacun de ces fichiers, il faut rajouter une ligne. **common-auth** auth sufficient pam_ldap.so **common-account** account sufficient pam_ldap.so **common-session** session sufficient pam_ldap.so **common-password** # use_first_pass precise au module d'utiliser le password saisie pour # toutes les operations, ce qui evite a 'su' de le demander 2 fois, par exemple password sufficient pam_ldap.so use_first_pass La methode LDAP est toujours **sufficient**. Si elle marche, tant mieux, sinon ce n'est pas bloquant, on peut toujours s'authentifier avec un compte dans /etc/passwd ====== Le test ====== Facile a tester avec su, on peux aussi ajouter rapidement un service, comme vsftpd, pour regarder comment ca marche : # cat /etc/pam.d/vsftpd # Standard behaviour for ftpd(8). auth required pam_listfile.so item=user sense=deny file=/etc/ftpusersonerr=succeed # Note: vsftpd handles anonymous logins on its own. Do not enable # pam_ftp.so. # Standard blurb. @include common-account @include common-session @include common-auth auth required pam_shells.so Et dans /etc/vsftpd.conf, on rajoute : pam_service_name=vsftpd Enjoy ;)~~DISCUSSION~~