# -*- mode: python; coding: utf-8 -*- include("ip") header("Serveur LDAP") @####################################################################### @# Directives globales: @ @# On permet le binding en version 2 pour login_ldap sur ragnarok @allow bind_v2 @ @# Définition des schémas et objectClasses @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/amavis.schema @include /etc/ldap/schema/dyngroup.schema @include /etc/ldap/schema/crans.schema @ @# Emplacement du pidfile @pidfile /var/run/slapd/slapd.pid @ @# Arguments passés au serveur @argsfile /var/run/slapd/slapd.args @ @# Niveau de journalisation @loglevel 0 @ @# Stockage des modules @modulepath /usr/lib/ldap @moduleload back_bdb @moduleload dynlist if has("db-main"): @moduleload syncprov @ @# Limitation du nombre de réponses @sizelimit 1000000000 @ @# Méthode pour crypter les mots de passe @password-hash {SSHA} @ @####################################################################### @# Directives de configuration pour le backend bdb @backend bdb @ @####################################################################### @# Configuration de la base de données principale @database bdb @ @# Base de recherche principale @suffix "dc=crans,dc=org" @ @# Répertoire de stockage de la base de données @directory "/var/lib/ldap" @ @# Pour générer dynamiquement les membres des groupes posix @overlay dynlist @dynlist-attrset groupeCrans memberURL memberUid:uid @ @# Options d'indexation pour la base de données @index entryUUID,entryCSN eq @index objectClass,memberUid,uid,uidNumber eq @index cn,sn eq,approx,sub @index mailAlias,mail,canonicalAlias eq @index macAddress eq @index nom,host,hostAlias eq,approx,sub @index chbre eq,subinitial @index paiement,droits eq @ @# Sauvegarde des timestamps de modifications des objets @lastmod on @ if has("db-main"): @# Overlay pour la synchronisation par syncprov @overlay syncprov @syncprov-checkpoint 100 10 @syncprov-sessionlog 100 else: include("secrets") rid = admip() # L'identifiant du réplica est choisi comme étant la dernière partie de l'adresse ip rid = rid[rid.rfind(".")+1:] @# Réplication de la base @# LDAP a besoin de la déclaration du rootdn @rootdn "cn=admin,dc=crans,dc=org" @ @# SyncRepl out("syncrepl rid=%s" % (rid,)) @ provider=ldap://vert.adm.crans.org @ searchbase="dc=crans,dc=org" @ type=refreshAndPersist out(' binddn="%s"' % (secrets.ldap_replica_auth_dn,)) @ bindmethod=simple out(' credentials=%s' % (secrets.ldap_replica_password,)) @ retry="30 20 300 3" @ @# Redirection des requêtes en écriture, ... @updateref ldap://vert.adm.crans.org @ @# L'attribut userPassword doit pouvoir être écrit uniquement par @# soi-même, l'admin, les replicas. Dovecot peut le lire, et on peut @# s'authentifier avec anonymement @ @access to attrs=userPassword if not has("db-replicat-test"): @ by dn.regex="cn=admin,dc=crans,dc=org" write @ by dn.regex="cn=replica,dc=crans,dc=org" write @ by dn.regex="cn=dovecot,dc=crans,dc=org" read @ by anonymous auth @ by self write @ by * none @ @# Permettre l'accès à la base pour des trucs comme @# "supportedSASLMechanisms", pour éviter des problèmes @# possibles si les méthodes SASL ne sont pas connues. @access to dn.base="" by * read @ @# Pour postfix @access to dn.regex="^(a|c)id=[0-9]+,ou=data,dc=crans,dc=org$$" @ attrs=mailAlias,canonicalAlias,uid,mail,entry,objectClass,contourneGreylist,rewriteMailHeaders @ by dn.regex="cn=postfix,dc=crans,dc=org" read @ by * break @ @# Pour intranet @access to dn.regex="^(a|c)id=[0-9]+,ou=data,dc=crans,dc=org$$" @ attrs=uid,entry,objectClass @ by dn.regex="cn=intranet,dc=crans,dc=org" read @ by * break @ @# Pour dovecot @access to dn.regex="^(a|c)id=[0-9]+,ou=data,dc=crans,dc=org$$" @ attrs=uid,homeDirectory,uidNumber,gidNumber,userPassword,objectClass,entry @ by dn.regex="cn=dovecot,dc=crans,dc=org" read @ by * break @ @# Informations accessibles à tous @access to dn.regex="^(a|c)id=[0-9]+,ou=data,dc=crans,dc=org$$" @ attrs=uid,homeDirectory,uidNumber,gidNumber,gecos,objectClass,entry @ by anonymous read @ by * break @ @access to dn="ou=data,dc=crans,dc=org" @ by anonymous search @ by * break @ @access to dn.subtree="ou=Group,dc=crans,dc=org" @ by anonymous read @ by * break @ @# L'admin et la réplication peut tout lire @# can read everything. @access to * @ by dn.regex="cn=admin,dc=crans,dc=org" write @ by dn.regex="cn=replica,dc=crans,dc=org" write @ by sockname.regex="ldapi" read @ by dn.regex="cn=readonly,dc=crans,dc=org" read @ by self read @ by * none