====== Serveur d'authentification — Kanidm ====== Dernière mise à jour : juin 2026 ===== Vue d'ensemble ===== 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.). * **Version :** 1.10.3 * **Conteneur :** ''kanidm/server:latest'' * **Accès web :** https://auth.beafrancois.fr * **Interface d'administration :** CLI uniquement (l'interface web est réservée au self-service utilisateur) Portable (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 ===== Architecture réseau ===== 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) * Le serveur Kanidm utilise un certificat **auto-signé** en interne * Caddy fait la terminaison TLS publique (Let's Encrypt) pour ''auth.beafrancois.fr'' * Caddy accepte le certificat auto-signé de Kanidm via ''tls_insecure_skip_verify'' ===== Configuration des machines annexes ===== ==== DNS — OpenWrt ==== 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. ==== Port forwarding — OpenWrt ==== * Le port 443 est déjà forwardé vers le proxy Caddy (192.168.1.25) * La redirection pour l'accès externe à Kanidm sera activée **une fois la validation locale terminée** ==== Reverse proxy — Caddy ==== 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 ==== Pare-feu — UFW (serveur principal) ==== 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 ===== Structure des fichiers ===== /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 ===== docker-compose.yml ===== 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 ===== server.toml ===== 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 ===== Mise en place initiale ===== ==== 1. Générer les certificats TLS auto-signés ==== 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 ==== 2. Démarrer le serveur ==== 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/'' ==== 3. Initialiser les comptes break-glass ==== 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 groupes docker 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. ===== Client CLI ===== L'administration se fait via l'image séparée ''kanidm/tools''. Un wrapper simplifie les commandes. ==== Configuration client ==== Fichier ''~/.config/kanidm/config'' : uri = "https://auth.beafrancois.fr" verify_ca = false ==== Wrapper ==== 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 ==== Connexion ==== ~/kanidm-cli login --name idm_admin La session reste valide un certain temps ; inutile de se reconnecter à chaque commande. ===== Gestion des comptes et groupes ===== ==== Groupes ==== # 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 ==== Personnes ==== # 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 ===== Comptes et groupes configurés ===== ^ 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. ===== Plan de bascule des PC (à faire plus tard) ===== Principe : ne jamais supprimer les comptes locaux avant validation complète de Kanidm. - **Compte de test** : créer ''testkanidm'' (UID 5000, n'existe sur aucun PC) pour valider le login online puis offline sans risque - **Installer ''kanidm-unixd''** sur un PC de test (Debian, Ubuntu ou Arch — paquets natifs ou AUR) - **Valider** le login online, puis couper le réseau et valider le login offline (cache) - **Bascule par PC** : pour chaque vrai utilisateur, ''userdel'' **sans** ''-r'' (préserve le home), Kanidm prend le relais. Les UID identiques garantissent la cohérence des fichiers - **Chiffrement disque** (LUKS) recommandé sur les portables : le cache offline stocke des credentials ===== Sécurité ===== * Les comptes ''admin'' et ''idm_admin'' sont des comptes break-glass : usage exceptionnel uniquement * Kanidm exposé vers Internet (provisionnement portables hors LAN) → **MFA obligatoire** (TOTP ou passkey) * UFW limite l'accès à Kanidm au seul proxy Caddy * Forcer les UID/GID ne crée pas de faille (les UID ne sont pas des secrets). Seul risque classique Unix : la réutilisation d'UID sur des fichiers orphelins — théorique avec 4 comptes stables * **Auth des serveurs (principal + proxy) : ne PAS passer par Kanidm.** Garder un compte local + clé SSH, pour conserver l'accès même si Kanidm est indisponible ===== Commandes utiles ===== # É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 ====== Désactivation / suppression de Kanidm ====== 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. ===== Phase 1 — Désactivation (à faire maintenant) ===== ==== Serveur ==== === 1. Sauvegarder les données Kanidm === sudo tar czf ~/kanidm-backup-$(date +%F).tar.gz -C /mnt/stockage/docker/data kanidm ls -lh ~/kanidm-backup-*.tar.gz === 2. Arrêter le conteneur === cd /mnt/stockage/docker/compose/auth docker compose down === 3. Mettre le compose de côté (ne pas supprimer) === mv /mnt/stockage/docker/compose/auth/docker-compose.yml \ /mnt/stockage/docker/compose/auth/docker-compose.yml.kanidm-disabled === 4. Retirer les règles UFW (ports 8443 et 3636 vers le proxy) === sudo ufw status numbered # repérer les numéros des règles 8443 et 3636 sudo ufw delete # supprimer chaque règle (du plus grand numéro au plus petit) ==== Proxy (Caddy) ==== === 5. Retirer le bloc auth.beafrancois.fr du Caddyfile === É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 ==== Ce qu'on conserve (à réaffecter) ==== * **Entrée DNS OpenWrt** ''auth.beafrancois.fr'' → garder, réutilisable pour la future stack d'auth (LLDAP/Authelia) * **Entrée DNS hébergeur** ''auth.beafrancois.fr'' → garder, idem * **Backup** ''~/kanidm-backup-*.tar.gz'' → conserver jusqu'à validation complète de LLDAP * **Wrapper** ''~/kanidm-cli'' → laisser (inoffensif, utile pour ré-exporter des données si besoin) * **Docs DokuWiki Kanidm** (serveur + client) → archiver, ne pas effacer (retour d'expérience utile) ==== Ce qu'on NE touche PAS encore ==== * **Client kanidm-unixd sur les portables** → laisser actif. Sera désactivé proprement au moment d'installer sssd, pas avant (pour ne pas se retrouver sans auth). * **Comptes et groupes** → présents dans le backup, à recréer à l'identique dans LLDAP (UID 1000-1003 ; groupes famille, partage, multimedia). ===== Phase 2 — Suppression définitive (PLUS TARD, après validation LLDAP+sssd) ===== **⚠️ Ne faire ces étapes qu'une fois LLDAP + sssd pleinement validé, offline compris, sur tous les portables.** ==== Serveur ==== # 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 ==== Portables ==== # 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 ==== Dépôt PPA (portables) ==== 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 ==== DNS (une fois la nouvelle stack en place) ==== * Réaffecter ou supprimer ''auth.beafrancois.fr'' selon le sous-domaine retenu pour LLDAP/Authelia * Supprimer le backup ''~/kanidm-backup-*.tar.gz'' une fois certain de ne plus en avoir besoin ===== Checklist rapide Phase 1 ===== * [ ] Backup données Kanidm créé * [ ] Conteneur arrêté (''docker compose down'') * [ ] Compose renommé en ''.kanidm-disabled'' * [ ] Règles UFW 8443 / 3636 retirées * [ ] Bloc Caddy ''auth.beafrancois.fr'' commenté + Caddy rechargé * [ ] DNS et backup conservés * [ ] Client portables et comptes laissés intacts