Mettez un manchot dans votre PC
Dernière modification 3 février 2017
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.
tar xvfz MigrationTools.tgz
Cela donne le répertoire MigrationTools-47
Maintenant à l'adresse http://arthurdejong.org/nss-pam-ldapd/
on récupèrera nss-pam-ldap
qui comme c'est marqué sur le site 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. On
décompresse l'archive en tapant :
nss-pam-ldapd-0.9.7.tar.gz
cela donne le répertoire nss-pam-ldapd-0.9.7 dans lequel on tape
./configure
Avant d'aller plus loin, installer le package pam-devel on tape ensuite
make
Puis en tant que root
make install
puis on crée les liens suivants
ln -s /lib/security/pam_ldap.so
/lib64/security
ln -s /lib/security/pam_ldap.so /usr/lib64/security/
ln -s /lib/libnss_ldap.so.2 /lib64
[Unit]
Description=Naming services LDAP client daemon
After=syslog.target network.target
[Service]
Type=forking
PIDFile=/run/nslcd/nslcd.pid
ExecStart=/usr/sbin/nslcd
[Install]
WantedBy=multi-user.target
on crée maintenant un utilisateur et un groupe système nslcd
groupadd nslcd
useradd -g nslcd -c "system user for nss-pam-ldapd" -s /bin/false -d /
nslcd
# Basic ACL
access to attrs=userPassword
by self write
by anonymous auth
by
dn="cn=Manager,dc=kervao,dc=fr" write
by * none
access to *
by
dn="cn=Manager,dc=kervao,dc=fr" write
by * read
Relancer le serveur LDAP
systemctl restart slapd.service
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";
Eventuellement 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
Editez 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
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
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
# 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
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.
Reprenons donc notre fichier system-auth il doit ressembler à ça (rajoutez uniquement les lignes concernant pam_ldap et laissez les autres) :
#%PAM-1.0Relancer 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)
Active: active (running) since sam. 2016-12-24 11:22:34
CET; 4min 19s ago
Process: 21038 ExecStart=/usr/sbin/nslcd (code=exited,
status=0/SUCCESS)
Main PID: 21041 (nslcd)
CGroup: /system.slice/nslcd.service
└─21041
/usr/sbin/nslcd
déc. 24 11:22:34 mana.kervao.fr nslcd[21041]: version 0.9.7 starting
déc. 24 11:22:34 mana.kervao.fr nslcd[21041]: accepting connections
si vous obtenez dans les logs du serveur ce genre de messages
déc. 23 19:25:06 mana.kervao.fr slapd[12893]: <=
bdb_equality_candidates: (uidNumber) not indexed
déc. 23 19:25:07 mana.kervao.fr slapd[12893]: <=
bdb_equality_candidates: (uidNumber) not indexed
déc. 23 19:25:07 mana.kervao.fr slapd[12893]: <=
bdb_equality_candidates: (uidNumber) not indexed
sur le serveur il faut revenir au fichier de configuration de slapd à savoir slapd.conf et juste après
# Indices to maintain
index objectClass eq
on va déclarer d'autres index pour la base de données LDAP
index
uid
pres,sub,eq
index
member
eq
index uidNumber eq
index gidNumber eq
index memberUid eq
on stoppe nslcd sur les clients
(et le serveur)
systemctl stop nslcd.service
on stoppe slapd sur le serveur
systemctl stop slapd.service
on reconstuit les index en tapant
slapdindex
et on relance le serveur
systemctl start slapd.service
ainsi que nslcd sur tous les
clients (et le serveur)
systemctl start nslcd.service
si le serveur LDAP est
configuré en connexion
chiffrée, on modifiera ainsi le fichier
/etc/nslcd.conf
# Use StartTLS without verifying the
server certificate.
ssl start_tls
tls_reqcert allow
# CA certificates for server certificate verification
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)
nslcd: DEBUG: NSS_LDAP nss-pam-ldapd
0.9.7
nslcd: DEBUG: ldap_set_option(LDAP_OPT_X_TLS_REQUIRE_CERT,allow)
nslcd: DEBUG:
ldap_set_option(LDAP_OPT_X_TLS_CACERTDIR,"/etc/openldap/cacerts")
nslcd: DEBUG:
ldap_set_option(LDAP_OPT_X_TLS_CACERTFILE,"/etc/openldap/cacerts/ldapcrt.pem")
avec un su toto
on obtient (extrait)
nslcd: DEBUG: CFG: reconnect_sleeptime
1
nslcd: DEBUG: CFG: reconnect_retrytime 10
nslcd: DEBUG: CFG: ssl start_tls
nslcd: DEBUG: CFG: tls_reqcert allow
nslcd: DEBUG: CFG: tls_cacertdir /etc/openldap/cacerts
nslcd: DEBUG: CFG: tls_cacertfile /etc/openldap/cacerts/ldapcrt.pem
nslcd: DEBUG: CFG: pagesize 0
nslcd: DEBUG: CFG: nss_min_uid 0
(...)
nslcd: [1d5ae9] <passwd=5008>
DEBUG: ldap_start_tls_s()
nslcd: [1d5ae9] <passwd=5008> DEBUG:
ldap_simple_bind_s("cn=Manager,dc=kervao,dc=fr","***")
(uri="ldap://192.168.0.13/")
nslcd: [1d5ae9] <passwd=5008> DEBUG: ldap_result():
uid=toto,ou=People,dc=kervao,dc=fr
nslcd: [1d5ae9] <passwd=5008> DEBUG: ldap_result(): end of results
(1 total)
nslcd: DEBUG: NSS_LDAP nss-pam-ldapd 0.9.7
nslcd: DEBUG: ldap_set_option(LDAP_OPT_X_TLS_REQUIRE_CERT,allow)
nslcd: DEBUG:
ldap_set_option(LDAP_OPT_X_TLS_CACERTDIR,"/etc/openldap/cacerts")
nslcd: DEBUG:
ldap_set_option(LDAP_OPT_X_TLS_CACERTFILE,"/etc/openldap/cacerts/ldapcrt.pem")
c'est tout bon !
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
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
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"
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.0Maintenant 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 page d'accueil FUNIX] |