===== Introduction =====
==== PAM ====
== Pluggable Authentication Modules ==
PAM est le système permettant à Unix d'identifier les utilisateurs et de vérifier de quels droit dispose un compte de vérifier si le mot de passe est correct, de lancer des scripts au démarrage, etc...
Il est basé sur une architecture modulaire et des configuratiosn disponible dans ``/etc/pam.d/`` et ``/etc/security/``.
== NSSwitch ==
NSSwitch permet aux outils Unix d'identification (``login``, ``shadow``, etc) de savoir où trouver les informations pour qu'ils puissent fonctionner (dans des fichiers, des serveurs DNS, des process, ou, par exemple, un annuaire ldap).
Il fonctionne avec nslcd qui permet de conserver en cache les informations des utilisateurs afin de pouvoir répondre aux requètes sans réinterroger à chaque fois les bases de données (et de permettre de pallier à de légères coupures de services).
===== Installation =====
Comme l'on va modifier les systèmes d'authentification et que donc l'on peut se retrouver coincé hors de la machine, il est recommandé de se prendre un shell en tant que root, permettant de remettre les choses en place éventuellement.
Avec tmux, cela se fait en faisant + pour ouvror une nouvelle fenêtre, puis
$ sudo -s
Nous nous baserons sur le [[https://wiki.debian.org/LDAP/PAM|Wiki Debian]] pour les procédures, le tout est détaillé en détail ci-dessous.
On commence par installer les paquets nécessaires.
$ sudo apt install libnss-ldapd nslcd libpam-ldapd
Attention à bien demander les variantes -ldapd et non -ldap des paquets, ils utilisent des systèmes plus récents.
==== Configuration ====
=== NSlcd ===
On configure nslcd en utilisant cette commande.
$ sudo dpkg-reconfigure nslcd
On renseigne les valeurs fournies par le [[ldap]] comme suit :
* LDAP server URI: **ldapi:\/\/\/**
* LDAP server search base: **dc=anarcha,dc=pink*
* LDAP authentication to use: **none**
* Use StartTLS: **No**
Comme on se connecte via les sockets Unix, pas besoin de starttls. Le reste devrait être relativement logique. Si on veut connecter des machines distantes à ce server, il ne faudra pas oublier d'activer TLS.
Le fichier de configuration doit maintenant ressembler à ça.
En remplissant les champs rootpw*, il est nécessaire d'écrire le mot de passe de l'admin LDAP, il est donc extrêmement important que seul root puisse ce fichier:
# chmod 0600 /etc/nslcd.conf
# /etc/nslcd.conf
# nslcd configuration file. See nslcd.conf(5)
# for details.
# The user and group nslcd should run as.
uid nslcd
gid nslcd
# The location at which the LDAP server(s) should be reachable.
uri ldapi:///
# The search base that will be used for all queries.
base dc=anarcha,dc=pink
# The LDAP protocol version to use.
#ldap_version 3
# The DN to bind with for normal lookups.
#binddn cn=admin,dc=anarcha,dc=pink
#bindpw jaaS9bie
# The DN used for password modifications by root.
rootpwmoddn cn=admin,dc=anarcha,dc=pink
rootpwmodpw *VERY SICRET PASSWORD*
# SSL options
ssl off
#tls_reqcert never
tls_cacertfile /etc/ssl/certs/ca-certificates.crt
# The search scope.
#scope sub
=== NSSwicth ===
Configuration de libnss-ldapd via ``dpkg-reconfigure``
$ sudo dpkg-reconfigure libpam-ldapd
On veut que NSSwitch utilise LDAP uniqueent pour ``passwd``, ``group`` et ``shadow``, qui permettent de récupérer les informations nécessaires à l'identification d'un utilisateur.
Le fichier de configuration de NSSwitch doit maintenant ressembler à ça :
# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.
passwd: compat ldap
group: compat ldap
shadow: compat ldap
gshadow: files
hosts: files dns
networks: files
protocols: db files
services: db files
ethers: db files
rpc: db files
netgroup: nis
On peut maintenant redémarrer nslcd et vérifier que tout fonctionne
$ sudo systemctl restart nslcd
$ sudo systemctl status nslcd
● nslcd.service - LSB: LDAP connection daemon
Loaded: loaded (/etc/init.d/nslcd; generated; vendor preset: enabled)
Active: active (running) since Wed 2018-06-27 19:57:02 CEST; 21s ago
Docs: man:systemd-sysv-generator(8)
Process: 22257 ExecStop=/etc/init.d/nslcd stop (code=exited, status=0/SUCCESS)
Process: 22268 ExecStart=/etc/init.d/nslcd start (code=exited, status=0/SUCCESS)
Tasks: 6 (limit: 4915)
CGroup: /system.slice/nslcd.service
└─22279 /usr/sbin/nslcd
juin 27 19:57:01 server02 systemd[1]: Starting LSB: LDAP connection daemon...
juin 27 19:57:01 server02 nslcd[22279]: version 0.9.7 starting
juin 27 19:57:02 server02 nslcd[22279]: accepting connections
juin 27 19:57:02 server02 nslcd[22268]: Starting LDAP connection daemon: nslcd.
juin 27 19:57:02 server02 systemd[1]: Started LSB: LDAP connection daemon.
On en profite pour vérifier que le bind anonyme fonctionne bien
$ ldapsearch -x
[...]
données ldap de tout l'arbre
[...]
=== libpam-ldapd ===
Comme nous utilisons libnss-ldapd, aucune configuration n'est nécessaire pour ce module. Mais au cas oú il faudrait changer les choses, pour désactiver un système par exemple, il faut configurer libpam-ldapd avec l'outil PAM adapté:
$ sudo pam-auth-update
Voici les fichiers communs de PAM et comment libpam-ldap les modifie.
[...]
# here are the per-package modules (the "Primary" block)
auth [success=2 default=ignore] pam_unix.so nullok_secure
auth [success=1 default=ignore] pam_ldap.so minimum_uid=1000 use_first_pass
# here's the fallback if no module succeeds
auth requisite pam_deny.so
# prime the stack with a positive return value if there isn't one already;
# this avoids us returning an error just because nothing sets a success code
# since the modules above will each just jump around
auth required pam_permit.so
# and here are more per-package modules (the "Additional" block)
# end of pam-auth-update config
Nous utilisons le module ldap avec le mot de passe saisi par l'utilisateur lors de la connexion (``use_first_pass``) afin d'éviter les saisies de commandes multiples. Nous réservons égalememnt l'utilisation de LDAP aux comptes ayant un uid >=1000 (Les comptes utilisateurs donc par opérations aux comptes systèmes).
# here are the per-package modules (the "Primary" block)
account [success=1 new_authtok_reqd=done default=ignore] pam_unix.so
# here's the fallback if no module succeeds
account requisite pam_deny.so
# prime the stack with a positive return value if there isn't one already;
# this avoids us returning an error just because nothing sets a success code
# since the modules above will each just jump around
account required pam_permit.so
# and here are more per-package modules (the "Additional" block)
account [success=ok new_authtok_reqd=done ignore=ignore user_unknown=ignore authinfo_unavail=ignore default=bad] pam_ldap.so minimum_uid=1000
# end of pam-auth-update config
On utilise l'authentification ldap pour associer le compte utilisateur à la session. On garde un ``minimum_uid=1000`` pour ne pas utiliser d'utilusateur système avec ldap et, en fonction du retour de la commande LDAP, on valide ou non si l'utilisateur est autoriséà se connecter.
Si le compte d'utilisateur n'est pas trouvé dans la base (ou que la base est indisponible), alors PAM ignore ce module et continue.
# here are the per-package modules (the "Primary" block)
password [success=2 default=ignore] pam_unix.so obscure sha512
password [success=1 default=ignore] pam_ldap.so minimum_uid=1000 try_first_pass
# here's the fallback if no module succeeds
password requisite pam_deny.so
# prime the stack with a positive return value if there isn't one already;
# this avoids us returning an error just because nothing sets a success code
# since the modules above will each just jump around
password required pam_permit.so
# and here are more per-package modules (the "Additional" block)
# end of pam-auth-update config
Pour préparer les mots de passe, on commence par vérifier si il en existe un dans la base unix (en le hashant avec l'algo SHA512). Si il ne trouve pas, alors il continue avec ldap. Si il trouve, alors il saute les deux instructiosn suivantes, afin d'autoriser la connexion
LDAP utilise le premier mot de passe entré par l'utilisateur.
Cela signifie qu'une utilisatrice disposant d'un compte de type unix et d'un autre sur LDAP, alors elle peut avoir un mot de passe différent pour chaque système. Soit elle utilise le mot de passe unix, et PAM saute à pam_permit, soit elle utilise son mot de passe ldap, et le résultat de ``pass_unix.so`` sera ignoré et le mot de passe saisis sera envoyé à LDAP pour validation.
# here are the per-package modules (the "Primary" block)
session [default=1] pam_permit.so
# here's the fallback if no module succeeds
session requisite pam_deny.so
# prime the stack with a positive return value if there isn't one already;
# this avoids us returning an error just because nothing sets a success code
# since the modules above will each just jump around
session required pam_permit.so
# and here are more per-package modules (the "Additional" block)
session required pam_unix.so
session [success=ok default=ignore] pam_ldap.so minimum_uid=1000
session optional pam_systemd.so
# end of pam-auth-update config
Classiquement, on vérifie que l'utilisateur LDAP a bien un uid >= 1000 et si le compte n'existe pas, alors on ignore et on passe à la suite, afin de permettre aux utilisateurs purement système de continuer de fonctionner.
Le fichier common-session-noninteractive contiens la même chose que le common-session, à l'exception de la ligne relative à systemd 9vu que c'est ce qui est utilisé pour les utilisateurs n'ouvrant pas de terminal).
Il est maintenant possible de restreindre les accès à certains groupes ou à certains services enmodifiant les fichiers contenus dans ``/etc/security.conf``