Table des matières

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

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 :

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 :

/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

Ubuntu 26.04

sudo apt install -y apparmor-utils
sudo aa-complain unix-chkpwd
KbdInteractiveAuthentication yes

puis sudo systemctl restart ssh.

sudo systemctl stop sssd && sudo systemctl disable sssd
sudo apt remove --purge sssd sssd-common libsss-* 2>/dev/null

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 :

⚠️ 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

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é) :

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

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)

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