Outils pour utilisateurs

Outils du site


commun:client_authentification_kanidm

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/<uuid>.

/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/<uuid>)
  • ✓ 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/<uuid> + 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
commun/client_authentification_kanidm.txt · Dernière modification : de francois

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki