Linux:Authentification LDAP

De WIKI.minetti.org
Aller à : navigation, rechercher

Installation et configuration du serveur LDAP

Paquetages

Les paquetages suivants doivent être installés:

  • openldap
  • openldap-clients
  • openldap-servers
  • openssl

Fichier /etc/openldap/slapd.conf

# ==============================================================================
# CONFIGURATION SERVEUR LDAP
# Copyright 2006 by MINETTI JP
# ==============================================================================


# ==============================================================================
# Schémas
# ==============================================================================

include                 /etc/openldap/schema/core.schema
include                 /etc/openldap/schema/cosine.schema
include                 /etc/openldap/schema/inetorgperson.schema
include                 /etc/openldap/schema/nis.schema
include                 /etc/openldap/schema/samba.schema


# ==============================================================================
# Support LDAPv2
# ==============================================================================

allow                   bind_v2


# ==============================================================================
# Paramètres du démon
# ==============================================================================

pidfile                 /var/run/openldap/slapd.pid
argsfile                /var/run/openldap/slapd.args


# ==============================================================================
# Connexion TLS
# ==============================================================================

# Spéfications des algorithmes de chiffrement
TLSCipherSuite          HIGH:MEDIUM:+SSLv2

# Certificat de la CA
TLSCACertificateFile    /etc/openldap/cacerts/ca.pem

# Certificat du serveur LDAP
TLSCertificateFile      /etc/openldap/server-certs/openldap.pem

# Clée privée du serveur LDAP
TLSCertificateKeyFile   /etc/openldap/server-certs/openldap.key

# Clôture la session si certificat non valide
TLSVerifyClient         demand

# Connexion TLS obligatoire
security                tls=1


# ==============================================================================
# Droits d'accès
# ==============================================================================

include                 /etc/openldap/access.conf


# ==============================================================================
# Base de données
# ==============================================================================

database                bdb
suffix                  "dc=minetti,dc=org"
rootdn                  "cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org"
rootpw                  {SSHA}XXXXXXXXXXXXXXXXXXXX
directory               /var/db/ldap


# ==============================================================================
# Indexes
# ==============================================================================

index objectClass                               eq,pres
index ou,cn,sn,mail,givenname                   eq,pres,sub
index uidNumber,gidNumber,loginShell            eq,pres
index uid,memberUid                             eq,pres,sub
index nisMapName,nisMapEntry                    eq,pres,sub
index sambaSID,uniqueMember                     eq
index sambaDomainName                           eq,pres
index sambaPrimaryGroupSID                      eq


# ==============================================================================
# Logs
# ==============================================================================
#   -1  Equivaut à tout tracer
#    1  Trace les appels aux fonctions
#    2  Gestion des paquets
#    4  Déboggage lourd et verbeux
#    8  Gestion de la connexion
#   16  Affiche les paquets entrants et sortants
#   32  Analyse des filtres de recherche
#   64  Analyse du fichier de configuration
#  128  Analyse des restrictions d'accès
#  256  Récapitule les stats (recherche/résultats)
#  512  Log des entrées renvoyées
# 1024  Analyse de la communication avec les backends
# 2048  Analyse du parsing d'une entrée
#    0  Désactive tout logging
# ==============================================================================

loglevel        0

Création des certificats du serveur

On suppose que l'on soit une autorité de certification et que nous avons déjà créé notre CA. Dans le cas contraire, reportez-vous ici.

On génère la demande de certificat auprès de l'autorité de certification (CA):

openssl genrsa -out openldap.key 1024
openssl req -new -key openldap.key -out openldap.req

L'autorité de certification (CA) accepte la demande et procède à la signature du certificat:

openssl ca -in openldap.req -extensions v3_ca -out openldap.pem -days 3650

L'autorité de certification (CA) retourne un certificat signé valable pour 10 ans. Le fichier openldap.pem qui contient ce certificat, et le fichier openldap.key qui contient le couple clé privée/publique seront placés dans le répertoire /etc/openldap/server-certs.

Pour éviter que le serveur LDAP soit obligé de demander un mot de passe au démarrage, enlever le mot de passe du certificat:

mv openldap.key openldap-pw.key
openssl rsa -in openldap-pw.key -out openldap.key

Il ne faut pas oublier de placer le certificat de l'autorité de certification (CA) dans le répertoire /etc/openldap/cacerts afin que le serveur puisse vérifier la validité des certificats des clients.

Configuration des accès clients

Sur chaque machine accédant au LDAP, on modifie le fichier /etc/openldap/ldap.conf:

# ==============================================================================
# PARAMETRES DE CONNEXION PAR DEFAUT DES CLIENTS LDAP
# Copyright 2006 by MINETTI JP
# ==============================================================================


# Connexion
URI             ldap://ldap.srv.minetti.org/
BASE            dc=minetti,dc=org

# Certificats SSL (voir $HOME/.ldaprc pour chaque utilisateur)
SSL             start_tls

# Le serveur doit posséder un certificat signé par la CA pour que la
# connection soit possible
TLS_REQCERT     demand

# Certificat de la CA
TLS_CACERTDIR   /etc/openldap/cacerts

Comme pour la machine serveur, on place le certificat de l'autorité de certification dans le répertoire /etc/openldap/cacerts de chaque machine afin que les clients puissent vérifier la validité du certificat du serveur.

Pour que le client LDAP puisse trouver le bon certificat (il peut y en avoir plusieurs), il faut créer un lien avec le hash du certificat:

cacertdir_rehash /etc/openldap/cacerts

Sur chaque machine et pour chaque utilisateur autorisé à se connecter au LDAP, on créé un fichier .ldaprc dans le répertoire home des utilisateurs ($HOME):

# ==============================================================================
# PARAMETRES DE CONNEXION PAR DEFAUT DES CLIENTS LDAP
# Copyright 2006 by MINETTI JP
# ==============================================================================


# Certificat x509 du client
TLS_CERT        /etc/pki/tls/certs/mout.pem

# Clés du certificat
TLS_KEY         /etc/pki/tls/private/mout.key

On génère la demande de certificat du client auprès de l'autorité de certification (CA):

openssl genrsa -out mout.key 1024
openssl req -new -key mout.key -out mout.req

L'autorité de certification (CA) accepte la demande et procède à la signature du certificat:

openssl ca -in mout.req -extensions v3_ca -out mout.pem -days 3650

L'autorité de certification (CA) retourne un certificat signé valable pour 10 ans. Le fichier mout.pem qui contient ce certificat, et le fichier mout.key qui contient le couple clé privée/publique seront placés dans le répertoire /etc/pki/tls/certs et /etc/pki/tls/private.

ATTENTION: Si SELinux est activé et que les certificats se trouvent dans une autre arborescence que /etc/pki, il est impératif de positionner les contextes SELinux des fichiers contenant les certificats sur cert_t. Sans cela, le serveur LDAP ne pourrait pas avoir accès à ses certificats:

chcon -R -u system_u /var/minetti/pki
semanage fcontext -a -t cert_t '/var/minetti/pki(/.*)?'
restorecon -R -v /var/minetti

Démarrage/arrêt du serveur LDAP

  • Pour démarrer le serveur:
/sbin/service ldap start
  • Pour arrêter le serveur:
/sbin/service ldap stop
  • Pour redémarrer le serveur:
/sbin/service ldap restart
  • Pour connaître l'état du serveur:
/sbin/service ldap status

Peuplement du LDAP

Pour peupler le LDAP, on créé un fichier d'import au format LDIF (import.ldif):

blabla 

La commande suivante permet de crypter les mots de passe:

slappasswd -s "xxxxxxxxxxxxxx"

Puis on procède à l'import:

ldapadd -W -x -v -ZZ -D "cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" -f import.ldif

Fichier /etc/openldap/access.conf

# ==============================================================================
# CONFIGURATION SERVEUR LDAP: Droits d'accès
# Copyright 2006 by MINETTI JP
# ==============================================================================
# dn.base       Acces au noeud uniquement
# dn.one        Acces enfant direct du noeud
# dn.subtree    Acces au noeud et a ses descendants
# dn.children   Acces aux descendants du noeud (mais pas au noeud)
# ==============================================================================


# Accès sysaccount.localnet.minetti.org
access to dn.base="ou=sysaccount,ou=localnet,dc=minetti,dc=org"
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn.regex="^cn=([^,]+),ou=sysaccount,ou=localnet,dc=minetti,dc=org$" read
       by * none
access to dn.children="ou=sysaccount,ou=localnet,dc=minetti,dc=org"
          attrs="userPassword"
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by self read
       by anonymous auth
       by * none
access to dn.children="ou=sysaccount,ou=localnet,dc=minetti,dc=org"
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by self read
       by * none

# Accès people.localnet.minetti.org
access to dn.base="ou=people,ou=localnet,dc=minetti,dc=org"
          attrs=objectClass,top,organizationalUnit
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=nss,ou=sysaccount,ou=localnet,dc=minetti,dc=org" read
       by dn="cn=samba,ou=sysaccount,ou=localnet,dc=minetti,dc=org" read
       by dn="cn=contact,ou=sysaccount,ou=localnet,dc=minetti,dc=org" read
       by * none
access to dn.base="ou=people,ou=localnet,dc=minetti,dc=org"
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=nss,ou=sysaccount,ou=localnet,dc=minetti,dc=org" read
       by dn="cn=samba,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=contact,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by * none
access to dn.children="ou=people,ou=localnet,dc=minetti,dc=org"
          filter="objectClass=posixAccount"
          attrs=userPassword
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=nss,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=samba,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by self write
       by anonymous auth
       by * none
access to dn.children="ou=people,ou=localnet,dc=minetti,dc=org"
          filter="objectClass=posixAccount"
          attrs=shadowlastchange
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=nss,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=samba,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by self write
       by * none
access to dn.subtree="uid=admin,ou=people,ou=localnet,dc=minetti,dc=org"
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=nss,ou=sysaccount,ou=localnet,dc=minetti,dc=org" read
       by dn="cn=samba,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by self read
       by * none
access to dn.children="ou=people,ou=localnet,dc=minetti,dc=org"
          filter="objectClass=sambaSamAccount"
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=nss,ou=sysaccount,ou=localnet,dc=minetti,dc=org" read
       by dn="cn=samba,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=contact,ou=sysaccount,ou=localnet,dc=minetti,dc=org" read
       by self read
       by * none
access to dn.children="ou=people,ou=localnet,dc=minetti,dc=org"
          filter="objectClass=shadowAccount"
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=nss,ou=sysaccount,ou=localnet,dc=minetti,dc=org" read
       by dn="cn=samba,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=contact,ou=sysaccount,ou=localnet,dc=minetti,dc=org" read
       by self read
       by * none
access to dn.children="ou=people,ou=localnet,dc=minetti,dc=org"
          filter="objectClass=posixAccount"
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=nss,ou=sysaccount,ou=localnet,dc=minetti,dc=org" read
       by dn="cn=samba,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=contact,ou=sysaccount,ou=localnet,dc=minetti,dc=org" read
       by self read
       by * none
access to dn.children="ou=people,ou=localnet,dc=minetti,dc=org"
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=contact,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by * none

# Accès group.localnet.minetti.org
access to dn.base="ou=group,ou=localnet,dc=minetti,dc=org"
          attrs=objectClass,top,organizationalUnit
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=nss,ou=sysaccount,ou=localnet,dc=minetti,dc=org" read
       by dn="cn=samba,ou=sysaccount,ou=localnet,dc=minetti,dc=org" read
       by * none
access to dn.base="ou=group,ou=localnet,dc=minetti,dc=org"
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=nss,ou=sysaccount,ou=localnet,dc=minetti,dc=org" read
       by dn="cn=samba,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by * none
access to dn.children="ou=group,ou=localnet,dc=minetti,dc=org"
          filter="objectClass=sambaGroupMapping"
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=samba,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=nss,ou=sysaccount,ou=localnet,dc=minetti,dc=org" read
       by * none
access to dn.children="ou=group,ou=localnet,dc=minetti,dc=org"
          filter="objectClass=posixGroup"
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=samba,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=nss,ou=sysaccount,ou=localnet,dc=minetti,dc=org" read
       by * none
access to dn.children="ou=group,ou=localnet,dc=minetti,dc=org"
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by * none

# Accès hosts.localnet.minetti.org
access to dn.base="ou=hosts,ou=localnet,dc=minetti,dc=org"
          attrs=objectClass,top,organizationalUnit
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=nss,ou=sysaccount,ou=localnet,dc=minetti,dc=org" read
       by dn="cn=samba,ou=sysaccount,ou=localnet,dc=minetti,dc=org" read
       by * none
access to dn.base="ou=hosts,ou=localnet,dc=minetti,dc=org"
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=nss,ou=sysaccount,ou=localnet,dc=minetti,dc=org" read
       by dn="cn=samba,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by * none
access to dn.children="ou=hosts,ou=localnet,dc=minetti,dc=org"
          filter="objectClass=posixAccount"
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=samba,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by * none
access to dn.children="ou=hosts,ou=localnet,dc=minetti,dc=org"
          filter="objectClass=ipHost"
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=nss,ou=sysaccount,ou=localnet,dc=minetti,dc=org" read
       by dn="cn=samba,ou=sysaccount,ou=localnet,dc=minetti,dc=org" read
       by * none
access to dn.children="ou=hosts,ou=localnet,dc=minetti,dc=org"
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by * none

# Accès IDMAP
access to dn.base="ou=idmap,ou=localnet,dc=minetti,dc=org"
          attrs=objectClass,top,organizationalUnit
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=samba,ou=sysaccount,ou=localnet,dc=minetti,dc=org" read
       by * none
access to dn.base="ou=idmap,ou=localnet,dc=minetti,dc=org"
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=samba,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by * none
access to dn.children="ou=idmap,ou=localnet,dc=minetti,dc=org"
          filter="objectClass=sambaIdmapEntry"
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=samba,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by * none
access to dn.children="ou=idmap,ou=localnet,dc=minetti,dc=org"
          filter="objectClass=sambaUNIXIdPool"
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=samba,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by * none
access to dn.children="ou=idmap,ou=localnet,dc=minetti,dc=org"
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by * none

# Accès services.localnet.minetti.org
access to dn.subtree="ou=services,ou=localnet,dc=minetti,dc=org"
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=nss,ou=sysaccount,ou=localnet,dc=minetti,dc=org" read
       by * none

# Accès protocols.localnet.minetti.org
access to dn.subtree="ou=protocols,ou=localnet,dc=minetti,dc=org"
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=nss,ou=sysaccount,ou=localnet,dc=minetti,dc=org" read
       by * none

# Accès netgroup.localnet.minetti.org
access to dn.subtree="ou=netgroup,ou=localnet,dc=minetti,dc=org"
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=nss,ou=sysaccount,ou=localnet,dc=minetti,dc=org" read
       by * none

# Accès autofs.localnet.minetti.org
access to dn.subtree="ou=autofs,ou=localnet,dc=minetti,dc=org"
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=nss,ou=sysaccount,ou=localnet,dc=minetti,dc=org" read
       by * none

# Accès localnet.minetti.org
access to dn.base="ou=localnet,dc=minetti,dc=org"
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=nss,ou=sysaccount,ou=localnet,dc=minetti,dc=org" read
       by dn="cn=samba,ou=sysaccount,ou=localnet,dc=minetti,dc=org" read
       by dn="cn=contact,ou=sysaccount,ou=localnet,dc=minetti,dc=org" read
       by * none
access to dn.one="ou=localnet,dc=minetti,dc=org"
          filter="objectClass=sambaDomain"
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=samba,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by * none
access to dn.one="ou=localnet,dc=minetti,dc=org"
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by * none

# Accès tomcat.appli.minetti.org
access to dn.base="ou=tomcat,ou=appli,dc=minetti,dc=org"
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=tomcat,ou=sysaccount,ou=localnet,dc=minetti,dc=org" read
       by * read
access to dn.children="ou=tomcat,ou=appli,dc=minetti,dc=org"
          attrs=userPassword
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=tomcat,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by self write
       by anonymous auth
       by * read
access to dn.children="ou=tomcat,ou=appli,dc=minetti,dc=org"
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=tomcat,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by self read
       by * read

# Accès appli.minetti.org
access to dn.base="ou=appli,dc=minetti,dc=org"
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=tomcat,ou=sysaccount,ou=localnet,dc=minetti,dc=org" read
       by * read

# Accès test.minetti.org
access to dn.base="ou=test,dc=minetti,dc=org"
          attrs=objectClass,top,organizationalUnit
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by * read
access to dn.base="ou=test,dc=minetti,dc=org"
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=test,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by * read
access to dn.children="ou=test,dc=minetti,dc=org"
          attrs=userPassword
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=test,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by self write
       by anonymous auth
       by * none
access to dn.children="ou=test,dc=minetti,dc=org"
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by dn="cn=test,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by self write
       by * read

# Accès minetti.org
access to dn.base="dc=minetti,dc=org"
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by * read
access to dn.subtree="dc=minetti,dc=org"
       by dn="cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" write
       by * none

# Accès par défaut
access to *
       by users read
       by anonymous auth

Test

Pour valider la configuration de notre serveur, on procèdera à quelques tests.

  • Pour lister tous le contenu du LDAP:
ldapsearch -vx -ZZ -D "cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" -W "(objectClass=*)"
  • Pour lister les informations d'un utilisateur (myUID):
ldapsearch -vx -ZZ -D "cn=admin,ou=sysaccount,ou=localnet,dc=minetti,dc=org" -W "(uid=myUID)"
  • Pour vérifier l'accès d'un utilisateur (myUID):
ldapsearch -vx -ZZ -D "uid=myUID,ou=people,ou=localnet,dc=minetti,dc=org" -W "(objectClass=*)"

Authentification LDAP avec NSS et PAM

NSS et PAM permettent l'authentification sous Linux.

Fichier /etc/ldap.conf

# ==============================================================================
# PARAMETRES DE CONNEXION DE PAM_LDAP & NSS_LDAP
# Copyright 2006 by MINETTI JP
# ==============================================================================


# ==============================================================================
# CONNEXION
# ==============================================================================

uri                             ldap://ldap.srv.minetti.org/
base                            dc=minetti,dc=org
ldap_version                    3


# ==============================================================================
# TLS
# ==============================================================================

# Activation du protocole TLS
ssl                             start_tls

# Vérifier le certificat du serveur
tls_checkpeer                   yes

# Spéfications des algorithmes de chiffrement
tls_ciphers                     HIGH:MEDIUM:+SSLv2

# Certificat de la CA
tls_cacertfile                  /etc/openldap/cacerts/ca.pem

# Certificat x509 du client
tls_cert                        /etc/pki/tls/certs/mout.pem

# Clés du certificat
tls_key                         /etc/pki/tls/private/mout.key


# ==============================================================================
# GENERAL
# ==============================================================================

timelimit                       5
bind_timelimit                  5
bind_policy                     soft
idle_timelimit                  3600

# Utilisateur pour la connexion au serveur LDAP
binddn                          cn=nss,ou=sysaccount,ou=localnet,dc=minetti,dc=org
bindpw                          XXXXXXXXXXXXXXX

# Type de parcours de recherche
scope                           one


# ==============================================================================
# Configuration PAM
# ==============================================================================

pam_password                    md5
pam_filter                      objectclass=posixAccount
pam_login_attribute             uid
pam_member_attribute            memberUid


# ==============================================================================
# Configuration NSS
# ==============================================================================

nss_base_passwd                 ou=people,ou=localnet,dc=minetti,dc=org?one
nss_base_shadow                 ou=people,ou=localnet,dc=minetti,dc=org?one
nss_base_group                  ou=group,ou=localnet,dc=minetti,dc=org?one
nss_base_hosts                  ou=hosts,ou=localnet,dc=minetti,dc=org?one
nss_base_services               ou=services,ou=localnet,dc=minetti,dc=org?one
nss_base_networks               ou=networks,ou=localnet,dc=minetti,dc=org?one
nss_base_protocols              ou=protocols,ou=localnet,dc=minetti,dc=org?one
nss_base_rpc                    ou=rpc,ou=localnet,dc=minetti,dc=org?one
nss_base_ethers                 ou=ethers,ou=localnet,dc=minetti,dc=org?one
nss_base_netmasks               ou=networks,ou=localnet,dc=minetti,dc=org?one
nss_base_bootparams             ou=ethers,ou=localnet,dc=minetti,dc=org?one
nss_base_aliases                ou=aliases,ou=localnet,dc=minetti,dc=org?one
nss_base_netgroup               ou=netgroup,ou=localnet,dc=minetti,dc=org?one

# Just assume that there are no supplemental groups for these named users
nss_initgroups_ignoreusers      root,ldap,named,avahi,haldaemon,dbus,radvd,tomcat,radiusd,news,mailman,nscd,gdm

Fichier /etc/pam.d/system-auth

#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      pam_env.so
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 500 quiet
auth        sufficient    pam_ldap.so use_first_pass
auth        required      pam_deny.so

account     sufficient    pam_unix.so broken_shadow
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 500 quiet
account     [default=bad success=ok user_unknown=ignore] pam_ldap.so
account     required      pam_permit.so

password    requisite     pam_cracklib.so try_first_pass retry=3
password    sufficient    pam_unix.so md5 shadow nullok try_first_pass use_authtok
password    sufficient    pam_ldap.so use_authtok
password    required      pam_deny.so

session     required      pam_limits.so
session     required      pam_unix.so
session     optional      pam_ldap.so

Fichier /etc/nsswitch.conf

# ==============================================================================
# CONFIGURATION NSS
# Copyright 2006 by MINETTI JP
# ==============================================================================


# Utilisateurs et groupes
passwd:     files ldap
shadow:     files ldap
group:      files ldap

# Machines du réseau
hosts:      files dns ldap

# Autres
bootparams: nisplus [NOTFOUND=return] files
ethers:     files
netmasks:   files
networks:   files
protocols:  files ldap
rpc:        files
services:   files ldap
netgroup:   nisplus ldap
publickey:  nisplus
automount:  files nisplus ldap
aliases:    files nisplus

SELinux et test

Si SELinux est activé et que les certificats se trouvent dans une autre arborescence que /etc/pki, il est impératif de positionner les contextes SELinux des fichiers contenant les certificats sur cert_t. Sans cela, PAM et NSS n'enverront pas leurs certificats au serveur LDAP:

chcon -R -u system_u /var/minetti/pki
semanage fcontext -a -t cert_t '/var/minetti/pki(/.*)?'
restorecon -R -v /var/minetti

Une fois tout ceci terminé, on peut tester une authentification. Mais avant, il ne faut pas oublier de redémarrer le démon NSCD:

service nscd restart

Authentification LDAP avec RADIUS

Authentification LDAP avec Apache

Applications PHP

Pour se connecter au LDAP, l'interpréteur PHP utilise le client OpenLDAP. La configuration de la connexion ne devrait donc pas représenter une difficulté. Toutefois, il faut s'assurer:

  • qu'un fichier .ldaprc est bien présent dans le répertoire home ($HOME) de l'utilisateur sous lequel le serveur Apache est lancé,
  • et que la variable d'environnement $HOME est bien positionné lors du lancement du serveur Apache.

Application PHPLDAPAdmin