Dernière mise à jour : juin 2026
Kanidm est le fournisseur d'identité centralisé de l'infrastructure. Il gère les comptes, les groupes, le login système des portables (via kanidm-unixd avec cache offline) et servira de backend LDAP pour les services web (Nextcloud, DokuWiki, etc.).
kanidm/server:latestPortable (online) --> kanidm-unixd --> Kanidm (auth + cache) Portable (offline) --> kanidm-unixd --> cache local chiffré Navigateur --> auth.beafrancois.fr (self-service : mot de passe, MFA) Service web (futur) --> LDAP --> Kanidm
Internet | 443 v [ Routeur OpenWrt ] NAT 443 -> proxy | v LAN1 [ Proxy Caddy ] 192.168.1.25 | reverse_proxy https://192.168.1.9:8443 (TLS interne auto-signé) v [ Serveur Kanidm ] 192.168.1.9 :8443 interface HTTPS (web + API) :3636 interface LDAPS (pour les services)
auth.beafrancois.frtls_insecure_skip_verify
Une entrée DNS locale résout auth.beafrancois.fr vers l'IP du proxy Caddy (192.168.1.25), pour que la résolution fonctionne aussi sur le LAN.
Sur le proxy, dans le Caddyfile (emplacement : /etc/caddy/Caddyfile dans le conteneur, projet dans /opt/proxy) :
auth.beafrancois.fr {
reverse_proxy 192.168.1.9:8443 {
transport http {
tls
tls_insecure_skip_verify
}
}
}
Recharger Caddy après modification :
cd /opt/proxy docker compose exec caddy caddy reload --config /etc/caddy/Caddyfile
Seul le proxy Caddy est autorisé à joindre Kanidm :
# Interface HTTPS sudo ufw allow from 192.168.1.25 to any port 8443 # Interface LDAPS (pour les services web, ex. Nextcloud) sudo ufw allow from 192.168.1.25 to any port 3636
/mnt/stockage/docker/
├── compose/
│ └── auth/
│ └── docker-compose.yml
└── data/
└── kanidm/
├── server.toml ← configuration serveur
├── kanidm.db ← base de données
└── tls/ ← certificats auto-signés
├── ca.pem
├── cakey.pem
├── cert.pem
├── chain.pem
└── key.pem
Emplacement : /mnt/stockage/docker/compose/auth/docker-compose.yml
services: kanidm: image: kanidm/server:latest container_name: kanidm restart: unless-stopped volumes: - /mnt/stockage/docker/data/kanidm:/data ports: - "192.168.1.9:8443:8443" - "192.168.1.9:3636:3636" environment: - RUST_LOG=info networks: default: name: auth_net
Emplacement : /mnt/stockage/docker/data/kanidm/server.toml
domain = "beafrancois.fr" origin = "https://auth.beafrancois.fr" bindaddress = "0.0.0.0:8443" ldapbindaddress = "0.0.0.0:3636" db_path = "/data/kanidm.db" tls_chain = "/data/tls/chain.pem" tls_key = "/data/tls/key.pem" log_level = "info"
Permissions à appliquer (sinon Kanidm émet des avertissements de sécurité) :
sudo chmod 750 /mnt/stockage/docker/data/kanidm sudo chmod 640 /mnt/stockage/docker/data/kanidm/server.toml sudo chmod 640 /mnt/stockage/docker/data/kanidm/tls/key.pem sudo chmod 640 /mnt/stockage/docker/data/kanidm/tls/chain.pem
sudo mkdir -p /mnt/stockage/docker/data/kanidm/tls docker run --rm -it \ -v /mnt/stockage/docker/data/kanidm:/data \ kanidm/server:latest \ kanidmd cert-generate -c /data/server.toml
cd /mnt/stockage/docker/compose/auth docker compose up -d docker compose logs -f kanidm
Attendre la ligne : ready to rock! 🪨 UI available at: https://auth.beafrancois.fr/
Deux comptes d'administration distincts (comptes de secours, pas pour usage quotidien) :
admin : gère la configuration de Kanidm (domaine, oauth2)idm_admin : gère les personnes et les groupesdocker exec -it kanidm kanidmd recover-account admin -c /data/server.toml docker exec -it kanidm kanidmd recover-account idm_admin -c /data/server.toml
Noter les mots de passe générés.
L'administration se fait via l'image séparée kanidm/tools. Un wrapper simplifie les commandes.
Fichier ~/.config/kanidm/config :
uri = "https://auth.beafrancois.fr" verify_ca = false
Fichier ~/kanidm-cli (rendu exécutable avec chmod +x) :
#!/bin/bash docker run --rm -it \ --network host \ -e KANIDM_URL="https://auth.beafrancois.fr" \ -e KANIDM_VERIFY_CA="false" \ --mount "type=bind,src=$HOME/.cache/kanidm_tokens,target=/root/.cache/kanidm_tokens" \ kanidm/tools:latest \ kanidm "$@"
Note : les variables d'environnement KANIDM_URL et KANIDM_VERIFY_CA sont utilisées car le montage du fichier de config dans le conteneur posait problème. Initialiser le cache de tokens avant la première connexion :
echo '{}' > ~/.cache/kanidm_tokens chmod 666 ~/.cache/kanidm_tokens
~/kanidm-cli login --name idm_admin
La session reste valide un certain temps ; inutile de se reconnecter à chaque commande.
# Créer un groupe ~/kanidm-cli group create famille --name idm_admin ~/kanidm-cli group create partage --name idm_admin ~/kanidm-cli group create multimedia --name idm_admin # Lister les groupes ~/kanidm-cli group list --name idm_admin # Ajouter des membres ~/kanidm-cli group add-members famille francois beatrice corentin louis --name idm_admin # Lister les membres d'un groupe ~/kanidm-cli group list-members famille --name idm_admin
# Créer une personne ~/kanidm-cli person create francois "François" --name idm_admin # Activer l'extension POSIX (login système) avec UID/GID forcé ~/kanidm-cli person posix set francois --name idm_admin --gidnumber 1000 # Définir le mot de passe POSIX (login système / sudo) ~/kanidm-cli person posix set-password francois --name idm_admin
| Groupe | Rôle |
|---|---|
| famille | Accès commun aux 4 utilisateurs |
| partage | Accès au partage /export/partage |
| multimedia | Accès au partage /export/multimedia |
| Utilisateur | UID/GID | Identifiant |
|---|---|---|
| François | 1000 | francois |
| Béatrice | 1001 | beatrice |
| Corentin | 1002 | corentin |
| Louis | 1003 | louis |
Les UID/GID Kanidm sont forcés pour correspondre aux UID locaux existants sur les PC, ce qui garantit la cohérence de propriété des fichiers (notamment sur les partages NFS) et évite toute casse lors de la bascule.
Principe : ne jamais supprimer les comptes locaux avant validation complète de Kanidm.
testkanidm (UID 5000, n'existe sur aucun PC) pour valider le login online puis offline sans risquekanidm-unixd sur un PC de test (Debian, Ubuntu ou Arch — paquets natifs ou AUR)userdel sans -r (préserve le home), Kanidm prend le relais. Les UID identiques garantissent la cohérence des fichiersadmin et idm_admin sont des comptes break-glass : usage exceptionnel uniquement# État du conteneur cd /mnt/stockage/docker/compose/auth docker compose ps docker compose logs -f kanidm # Redémarrer docker compose restart kanidm # Mettre à jour docker compose pull docker compose up -d # Reset d'un compte break-glass (nécessite accès exclusif à la DB) docker exec -it kanidm kanidmd recover-account idm_admin -c /data/server.toml
Dernière mise à jour : juin 2026
Contexte : Kanidm est abandonné au profit de LLDAP + sssd, car l'authentification hors ligne (exigence fondamentale) ne fonctionne pas (auth refusée hors réseau malgré un credential caché — voir doc client Kanidm).
Principe : on désactive et on sauvegarde, on ne supprime pas définitivement tout de suite. La suppression réelle n'aura lieu qu'une fois LLDAP + sssd validé (offline inclus). Ça protège en cas de surprise avec la nouvelle solution.
sudo tar czf ~/kanidm-backup-$(date +%F).tar.gz -C /mnt/stockage/docker/data kanidm ls -lh ~/kanidm-backup-*.tar.gz
cd /mnt/stockage/docker/compose/auth docker compose down
mv /mnt/stockage/docker/compose/auth/docker-compose.yml \ /mnt/stockage/docker/compose/auth/docker-compose.yml.kanidm-disabled
sudo ufw status numbered # repérer les numéros des règles 8443 et 3636 sudo ufw delete <numero> # supprimer chaque règle (du plus grand numéro au plus petit)
Éditer le Caddyfile (commenter ou supprimer le bloc) :
# auth.beafrancois.fr {
# reverse_proxy 192.168.1.9:8443 {
# transport http {
# tls
# tls_insecure_skip_verify
# }
# }
# }
Puis recharger Caddy :
cd /opt/proxy docker compose exec caddy caddy reload --config /etc/caddy/Caddyfile
auth.beafrancois.fr → garder, réutilisable pour la future stack d'auth (LLDAP/Authelia)auth.beafrancois.fr → garder, idem~/kanidm-backup-*.tar.gz → conserver jusqu'à validation complète de LLDAP~/kanidm-cli → laisser (inoffensif, utile pour ré-exporter des données si besoin)⚠️ Ne faire ces étapes qu'une fois LLDAP + sssd pleinement validé, offline compris, sur tous les portables.
# Supprimer les données (le backup reste disponible si besoin) sudo rm -rf /mnt/stockage/docker/data/kanidm # Supprimer le dossier compose rm -rf /mnt/stockage/docker/compose/auth # Supprimer l'image Docker docker image rm kanidm/server:latest # Supprimer le wrapper CLI rm -f ~/kanidm-cli rm -rf ~/.config/kanidm ~/.cache/kanidm_tokens
# Désactiver et purger le client (APRÈS bascule vers sssd) sudo systemctl disable --now kanidm-unixd kanidm-unixd-tasks sudo apt remove --purge kanidm-unixd libnss-kanidm libpam-kanidm kanidm # Nettoyer la config résiduelle sudo rm -rf /etc/kanidm # Vérifier nsswitch.conf : retirer 'kanidm' des lignes passwd/group sudo nano /etc/nsswitch.conf # Relancer pam-auth-update pour retirer le profil Kanidm sudo pam-auth-update
sudo rm -f /etc/apt/sources.list.d/kanidm_ppa.list sudo rm -f /etc/apt/trusted.gpg.d/kanidm_ppa.asc sudo apt update
auth.beafrancois.fr selon le sous-domaine retenu pour LLDAP/Authelia~/kanidm-backup-*.tar.gz une fois certain de ne plus en avoir besoindocker compose down).kanidm-disabledauth.beafrancois.fr commenté + Caddy rechargé