Introduction
LDAP est un protocole basé sur TCP/IP qui permet de partager des bases de données d'information sur un réseau interne (intranet) ou externe (internet). Ces bases de données sont appelées annuaire électronique (Directory en anglais), elles peuvent contenir tout type d'informations, des informations sur les personnes, à des données systèmes. Qui dit base de données, dit recherche, il est donc possible de faire des recherches dans la base en employant plusieurs critères, mais aussi bien sûr de la modifier, mais contrairement à un SGBD, un annuaire est très rapide en lecture, mais l'est beaucoup moins en écriture, en effet comme un annuaire est plutôt lu que modifier il a été optimisé pour la lecture et ne possède pas les mécanismes de transaction complexe que les SGBD possèdent pour traiter de gros volumes de données.
Le LDAP ou Lightweight Directory Access Protocol est la version TCP/IP du protocole DAP, ce dernier étant le protocole pour accéder au protocole OSI du service d'annuaire X500. Dans un premier temps LDAP s'est contenté d'être l'interface à des annuaires X500, mais maintenant LDAP peut gérer complètement les bases (standalone LDAP).
Si on rentre dans les détails, le protocole LDAP est du type client/serveur, le serveur contient la base de données, et le client consulte la base de données, le protocole fournit les bases pour cette communication entre la client et le serveur (normalisée par l'IETF par la RFC2251), et les commandes nécessaires au client pour rechercher, créer, modifier ou effacer des données. LDAP est bien entendu sécurisé pour le transfert et l'accès aux données.
Par ailleurs LDAP fournit des outils pour que les serveurs LDAP puissent communiquer entre eux, on a ainsi la possibilité de créer des serveurs miroirs qui pourront se synchroniser, ou de relier simplement les serveurs entre eux, les serveurs redirigeant automatiquement les requêtes qui ne les concernent pas.
Les exemples d'applications de LDAP sont nombreux: - bases de données d'employés, - bases de données de produits, - bases de données pour certaines applis,
exemple : toutes les infos contenant les utilisateurs de votre réseau (mot de passe, shell, homedirectory, …) peuvent être dans la base, on a ainsi beaucoup plus de possibilités qu'un simple fichier /etc/passwd, l'authentification peut donc utiliser LDAP plutôt que passwd ou shadow ou encore NIS. Vos utilisateurs pourront ainsi changer leur mot de passe et certains de leurs attributs à partir d'une interface web.
Architecture
Installation
Installation des packages La suite de bibliothèques et d'outils OpenLDAP est fournie par les paquets suivants :
[root@srv] # yum -y install openldap openldap-servers openldap-clients nss-pam-ldapd
Configuration d'OpenLDAP
Initialisation de base
Copie de la DB_CONFIG
[root@srv] # cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
Mise en place des droits
[root@srv] # chown ldap. /var/lib/ldap/DB_CONFIG
Démarrage slapd
[root@srv] # systemctl start slapd
Activation au boot
[root@srv] # systemctl enable slapd Created symlink from /etc/systemd/system/multi-user.target.wants/slapd.service to /usr/lib/systemd/system/slapd.service.
Vérification
[root@srv] # systemctl is-active slapd active
Check des ports
[root@srv] # ss -tlnp | grep slapd LISTEN 0 128 *:389 *:* users:1) LISTEN 0 128 :::389 :::* users:2)
Définition du password cn=config
[root@srv ~] # slappasswd (Défini le mot de passe du cn=config) New password: Re-enter new password: {SSHA}…….
[root@srv ~] # nano olcRootPasswd.ldif dn: olcDatabase={0}config,cn=config changetype: modify add: olcRootPW olcRootPW: {SSHA}…….
[root@srv ~] # ldapadd -Y EXTERNAL -H ldapi:/ -f olcRootPasswd.ldif SASL/EXTERNAL authentication started SASL usernamehttps:help.ubuntu.com/community/OpenLDAPServer: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry “olcDatabase={0}config,cn=config”
Importation des schémas
[root@srv] # for def in cosine.ldif nis.ldif inetorgperson.ldif ; do ldapadd -Y EXTERNAL -H ldapi:/ -f /etc/openldap/schema/$def; done SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry “cn=cosine,cn=schema,cn=config” SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry “cn=nis,cn=schema,cn=config” SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry “cn=inetorgperson,cn=schema,cn=config” Vérifier que les schéma sont bien chargé
[root@srv ] # ls -1 /etc/openldap/slapd.d/cn\=config/cn\=schema/ cn={0}core.ldif cn={1}cosine.ldif cn={2}nis.ldif cn={3}inetorgperson.ldif
Create configure.ldif file to configure: domain name, ACLs and directory Manager’s user/password: [root@srv ~]# slappasswd (Défini le mot de passe du compte manager) New password: Re-enter new password: {SSHA}….. [root@srv ~] # nano /root/olcConfigure.ldif dn: olcDatabase={1}monitor,cn=config changetype: modify replace: olcAccess olcAccess: {0}to * by dn.base=“gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth” read by dn.base=“cn=manager,dc=domain,dc=com” read by * none dn: olcDatabase={2}hdb,cn=config changetype: modify replace: olcSuffix olcSuffix: dc=domain,dc=com dn: olcDatabase={2}hdb,cn=config changetype: modify replace: olcRootDN olcRootDN: cn=manager,dc=domain,dc=com dn: olcDatabase={2}hdb,cn=config changetype: modify replace: olcRootPW olcRootPW: {SSHA}………. dn: olcDatabase={2}hdb,cn=config changetype: modify add: olcAccess olcAccess: {0}to attrs=userPassword,shadowLastChange by dn=“cn=manager,dc=domain,dc=com” write by anonymous auth by self write by * none olcAccess: {1}to dn.base=“” by * read olcAccess: {2}to * by dn=“cn=manager,dc=domain,dc=com” write by * read [root@srv ~] # ldapadd -Y EXTERNAL -H ldapi:/ -f olcConfigure.ldif
SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry “olcDatabase={1}monitor,cn=config” modifying entry “olcDatabase={2}hdb,cn=config” modifying entry “olcDatabase={2}hdb,cn=config” modifying entry “olcDatabase={2}hdb,cn=config” modifying entry “olcDatabase={2}hdb,cn=config”
4.1 - Configure base ldap
[root@srv ~]# nano olcBaseDomain.ldif dn: dc=domain,dc=com objectClass: top objectClass: dcObject objectclass: organization o: domain.com dc: domain
[root@srv ~]# ldapadd -x -D cn=manager,dc=domain,dc=com -W -f olcBaseDomain.ldif Enter LDAP Password: adding new entry “dc=domain,dc=com”
Gestion des logs Send log /local/openldap/log
[root@srv ~]# mkdir -p /local/openldap/log [root@srv ~]# touch /local/openldap/log/slapd.log Add after local7.* entries to /etc/rsyslog.conf
# Log openldap local4.* -/local/openldap/log/slapd.log
Restart rsyslog service [root@srv ~]# systemctl restart rsyslog.service
[root@srv ~]# nano /etc/logrotate.d/openldap /local/openldap/log/slapd.log {
missingok
daily
dateext
rotate 15
create 644 root root
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
[root@srv ~]# chmod 644 /etc/logrotate.d/openldap [root@srv ~]# logrotate -f /etc/logrotate.d/openldap Logging - Enable LogLevel
Tab for level log # Level Keyword Description # -1 any enable all debugging # 0 no debugging # 1 (0x1 trace) trace function calls # 2 (0x2 packets) debug packet handling # 4 (0x4 args) heavy trace debugging # 8 (0x8 conns) connection management # 16 (0x10 BER) print out packets sent and received # 32 (0x20 filter) search filter processing # 64 (0x40 config) configuration processing # 128 (0x80 ACL) access control list processing # 256 (0x100 stats) stats log connections/operations/results # 512 (0x200 stats2) stats log entries sent # 1024 (0x400 shell) print communication with shell backends # 2048 (0x800 parse) print entry parsing debugging # 16384 (0x4000 sync) syncrepl consumer processing # 32768 (0x8000 none) only messages that get logged whatever log level is set
[root@srv ~]# nano olcLogLevel.ldif dn: cn=config changetype: modify replace: olcLogLevel olcLogLevel: 256
[root@srv ~]# ldapmodify -Y EXTERNAL -H ldapi:/ -f olcLogLevel.ldif Check [root@srv ~]# ldapsearch -H ldapi: -Y EXTERNAL -b “cn=config” -LLL -Q -s base Désactivation de l'ipv6 [root@srv ~] # nano /etc/sysconfig/slapd
Remplacer #SLAPD_OPTIONS="" par SLAPD_OPTIONS="-4"
Redémarrage et Vérifiaction [root@srv ~] # systemctl restart slapd
[root@srv ~] # ss -tlnp | grep slapd LISTEN 0 128 *:389 *:* users:3)
Change port number [root@srv ~] # nano /etc/sysconfig/slapd replace SLAPD_URLS=“ldapi:/ ldap:///” by SLAPD_URLS=“ldapi:/ ldap:<IP_SERVICE>:10389/ ldap://localhost:10389/” [root@srv] # systemctl restart slapd Check port number # ss -tlnp | grep slapd LISTEN 0 128 XXX.XXX.XXX.XXX:10389 *:* users:4) LISTEN 0 128 127.0.0.1:10389 *:* users:5) Désactiver les connexion anonyme [root@srv ~]# nano olcBindaNon.ldif dn: cn=config changetype: modify add: olcDisallows olcDisallows: bind_anon - add: olcRequires olcRequires: authc [root@srv ~]# ldapmodify -H ldapi: -Y EXTERNAL -f olcBindaNon.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry “cn=config”
Mofidier le répertoire Openldap
1 Stopper slapd [root@srv ~]# service slapd stop
2 faire un backup
[root@srv ~]# /usr/sbin/slapcat -n0 > /tmp/cn_config.ldif-$(date +\%d-\%m-\%Y) [root@srv ~]# /usr/sbin/slapcat -n2 > /tmp/base_user.ldif-$(date +\%d-\%m-\%Y)
3 modifier la variable olcDbDirectory du backup cn_config.ldif-xxxx
remplacer :
olcDbDirectory: /var/lib/ldap
par : olcDbDirectory: /local/openldap/db
4 - creation arborescence
[root@srv ~]# mkdir -p /local/openldap/db [root@srv ~]# chown ldap:ldap /local/openldap/db [root@srv ~]# chmod 755 /local/openldap [root@srv ~]# chmod 700 /local/openldap/db [root@srv ~]# cp -Rfp /var/lib/ldap/* /local/openldap/db/
5- Vider slapd.d [root@srv ~]# rm -rf /etc/openldap/slapd.d/*
6- Importer le contenu modifié (base de config) [root@srv ~]# slapadd -n0 -F /etc/openldap/slapd.d/ -l /tmp/cn_config.ldif-10-12-2017 slapadd: could not add entry dn=“cn=config” (line=1): _ 1.57% eta none elapsed none spd 5.1 M/s Closing DB… [root@srv ~]# slapadd -n2 -F /etc/openldap/slapd.d/ -l /tmp/base_user.ldif.ldif-10-12-2017
7- Changer les droits [root@srv ~]# chown -R ldap:ldap /etc/openldap/slapd.d/ 8- Démarrer le démon [root@srv ~]# service slapd start
Déposer le schema sybase
[root@srv ] # nano /etc/openldap/schema/sybase.schema
[root@srv ] # cat > ./schema_sybase_conv.conf « EOL include /etc/openldap/schema/sybase.schema EOL
[root@srv ] # mkdir /tmp/ldif [root@srv ] # slaptest -f ./schema_sybase_conv.conf -F /tmp/ldif/ config file testing succeeded
[root@srv] # vi /tmp/ldif/cn\=config/cn\=schema/cn\=\{0\}sybase.ldif
Remplacer
dn: cn={0}sybase
objectClass: olcSchemaConfig
cn: {0}sybase
par :
dn: cn=sybase,cn=schema,cn=config objectClass: olcSchemaConfig cn: sybase
Supprimer les dernières entrées.
structuralObjectClass: olcSchemaConfig entryUUID: 3cd542f4-6de9-1037-94c4-63508309d03c creatorsName: cn=config createTimestamp: 20171205092010Z entryCSN: 20171205092010.949113Z#000000#000#000000 modifiersName: cn=config modifyTimestamp: 20171205092010Z
[root@srv ] # cd /etc/openldap/schema/ [root@srv ] # cp /tmp/ldif/cn\=config/cn\=schema/cn\=\{0\}sybase.ldif sybase.ldif [root@srv ] # chmod 444 sybase.ldif [root@srv ] # ldapadd -x -D “cn=config” -W -H ldap://localhost:10389 -f /etc/openldap/schema/sybase.ldif
Overlay Password Policy charger le schéma
[root@srv ~]# ldapadd -Y EXTERNAL -H ldapi:/ -f /etc/openldap/schema/ppolicy.ldif [root@srv ~]# ldapsearch -H ldapi: -Y EXTERNAL -b “cn=schema,cn=config” cn -LLL SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 dn: cn=schema,cn=config cn: schema
dn: cn={0}core,cn=schema,cn=config cn: {0}core
dn: cn={1}cosine,cn=schema,cn=config cn: {1}cosine
dn: cn={2}nis,cn=schema,cn=config cn: {2}nis
dn: cn={3}inetorgperson,cn=schema,cn=config cn: {3}inetorgperson
dn: cn={4}ppolicy,cn=schema,cn=config cn: {4}ppolicy
[root@srv ~]# nano olcPasswordPolicy.ldif
dn: cn=module,cn=config objectClass: olcModuleList cn: module olcModulepath: /usr/lib64/openldap olcModuleLoad: ppolicy.la [root@srv ~]# ldapadd -H ldap://localhost:10389 -x -D “cn=config” -W -f olcPasswordPolicy.ldif [root@srv ~]# ldapsearch -H ldapi: -Y EXTERNAL -b “cn=config” “(objectClass=olcModuleList)” olcModuleLoad -LLL SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 dn: cn=module{0},cn=config olcModuleLoad: {0}ppolicy.la [root@srv ~]# nano olcPPolicyConfig.ldif dn: olcOverlay=ppolicy,olcDatabase={2}hdb,cn=config objectClass: olcConfig objectClass: olcOverlayConfig objectClass: olcPpolicyConfig olcOverlay: ppolicy olcPPolicyDefault: cn=default,ou=policies,dc=domain,dc=com olcPPolicyUseLockout: TRUE olcPPolicyHashCleartext: TRUE [root@srv ~]# ldapadd -x -H ldap://localhost:10389 -D “cn=config” -W -f olcPPolicyConfig.ldif </WRAP> Create the policies OU:
[root@srv ~]# nano olcCreatePolicieOU.ldif dn: ou=policies,dc=domain,dc=com objectClass: top objectClass: organizationalUnit ou: policies
[root@srv ~]# ldapadd -H ldap://localhost:10389 -x -D “cn=manager,dc=domain,dc=com” -W -f olcCreatePolicieOU.ldif Enter LDAP Password: adding new entry “ou=policies,dc=domain,dc=com”
Definition of a password policy
[root@srv ~]# nano olcCreateDefaultPPolicy.ldif dn: cn=default,ou=policies,dc=domain,dc=com cn: default objectClass: top objectClass: device objectClass: pwdPolicy objectClass: pwdPolicyChecker pwdFailureCountInterval: 0 pwdMaxFailure: 6 pwdMustChange: TRUE pwdAttribute: userPassword pwdMinLength: 9 pwdSafeModify: FALSE pwdGraceAuthNLimit: 0 pwdCheckQuality: 1 pwdLockoutDuration: 900 pwdAllowUserChange: TRUE pwdExpireWarning: 864000 pwdMinAge: 86400 pwdLockout: TRUE pwdMaxAge: 7776000 pwdInHistory: 4
[root@srv ~]# ldapadd -x -H ldap://localhost:10389 -D “cn=manager,dc=domain,dc=com” -W -f olcCreateDefaultPPolicy.ldif Enter LDAP Password: adding new entry “cn=default,ou=policies,dc=domain,dc=com”
[root@srv ~]# nano olcCreateServiceAccountPPolicy.ldif dn: cn=servicesaccounts,ou=policies,dc=domain,dc=com cn: servicesaccounts objectClass: top objectClass: device objectClass: pwdPolicy objectClass: pwdPolicyChecker pwdFailureCountInterval: 0 pwdMaxFailure: 0 pwdMustChange: FALSE pwdAttribute: userPassword pwdMinLength: 12 pwdSafeModify: FALSE pwdGraceAuthNLimit: 0 pwdCheckQuality: 0 pwdLockoutDuration: 0 pwdAllowUserChange: TRUE pwdExpireWarning: 0 pwdMinAge: 0 pwdLockout: FALSE pwdMaxAge: 0 pwdInHistory: 0
[root@srv ~]# ldapadd -x -H ldap://localhost:10389 -D “cn=manager,dc=domain,dc=com” -W -f olcCreateServiceAccountPPolicy.ldif Enter LDAP Password: adding new entry “cn=servicesaccounts,ou=policies,dc=domain,dc=com”
Vérifier
[root@srv ~]# ldapsearch -x -H ldap://localhost:10389 -D “cn=manager,dc=domain,dc=com” -W -b dc=domain,dc=com “(objectClass=pwdPolicy)” -LLL Enter LDAP Password:
dn: cn=default,ou=policies,dc=domain,dc=com cn: default objectClass: top objectClass: device objectClass: pwdPolicy objectClass: pwdPolicyChecker pwdFailureCountInterval: 0 pwdMaxFailure: 6 pwdMustChange: TRUE pwdAttribute: userPassword pwdMinLength: 9 pwdSafeModify: FALSE pwdGraceAuthNLimit: 0 pwdCheckQuality: 1 pwdLockoutDuration: 900 pwdAllowUserChange: TRUE pwdExpireWarning: 864000 pwdMinAge: 86400 pwdLockout: TRUE pwdMaxAge: 7776000 pwdInHistory: 4
dn: cn=servicesaccounts,ou=policies,dc=domain,dc=com cn: servicesaccounts objectClass: top objectClass: device objectClass: pwdPolicy objectClass: pwdPolicyChecker pwdFailureCountInterval: 0 pwdMaxFailure: 0 pwdMustChange: FALSE pwdAttribute: userPassword pwdMinLength: 12 pwdSafeModify: FALSE pwdGraceAuthNLimit: 0 pwdCheckQuality: 0 pwdLockoutDuration: 0 pwdAllowUserChange: TRUE pwdExpireWarning: 0 pwdMinAge: 0 pwdLockout: FALSE pwdMaxAge: 0 pwdInHistory: 0
Create the ServiceAccount
[root@srv ~]# nano olcCreateServiceAccountOU.ldif dn: ou=ServiceAccount,dc=domain,dc=com objectClass: top objectClass: organizationalUnit ou: ServiceAccount
[root@srv ~]# ldapadd -H ldap://localhost:10389 -x -D “cn=manager,dc=domain,dc=com” -W -f olcCreateServiceAccountOU.ldif
Générate password for service account 12 caracter
[root@srv ~]# slappasswd
[root@srv ~]# nano olcCreateUserAccount.ldif
dn: uid=admlotaseam,ou=ServiceAccount,dc=domain,dc=com objectClass: top objectClass: account objectClass: simpleSecurityObject uid: admlotaseam description: Service account for OTASEAM application to access LDAP userPassword: {SSHA}……..
[root@srv ~]# ldapadd -H ldap://localhost:10389 -x -D “cn=manager,dc=domain,dc=com” -W -f olcCreateUserAccount.ldif Enter LDAP Password: adding new entry “cn=admlotaseam,ou=ServiceAccount,dc=domain,dc=com”
[root@srv ~]# nano olcModifyUserAccountPolicies.ldif
dn: uid=admlotaseam,ou=ServiceAccount,dc=domain,dc=com changetype: modify replace: pwdPolicySubEntry pwdPolicySubEntry: cn=servicesaccounts,ou=policies,dc=domain,dc=com
[root@srv ~]# ldapadd -H ldap://localhost:10389 -x -D “cn=manager,dc=domain,dc=com” -W -f olcModifyUserAccountPolicies.ldif Enter LDAP Password: modifying entry “cn=admlotaseam,ou=ServiceAccount,dc=domain,dc=com”
Vérifier que le compte utilise la bonne policies
[root@srv ~]# ldapsearch -xLLL -H ldap://localhost:10389 -D “cn=manager,dc=domain,dc=com” -W -b uid=admlotaseam,ou=ServiceAccount,dc=domain,dc=com -s sub “(objectClass=*)” pwdPolicySubEntry Enter LDAP Password: dn: cn=admootaseam,ou=ServiceAccount,dc=domain,dc=com pwdPolicySubentry: cn=servicesaccounts,ou=policies,dc=domain,dc=com
====== Administration ====== ====== Annexe ======