mirroir readonly du Gitit wiki.evolix.org (attention, ne rien commiter/merger sur ce dépôt) https://wiki.evolix.org
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

456 lines
14 KiB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
  1. **Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été complètement révisée.**
  2. # Howto OpenLDAP
  3. * Documentation : <http://www.openldap.org/doc/admin24/>
  4. * Rôle Ansible
  5. [OpenLDAP](http://www.openldap.org) est une implémentation libre du protocole LDAP développée par The OpenLDAP Project.
  6. ## Installation
  7. ~~~
  8. # apt install slapd ldap-utils ldapvi shelldap
  9. $ /usr/sbin/slapd -VV
  10. @(#) $OpenLDAP: slapd (May 28 2017 16:59:46) $
  11. Debian OpenLDAP Maintainers <pkg-openldap-devel@lists.alioth.debian.org>
  12. # systemctl status slapd
  13. ● slapd.service - LSB: OpenLDAP standalone server (Lightweight Directory Access Protocol)
  14. Loaded: loaded (/etc/init.d/slapd; generated; vendor preset: enabled)
  15. Docs: man:systemd-sysv-generator(8)
  16. Tasks: 3 (limit: 4915)
  17. CGroup: /system.slice/slapd.service
  18. └─23686 /usr/sbin/slapd -h ldap:/// ldapi:/// -g openldap -u openldap -F /etc/ldap/slapd.d
  19. ~~~
  20. ## Configuration
  21. Depuis Debian 6, OpenLDAP stocke directement sa configuration et de son schéma dans l'arborescence *cn=config*.
  22. Notez que si vous êtes fainéant, il est toujours possible d'utiliser un bon vieux `slapd.conf`.
  23. Le contenu de cette arborescence est aussi stocké sous forme de fichiers, dans le répertoire `/etc/ldap/slapd.d/` et ceux-ci sont chargés au démarrage de OpenLDAP.
  24. Selon vos goûts, différentes commandes pour visualiser la configuration :
  25. ~~~
  26. # slapcat -b cn=config
  27. $ ldapsearch -xLLL -b cn=config -x -D cn=admin,cn=config -W
  28. # ldapvi -Y EXTERNAL -h ldapi:// -b cn=config
  29. ~~~
  30. Note : cette dernière commande peut nécessiter que l'ACL (`olcAccess`) suivante soit positionnée sur l'entrée _olcDatabase={0}config,cn=config_ :
  31. ~~~
  32. olcDatabase={0}config,cn=config
  33. objectClass: olcDatabaseConfig
  34. olcDatabase: {0}config
  35. olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth manage by * break
  36. olcRootDN: cn=admin,cn=config
  37. ~~~
  38. ### Modifier la configuration
  39. On pourra donc modifier la configuration à chaud via `ldapvi` ou tout simplement `ldapmodify` et de superbes fichiers LDIF.
  40. À savoir : lorsqu'on modifie à chaud la configuration, OpenLDAP met alors immédiatement à jour le contenu du fichier correspondant dans `/etc/ldap/slapd.d/` !
  41. Une autre possibilité est de stopper **slapd**, de modifier les fichiers LDIF dans _/etc/ldap/slapd.d/_ et de le redémarrer.
  42. Attention, cela risque de générer des warnings à propos de checksums sur les fichiers. Pour contourner cela, il faut ré-éditer les entrées à chaud pour que les dumps soient regénérés avec les bons checksums...
  43. Autre détail important, avant la version 2.5 il n'est pas possible de faire un delete à chaud sur une entrée de _cn=config_ !
  44. Il faut donc utiliser la méthode nécessitant l'arrêt de _slapd_, faire les modifications sur les fichiers LDIF et le relancer.
  45. ### Directives
  46. Pour gérer les logs, on utilise la directive _olcLogLevel_ dans l'entrée _cn=config_.
  47. Exemple pour désactiver les logs :
  48. ~~~
  49. cn=config
  50. olcLogLevel: 0
  51. ~~~
  52. ### Gestion des schémas
  53. Autrefois, il suffisait d'un simple _include_ vers un fichier .schema pour ajouter un schéma.
  54. Mais avec la configuration dans _cn=config_, il faut désormais convertir un schéma en LDIF puis l'injecter !
  55. Voici les étapes pour convertir un .schema en .ldif (exemple avec _amavis.schema_) :
  56. 1. Créer un fichier _/tmp/convert-to-ldap.conf_ contenant une seule ligne :
  57. ~~~
  58. include /etc/ldap/schema/amavis.schema
  59. ~~~
  60. 2. On lance la commande suivante :
  61. ~~~
  62. # mkdir /tmp/convert
  63. # slaptest -f /tmp/convert-to-ldap.conf -F /tmp/convert
  64. config file testing succeeded
  65. ~~~
  66. 3. On obtient donc un fichier LDIF : _/tmp/convert/cn\=config/cn\=schema/cn\=\{0\}amavis.ldif_
  67. Pour l'injecter, il faut le modifier :
  68. * ajouter le base DN en fin de 1ère ligne : cn=schema,cn=config
  69. * supprimer les dernières lignes du fichier spécifiques à LDAP : structuralObjectClass, entryUUID, creatorsName, etc.
  70. * renumérotation du _cn={0}_ (dn: et cn:) en fonction des schémas déjà existants
  71. On peut ainsi faire :
  72. ~~~
  73. # ldapadd -Y EXTERNAL -H ldapi:/// -f /tmp/convert/cn\=config/cn\=schema/cn\=\{0\}amavis.ldif
  74. SASL/EXTERNAL authentication started
  75. SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
  76. SASL SSF: 0
  77. adding new entry "cn={4}amavis,cn=schema,cn=config"
  78. ~~~
  79. Note : Si besoin, on peut bien sûr convertir plusieurs schémas d'un coup via un fichier _/tmp/convert-to-ldap.conf_ du type :
  80. ~~~
  81. include /etc/ldap/schema/core.schema
  82. include /etc/ldap/schema/collective.schema
  83. [...]
  84. include /etc/ldap/schema/monschema2.schema
  85. ~~~
  86. ### Gestion des ACL
  87. Les ACL s'ajoutent via des règles du type :
  88. ~~~
  89. olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by anonymous auth by dn="cn=admin,dc=example,dc=com" write by * none
  90. olcAccess: {1}to dn.base="" by * read
  91. olcAccess: {2}to * by self write by dn="cn=admin,dc=example,dc=com" write by peername.ip="127.0.0.1" read by * none
  92. ~~~
  93. /!\ en cas de réplication, bien penser à inclure l'utilisateur de réplication pour les attrs=userPassword,shadowLastChange sous peine
  94. de ne pas avoir de synchronisation des mots de passe !!!
  95. Pour ne pas avoir un annuaire lisible publiquement mais accessible depuis l'extérieur, on peut forcer l'authentification en remplaçant "by peername.ip="127.0.0.1" read" par :
  96. ~~~
  97. by users read by anonymous auth
  98. ~~~
  99. ### Réplication (master->slave)
  100. *Sur le master :*
  101. * Ajouter le module syncprov (dans l'objet cn=module{0},cn=config) :
  102. ~~~
  103. olcModuleLoad: {1}syncprov
  104. ~~~
  105. * Ajouter l'objet suivant :
  106. ~~~
  107. dn: olcOverlay={0}syncprov,olcDatabase={1}hdb,cn=config
  108. objectClass: olcOverlayConfig
  109. objectClass: olcSyncProvConfig
  110. olcOverlay: {0}syncprov
  111. structuralObjectClass: olcOverlayConfig
  112. entryUUID: b5786b24-6688-1030-8824-91503a3ebf6f
  113. creatorsName: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
  114. createTimestamp: 20110829124650Z
  115. entryCSN: 20110829124650.326464Z#000000#000#000000
  116. modifiersName: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
  117. modifyTimestamp: 20110829124650Z
  118. olcSpSessionlog: 100
  119. olcSpCheckpoint: 100 10
  120. ~~~
  121. * Créer l' _ou_ ldapuser et l'utilisateur _repl_, et lui donner les droits de lecture sur l'ensemble de l'arbre LDAP
  122. *Sur le slave :*
  123. * S'assurer que le schéma LDAP soit le même que sur le master
  124. * Ajouter le module syncprov (dans l'objet cn=module{0},cn=config) :
  125. ~~~
  126. olcModuleLoad: {1}syncprov
  127. ~~~
  128. * Ajouter les attributs suivants à l'objet "dn: olcDatabase={1}hdb,cn=config" :
  129. ~~~
  130. olcDbIndex: entryUUID eq
  131. olcSyncrepl: {0}rid=124 provider=ldap://ldap.example.com bindmethod=simple binddn="cn=repl,ou=ldapuser,dc=example,dc=com" credentials=XXX searchbase="dc=example,dc=com" retry="60 +" type=refreshAndPersist
  132. ~~~
  133. ### Gestion des index LDAP
  134. On configure des index ainsi :
  135. ~~~
  136. olcDbIndex: objectClass eq
  137. olcDbIndex: default eq
  138. olcDbIndex: phpgwContactOwner pres,eq,sub
  139. olcDbIndex: uidNumber,gidNumber pres,eq
  140. olcDbIndex: uid,mail eq,approx
  141. ~~~
  142. Attention, si l'on modifie les index, il faut absolument les regénérer avec la commande suivante :
  143. ~~~
  144. # /etc/init.d/slapd stop
  145. # sudo -u openldap slapindex
  146. # /etc/init.d/slapd start
  147. ~~~
  148. ### Activer SSL (LDAPS)
  149. Rajouter dans _cn=config_ :
  150. ~~~
  151. olcTLSCertificateFile: /etc/ssl/certs/ssl-cert-snakeoil.pem
  152. olcTLSCertificateKeyFile: /etc/ssl/private/ssl-cert-snakeoil.key
  153. olcTLSCACertificateFile: /etc/ssl/certs/cacert.pem
  154. ~~~
  155. Et dans */etc/default/slapd* par exemple :
  156. ~~~
  157. SLAPD_SERVICES="ldap://127.0.0.1:389/ ldapi:/// ldaps:///"
  158. ~~~
  159. Suite à cette mise en place, si en tentant de se connecter au serveur apparaît l'erreur `ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)`, il se peut que ça soit dû au certificat non reconnu. Pour désactiver la vérification du certificat, sur le client, ajouter cette ligne dans _/etc/ldap/ldap.conf_ :
  160. ~~~
  161. TLS_REQCERT never
  162. ~~~
  163. ## Utilisation
  164. ### ldapvi
  165. _ldapvi_ permet d'éditer un annuaire LDAP avec Vim.
  166. Pour ajouter une entrée, on fera donc :
  167. ~~~
  168. $ cat add.ldif
  169. dn: ou=test,dc=example,dc=com
  170. ou: test
  171. objectClass:
  172. $ ldapadd [-h <hostname>] -D uid=xxx,ou=xxx,dc=evolix,dc=net -f add.ldif -W
  173. add: 1, rename: 0, modify: 0, delete: 0
  174. Action? [yYqQvVebB*rsf+?] y
  175. Done.
  176. ~~~
  177. ### .ldaprc
  178. Le fichier _~/.ldaprc_ est utilisé pour les outils inclus dans `ldap-utils` il permet de définir des paramètres particulier.
  179. On peut notamment autoriser les certifications non reconnus :
  180. ~~~
  181. tls_reqcert never
  182. ~~~
  183. ## Backup
  184. Rien de plus simple :
  185. ~~~
  186. slapcat -l ldap.bak
  187. ~~~
  188. Cela dump l'arbre ldap dans un seul fichier LDIF. Cette sauvegarde n'inclut *pas* cn=config.
  189. Pour sauvegarder la configuration (ACLs, Schema...etc) :
  190. ~~~
  191. slapcat -b cn=config -l config.ldif
  192. ~~~
  193. ## Restauration
  194. ~~~
  195. /etc/init.d/slapd stop
  196. rm -rf /var/lib/ldap/*
  197. sudo -u openldap slapadd -l ldap.bak
  198. /etc/init.d/slapd start
  199. ~~~
  200. ## Infos sur les attributs LDAP
  201. ### Attributs pour authentification Windows
  202. *sambaPwdMustChange*: Timestamp Unix, date d'expiration du mot de passe Windows.
  203. *sambaKickoffTime*: Timestamp Unix, date d'expiration du compte Windows.
  204. *sambaPwdLastSet*: Timestamp Unix, dernière fois que le mot de passe a été changé. (Bizarrerie à ce propos...)
  205. ### Attributs pour authentification UNIX
  206. '''
  207. shadowExpire''': Durée en nombre de jours depuis le 1° Janvier 1970. Date d'expiration du compte.
  208. *shadowInactive*: Combien de jours il faut accepter un mot de passe qui a expiré.
  209. *shadowWarning*: Nombre de jours avant que le mot de passe expire et où le système va avertir de la proche expiration.
  210. *shadowFlag*: -1 ???
  211. *shadowLastChange*: Durée en nombre de jours depuis le 1° Janvier 1970 de la dernière fois que le mot de passe a été modifié (Ex: 15579 = 27/08/2012).
  212. *shadowMin*: Age minimum en jours avant que l'utilisateur puisse changer son mot de passe. (Défaut à 0 = quand il veut).
  213. *shadowMax*: Durée en jours de la validité du mot de passe. (Ex 365 = 1 an). Pour désactiver l'expiration du mot de passe, affecter la valeur -1.
  214. ## FAQ
  215. ### Changer un mot de passe LDAP
  216. Lors de l'exécution de la commande, un mot de passe sera demandé :
  217. ~~~
  218. slappasswd
  219. ~~~
  220. ### Logiciels pour gestion de l'annuaire
  221. #### Windows
  222. Client lourd : [http://www.ldapadmin.org/](http://www.ldapadmin.org/)
  223. ![Configurer la connexion au LDAP distant. Si pas de TLS activé, utiliser un tunnel SSH](/ldap_admin1.png)
  224. ![Rendu complet de l'annuaire](/ldap_admin2.png)
  225. ### could not parse entry
  226. Lors d'ajout/modification d'un annuaire LDAP, si vous obtenez un message de ce type :
  227. ~~~
  228. str2entry: invalid value for attributeType objectClass #0 (syntax 1.3.6.1.4.1.1466.115.121.1.38)
  229. slapadd: could not parse entry (line=70)
  230. structuralObjectClass: organizationalRole
  231. ~~~
  232. C'est sûrement dû au fait que vos schémas spécifiques ne sont pas pris en compte car _slapd_
  233. utilise la configuration présente dans _/etc/ldap/slapd.d_ si le dossier est présent.
  234. ### Insufficient access
  235. ~~~
  236. Uncaught exception from user code:
  237. Insufficient access at ./add.pl line 678, <STDIN> line 2.
  238. ~~~
  239. Vérifier dans les acl que votre utilisateur a le droit de modifier l'attribut que vous modifier.
  240. ### ldapvi ouvre avec nano
  241. Pour changer l’éditeur lors ouverture ldapvi :
  242. ~~~{ .bash }
  243. EDITOR=vim ldapvi
  244. ~~~
  245. ### Too many open files
  246. En wheezy bug rencontré :
  247. ~~~
  248. slapd[15245]: warning: cannot open /etc/hosts.deny: Too many open files
  249. ~~~
  250. Pour l'éviter ajouter dans /etc/default/slapd :
  251. ~~~
  252. ulimit -n 8192
  253. ~~~
  254. ### TLS init def ctx failed: -1
  255. Si vous obtenez un message du type :
  256. ~~~
  257. slapd: main: TLS init def ctx failed: -1
  258. ~~~
  259. Vérifiez que l'utilisation _openldap_ a bien accès aux clés privés et certificats définis dans sa configuration (vous pouvez utiliser `sudo -u openldap /bin/bash` pour vous en assurer).
  260. ### ldif_read_file: checksum error
  261. Le répertoire `/etc/ldap/slapd.d/cn=config/` à du être modifié (à ne pas faire lorsque **slapd** tourne), il vous faudra regenérer le checksum manuellement.
  262. On récupère le checksum actuel :
  263. ~~~
  264. # apt install libarchive-zip-perl
  265. # crc32 <(cat /etc/ldap/slapd.d/cn=config.ldif | tail -n +3)
  266. 42cd80b1
  267. ~~~
  268. On le modifie exceptionnellement à la place de l'ancien :
  269. ~~~
  270. vim /etc/ldap/slapd.d/cn=config.ldif
  271. ~~~
  272. Ce qui donnera ce résultat :
  273. ~~~
  274. # head -2 /etc/ldap/slapd.d/cn=config.ldif
  275. # AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
  276. # CRC32 42cd80b1
  277. ~~~
  278. ### Size limit exceeded
  279. La limite par défaut lors d'un ldapseach est de 500. On peut l'augmenter en modifiant l'attribut olcSizeLimit, avec par exemple `ldapvi -Y EXTERNAL -h ldapi:// -b cn=config`.
  280. ### no equality matching rule
  281. En cas d'erreur du type :
  282. ~~~
  283. ldap_modify: Inappropriate matching (18)
  284. additional info: modify/delete: foo_attribute: no equality matching rule
  285. ~~~
  286. Vérifiez que l'attribut concerné a bien une règle EQUALITY dans le schéma LDAP.
  287. Si ce n'est pas possible d'ajouter une règle EQUALITY dansle schéma LDAP (par exemple pour les SYNTAX binary comme jpegPhoto), n'utilisez pas ldapmodify (LDAP_MOD_REPLACE) mais plutôt suppression (et recréation si besoin) :
  288. ~~~
  289. $ cat delete.ldif
  290. dn: cn=foo,dc=example,dc=com
  291. changetype: modify
  292. delete: jpegPhoto
  293. $ ldapvi --ldapmodify delete.ldif
  294. ~~~
  295. ### no such value
  296. En cas d'erreur du type :
  297. ~~~
  298. > ldap_modify: No such attribute (16)
  299. > additional info: modify/delete: foo_attribute: no such value
  300. ~~~
  301. Vérifier que votre attribut n'a pas des caractères spéciaux (saut de ligne, etc.), vous pouvez notamment d'abord remplacer votre ligne avec une valeur "test" pour voir si cela fonctionne.
  302. ### TLS error
  303. Les erreurs SSL/TLS ne sont pas très explicites avec OpenLDAP, si vous en avez une, vérifiez d'abord que vos clés/certificats sont bien corrects avec des bons droits pour y accéder.