projet_serveur_krkn/applicatif/zone_interne/ldap/serveur_ldap.md

28 KiB
Raw Permalink Blame History

LDAP

Nous allons ici mettre en place le serveur LDAP qui sera répliqué sur les deux nodes. Tout les services utiliseront LDAP pour l'authentification des utilisateurs. A noté que pour des questions pratique nous n'allons pas utilisé Fusion Directory, il faudra donc créer un schéma pour chaque service et modifier les utilisateur avec ldapadd et ldapmodify. Pour la sécurisation de LDAP nous allons utiliser LDAP avec StartTLS.

Le conteneur

Numéro 108 (Alpha)

Interface réseau

  • eth0 : vmbr1 / VLAN 30 / IP 10.0.2.1 / GW 10.0.2.254

Le proxy

/etc/apt/apt.conf.d/01proxy

Acquire::http {
 Proxy "http://10.0.0.252:9999";
};

Installation slapd

On commence par installer le serveur ldap.

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

Configuration de sladp

On commence par reconfigurer le packet

dpkg-reconfigure slapd

Il faut répondre de la manière suivante

Omit OpenLDAP server configuration? No
DNS domain name: krhacken.org
Organization name? Kr[HACK]en
Administrator password: PASSWORD
Confirm password: PASSWORD
Database backend to use: MDB
Do you want the database to be removed when slapd is purged? Yes
Move old database? Yes

Centralisation des fichiers de configuration

Nous allons créer un répertoire /root/ldap/conf qui va centraliser tous nos fichiers de configuration

mkdir -p /root/ldap/conf/

Stockage du mot de passe administrateur

Mettez le mot de passe d'administration de l'annuaire LDAP.

echo -n "mdpadmin" > /root/pwdldap
chmod 600 /root/pwdldap

Mise en place SSL

apt-get install -y gnutls-bin ssl-cert
mkdir /etc/ssl/templates

/etc/ssl/templates/ca_server.conf

cn = LDAP Server CA - Kr[HACK]en
ca
cert_signing_key

/etc/ssl/templates/ldap_server.conf

organization = "krhacken"
cn = *.ldap.krhacken.org
tls_www_server
encryption_key
signing_key
expiration_days = 3650

CA clé et certificat

certtool -p --outfile /etc/ssl/private/ca_server.key
certtool -s --load-privkey /etc/ssl/private/ca_server.key --template /etc/ssl/templates/ca_server.conf --outfile /etc/ssl/certs/ca_server.pem

LDAP clé et certificat

certtool -p --sec-param high --outfile /etc/ssl/private/ldap_server.key
certtool -c --load-privkey /etc/ssl/private/ldap_server.key --load-ca-certificate /etc/ssl/certs/ca_server.pem --load-ca-privkey /etc/ssl/private/ca_server.key --template /etc/ssl/templates/ldap_server.conf --outfile /etc/ssl/certs/ldap_server.pem

Nous avons maintenant créer tout les certificats nécessaire pour pouvoir chiffrer LDAP avec STARTTLS.

Chiffrement par STARTTLS

Nous avons choisi STARTTLS au lieu de LDAPS car il est plus sûr pour notre usage.

Gestion des permissions

usermod -aG ssl-cert openldap
chown :ssl-cert /etc/ssl/private/ldap_server.key
chmod 640 /etc/ssl/private/ldap_server.key

Ajout des certificat à OpenLDAP

/root/ldap/conf/addCAcerts.ldif

dn: cn=config
changetype: modify
replace: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ssl/certs/ca_server.pem

Application des modification et redémarrage de slapd

ldapmodify -H ldapi:// -Y EXTERNAL -f /root/ldap/conf/addCAcerts.ldif
service slapd force-reload

/root/ldap/conf/addcerts.ldif

dn: cn=config
changetype: modify
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/ldap_server.key
-
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/ldap_server.pem

Application des modification et redémarrage de slapd

ldapmodify -H ldapi:// -Y EXTERNAL -f /root/ldap/conf/addcerts.ldif
service slapd force-reload

Le retour de la commande

ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config | grep olcTLS

doit contenir les informations ci-dessous, cela confirme l'installation des certificats.

olcTLSCACertificateFile: /etc/ssl/certs/ca_server.pem
olcTLSCertificateFile: /etc/ssl/certs/ldap_server.pem
olcTLSCertificateKeyFile: /etc/ssl/private/ldap_server.key

Sur le serveur

cp /etc/ssl/certs/ca_server.pem /etc/ldap/ca_certs.pem

Il faut ensuite ajuster la configuration en modifiant les paramètres de connexions

/etc/ldap/ldap.conf

BASE dc=krhacken,dc=org
URI ldap://alpha.ldap.krhacken.org/
TLS_CACERT /etc/ldap/ca_certs.pem

On redémarre le serveur slapd.

service slapd force-reload

Vérification

La commande ldapsearch -xLLL -H ldap://alpha.ldap.krhacken.org -ZZ doit retourner des informations sur l'arbre.

Droits d'accès pour la configuration

/root/ldap/conf/acces-conf-admin.ldif

dn: olcDatabase={0}config,cn=config
changeType: modify
add: olcAccess
olcAccess: to * by dn.exact=cn=admin,dc=krhacken,dc=org manage by * break

Puis on applique le .ldif

ldapmodify -Y external -H ldapi:/// -f acces-conf-admin.ldif

Les overlays

Les overlays sont des fonctionnalités supplémentaires.

Voici l'ensemble des overlays que nous allons utiliser

MemberOf

Loverlay memberof permet de savoir dans quels groupes se trouve un utilisateur.

/root/ldap/conf/memberof_act.ldif

dn: cn=module,cn=config
cn:module
objectclass: olcModuleList
objectclass: top
olcmoduleload: memberof.la
olcmodulepath: /usr/lib/ldap

/root/ldap/conf/memberof_conf.ldif

dn: olcOverlay=memberof,olcDatabase={1}mdb,cn=config
changetype: add
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: olcConfig
objectClass: top
olcOverlay: memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfNames
olcMemberOfMemberAD: member
olcMemberOfMemberOfAD: memberOf

On applique les modifications

ldapadd -Y EXTERNAL -H ldapi:/// -f memberof_act.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f memberof_conf.ldif

Vérification

ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b "cn=config" "Objectclass=olcModuleList"

refint

L'overlay permet de sassurer de la cohérence de lannuaire lors de suppression dentrées.

/root/ldap/conf/refint_act.ldif

dn: cn=module,cn=config
cn: module
objectclass: olcModuleList
objectclass: top
olcmoduleload: refint.la
olcmodulepath: /usr/lib/ldap

/root/ldap/conf/refint_conf.ldif

dn: olcOverlay=refint,olcDatabase={1}mdb,cn=config
objectClass: olcConfig
objectClass: olcOverlayConfig
objectClass: olcRefintConfig
objectClass: top
olcOverlay: refint
olcRefintAttribute: memberof member manager owner
olcRefintNothing: cn=admin,dc=krhacken,dc=org

On applique les modifications

ldapadd -Q -Y EXTERNAL -H ldapi:/// -f refint_act.ldif
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f refint_conf.ldif

Vérifications

ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b "cn=config" "Objectclass=olcModuleList"
ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b "cn=config" "Objectclass=olcRefintConfig"

Audit Log

Cet overlay audite chaque modification faites sur lannuaire, les logs seront dans /var/log/openldap/audit.ldif

/root/ldap/conf/auditlog_act.ldif

dn: cn=module,cn=config
cn: module
objectclass: olcModuleList
objectclass: top
olcModuleLoad: auditlog.la
olcmodulepath: /usr/lib/ldap

/root/ldap/conf/auditlog_conf.ldif

dn: olcOverlay=auditlog,olcDatabase={1}mdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcAuditLogConfig
olcOverlay: auditlog
olcAuditlogFile: /var/log/openldap/auditlog.ldif

On applique les modifications

ldapadd -Q -Y EXTERNAL -H ldapi:/// -f auditlog_act.ldif
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f auditlog_conf.ldif

On créer le fichier

mkdir /var/log/openldap
chmod 755 /var/log/openldap
chown openldap:openldap /var/log/openldap
touch /var/log/openldap/auditlog.ldif
chmod 755 /var/log/openldap/auditlog.ldif
chown openldap:openldap /var/log/openldap/auditlog.ldif

Vérifications

ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b "cn=config" "Objectclass=olcModuleList"
ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b "cn=config" "Objectclass=olcAuditLogConfig"

Unique

Cet overlay permet de nous assurer lunicité des attributs que lon spécifie.

/root/ldap/conf/unique_act.ldif

dn: cn=module,cn=config
cn: module
objectclass: olcModuleList
objectclass: top
olcModuleLoad: unique.la
olcmodulepath: /usr/lib/ldap

/root/ldap/conf/unique_conf.ldif

dn: olcOverlay=unique,olcDatabase={1}mdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcUniqueConfig
olcOverlay: unique
olcUniqueUri: ldap:///ou=people,dc=krhacken,dc=org?uid?sub
olcUniqueUri: ldap:///ou=people,dc=krhacken,dc=org?mail?sub
olcUniqueUri: ldap:///ou=people,dc=krhacken,dc=org?uidNumber?sub
olcUniqueUri: ldap:///ou=groups,dc=krhacken,dc=org?cn?sub

Nous demandons ici à ce que les attributs UI, mail et uidNumber dans lou people soient uniques. Et que lattribut cn dans lou groups soit lui aussi unique. On applique les modifications,

ldapadd -Q -Y EXTERNAL -H ldapi:/// -f unique_act.ldif
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f unique_conf.ldif

Vérifications,

ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b "cn=config" "Objectclass=olcModuleList"
ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b "cn=config" "Objectclass=olcUniqueConfig"

Ppolicy

Cet overlay va nous permettre de spécifier une politique de mot de passe.

On va ajouter son schéma dans lannuaire

ldapadd -Q -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/ppolicy.ldif

Dans la branche cn=schema, on doit voir le schéma ppolicy,

ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b "cn=schema,cn=config" cn

/root/ldap/conf/ppolicy_act.ldif

dn: cn=module,cn=config
cn: module
objectclass: olcModuleList
objectclass: top
olcModuleLoad: ppolicy.la
olcmodulepath: /usr/lib/ldap

/root/ldap/conf/ppolicy_conf.ldif

dn: olcOverlay=ppolicy,olcDatabase={1}mdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcPpolicyConfig
olcOverlay: ppolicy
olcPPolicyDefault: cn=ppolicy,dc=krhacken,dc=org
olcPPolicyHashCleartext: TRUE
olcPPolicyUseLockout: FALSE

Explication,

  • olcPPolicyDefault : Indique le DN de configuration utilisé
  • olcPPolicyHashCleartext : Indique si les mots de passe doivent être cryptés.

On applique les modifications,

ldapadd -Q -Y EXTERNAL -H ldapi:/// -f ppolicy_act.ldif
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f ppolicy_conf.ldif

On va maintenant créer la politique par défaut.

/root/ldap/conf/ppolicy_def.ldif

dn: cn=ppolicy,dc=krhacken,dc=org
objectClass: top
objectClass: device
objectClass: pwdPolicy
cn: ppolicy
pwdAllowUserChange: TRUE
pwdAttribute: userPassword
pwdCheckQuality: 1
pwdExpireWarning: 0
pwdFailureCountInterval: 30
pwdGraceAuthNLimit: 5
pwdInHistory: 5
pwdLockout: TRUE
pwdLockoutDuration: 60
pwdMaxAge: 0
pwdMaxFailure: 5
pwdMinAge: 0
pwdMinLength: 5
pwdMustChange: FALSE
pwdSafeModify: FALSE

La signification des attributs est :

  • pwdAllowUserChange : indique si lutilisateur peut changer son mot de passe.
  • pwdCheckQuality : indique si OpenLDAP renvoie une erreur si le mot de passe nest pas conforme
  • pwdExpireWarning : avertissement dexpiration.
  • pwdFailureCountInterval : Intervalle de temps entre deux tentatives infructueuses pour quelles soient considérées comme « à la suite ».
  • pwdGraceAuthNLimit : période de grâce suite à lexpiration du mot de passe.
  • pwdInHistory : nombre de mots de passe dans lhistorique.
  • pwdLockout : indique si on bloque le compte au bout de X échecs.
  • pwdLockoutDuration : durée du blocage du compte (en secondes).
  • pwdMaxAge : age maximal du mot de passe (en secondes).
  • pwdMaxFailure : nombre déchecs de saisie du mot de passe maximal (avant blocage).
  • pwdMinAge : age minimal du mot de passe (en secondes).
  • pwdMinLength : longueur minimale du mot de passe.
  • pwdMustChange : indique si lutilisateur doit changer son mot de passe.
  • pwdSafeModify : indique si il faut envoyer lancien mot de passe avec le nouveau pour modification.

On applique les modifications,

ldapadd -H ldap://localhost -D cn=admin,dc=krhacken,dc=org -y /root/pwdldap -f ppolicy_def.ldif

Vérifications

ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b "cn=schema,cn=config" cn
ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b "cn=config" "Objectclass=olcPpolicyConfig" -LLL
ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b "dc=krhacken,dc=org" "Objectclass=pwdPolicy"

Structuration de l'annuaire LDAP.

Maintenant que la base de l'annuaire est en place nous allons structurer l'intérieur de l'annuaire.

Avant ça nous allons décrire la structure comme un arbre.

Le tronc (le DC)

  • Le tronc de cet arbre : dc=krhacken,dc=org, c'est ce que l'on appelle le DN de base.

Les grosses branches (les OU)

  • Une grosse branche pour les utilisateurs : ou=people,dc=krhacken,dc=org.
  • Une sous branche des utilisateurs pour les membres krhacken : ou=krhacken,ou=people,dc=krhacken,dc=org.
  • Une grosse branche pour les groupes : ou=group,dc=krhacken,dc=org.
  • Une sous branche des groupes pour les groupes krhacken : ou=krhacken,ou=group,dc=krhacken,dc=org.

Les petites branches (les CN)

  • Une petite branche pour le groupe des adminsys : cn=adminsys,ou=krhacken,ou=group,dc=krhacken,dc=org
  • Une petite branche pour le groupe des webmestres : cn=webmestre,ou=krhacken,ou=group,dc=krhacken,dc=org
  • Une petite branche pour le groupe des membres krhacken : cn=krhacken,ou=krhacken,ou=group,dc=krhacken,dc=org
  • Une petite branche pour le groupe des membres extérieur : cn=ext,ou=krhacken,ou=group,dc=krhacken,dc=org

Mise en place des grosses branches

Les OUs sont des conteneurs qui permettent de ranger les données dans lannuaire et de les hiérarchiser.

/root/ldap/conf/OU.ldif

dn: ou=people,dc=krhacken,dc=org
ou: people
objectClass: organizationalUnit

dn: ou=group,dc=krhacken,dc=org
ou: group
objectClass: organizationalUnit

dn: ou=system,dc=krhacken,dc=org
ou: system
objectClass: organizationalUnit

dn: ou=krhacken,ou=people,dc=krhacken,dc=org
ou: krhacken
objectClass: organizationalUnit

dn: ou=krhacken,ou=group,dc=krhacken,dc=org
ou: krhacken
objectClass: organizationalUnit

On rajoute les OU au ldap

ldapadd -cxWD cn=admin,dc=krhacken,dc=org -y /root/pwdldap -f OU.ldif

Mise en place des petites branches

Il existe deux types de groupes : les posixgroup et les groupofnames.

Les posixgroup sont similaires au groupes Unix.

Pour faire simple, lavantage des groupofnames est quavec un filtre sur un utilisateur, on peut connaitre ses groupes (avec loverlay memberof). Chose impossible avec les posixgroups. On va donc utiliser des groupofnames.

/root/ldap/conf/group.ldif

dn: cn=adminsys,ou=krhacken,ou=group,dc=krhacken,dc=org
cn: adminsys
description: AdminSys Kr[HACK]en
objectClass: groupOfNames
member: cn=admin,dc=krhacken,dc=org

dn: cn=webmestre,ou=krhacken,ou=group,dc=krhacken,dc=org
cn: webmestre
description: Webmestre Kr[HACK]en
objectClass: groupOfNames
member: cn=admin,dc=krhacken,dc=org

dn: cn=krhacken,ou=krhacken,ou=group,dc=krhacken,dc=org
cn: krhacken
description: Membres du Kr[HACK]en
objectClass: groupOfNames
member: cn=admin,dc=krhacken,dc=org

dn: cn=ext,ou=krhacken,ou=group,dc=krhacken,dc=org
cn: ext
description: Personnes extérieure au Kr[HACK]en
objectClass: groupOfNames
member: cn=admin,dc=krhacken,dc=org

On ajoute les groupes

ldapadd -cxWD cn=admin,dc=krhacken,dc=org -y /root/pwdldap -f group.ldif

On peu utiliser memberof pour voir dans quels groupes est l'utilisateur admin

ldapsearch -xLLLH ldap://localhost -D cn=admin,dc=krhacken,dc=org -y /root/pwdldap -b "dc=krhacken,dc=org" "cn=admin" memberof

Création d'un compte root

Cet utilisateur aura tout les droits sur l'annuaire, on ne lui donnera pas accès aux services son rôle est seulement d'administrer l'annuaire LDAP.

/root/ldap/conf/root.ldif

dn: uid=root,ou=krhacken,ou=people,dc=krhacken,dc=org
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
uid: root
cn: root
sn: root
displayName: root
userPassword: PASSWORD
mail: root@krhacken.org

On ajoute l'utilisateur

ldapadd -cxWD cn=admin,dc=krhacken,dc=org -y /root/pwdldap -f root.ldif

Ajout de compte root au groupe adminsys pour qu'il est accès à l'interface d'administration

/root/ldap/conf/adminsysaddroot.ldif

dn: cn=adminsys,ou=krhacken,ou=group,dc=krhacken,dc=org
changetype: modify
add: member
member: uid=root,ou=krhacken,ou=people,dc=krhacken,dc=org
ldapadd -cxWD cn=admin,dc=krhacken,dc=org -y /root/pwdldap -f adminsysaddroot.ldif

Commande pour afficher les informations de l'utilisateur root

ldapsearch -xLLLH ldap://localhost -D uid=root,ou=krhacken,ou=people,dc=krhacken,dc=org -W -b "dc=krhacken,dc=org" "uid=root"

Sécurisation de l'annuaire

Comptes avec permissions réduite

Nous allons créer deux compte systèmes.

  • Un viewer qui aura uniquement les droits en lecture de l'arbre
  • Un Writer qui lui aura les droits en écriture

/root/ldap/conf/viewer.ldif

dn: cn=viewer,ou=system,dc=krhacken,dc=org
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: viewer
description: LDAP Viewer
userPassword: passview

/root/ldap/conf/writer.ldif

dn: cn=writer,ou=system,dc=krhacken,dc=org
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: writer
description: LDAP Writer
userPassword: passwrite

Ajout des utilisateurs,

ldapadd -cxWD cn=admin,dc=krhacken,dc=org -y /root/pwdldap -f viewer.ldif
ldapadd -cxWD cn=admin,dc=krhacken,dc=org -y /root/pwdldap -f writer.ldif

On autorise la lecture de l'arbre uniquement au utilisateur authentifié en modifiant une ACL

/root/ldap/conf/acl.ldif

dn: olcDatabase={1}mdb,cn=config
changetype: modify
replace: olcAccess
olcAccess: to attrs=userPassword by self write by anonymous auth by dn="cn=writer,ou=system,dc=krhacken,dc=org" write by dn="cn=viewer,ou=system,dc=krhacken,dc=org" read by dn="cn=admin,dc=krhacken,dc=org" write by * none
olcAccess: to dn.base="dc=krhacken,dc=org" by users read
olcAccess: to * by self write by dn="cn=admin,dc=krhacken,dc=org" write by * read by anonymous none

On modife l'ACL

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

Forcer SSL

Si c'est le cas on peut maintenant forcer la connexion SSL

/root/ldap/conf/forcetls.ldif

dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcSecurity
olcSecurity: tls=1

Ajout des modifications et application

ldapmodify -H ldapi:// -Y EXTERNAL -f forcetls.ldif
systemctl restart slapd

Vérification

La commande

ldapsearch -xLLL -H ldap://alpha.ldap.krhacken.org -D cn=viewer,ou=system,dc=krhacken,dc=org -w passview -b "dc=krhacken,dc=org"

doit retourner une erreur, si on ajout -ZZ à la fin ça doit fonctionner

Voilà pour la mise en place de base du LDAP cependant il faut configuré chaque client pour se connecter au serveur avec STARTTLS.

Réplication de l'annuaire LDAP

Nous allons mettre en place une réplication Master/Master. Lidée est de faire en sorte que nimporte lequel de nos serveurs LDAP soit capable à la fois de lire les données, mais également de les modifier. De plus, nous allons mettre en place une réplication, à la fois sur larbre de données dc=krhacken,dc=org mais également sur larbre de configuration cn=config.

Vous avez déjà fait toute la configuration du premier conteneur LDAP (CT107). Pour gagner du temps clonez ce conteneur vers le conteneur 108 sur Beta.

Avant le démarrage il vous faudra reconfigurer les interfaces comme suis :

  • eth0 : vmbr1 / VLAN: 30 / IP: 10.0.2.2/24 / GW: 10.0.2.254
  • eth1 : vmbr2 / VLAN: 100 / IP: 10.1.0.108/24 / GW: 10.1.0.254

Nous avons désormais deux conteneurs LDAP identique, ce qui ne fonctionnera pas dans l'état.

Il faut donc ajuster la configuration en modifiant les paramètres de connexions

/etc/ldap/ldap.conf

Sur Alpha :

BASE dc=krhacken,dc=org
URI ldap://alpha.ldap.krhacken.org/
URI ldap://vip.ldap.krhacken.org/
TLS_CACERT /etc/ldap/ca_certs.pem

Sur Beta :

BASE dc=krhacken,dc=org
URI ldap://beta.ldap.krhacken.org/
URI ldap://vip.ldap.krhacken.org/
TLS_CACERT /etc/ldap/ca_certs.pem

On redémarre les serveurs slapd.

service slapd force-reload

Réplication de l'arbre de configuration

01-syncprov_act.ldif

dn: cn=module,cn=config
cn: module
objectclass: olcModuleList
objectclass: top
olcmoduleload: syncprov.la
olcmodulepath: /usr/lib/ldap
ldapadd -Y EXTERNAL -H ldapi:/// -f 01-syncprov_act.ldif

Vérifications :

ldapsearch -LLLY external -H ldapi:/// -b "cn=config" "objectClass=olcModuleList"
ldapsearch -LLLY external -H ldapi:/// -b "cn=module{6},cn=config"

02-serverid.ldif

X vaut 1 sur Alpha 2 sur Beta.

dn: cn=config
changetype: modify
add: olcServerID
olcServerID: X
ldapmodify -Y EXTERNAL -H ldapi:/// -f 02-serverid.ldif

Vérification :

ldapsearch -LLLY external -H ldapi:/// -b "cn=config" "objectClass=olcGlobal" olcServerID

03-replica_account.ldif

dn: cn=replica,ou=system,dc=krhacken,dc=org
userPassword: PASS
cn: replica
objectclass: top
objectclass: person
sn: replica
ldapadd -x -H ldap://localhost -D cn=admin,dc=krhacken,dc=org -y /root/pwdldap -f 03-replica_account.ldif

04-droit_conf.ldif

Gestion des droits du CN replica

dn: olcDatabase={0}config,cn=config
changeType: modify
add: olcAccess
olcAccess: to * by dn.exact=cn=replica,ou=system,dc=krhacken,dc=org manage by * break
ldapmodify -Y EXTERNAL -H ldapi:/// -f 04-droit_conf.ldif

05-syncprov_conf_conf.ldif

dn: olcOverlay=syncprov,olcDatabase={0}config,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
ldapmodify -Y EXTERNAL -H ldapi:/// -f 05-syncprov_conf_conf.ldif

06-repl_conf_conf.ldif

dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=01 provider=ldap://alpha.ldap.krhacken.org
  binddn="cn=replica,ou=system,dc=krhacken,dc=org" bindmethod=simple
  credentials=password searchbase="cn=config"
  type=refreshAndPersist retry="5 5 300 5" timeout=1
olcSyncRepl: rid=02 provider=ldap://beta.ldap.krhacken.org
  binddn="cn=replica,ou=system,dc=krhacken,dc=org" bindmethod=simple
  credentials=password searchbase="cn=config"
  type=refreshAndPersist retry="5 5 300 5" timeout=1
-
add: olcMirrorMode
olcMirrorMode: TRUE
ldapmodify -Y EXTERNAL -H ldapi:/// -f 06-repl_conf_conf.ldif

Vérification :

ldapsearch -QLLLY external -H ldapi:/// -b "cn=config" "olcDatabase={0}config" olcSyncRepl

A partir d'ici l'arbre de configuration cn=config est synchronisé entre les deux conteneurs LDAP. Pour le reste de la configuration il faut faire les manipulations que sur un des deux conteneurs LDAP

Réplication de l'arbre de données

Nous allons ici mettre en place la synchronisation automatique de l'arbre de données entre les deux conteneurs LDAP.

07-acl_replica.ldif

dn: olcDatabase={1}mdb,cn=config
changetype: modify
replace: olcAccess
olcAccess: to attrs=userPassword by self write by anonymous auth by dn="cn=writer,ou=system,dc=krhacken,dc=org" write by dn="cn=viewer,ou=system,dc=krhacken,dc=org" read by dn="cn=admin,dc=krhacken,dc=org" write by dn.exact="cn=replica,ou=system,dc=krhacken,dc=org" read by * none
olcAccess: to dn.subtree="dc=krhacken,dc=org" by users read by * none
olcAccess: to * by self write by dn="cn=admin,dc=krhacken,dc=org" write by * read by anonymous none
ldapmodify -Y EXTERNAL -H ldapi:/// -f 07-acl_replica.ldif

Vérification :

ldapsearch -QLLLY external -H ldapi:/// -b "cn=config" "olcDatabase={1}mdb" olcAccess

08-limit.ldif

dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcLimits
olcLimits: dn.exact="cn=replica,ou=system,dc=krhacken,dc=org" time.soft=unlimited time.hard=unlimited size.soft=unlimited size.hard=unlimited
ldapmodify -Y EXTERNAL -H ldapi:/// -f 08-limit.ldif

09-index.ldif

dn:olcDatabase={1}mdb,cn=config
changetype: modify
add: olcDbIndex
olcDbIndex: entryCSN,entryUUID eq
ldapmodify -Y EXTERNAL -H ldapi:/// -f 09-index.ldif

10-syncprov_conf_data.ldif

dn: olcOverlay=syncprov,olcDatabase={1}mdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
ldapmodify -Y EXTERNAL -H ldapi:/// -f 10-syncprov_conf_data.ldif

11-repl_conf_data.ldif

dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=01 provider=ldap://alpha.ldap.krhacken.org
  binddn="cn=replica,ou=system,dc=krhacken,dc=org"
  bindmethod=simple credentials=password
  searchbase="dc=krhacken,dc=org"
  type=refreshAndPersist retry="5 5 300 5" timeout=1
olcSyncRepl: rid=02 provider=ldap://beta.ldap.krhacken.org
  binddn="cn=replica,ou=system,dc=krhacken,dc=org"
  bindmethod=simple credentials=password
  searchbase="dc=krhacken,dc=org"
  type=refreshAndPersist retry="5 5 300 5" timeout=1
-
add: olcMirrorMode
olcMirrorMode: TRUE
ldapmodify -Y EXTERNAL -H ldapi:/// -f 11-repl_conf_data.ldif

Configuration des ServerID

A cause de la synchronisation de l'arbre de configuration les ServerID sont les mêmes.

Il faut stoper slapd sur les deux conteneurs avec systemctl stop slapd

Puis éditer /etc/ldap/slapd.d/cn\=config.ldif de la manière suivante

  • Alpha -> olcServerID: 1
  • Beta -> olcServerID: 2

On peut maintenant relancer slapd sur les deux conterneurs avec systemctl start slapd

Maintenant la commande ci-dessous donne un ID différent selon le conteneur.

ldapsearch -x -LLL -H ldap://localhost -D cn=admin,dc=krhacken,dc=org -w passadmin -b cn=config "objectClass=olcGlobal"

Accès via une IP virtuelle

Comme pour HAProxy nous allons utiliser keepalived pour avoir une IP virtuelle que se déplace entre les deux conteneurs en fonction de la disponibilité de l'annuaire LDAP.

apt-get install -y keepalived

Script pour vérifier l'état des conteneurs LDAP

Créer, sur les deux serveurs, le script /etc/keepalived/test_ldap.sh

Il faut spécifier le mot de passe du compte viewer.

#!/bin/bash

ldapsearch -x -H ldap://$1 -D cn=viewer,ou=system,dc=krhacken,dc=org -w passview -b dc=krhacken,dc=org -l 3 > /dev/null 2>&1
ldapresponse=$?

if [ "$ldapresponse" -gt 0 ]; then
    echo "down"
    exit 1
else
    echo "up"
fi

exit 0
chmod /etc/keepalived/test_ldap.sh +x

Configuration de keepalived

Configuration sur Alpha

/etc/keepalived/keepalived.conf

vrrp_script check_server_health {
    script "/etc/keepalived/test_ldap.sh 10.0.2.1" (mettre l'ip réel de votre serveur)
    interval 2
    fall 2
    rise 2
}
vrrp_instance VI_LDAP {
    interface eth0
    state MASTER
    virtual_router_id 50
    priority 101 # 101 on master, 100 on backup
    virtual_ipaddress {
        10.0.2.3
    }
    track_script {
        check_server_health
    }
}
systemctl restart keepalived
authentication {
    auth_type PASS
    auth_pass MON_MOT_DE_PASSE_SECRET
}

Configuration sur Beta

/etc/keepalived/keepalived.conf

vrrp_script check_server_health {
    script "/etc/keepalived/test_ldap.sh 10.0.2.2" (mettre l'ip réel de votre serveur)
    interval 2
    fall 2
    rise 2
}
vrrp_instance VI_LDAP {
    interface eth0
    state MASTER
    virtual_router_id 50
    priority 101 # 101 on master, 100 on backup
    virtual_ipaddress {
        10.0.2.3
    }
    track_script {
        check_server_health
    }
}
systemctl restart keepalived

Un des deux conteneur est maintenant accessible à l'adresse 10.0.2.3. Les requêtes se feront sur cette adresse.

Configuration des futurs client LDAP

Sur tout les futurs client LDAP il faudra activer la connexion SSL. Il faut commencer par copier le certificat de la CA (ca_server.pem qu'il faudra copier via scp)

cat ca_server.pem | tee -a /etc/ldap/ca_certs.pem

Il faut ensuite modifier la configuration en modifiant la ligne suivante

/etc/ldap/ldap.conf

TLS_CACERT /etc/ldap/ca_certs.pem

La commande,

ldapsearch -xLLL -H ldap://vip.ldap.krhacken.org -D cn=viewer,ou=system,dc=krhacken,dc=org -w passview -b "dc=krhacken,dc=org" -ZZ

doit retourner des informations sur l'arbre.