[ Présentation | Installation | Configuration ( Configuration d'un serveur  , Configuration serveur et client  , Tests de fonctionnement ) | utilisation ( Créer un nouvel utlisateur , Rajouter un groupe, Supprimer un utilisateur , Changer son mot de passe ) | Suggestion de mise en place ]

Dernière modification 4 août 2022

Authentification des utilisateurs avec LDAP


Réseau et système

(ce document est téléchargeable au format pdf dans la section download)

Présentation

L'authentification des utilisateurs sur le système se fait par défaut au moyen des fichiers /etc/passwd (définition des utilisateurs), /etc/group (identification des groupes d'utilisateurs) et éventuellement /etc/shadow si vous utilisez les "shadow password". C'est satisfaisant quand l'on dispose d'une machine isolée, par contre avec un parc d'une centaine de machines, il est peut concevable d'avoir à modifier ces fichiers sur tous les postes pour rajouter un utilisateur. L'idée est de centraliser l'authentification, NIS fait cela très bien ainsi que LDAP, c'est ce que l'on va voir dans cette page.
Préalablement vous devez avoir installé et configuré un serveur LDAP tel que décrit dans la page qui va bien.

Dans la suite des opérations, on appelera serveur, la machine qui centralise la définition de tous les utilisateurs et groupes, le client fait appel au serveur pour l'authentification des utilisateurs.

[Retour haut de la page  ]

Installation

On récupérera sur ce site https://src.fedoraproject.org/repo/pkgs/openldap/MigrationTools-47.tar.gz  le tarball  MigrationTools-4.7.tar.gz on le décompresse en tapant

tar xvfz MigrationTools-4.7.tar.gz

Cela donne le répertoire MigrationTools-47

Maintenant on installera nss-pam-ldapd qui fournit un module Name Service Switch (NSS) qui accéder aux informations de compte et tous autres informations qu'on trouve dans les fichiers du système (hosts, alias, netgroup, etc...). Il fournit également un module PAM (Pluggable Authentification Module) pour un serveur LDAP.

Le daemon nslcd (Name Service LDAP Connection Daemon) fourni dans le package nss-pam-ldapd permet de gérer les connexions vers serveur LDAP via PAM. Pour le rendre actif à chaque démarrage on tapera donc

systemctl enable nslcd.service

voilà le résultat

Created symlink from /etc/systemd/system/multi-user.target.wants/nslcd.service to /usr/lib/systemd/system/nslcd.service.

on tachera de le lancer après avoir configurer le fichier /etc/nslcd.conf (voir plus bas)
[ Retour haut de la page  ]

Configuration

Configuration d'un serveur

Le serveur slapd est configuré conformément à ce qui est décrit dans la page qui lui est consacrée.

A présent dans le répertoire MigrationTools-47, on va modifier le fichier migrate_common.ph, on doit y indiquer son nom de domaine, comme ceci :

# Default DNS domain
$DEFAULT_MAIL_DOMAIN = "kervao.fr";

# Default base
$DEFAULT_BASE = "dc=kervao,dc=fr";

Éventuellement vous pouvez modifier la ligne suivante spécifiant le serveur de mail bien que ce ne soit pas absolument nécessaire.

$DEFAULT_MAIL_HOST = "mail.padl.com";

A présent il faut rentrer les utilisateurs et groupes du système dans la base de données LDAP. Commençons d'abord par créer des fichiers temporaires au format ldif. On tape maintenant en tant que root (pour pouvoir lire /etc/shadow)

ETC_SHADOW=/etc/shadow
export ETC_SHADOW

./migrate_passwd.pl /etc/passwd /tmp/passwd.ldif
./migrate_group.pl /etc/group /tmp/group.ldif

Éditez les deux fichiers ldif pour ne laisser que les utilisateurs, enlever tous les utilisateurs et groupes système (root, lp, sys, apache, ...). Voici le contenu de mon group.ldif avec mon groupe utilisateur hoarau

dn: cn=hoarau,ou=Group,dc=kervao,dc=fr
objectClass: posixGroup
objectClass: top
cn: hoarau
userPassword: {crypt}*
gidNumber: 5000
memberUid: olivier
memberUid: veronique

[Retour haut de la page ]

Voici maintenant le contenu de mon passwd.ldif avec mes deux utilisateurs

dn: uid=olivier,ou=People,dc=kervao,dc=fr
uid: olivier
cn: olivier
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {crypt}$1$76UeLH8Z$K8rdYPRmUoiONZQm6hV4q.
shadowLastChange: 11858
shadowMax: 99999
shadowWarning: 7
shadowInactive: -1
shadowExpire: -1
shadowFlag: 1081428222
loginShell: /bin/bash
uidNumber: 5001
gidNumber: 5000
homeDirectory: /home/olivier
gecos: olivier

dn: uid=veronique,ou=People,dc=kervao,dc=fr
uid: veronique
cn: veronique
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {crypt}$1$OyedUoIU$uwpYR0bWJGzF4AFAHspSm/
shadowLastChange: 11858
shadowMax: 99999
shadowWarning: 7
shadowInactive: -1
shadowExpire: -1
shadowFlag: 1081428222
loginShell: /bin/bash
uidNumber: 5002
gidNumber: 5000
homeDirectory: /home/veronique
gecos: veronique

A présent il faudra créer le fichier temp.ldif qui va contenir la définition  des Organizational Unit (ou ) Group (groupe d'utilisateur) et  People (utilisateur). Voici son contenu :

dn: dc=kervao,dc=fr
objectClass: dcObject
objectClass: organization
dc: kervao
o: kervao.fr

dn: ou=Group,dc=kervao,dc=fr
ou: Group
objectClass: top
objectClass: organizationalUnit
description: groupe d utilisateurs

dn: ou=People,dc=kervao,dc=fr
ou: People
objectClass: top
objectClass: organizationalUnit
description: utilisateurs du systeme

On peut commencer à rajouter tout cela (en mode verbeux), dans la base, on commence par les ou Group et People

ldapadd -v -x -D "cn=Manager,dc=kervao,dc=fr" -W -f /tmp/temp.ldif

voilà le résultat

ldap_initialize( <DEFAULT> )
Enter LDAP Password:
add objectClass:
        dcObject
        organization
add dc:
        kervao
add o:
        kervao.fr
adding new entry "dc=kervao,dc=fr"
modify complete

add ou:
        Group
add objectClass:
        top
        organizationalUnit
add description:
        groupe d utilisateurs
adding new entry "ou=Group,dc=kervao,dc=fr"
modify complete

add ou:
        People
add objectClass:
        top
        organizationalUnit
add description:
        utilisateurs du systeme
adding new entry "ou=People,dc=kervao,dc=fr"
modify complete

[Retour haut de la page ]
On continue avec le rajout des groupes et utilisateurs:

ldapadd -x -D "cn=Manager,dc=kervao,dc=fr" -f /tmp/passwd.ldif -W
Enter LDAP Password:
adding new entry "uid=olivier,ou=People,dc=kervao,dc=fr"

adding new entry "uid=veronique,ou=People,dc=kervao,dc=fr"

Puis

ldapadd -x -D "cn=Manager,dc=kervao,dc=fr" -f /tmp/group.ldif -W
Enter LDAP Password:
adding new entry "cn=hoarau,ou=Group,dc=kervao,dc=fr"

On visualise tout ça en tapant

ldapsearch -x -D "cn=Manager, dc=kervao, dc=fr" -W -b "dc=kervao,dc=fr"
Enter LDAP Password:
version: 2

#
# filter: (objectclass=*)
# requesting: ALL
#

# kervao, fr
dn: dc=kervao, dc=fr
objectClass: dcObject
objectClass: organization
dc: kervao.fr
o: kervao.fr

# Group, kervao, fr
dn: ou=Group,dc=kervao,dc=fr
ou: Group
objectClass: top
objectClass: organizationalUnit
description: groupe d utilisateurs

# People, kervao, fr
dn: ou=People,dc=kervao,dc=fr
ou: People
objectClass: top
objectClass: organizationalUnit
description: utilisateurs du systeme

# hoarau, Group, kervao, fr
dn: cn=hoarau,ou=Group,dc=kervao,dc=fr
objectClass: posixGroup
objectClass: top
cn: hoarau
gidNumber: 5000
memberUid: olivier
memberUid: veronique

# olivier, People, kervao, fr
dn: uid=olivier,ou=People,dc=kervao,dc=fr
uid: olivier
cn: olivier
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword:: e2NyeXB0fSQxJDc2VWvMSDhaJEs4cmRVUFJtVW5pT05aUW02aFY0cS4=
shadowLastChange: 11858
shadowMax: 99999
shadowWarning: 7
shadowInactive: -1
shadowExpire: -1
shadowFlag: 1081428222
loginShell: /bin/bash
uidNumber: 5001
gidNumber: 5000
homeDirectory: /home/olivier
gecos: olivier

# veronique, People, kervao, fr
dn: uid=veronique,ou=People,dc=kervao,dc=fr
uid: veronique
cn: veronique
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword:: e2NyeXB0fSQxJE95aWRVb0lVJHV3cFlOM7JXSkd6RjRBRkFIc3BTbS8=
shadowLastChange: 11858
shadowMax: 99999
shadowWarning: 7
shadowInactive: -1
shadowExpire: -1
shadowFlag: 1081428222
loginShell: /bin/bash
uidNumber: 5002
gidNumber: 5000
homeDirectory: /home/veronique
gecos: veronique

# search result
search: 2
result: 0 Success

# numResponses: 7
# numEntries: 6  

[Retour haut de la page  ]

Configuration serveur et client

Pour un client sous mageia il faut installer les packages suivants

openldap
nss-pam-ldapd

Le client repose sur nslcd (Name Service LDAP Connection Daemon), à noter que sur un serveur si vous voulez également vous connecter sur le daemon LDAP, il faudra le configurer comme un client. On édite le fichier /etc/nslcd.conf et on apporte les modifications suivantes

# The user and group nslcd should run as.
uid nslcd, ça n'a pas d'impact sur le fonctionnement
gid nslcd

# le serveur LDAP
uri ldap://192.168.13.11/

# The distinguished name of the search base qui doit être identique à la configuration de slapd
base dc=kervao,dc=fr

# The distinguished name to bind to the server with qui doit être identique à la configuration de slapd
binddn cn=Manager,dc=kervao,dc=fr

# The credentials to bind with, attention on doit mettre ici en clair le mot de passe qui a défini dans le fichier slapd.conf du serveur
bindpw mot-depasse-slapd-enclair

# Customize certain database lookups.
base  group  ou=Group,dc=kervao,dc=fr
base  passwd ou=People,dc=kervao,dc=fr
base  shadow ou=People,dc=kervao,dc=fr

map shadow userPassword userPassword

Comme le mot de passe est en clair, il faudra veiller à ce que les droits du fichier soient bien à 600

-rw------- 1 root root 4855 juil. 17 08:04 /etc/nslcd.conf

Dans le fichier /etc/nsswitch.conf on modifiera les lignes suivantes pour lire

passwd:     files nis ldap
shadow:     files nis ldap
group:      files nis ldap

A noter que le nis n'est pas nécessaire si vous n'avez pas mis en place de domaine NIS.

[Retour haut de la page ]
Bon maintenant on va éditer le fichier /etc/pam.d/system-auth. Pour information, c'est dans ce fichier  qui va  servir à appeler les bibliothèques qui vont bien pour l'authentification d'un utilisateur à la connexion sur une machine. Sans rentrer dans le détail, ce fichier et ceux  qui se trouvent dans le même répertoire font parti du système PAM (Pluggable Authentication Modules), qui permet de gérer l'authentification sur le système que ce soit pour le login mais aussi pour d'autres  services comme l'accès au serveur de mail, à ftp, etc. 

Reprenons donc notre fichier system-auth il doit ressembler à ça (rajoutez uniquement les lignes concernant pam_ldap et laissez les autres) :

#%PAM-1.0

auth        required      pam_env.so
auth        sufficient    pam_tcb.so shadow nullok prefix=$2a$ count=8
auth        required      pam_deny.so
auth        sufficient    pam_ldap.so

account     sufficient    pam_tcb.so shadow
account     required      pam_deny.so
account     sufficient    pam_ldap.so

password    required      pam_cracklib.so try_first_pass retry=3 minlen=4  dcredit=0  ucredit=0
password    sufficient    pam_tcb.so use_authtok shadow write_to=shadow nullok prefix=$2a$ count=8
password    required      pam_deny.so
password    sufficient    pam_ldap.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
-session    optional      pam_systemd.so
session     required      pam_tcb.so
session     sufficient    pam_ldap.so

Relancer LDAP sur le client (ou le serveur) maintenant

systemctl restart nslcd

ou lancer le s'il ne l'était pas à l'origine

systemctl start nslcd

A noter que le fichier /etc/ldap.conf ne sert plus à rien, vous pouvez l'ignorer superbement.

pour connaitre l'état du daemon on tapera

systemctl status nslcd.service

voilà le résultat

● nslcd.service - Naming services LDAP client daemon
     Loaded: loaded (/usr/lib/systemd/system/nslcd.service; enabled; vendor preset: disabled)
     Active: active (running) since Sun 2022-07-17 09:04:50 CEST; 5s ago
    Process: 84574 ExecStart=/usr/sbin/nslcd (code=exited, status=0/SUCCESS)
   Main PID: 84576 (nslcd)
      Tasks: 6 (limit: 2289)
     Memory: 1.0M
        CPU: 9ms
     CGroup: /system.slice/nslcd.service
             └─84576 /usr/sbin/nslcd

juil. 17 09:04:50 tahiti.kervao.fr systemd[1]: Starting Naming services LDAP client daemon...
juil. 17 09:04:50 tahiti.kervao.fr nslcd[84576]: version 0.9.11 starting
juil. 17 09:04:50 tahiti.kervao.fr nslcd[84576]: DEBUG: initgroups("nslcd",977) done
juil. 17 09:04:50 tahiti.kervao.fr nslcd[84576]: DEBUG: setgid(977) done
juil. 17 09:04:50 tahiti.kervao.fr nslcd[84576]: DEBUG: setuid(983) done
juil. 17 09:04:50 tahiti.kervao.fr nslcd[84576]: DEBUG: unlink() of /var/run/nslcd/socket failed (ignored): No such file or directory
juil. 17 09:04:50 tahiti.kervao.fr nslcd[84576]: accepting connections
juil. 17 09:04:50 tahiti.kervao.fr systemd[1]: Started Naming services LDAP client daemon.

si le serveur LDAP est configuré en connexion chiffrée, on modifiera ainsi le fichier /etc/nslcd.conf

# on doit indiquer ici ldaps qui est le protocole LDAP sur SSL, j'ai dû indiquer le nom de mon serveur slapd car son certificat le référence par son nom et non par son adresse IP

uri ldaps://serveur-slapd.kervao.fr/

# Use StartTLS without verifying the server certificate.
#ssl start_tls
#tls_reqcert allow

# CA certificates for server certificate verification, on indique ici le chemin du certificat du serveur slapd qu'il faudra placer dans le répertoire /etc/openldap/cacerts du client
tls_cacertdir /etc/openldap/cacerts
tls_cacertfile /etc/openldap/cacerts/ldapcrt.pem

on stoppe nslcd, si on le relance en mode debug, voilà ce qu'on peut voir (extrait)

juil. 17 09:01:17 tahiti.kervao.fr nslcd[84462]: [43a858] <passwd=5008> DEBUG: ldap_initialize(ldaps://serveur-slapd.kervao.fr/)

c'est tout bon !


[Retour haut de la page ]

Test de fonctionnement

C'est simple que ce soit sur le serveur ou le client, supprimer les lignes qui correspondent à vos utilisateur dans /etc/passwd, et /etc/shadow et faites de même pour vos groupes utilisateurs dans /etc/group. N'oubliez pas de faire une sauvegarde de ces fichiers au cas où ! Maintenant essayer de vous loguer en tant que simple utilisateur, et là normalement, vous devriez vous loguer sans problème.
[Retour haut de la page  ]

Utilisation

Créer un nouvel utilisateur

Maintenant pour créer un nouvel utilisateur, useradd ne fonctionne pas, car il repose uniquement sur /etc/passwd. On doit d'abord définir un mot de passe. On se sert pour cela de la fonction slappasswd

slappasswd -v -s toto345  -h {CRYPT}

On obtient

{CRYPT}rURm18fYhMvew

 Il faudra créer un fichier new.ldif qui aura cette tête là :

dn: uid=utilisateur,ou=People,dc=kervao,dc=fr
uid: utilisateur
cn: utilisateur
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {CRYPT}rURm18fYhMvew
shadowLastChange: 11858
shadowMax: 99999
shadowWarning: 7
shadowInactive: -1
shadowExpire: -1
shadowFlag: 1081428222
loginShell: /bin/bash
uidNumber: 5004
gidNumber: 5000
homeDirectory: /home/utilisateur
gecos: utilisateur

Pour mémoire voici la signification de chacun des paramètres des shadow passwords

shadowLastChange: date de dernière modification (en jour depuis le 1.1.70),
shadowMax: nombre de jours d'utilisation max du mot de passe (changement requis à l'issue), pas de période de validité si égal à 99999
shadowWarning: nombre de jours avant l'expiration pour avertir l'utilisateur ,
shadowInactive: nombre de jours après la date de l'expiration où on rend le compte inactif, fonctionnalité désactivé si égal à -1
shadowExpire: nombre de jours après le 1.1.70 où le compte sera désactivé, fonctionnalité désactivée si égal à -1
shadowFlag: ne sert à rien (dispo pour une utilisation future) .

ATTENTION Il ne doit pas y avoir de blanc ou de tabulation à la fin des lignes de votre fichier ldif

On tape ldapadd pour la saisie de l'utilisateur dans la base

ldapadd -x -D "cn=Manager,dc=kervao,dc=fr" -f /tmp/new.ldif -W
Enter LDAP Password:
adding new entry "uid=utilisateur,ou=People,dc=kervao,dc=fr"

C'est pas tout il faut indiquer maintenant que cet utilisateur appartient bien au groupe hoarau On crée ce fichier groupe.ldif contenant

dn: cn=hoarau,ou=Group,dc=kervao,dc=fr
Add: memberUid
memberUid: utilisateur

On modifie la base en tapant

ldapmodify -x -D "cn=Manager, dc=kervao, dc=fr" -W -f groupe.ldif
Enter LDAP Password:
modifying entry "cn=hoarau,ou=Group,dc=kervao,dc=fr"

Par contre il faudra créer manuellement la home directory en tant que root en tapant :

mkdir /home/utilisateur
cp -R /etc/skel/* /home/utilisateur
chown -R utilisateur:hoarau /home/utilisateur

[Retour haut de la page]

Rajouter un groupe

Sans rentrer dans les détails des commandes, le fichier ldif à créer pour la saisie d'un nouveau groupe est le suivant

dn: cn=newgroupe,ou=Group,dc=kervao,dc=fr
objectClass: posixGroup
objectClass: top
cn: newgroupe
gidNumber: 5000

Voilà le fichier pour rajouter des utilisateurs au groupe

dn: cn=newgroupe,ou=Group,dc=kervao,dc=fr
Add: memberUid
memberUid: new-utilisateur

[Retour haut de la page]

Supprimer un utilisateur

Pour supprimer l'utilisateur utilisateur on tapera

ldapdelete -x -D "cn=Manager, dc=kervao, dc=fr" "uid=utilisateur,ou=People,dc=kervao,dc=fr" -W

On créera ensuite un fichier delete.ldif contenant

dn: cn=hoarau,ou=Group,dc=kervao,dc=fr
delete: memberUid
memberUid: utilisateur

On tape maintenant

ldapmodify -x -D "cn=Manager, dc=kervao, dc=fr" -W -f delete.ldif
Enter LDAP Password:
modifying entry "cn=hoarau,ou=Group,dc=kervao,dc=fr"


[Retour haut de la page  ]

Changer son mot de passe

Maintenant le problème consiste à changer le mot de passe sans avoir à passer par le Manager. Un simple utilisateur doit pouvoir changer son propre mot de passe, prenons le cas de l'utilisateur olivier, il doit d'abord en trouver un avec la commande slappasswd

slappasswd -v -s tutu728  -h {CRYPT} 

Voilà le résultat

{CRYPT}WW6h470hoW4nI

Il crée maintenant le fichier modif.ldif contenant

dn: uid=olivier, ou=People, dc=kervao, dc=fr
changetype: modify
replace: userPassword
userPassword: {CRYPT}WW6h470hoW4nI

Et il modifie la base en tapant

[olivier@asterix olivier]$ ldapmodify -x -D "uid=olivier, ou=People, dc=kervao, dc=fr" -f /tmp/modif.ldif -W
Enter LDAP Password: (mot de passe d'olivier)
modifying entry "uid=olivier, ou=People, dc=kervao, dc=fr"

Voilà son mot de passe a été changé. Vous me direz c'est bien compliqué,  y a plus simple !

En tant que root modifiez le fichier /etc/pam.d/passwd (rajoutez uniquement les lignes concernant pam_ldap et laissez les autres) pour lire

#%PAM-1.0
auth       include      system-auth
auth       sufficient   pam_ldap.so
account    sufficient   pam_ldap.so
account    include      system-auth
password   sufficient   pam_ldap.so
password   substack     system-auth
password   optional     pam_gnome_keyring.so

Maintenant pour changer son mot de passe olivier tape le plus simplement du monde

passwd

Voilà le résultat

Enter login(LDAP) password:
New password:
Re-enter new password:
LDAP password information changed for olivier
passwd: all authentication tokens updated successfully

Ca marche !!!!

[Retour haut de la page]

Suggestion de mise en place

Pour l'administration je vous suggère admin4 qu'on peut récupérer par ici http://www.admin4.org/ on le décompresse en tapant

tar xvfz
admin4-3.0.1.tar.gz

cela donne le répertoire admin4-3.0.1. On installera préalablement les packages suivants

python-wxpython4

dnspython
python-requests
python-ldap

python3-psycopg2

on revient au répertoire admin4-3.0.1 et on tape

python admin4.py


et voilà le résultat



pour être plus facilement accessible j'ai créé le script /usr/bin/admin4 contenant

#!/bin/bash
python /usr/local/linux/systeme/admin4-3.0.1/admin4.py


en lui donnant les droits d'exécution

chmod 755 /usr/bin/admin4

 
[Retour page d'accueil FUNIX]
[Retour haut de la page ]