Migration d’openldap sur un nouveau serveur Ubuntu 12.04

Pour bien commencer l’année voici un article qui retrace la migration d’un serveur openldap vers un nouveau serveur.

Backup de l’ancien serveur

Sur l’ancien serveur il suffit de lancer cette commande en root.

slapcat | grep -v 'structuralObjectClass\|entryUUID\|creatorsName\|modifiersName\|createTimestamp\|modifyTimestamp\|entryCSN' > dump.ldif

Cette commande élague tous les attributs qui peuvent être gênant pour la migration sur le nouveau serveur.

Installation sur le nouveau serveur

L’installation se fait par les dépôts.

apt-get update
apt-get upgrade
apt-get install slapd ldap-utils

L’installateur demande quelque informations mais récupère le domaine automatiquement, c’est pourquoi j’utilise toujours l’outil de reconfiguration pour avoir la procédure complète.

dpkg-reconfigure slapd
Omit OpenLDAP server configuration ::: No
DNS domain name ::: domain.com
Organisation name ::: domain.com
Admin Password ::: xxxxxxx
Admin Password ::: xxxxxxx
Database backend to use  ::: HDB
Remove databases when slapd is purge ::: No
Move old databases :::: Yes
Alllow protocol 2 ::: No

Import des données sur le nouveau serveur

Apres avoir transmis le fichier dump.ldif sur le nouveau serveur (via un moyen securisé comme scp ou sftp), il nous suffit de l’importer en spécifiant le

cat dump.ldif | ldapadd -D cn=admin,dc=domain,dc=com -W

Pour verifier que tout est en place il suffit de faire :

slapcat 

Les Access Control openldap aka ACL

Comme le sujet ldap a l’air de bien intéresser, je rajoute une couche avec les Access Control, un sujet vaste et surtout une source de complexité et de sécurité.
Toutes les operations se font en tant qu’admin bien évidement.

    Listing

Pour lister les ACL en cours

ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -W -b cn=config '(olcDatabase={1}hdb)' olcAccess
dn: olcDatabase={1}hdb,cn=config
olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by anonymous auth by dn="cn=admin,dc=cyklodev,dc=com" write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by self write by dn="cn=admin,dc=cyklodev,dc=com" write by  * read

Pour en supprimer on peut spécifier la règle dans un fichier ldif mais c’est fastidieux.

    Remove
vim remove.ldif
dn: olcDatabase={1}hdb,cn=config
delete: olcAccess
olcAccess: to dn.base="" by * read
ldapmodify -Y EXTERNAL -H ldapi:/// -f remove.ldif

Mais on peut aussi le faire par id et la c’est plus cool

    Remove by id
vim remove.ldif
dn: olcDatabase={1}hdb,cn=config
delete: olcAccess
olcAccess: {1}
ldapmodify -Y EXTERNAL -H ldapi:/// -f remove.ldif

Comme la configuration de base permet une lecture de tout par tous les users, il vaut mieux commencer par tout enlever en passant par une boucle sur {0}.

Maintenant on peut rajouter ses propres règles comme celle qui exposait toutes les branches aux users :

    Add
vim add.ldif
dn: olcDatabase={1}hdb,cn=config
add: olcAccess
olcAccess: to dn.base="" by * read
ldapmodify -Y EXTERNAL -H ldapi:/// -f add.ldif

A éviter bien sur !

Il reste maintenant a exploiter correctement les fonctionnalités des ACL avec quelques règles a savoir :

Les ACL sont appliquées par ordre croissant {id}

Au premier match la règle est appliquée

Aucune mise en production sans tests avec table de vérité sur les cas

Pour faciliter la gestion quelques fonctionnalités sont ajoutées :

 0: o=suffix
    1: cn=Manager,o=suffix
    2: ou=people,o=suffix
    3: uid=kdz,ou=people,o=suffix
    4: cn=addresses,uid=kdz,ou=people,o=suffix
    5: uid=hyc,ou=people,o=suffix
    dn.base="ou=people,o=suffix" match 2;
    dn.one="ou=people,o=suffix" match 3, and 5;
    dn.subtree="ou=people,o=suffix" match 2, 3, 4, and 5; and
    dn.children="ou=people,o=suffix" match 3, 4, and 5.

Source : Doc OpenLdap 2.4

Installation de Apache Directory Server aka ApacheDS 2.0.0-M7

Pour rester dans le registre ldap mais en innovant un peu voici ApacheDS soit le protocole LDAP mais remis au gout du jour et en Java.
Autant le dire tout de suite la documentation n’est pas tres presente mais bon voila les lignes directrices.

Pre requis : Java 1.6+
Attention : Vulnerabilité pour la version 1.5.X https://blogs.reucon.com/srt/vulnerability-in-apacheds-1-5-10878/
Download : http://directory.apache.org/apacheds/2.0/downloads.html

On installe

chmod +x apacheds-2.0.0-M7-amd64.deb
dpkg -i apacheds-2.0.0-M7-amd64.deb

On configure le tout en faisant attention car la version 2.0 abandonne la configuration par xml pour une configuration par ldif

* Position des fichiers

moteur   : /opt/apacheds-2.0.0-M7/
instance : /var/lib/apacheds-2.0.0-M7/
init         : /etc/init.d/

* Configuration des ports

vim /var/lib/apacheds-2.0.0-M7/default/conf/config.ldif
dn: ads-transportid=ldap,ou=transports,ads-serverId=ldapServer,ou=servers,ads-directoryServiceId=default,ou=config
dn: ads-transportid=ldap,ou=transports,ads-serverId=ldapServer,ou=servers,ads-directoryServiceId=default,ou=config

* Ajouter sa propre partition
Attention la version 2.0 demande d’avoir la nouvelle version du Studio http://directory.apache.org/studio/apache-directory-studio-20.html

* Ouvrir le Studio et ajouter un server avec comme user et comme password

uid=admin,ou=system
default

* Clic droit sur le serveur > Open configuration > Partition > Add
* On redemarre le serveur
Attention encore car il y a un bug dans le Studio sur l’attribut krbprincipalname qui est en fait krb5principalname

ERR_04269 ATTRIBUTE_TYPE for OID krbprincipalname does not exist!

Avec ca vous pouvez vous faire une idee de la bete. Beaucoup de choses sont encore a ameliorer mais c’est un ldap en bonne et due forme.

Installation de Ldap sur Ubuntu 12.04 lts

Apres un update de l’os, voici les grandes lignes d’installation d’un ldap.

* La premiere chose est de renseigner le domaine dans le fichier /etc/hosts

vim /etc/hosts
192.168.1.100      cyklodev.com

* Ensuite la phase habituelle d’installation

apt-get update && apt-get upgrade
apt-get install slapd ldap-utils

* On ajoute le logging

vim logging_mode.ldif
dn: cn=config
changetype: modify
add: olcLogLevel
olcLogLevel: stats

Et on applique

ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f logging_mode.ldif

* On privilegie l’uid

vim uid.ldif
dn: olcDatabase={1}hdb,cn=config
changetype: modify
add: olcDbIndex
olcDbIndex: uid eq,pres,sub

Et on applique

ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f uid.ldif

* A partir de la vous pouvez importer ou écrire votre schema

vim base.ldif
dn: dc=cyklodev,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: fcm.auth
dc: fcm
structuralObjectClass: organization
entryUUID: 6aeb2de0-90a2-1031-93c1-81fe910c2d7d
creatorsName: cn=admin,dc=cyklodev,dc=com
createTimestamp: 20120911212138Z
entryCSN: 20120911212138.672114Z#000000#000#000000
modifiersName: cn=admin,dc=cyklodev,dc=com
modifyTimestamp: 20120911212138Z

dn: cn=admin,dc=cyklodev,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword::kikoumotdepasse.lol=
structuralObjectClass: organizationalRole
entryUUID: 6afb378a-90a2-1031-93c2-81fe910c2d7d
creatorsName: cn=admin,dc=cyklodev,dc=com
createTimestamp: 20120911212138Z
entryCSN: 20120911212138.777226Z#000000#000#000000
modifiersName: cn=admin,dc=cyklodev,dc=com
modifyTimestamp: 20120911212138Z

dn: ou=groups,dc=cyklodev,dc=com
ou: groups
objectClass: organizationalUnit
objectClass: top
structuralObjectClass: organizationalUnit
entryUUID: 8104d98c-90a2-1031-9ecd-832c825e9c60
creatorsName: cn=admin,dc=cyklodev,dc=com
createTimestamp: 20120911212215Z
entryCSN: 20120911212215.750231Z#000000#000#000000
modifiersName: cn=admin,dc=cyklodev,dc=com
modifyTimestamp: 20120911212215Z

dn: ou=users,dc=cyklodev,dc=com
ou: users
objectClass: organizationalUnit
objectClass: top
structuralObjectClass: organizationalUnit
entryUUID: 8bfed72a-90a2-1031-9ece-832c825e9c60
creatorsName: cn=admin,dc=cyklodev,dc=com
createTimestamp: 20120911212234Z
entryCSN: 20120911212234.165787Z#000000#000#000000
modifiersName: cn=admin,dc=cyklodev,dc=com
modifyTimestamp: 20120911212234Z

* Et on applique

ldapadd -x -D cn=admin,dc=cyklodev,dc=com -w motdepasse -f base.ldif

* Pour le backup rien de plus simple :

slapcat -v -l dump-ldap.ldif

Pour reconfigurer le serveur ldap

dpkg-reconfigure slapd