====== Client sssd (Arch / CachyOS) — login système via LLDAP ====== Dernière mise à jour : juin 2026 État : **validé sur CachyOS** (portable-tuxedo) — login en ligne fonctionnel via sssd. Voir la doc serveur pour LLDAP/réseau/UID-GID, et la doc client Debian pour les détails communs sssd. Cette page ne couvre que les **spécificités Arch/CachyOS** (NSS et PAM ne se configurent PAS automatiquement, contrairement à Debian). ===== Installation ===== sudo pacman -S sssd (tire les modules NSS/PAM nécessaires ; ''pam_sss.so'' dans ''/usr/lib/security/'') Pour les tests LDAP en ligne de commande : ''sudo pacman -S openldap'' (fournit ''ldapsearch''). ===== Certificat CA ===== sudo mkdir -p /etc/ssl/lldap sudo scp maitre@192.168.1.9:/mnt/stockage/docker/data/lldap/ca-cert.pem /etc/ssl/lldap/ca-cert.pem sudo chmod 644 /etc/ssl/lldap/ca-cert.pem sudo chown root:root /etc/ssl/lldap/ca-cert.pem ===== sssd.conf ===== **Identique à la config Debian** (voir doc client Debian pour le fichier complet et le détail des options). Emplacement ''/etc/sssd/sssd.conf'', permissions **600 root:root** obligatoires. Points clés du mapping (rappel) : * ''ldap_uri = %%ldaps://auth.beafrancois.fr:6360%%'' * ''ldap_schema = rfc2307bis'' * ''ldap_user_object_class = posixAccount'' / ''ldap_group_object_class = groupOfNames'' / ''ldap_group_member = member'' * ''access_provider = simple'' + ''simple_allow_groups = famille'' * ''cache_credentials = True'' + ''offline_credentials_expiration = 0'' (dans ''[pam]'') * ''ldap_user_shell = unixShell'' + ''default_shell = /bin/bash'' (fallback) * **PAS** de ''auto_private_groups'', **PAS** de groupes privés (groupe primaire = famille 302) sudo chmod 600 /etc/sssd/sssd.conf sudo chown root:root /etc/sssd/sssd.conf sudo sssctl config-check # doit retourner 0 issue sudo systemctl enable --now sssd sudo sssctl domain-status beafrancois.fr # doit afficher Online ===== NSS (à faire à la main sur Arch) ===== Arch ne modifie PAS ''/etc/nsswitch.conf'' automatiquement. Éditer : passwd: files sss systemd group: files [SUCCESS=merge] sss [SUCCESS=merge] systemd Le ''[SUCCESS=merge]'' sur ''group'' permet de fusionner les appartenances locales ET LLDAP (un user peut cumuler ses groupes système locaux et ses groupes LLDAP). Vérifier : sudo systemctl restart sssd getent passwd francois # doit afficher uid=10000 gid=302 ... /usr/bin/zsh ===== PAM (à faire à la main sur Arch) ===== Arch n'a PAS ''pam-auth-update''. Éditer ''/etc/pam.d/system-auth'' à la main. **Sauvegarder d'abord :** sudo cp /etc/pam.d/system-auth /etc/pam.d/system-auth.bak **⚠️ POINT CRITIQUE — ''try_first_pass'' (pas ''use_first_pass'') :** Avec ''use_first_pass'', pam_sss attend un mot de passe déjà mis en cache par un module précédent ; dans la stack Arch (faillock + systemd_home), ce cache n'est pas peuplé au bon moment → pam_sss reçoit un mot de passe vide → ''Invalid credentials(49)'' / échec d'auth. **Utiliser ''try_first_pass''** (redemande le mot de passe si absent du cache). ''/etc/pam.d/system-auth'' (version validée) : #%PAM-1.0 auth required pam_faillock.so preauth -auth [success=3 default=ignore] pam_systemd_home.so auth [success=2 default=ignore] pam_sss.so try_first_pass forward_pass auth [success=1 default=bad] pam_unix.so try_first_pass nullok auth [default=die] pam_faillock.so authfail auth optional pam_permit.so auth required pam_env.so auth required pam_faillock.so authsucc -account [success=2 default=ignore] pam_systemd_home.so account [success=1 default=ignore] pam_sss.so account required pam_unix.so account optional pam_permit.so account required pam_time.so -password [success=2 default=ignore] pam_systemd_home.so password sufficient pam_sss.so password required pam_unix.so try_first_pass nullok shadow password optional pam_permit.so -session optional pam_systemd_home.so session required pam_limits.so session required pam_unix.so session optional pam_mkhomedir.so skel=/etc/skel umask=0077 session optional pam_sss.so session optional pam_permit.so **⚠️ Ligne ''pam_mkhomedir.so'' indispensable** : sur Arch, rien ne crée le home d'un utilisateur LLDAP à la première connexion (contrairement à Debian où ''pam-auth-update'' coche « create home dir »). Sans cette ligne dans la phase session, le login réussit mais le home n'existe pas. ''skel=/etc/skel'' copie les fichiers de base, ''umask=0077'' rend le home privé. ===== Pièges spécifiques Arch ===== ==== su ne teste PAS sss ==== ''/etc/pam.d/su'' appelle ''pam_unix.so'' en dur (il n'inclut ''system-auth'' que pour ''password''). Donc **''su - '' échoue toujours**, même avec une config sss correcte — ce n'est PAS un bon test. Tester avec un **vrai login** : TTY (Ctrl+Alt+F3) ou ssh. Pour que ''su'' fonctionne aussi avec sss (optionnel), remplacer dans ''/etc/pam.d/su'' les lignes ''auth/account/session required pam_unix.so'' par ''include system-auth''. ==== ssh : KbdInteractiveAuthentication ==== Si l'auth ssh par mot de passe échoue alors que pam_sss est bien appelé, vérifier ''/etc/ssh/sshd_config.d/99-archlinux.conf'' : ''KbdInteractiveAuthentication'' doit être à **''yes''** (sinon ssh ne transmet pas le mot de passe à PAM correctement). ''sudo systemctl restart sshd'' après modif. ==== faillock (verrouillage après échecs) ==== Les tentatives ratées répétées verrouillent le compte (''account locked''). Débloquer : sudo faillock --user francois --reset sudo faillock --user francois # vérifier (liste vide = OK) ===== Bascule d'un compte local en collision (cas francois) ===== Quand un compte **local** porte le même nom qu'un compte LLDAP mais avec un UID différent (local 1000 vs LLDAP 10000) : - **Créer un compte admin local de secours** (autre nom) AVANT toute manip, et valider son sudo : sudo useradd -m -G wheel,network,audio,storage,video,libvirt,users,rfkill,lp,sys -s /bin/bash beafrancois sudo passwd beafrancois # se déconnecter, se reconnecter en beafrancois, vérifier : sudo whoami -> root (sur Arch, sudo = groupe ''wheel'' ; vérifier ''%wheel ALL=(ALL) ALL'' dans ''/etc/sudoers.d/'') - **Sauvegarder** les infos du compte local avant suppression (filet) : getent passwd francois >> ~/francois-backup.txt getent group francois >> ~/francois-backup.txt - **Supprimer le compte local SANS ''-r''** (préserve le home) — en étant connecté en beafrancois, pas en francois : sudo pkill -u francois 2>/dev/null sudo userdel francois # le home /home/francois reste intact - **Installer/configurer sssd** (ci-dessus) pour que francois LLDAP (uid 10000) soit résolu. - **Réattribuer le home** au nouvel UID LLDAP (les fichiers étaient à l'ancien UID 1000) : sudo chown -R 10000:302 /home/francois - **Valider** le login francois (TTY ou ssh) puis l'offline. ===== Tests de validation ===== getent passwd francois # uid=10000 gid=302 ... /home/francois /usr/bin/zsh id francois # groupes : 302(famille) + secondaires éventuels ssh francois@localhost # login en ligne (vrai vecteur, PAS su) **Bind direct** (pour isoler un souci d'auth : si le bind marche mais pas le login, le problème est PAM, pas LDAP) : LDAPTLS_CACERT=/etc/ssl/lldap/ca-cert.pem ldapsearch -x \ -H ldaps://auth.beafrancois.fr:6360 \ -D "uid=francois,ou=people,dc=beafrancois,dc=fr" -w 'MDP' \ -b "dc=beafrancois,dc=fr" "(uid=francois)" dn **Offline** (réseau coupé, vrai login TTY/ssh) — après un login en ligne réussi qui peuple le cache. Voir doc client Debian pour la procédure détaillée et le piège MPG. ===== GNOME Keyring : déverrouillage automatique avec LDAP/sssd (CachyOS) ===== === Symptôme === Après migration vers l'auth LDAP (LLDAP + sssd), le trousseau ne se déverrouille plus au login. Pop-ups en boucle : « The login keyring did not get unlocked » ou « Choose password for new keyring » (déclenchées par toute appli utilisant le Secret Service : Nextcloud, Signal, etc.) Diagnostic dans les logs : journalctl -b | grep -i gkr-pam → gkr-pam: no password is available for user → gkr-pam: couldn't unlock the login keyring. === Cause === ''pam_sss'' authentifie mais **ne transmet pas le mot de passe** aux modules PAM suivants. ''pam_gnome_keyring'' n'a donc jamais le mot de passe pour créer/déverrouiller le trousseau ''login''. Aggravé par ''gnome-keyring-daemon'' démarré par le socket systemd user (hors session PAM, sans mot de passe). === Procédure complète === == 1. PAM : forward_pass (le fix principal) == Dans ''/etc/pam.d/system-auth'', ajouter ''forward_pass'' à la ligne auth pam_sss : auth [success=2 default=ignore] pam_sss.so try_first_pass forward_pass ⚠ Garder un shell root ouvert (TTY) pendant l'édition d'un fichier PAM. == 2. Vérifier la pile PAM de GDM == ''/etc/pam.d/gdm-password'' doit contenir (présent par défaut) : auth optional pam_gnome_keyring.so password optional pam_gnome_keyring.so use_authtok session optional pam_gnome_keyring.so auto_start == 3. Désactiver le lancement par socket systemd (global, tous utilisateurs) == Le daemon doit être lancé par PAM, pas par systemd. Poste multi-utilisateurs → mask **global** : sudo ln -s /dev/null /etc/systemd/user/gnome-keyring-daemon.socket sudo ln -s /dev/null /etc/systemd/user/gnome-keyring-daemon.service //(équivalent d'un ''systemctl --user mask'' appliqué à tous les utilisateurs du poste)// == 4. Purger les trousseaux désalignés (par utilisateur) == Depuis un TTY, session graphique fermée : cd ~/.local/share/keyrings/ rm -f *.keyring # supprime les trousseaux chiffrés avec l'ancien mdp echo -n "login" > default (''user.keystore'' peut rester ; sauvegarder les .keyring avant si secrets à récupérer) == 5. Relogin et validation == Reconnexion GDM complète (mot de passe LDAP). PAM crée alors ''login.keyring'' chiffré avec le mot de passe LDAP et le déverrouille automatiquement. ls ~/.local/share/keyrings/ # login.keyring doit exister journalctl -b | grep -i gkr-pam # plus de "no password is available" secret-tool store --label=test test k # stocke sans pop-up de déverrouillage ssh-add -l # si keyring utilisé comme agent SSH : doit répondre === Notes === * Étapes 1–3 : une fois par poste. Étape 4 : pour **chaque utilisateur** du poste. * Ne jamais créer le trousseau ''login'' à la main (Seahorse) : laisser PAM le créer, sinon l'auto-unlock est aléatoire. * Le mot de passe du trousseau = mot de passe de session, toujours. Synchronisé automatiquement si le changement de mdp passe par PAM. * Ne pas démasquer les services systemd du keyring : le mask fait partie du fix (sinon le daemon redémarre hors PAM et le conflit revient). ===== Sécurité ===== * Garder le compte admin local de secours (''beafrancois'') hors LLDAP — accès garanti si l'annuaire est indisponible. * ''offline_credentials_expiration = 0'' (cache illimité) → **LUKS recommandé** sur le portable (un portable volé jamais reconnecté garde l'accès indéfiniment).