====== Client Kanidm — login système des portables (kanidm-unixd) ====== Dernière mise à jour : juin 2026 État : **config validée et fonctionnelle en ligne** (nom court, home court, SSH OK). Un point précis en suspens : l'authentification **hors ligne** est refusée (voir section dédiée). ===== Objectif ===== Permettre aux 4 utilisateurs de se connecter à leurs portables avec leurs identifiants Kanidm centralisés, y compris **hors réseau** grâce au cache local de ''kanidm-unixd''. Les homes restent locaux (pas de NFS). ===== Machines de test ===== * **Portable Debian :** lat7400 — Debian Trixie (13), kernel 6.12 — **machine de référence, config validée** * **Portable Ubuntu :** clelinfoue — Ubuntu 26.04 LTS (resolute) — première install, a servi à défricher * **Compte de test :** ''testkanidm'' (UID/GID 5000, n'existe sur aucun PC en local) * Distributions cibles à terme : Debian, Ubuntu, Arch ===== Installation ===== ==== Dépôt PPA Kanidm — choix du codename ==== Le PPA ne reconnaît que les codenames LTS connus. Pour les versions récentes, forcer la cible LTS la plus proche : * **Ubuntu 26.04 (resolute)** → forcer ''noble'' (24.04) * **Debian Trixie (13)** → forcer ''bookworm'' (12) sudo mkdir -p /etc/apt/trusted.gpg.d/ curl -s "https://kanidm.github.io/kanidm_ppa/kanidm_ppa.asc" \ | sudo tee /etc/apt/trusted.gpg.d/kanidm_ppa.asc >/dev/null # Adapter le codename : noble (Ubuntu récent) ou bookworm (Debian récent) echo "deb [arch=amd64,arm64 signed-by=/etc/apt/trusted.gpg.d/kanidm_ppa.asc] https://kanidm.github.io/kanidm_ppa noble stable" \ | sudo tee /etc/apt/sources.list.d/kanidm_ppa.list sudo apt update ==== Paquets ==== sudo apt install -y kanidm-unixd libnss-kanidm libpam-kanidm kanidm Version PPA installée : **1.10.2**. Serveur en **1.10.3**. Un warning « Mismatched client and server version » apparaît ; aucun impact constaté sur le fonctionnement en ligne (voir note versions). ===== Configuration ===== ==== /etc/kanidm/config ==== uri = "https://auth.beafrancois.fr" verify_ca = false ''verify_ca'' pourra passer à ''true'' (Caddy présente un certificat Let's Encrypt valide). À valider en LAN et hors LAN. ==== /etc/kanidm/unixd — CONFIG VALIDÉE ==== **Point clé découvert :** dans le format ''version = '2''', les options de **mapping / résolution / home** doivent être placées **à la racine** du fichier, PAS sous ''[kanidm]''. Seules les options propres au provider (''pam_allowed_login_groups'', ''default_shell'') vont sous ''[kanidm]''. C'est ce placement qui corrige le suffixe ''@beafrancois.fr'' (nom et home courts). version = '2' uid_attr_map = "name" gid_attr_map = "name" home_attr = "uuid" home_alias = "name" home_prefix = "/home/" [kanidm] pam_allowed_login_groups = ["famille"] default_shell = "/bin/bash" **⚠️ Pièges sur ce fichier :** * La section ''[kanidm]'' est **commentée par défaut**. Sans elle (décommentée), le provider n'est pas actif → « No provider is willing to service authentication ». * Ne pas laisser **deux lignes** ''version = '2''' (le template en a déjà une) → erreur ''duplicate key'' au démarrage de ''pam-auth-update''. * Résultat attendu : ''getent passwd testkanidm'' → ''testkanidm:x:5000:5000:...:/home/testkanidm:/bin/bash'' (sans suffixe), et un symlink ''/home/testkanidm -> /home/''. ==== /etc/nsswitch.conf ==== Selon la doc Kanidm : ''kanidm'' en **premier**, ''systemd'' en **dernier**. passwd: kanidm files systemd group: kanidm files systemd ==== PAM (pam-auth-update) ==== Cocher : Unix authentication, Kanidm Authentication, Create home directory on login, Maintain wtmp, Register user sessions in systemd, GNOME Keyring. **Décocher** toute entrée SSS/SSSD. ===== Spécificités par distribution ===== ==== Debian Trixie ==== * Dépôt : forcer ''bookworm'' * **AppArmor : non bloquant.** Le profil ''unix-chkpwd'' de Trixie autorise déjà l'accès au socket Kanidm (log ''apparmor="ALLOWED" ... /etc/kanidm/unixd''). **Aucune action requise.** * **SSH :** ''KbdInteractiveAuthentication yes'' a aussi été positionné sur Trixie (par cohérence avec Ubuntu). À vérifier si Trixie en a réellement besoin avec sa valeur par défaut, ou si c'est superflu ici — non tranché. * Installation globalement plus propre que sur Ubuntu (moins de frictions). ==== Ubuntu 26.04 ==== * Dépôt : forcer ''noble'' * **AppArmor : bloquant.** Le profil ''unix-chkpwd'' bloque l'accès au socket Kanidm (''apparmor="DENIED" ... /run/kanidm-unixd/sock'') → l'auth échoue. Contournement : sudo apt install -y apparmor-utils sudo aa-complain unix-chkpwd * **SSH : nécessitait un correctif.** ''KbdInteractiveAuthentication no'' dans ''/etc/ssh/sshd_config'' empêche le login par mot de passe via PAM. Passer à : KbdInteractiveAuthentication yes puis ''sudo systemctl restart ssh''. * **sssd résiduel.** La machine avait ''sssd'' installé (inactif). Il entre en conflit avec kanidm-unixd. Retiré : sudo systemctl stop sssd && sudo systemctl disable sssd sudo apt remove --purge sssd sssd-common libsss-* 2>/dev/null * **Symptôme ''fatal: PAM user mismatch'' au login SSH** : causé par le suffixe ''@beafrancois.fr'' (nom long). Réglé par le bon placement de ''uid_attr_map'' à la racine (voir config validée). Avant correctif, contournement : ''ssh 'testkanidm@beafrancois.fr'@localhost''. ===== Mise en service côté serveur (rappel) ===== # POSIX sur l'utilisateur, UID/GID forcé pour matcher les comptes locaux ~/kanidm-cli person posix set testkanidm --name idm_admin --gidnumber 5000 # Le GROUPE d'accès PAM doit AUSSI être POSIX (sinon account failed) ~/kanidm-cli group posix set famille --name idm_admin # Appartenance au groupe autorisé ~/kanidm-cli group add-members famille testkanidm --name idm_admin **Mot de passe Unix (POSIX)** — DISTINCT du mot de passe web/principal. Deux méthodes : * CLI : ''~/kanidm-cli person posix set-password testkanidm --name idm_admin'' * Interface web : via le lien de réinitialisation (''person credential create-reset-token''), choisir **"Add Unix password"** **⚠️** Politique de complexité stricte (rejet des mots de passe faibles/compromis). Utiliser une passphrase longue. **⚠️ PIÈGE IMPORTANT — le flux web casse le credential POSIX.** Modifier le **mot de passe principal** (web) via l'interface de réinitialisation **invalide le credential POSIX** existant. Symptôme : l'auth POSIX (login système, ''auth-test'') échoue en ligne avec ''auth failed'' alors qu'elle marchait avant, même si le mot de passe principal et le POSIX ont la même valeur. **Correctif :** redéfinir le mot de passe POSIX en CLI après toute modification web : ~/kanidm-cli person posix set-password testkanidm --name idm_admin sudo kanidm-unix cache-invalidate # côté client Conséquence pratique : éviter de mélanger gestion web (principal) et CLI (POSIX) sur un même compte sans refaire le POSIX ensuite. ===== État actuel — ce qui fonctionne ===== * ✓ Daemon ''kanidm-unixd'' online, connecté au serveur * ✓ Résolution NSS avec **nom court** (''testkanidm'', plus de suffixe) * ✓ **Home court** (''/home/testkanidm'' → symlink vers ''/home/'') * ✓ Authentification **en ligne** de bout en bout (''auth success! account success!'') * ✓ Login ''su'', ''sudo su'' fonctionnels * ✓ Login **SSH en ligne** avec nom court (Debian : direct ; Ubuntu : après correctif KbdInteractive) * ✓ Création automatique du home * ✓ TPM détecté, HSM initialisé, **credential mis en cache** lors de l'auth en ligne (log ''Updated cached pw'') ===== Point en suspens : authentification HORS LIGNE refusée ===== **C'est le point bloquant pour l'objectif initial (login sans réseau).** ==== Symptôme ==== Hors ligne (réseau réellement coupé) : * ''account success'' — la résolution du compte fonctionne (données cachées OK) * ''auth failed'' — la vérification du mot de passe échoue, **avec le même mot de passe qui fonctionne en ligne** ==== Ce que montrent les logs (RUST_LOG=debug) ==== **En ligne**, auth réussie — le credential EST mis en cache : unix_user_online_auth_step Updated cached pw | spn: testkanidm@beafrancois.fr Authentication Success **Hors ligne**, le chemin offline est bien emprunté mais refuse : pam_account_authenticate_step get_cached_usertoken ← le credential caché est lu hmac_s256 ← le hash du mot de passe saisi est calculé Authentication Denied Donc : le credential est caché, le chemin offline le relit, calcule le hash du mot de passe, et la comparaison **échoue** alors que c'est le même mot de passe qu'en ligne. ==== Pistes écartées factuellement ==== * Mot de passe erroné : non — il fonctionne en ligne juste avant/après, de façon répétée * Cache désynchronisé après changement de mot de passe : non — plusieurs auth en ligne réussies (''Updated cached pw'') ont eu lieu après le dernier changement * Credential non mis en cache : non — le log ''Updated cached pw'' le confirme * Données de compte non cachées : non — ''account success'' en offline * TPM absent : non — TPM présent, HSM initialisé * Credential POSIX cassé par le flux web : écarté pour le offline — après avoir **redéfini le POSIX en CLI** et fait une **auth en ligne réussie juste avant** de couper (donc credential frais et fraîchement mis en cache), le offline **échoue toujours** à l'identique. Ce piège web (voir section serveur) explique des échecs **en ligne**, pas l'échec offline. ==== Hypothèse à investiguer (non confirmée) ==== Le hash est lié au HSM/TPM. Si le pin/clé HSM n'est pas relu de façon déterministe entre la mise en cache et la vérification hors ligne, le credential caché devient invérifiable. Le log montre un ''Generated new HSM pin'' à l'init — à creuser : ce pin est-il stable entre redémarrages / sessions ? ==== Prochaine étape recommandée ==== Ne pas multiplier les hypothèses. Poser la question aux mainteneurs Kanidm (issue GitHub ou forum) avec la signature exacte du problème : **''hmac_s256'' suivi de ''Authentication Denied'' en mode offline, alors que le même mot de passe réussit en ligne et que ''Updated cached pw'' apparaît bien lors de l'auth en ligne.** Joindre la version (client 1.10.2 / serveur 1.10.3) et la config unixd. ===== Note : alignement des versions ===== Client 1.10.2 (PPA) vs serveur 1.10.3 (Docker ''latest''). Pas de preuve que ça cause le problème offline, mais l'alignement est souhaitable. Lié au sujet **stratégie de mise à jour des images Docker** (épingler les versions Kanidm plutôt que subir ''latest''). À traiter séparément. ===== Bascule des vrais comptes (plus tard) ===== * Le home en ''/home/'' + symlink est le mode **recommandé** par Kanidm (''home_attr = "uuid"'') * Pour les vrais utilisateurs avec ''/home/francois'' existant : prévoir la migration du contenu vers le dossier UUID, ou une stratégie d'alias adaptée * Ne supprimer les comptes locaux (''userdel'' **sans** ''-r'') qu'après validation complète, PC par PC * Chiffrement disque (LUKS) recommandé (le cache offline stocke des credentials) ===== Commandes de diagnostic utiles ===== sudo kanidm-unix status # online/offline + état serveur sudo kanidm-unix auth-test --name testkanidm # test auth+account isolé sudo kanidm-unix cache-invalidate # refresh cache (garde l'offline) sudo kanidm-unix cache-clear --really # efface TOUT le cache (perte offline) getent passwd testkanidm ; id testkanidm # résolution NSS # Logs détaillés sudo systemctl edit kanidm-unixd # ajouter [Service] Environment="RUST_LOG=debug" sudo systemctl restart kanidm-unixd sudo journalctl -u kanidm-unixd -f | grep -iE "testkanidm|online|offline|cred|tpm|hsm|hmac" # Tests de login (du moins au plus complet) sudo su - testkanidm # court-circuite l'auth (account + session) su - testkanidm # auth + account + session, hors SSH ssh testkanidm@localhost