commun:serveur_d_authentification_lldap_sssd
Différences
Ci-dessous, les différences entre deux révisions de la page.
| commun:serveur_d_authentification_lldap_sssd [2026/06/23 05:22] – créée francois | commun:serveur_d_authentification_lldap_sssd [2026/06/27 11:10] (Version actuelle) – francois | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| - | ====== Serveur d' | + | ====== Serveur d' |
| Dernière mise à jour : juin 2026 | Dernière mise à jour : juin 2026 | ||
| - | **Contexte :** remplace Kanidm | + | État : **opérationnel et validé** (login système en ligne ET hors ligne fonctionnels via sssd côté |
| - | État : **serveur LLDAP déployé et fonctionnel | + | Remplace Kanidm |
| - | ===== Architecture ===== | + | ===== Architecture |
| < | < | ||
| Internet | Internet | ||
| - | | + | | |
| v | v | ||
| - | [ Routeur OpenWrt ] 192.168.1.90 | + | [ Routeur OpenWrt ] 192.168.1.90 |
| + | | redirections par port : | ||
| + | | ||
| + | | ||
| | | | | ||
| - | v LAN1 /26 | + | └──(6360)─> |
| [ Proxy Caddy ] 192.168.1.25 | [ Proxy Caddy ] 192.168.1.25 | ||
| - | | | + | |
| - | v | + | ldap.beafrancois.fr -> 192.168.1.9: |
| - | [ Serveur | + | |
| - | : | + | |
| - | : | + | |
| - | : | + | |
| - | [ Portables ] LAN filaire 192.168.1.x + WiFi 192.168.115.x | + | [ Serveur LLDAP ] 192.168.1.9 (cahute) |
| - | sssd -> ldaps:// | + | : |
| - | | + | : |
| + | : | ||
| + | |||
| + | Séparation des deux noms : | ||
| + | | ||
| + | -> routeur: | ||
| + | | ||
| + | -> proxy .25 -> serveur .9:17170 | ||
| + | |||
| + | [ Portables ] LAN filaire 192.168.1.0/26 + WiFi invité | ||
| + | sssd -> ldaps:// | ||
| </ | </ | ||
| **Réseaux :** | **Réseaux :** | ||
| * LAN filaire : 192.168.1.0/ | * LAN filaire : 192.168.1.0/ | ||
| - | * WiFi séparé | + | * WiFi invité |
| - | * Tous les portables joignent LLDAP via le nom '' | + | * **'' |
| - | + | * **'' | |
| - | ===== Pourquoi LLDAP + sssd plutôt que Kanidm ===== | + | * Le LDAPS ne passe **PAS** par Caddy (Caddy ne fait que du HTTP) : le routeur relaie directement le 6360 vers LLDAP. |
| - | + | ||
| - | | + | |
| - | * sssd : le cache offline est son métier depuis ~15 ans, éprouvé en production. C'est précisément le composant | + | |
| - | * LLDAP : annuaire léger avec UI web, recommandé par Kanidm eux-mêmes comme alternative simple. | + | |
| - | * Contrepartie : 2 briques | + | |
| - | ===== Déploiement | + | ===== Déploiement |
| ==== Structure ==== | ==== Structure ==== | ||
| Ligne 51: | Ligne 56: | ||
| ├── lldap_config.toml | ├── lldap_config.toml | ||
| ├── users.db | ├── users.db | ||
| - | ├── ca-cert.pem | + | ├── ca-cert.pem |
| - | ├── | + | ├── cert.pem |
| - | ├── cert.pem | + | ├── san.ext |
| - | ├── key.pem | + | |
| - | ├── san.ext | + | |
| └── secrets/ | └── secrets/ | ||
| ├── jwt_secret | ├── jwt_secret | ||
| Ligne 61: | Ligne 64: | ||
| </ | </ | ||
| - | ==== Génération des secrets | + | ==== Secrets |
| <code bash> | <code bash> | ||
| Ligne 83: | Ligne 86: | ||
| -nodes -subj "/ | -nodes -subj "/ | ||
| - | # Extension | + | # SAN |
| sudo tee san.ext > /dev/null <<' | sudo tee san.ext > /dev/null <<' | ||
| subjectAltName = DNS: | subjectAltName = DNS: | ||
| Ligne 93: | Ligne 96: | ||
| </ | </ | ||
| - | Vérification | + | Vérification : |
| <code bash> | <code bash> | ||
| openssl s_client -connect 192.168.1.9: | openssl s_client -connect 192.168.1.9: | ||
| Ligne 101: | Ligne 104: | ||
| ==== docker-compose.yml ==== | ==== docker-compose.yml ==== | ||
| - | |||
| - | Emplacement : ''/ | ||
| <code yaml> | <code yaml> | ||
| Ligne 133: | Ligne 134: | ||
| </ | </ | ||
| - | ==== Règles | + | Lancement : '' |
| + | Version déployée : LLDAP 0.6.3. | ||
| + | |||
| + | ===== Pare-feu serveur (UFW) ===== | ||
| <code bash> | <code bash> | ||
| - | # LDAPS : LAN filaire | + | # LDAPS : /24 (PAS /26 !) + wifi invité |
| - | sudo ufw allow from 192.168.1.0/ | + | # ⚠️ /24 nécessaire : le LDAPS arrive via le ROUTEUR (.90), qui est HORS du /26 |
| + | # (le /26 s' | ||
| + | sudo ufw allow from 192.168.1.0/ | ||
| sudo ufw allow from 192.168.115.0/ | sudo ufw allow from 192.168.115.0/ | ||
| # Web admin : via proxy Caddy uniquement | # Web admin : via proxy Caddy uniquement | ||
| sudo ufw allow from 192.168.1.25 to any port 17170 proto tcp | sudo ufw allow from 192.168.1.25 to any port 17170 proto tcp | ||
| - | # Port 3890 (LDAP clair) : NON ouvert (reste interne au serveur) | + | # Port 3890 (LDAP clair) : NON ouvert (interne au serveur) |
| </ | </ | ||
| - | ==== Reverse proxy Caddy (sur le proxy) | + | **⚠️ Piège vécu :** le LAN filaire est en ''/ |
| + | |||
| + | ===== Reverse proxy Caddy ===== | ||
| + | |||
| + | Caddy ne gère QUE l'UI web (HTTP). Le LDAPS d''' | ||
| + | |||
| + | Sur le proxy (/ | ||
| - | Bloc dans le Caddyfile : | ||
| < | < | ||
| - | auth.beafrancois.fr { | + | # UI web LLDAP (cert interne, pas de Let's Encrypt car pas de DNS public) |
| + | ldap.beafrancois.fr { | ||
| + | tls internal | ||
| reverse_proxy 192.168.1.9: | reverse_proxy 192.168.1.9: | ||
| } | } | ||
| </ | </ | ||
| + | |||
| Recharge : '' | Recharge : '' | ||
| - | LLDAP web parle HTTP simple | + | Note : '' |
| - | ===== Comptes et groupes (FAIT) ===== | + | ===== Configuration OpenWrt (routeur .90) ===== |
| + | |||
| + | ==== Principe ==== | ||
| + | |||
| + | '' | ||
| + | |||
| + | ==== Redirections de port (firewall) ==== | ||
| + | |||
| + | Règles DNAT nécessaires, | ||
| + | * **443** -> 192.168.1.25: | ||
| + | * **6360** -> 192.168.1.9: | ||
| + | * Cockpit 9090, git ssh 8329, etc. : redirections existantes conservées | ||
| + | |||
| + | **⚠️ Piège rencontré :** une règle 443 avec uniquement '' | ||
| + | |||
| + | ==== Port admin du routeur déplacé ==== | ||
| + | |||
| + | **⚠️ Piège majeur :** l' | ||
| + | |||
| + | <code sh> | ||
| + | uci del_list uhttpd.main.listen_https=' | ||
| + | uci del_list uhttpd.main.listen_https=' | ||
| + | uci add_list uhttpd.main.listen_https=' | ||
| + | uci add_list uhttpd.main.listen_https=' | ||
| + | uci commit uhttpd | ||
| + | / | ||
| + | </ | ||
| + | Admin routeur désormais : '' | ||
| + | |||
| + | ==== DNS local ciblé (dnsmasq) ==== | ||
| + | |||
| + | **⚠️ Ne PAS faire de wildcard** ''/ | ||
| + | |||
| + | <code sh> | ||
| + | uci add_list dhcp.@dnsmasq[0].address='/ | ||
| + | uci add_list dhcp.@dnsmasq[0].address='/ | ||
| + | uci add_list dhcp.@dnsmasq[0].address='/ | ||
| + | uci add_list dhcp.@dnsmasq[0].address='/ | ||
| + | uci add_list dhcp.@dnsmasq[0].address='/ | ||
| + | uci commit dhcp | ||
| + | / | ||
| + | </ | ||
| + | |||
| + | '' | ||
| + | |||
| + | ===== Comptes et groupes (LLDAP) ===== | ||
| Base DN : '' | Base DN : '' | ||
| - | ^ Groupe | + | ==== Attributs POSIX — à créer manuellement ==== |
| - | | famille | + | |
| - | | partage | + | |
| - | | multimedia | + | |
| - | ^ Utilisateur ^ uidNumber | + | **⚠️ LLDAP n'a PAS d' |
| - | | François | + | * **Schéma User :** '' |
| - | | Béatrice | + | * **Schéma Group :** '' |
| - | | Corentin | + | |
| - | | Louis | 1003 | louis | | + | |
| - | | **Test** | 5000 | testldap (groupe famille, pour validation) | | + | |
| - | Les UID/GID matchent les comptes locaux existants sur les PC (cohérence des partages NFS). | + | Puis remplir ces attributs pour chaque user et groupe. |
| - | Connexion admin : '' | + | ==== Modèle |
| - | ===== RESTE À FAIRE (reprise) ===== | + | **Groupe primaire partagé** |
| - | ==== 1. Schéma POSIX dans LLDAP ⚠️ CRUCIAL ==== | + | ^ Groupe |
| + | | famille | ||
| + | | partage | ||
| + | | multimedia | ||
| - | LLDAP n'a **pas** d' | + | ^ Utilisateur ^ uidNumber |
| + | | francois | ||
| + | | beatrice | ||
| + | | corentin | ||
| + | | louis | 10003 | 302 | | ||
| + | | testldap | ||
| - | **Schéma User — ajouter :** | + | **Plage UID haute (10000+) choisie** pour éviter toute collision avec les comptes locaux |
| - | * '' | + | |
| - | | + | |
| - | | + | |
| - | * '' | + | |
| - | **Schéma Group — ajouter | + | Note : les objectClass réels dans LLDAP — user = '' |
| - | * '' | + | |
| - | Puis **remplir** ces attributs pour chaque user et groupe | + | ==== Compte bind (lecture seule) ==== |
| - | Note : '' | + | |
| - | ==== 2. Compte bind (lecture seule) ==== | + | User '' |
| - | Créer dans LLDAP un user '' | + | ===== Opérations courantes ===== |
| - | ==== 3. Distribuer | + | Tout se fait via l' |
| - | Copier ''/ | + | ==== Ajouter un utilisateur ==== |
| - | ==== 4. Installer | + | - **Create a user** : renseigner User ID (identifiant de login, ex. '' |
| + | - Définir le **mot de passe** du compte (c'est lui qui servira au login système). | ||
| + | - Ouvrir la fiche du user et remplir les **attributs POSIX** (sinon | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | - Ajouter | ||
| + | **⚠️ Rappels :** | ||
| + | * Le '' | ||
| + | * Ne PAS réutiliser un uidNumber déjà pris. Vérifier : '' | ||
| + | |||
| + | ==== Changer le mot de passe d'un utilisateur ==== | ||
| + | |||
| + | Deux méthodes selon qui fait le changement. | ||
| + | |||
| + | === Par l' | ||
| + | |||
| + | Interface web : ouvrir la fiche du user → changer le mot de passe. Pas de contrainte particulière. Utile pour réinitialiser un mot de passe oublié. | ||
| + | |||
| + | === Par l' | ||
| + | |||
| + | Sur son portable, l' | ||
| <code bash> | <code bash> | ||
| - | sudo apt install -y sssd sssd-tools libnss-sss libpam-sss libsss-sudo | + | passwd |
| </ | </ | ||
| + | Demande le mot de passe **actuel**, puis le nouveau (deux fois). Le changement est écrit directement dans LLDAP. **Validé et fonctionnel** (grâce à '' | ||
| - | ==== 5. Configurer sssd ==== | + | **⚠️ Contraintes :** |
| + | * **Doit être EN LIGNE** (le portable doit joindre LLDAP en LDAPS). '' | ||
| + | * La commande standard '' | ||
| + | * Le nouveau mot de passe est actif immédiatement en ligne ; le cache offline du portable se met à jour au login suivant. | ||
| - | ''/ | + | === Propagation du cache offline |
| - | <code ini> | + | Après tout changement (web ou '' |
| - | [sssd] | + | |
| - | services = nss, pam | + | |
| - | domains = beafrancois.fr | + | |
| - | [domain/ | + | ==== Supprimer / désactiver un utilisateur ==== |
| - | id_provider | + | |
| - | auth_provider | + | |
| - | chpass_provider | + | |
| - | access_provider | + | |
| - | enumerate | + | |
| - | cache_credentials | + | |
| - | offline_credentials_expiration | + | |
| - | ldap_uri = ldaps://auth.beafrancois.fr:6360 | + | * **Supprimer** |
| - | ldap_schema | + | * **⚠️ Offline |
| - | ldap_search_base = dc=beafrancois,dc=fr | + | |
| - | ldap_default_bind_dn = uid=binduser,ou=people, | + | |
| - | ldap_default_authtok = <mot de passe binduser> | + | |
| - | ldap_tls_cacert = /etc/ | + | |
| - | ldap_tls_reqcert = demand | + | |
| - | # users | + | ==== Ajouter un groupe |
| - | ldap_user_search_base | + | |
| - | ldap_user_object_class | + | |
| - | ldap_user_name | + | |
| - | ldap_user_uid_number | + | |
| - | ldap_user_gid_number = gidNumber | + | |
| - | ldap_user_home_directory = homeDirectory | + | |
| - | ldap_user_shell = unixShell | + | |
| - | # groups | + | - **Create a group** |
| - | ldap_group_search_base = ou=groups, | + | - Remplir l' |
| - | ldap_group_object_class = posixGroup | + | - Ajouter les membres. |
| - | </code> | + | - Côté serveur, créer le groupe Unix correspondant si besoin pour les partages ('' |
| - | Puis : | + | ==== Gérer l' |
| - | <code bash> | + | |
| - | sudo chmod 600 / | + | |
| - | sudo systemctl enable --now sssd | + | |
| - | sudo pam-auth-update | + | |
| - | </ | + | |
| - | ==== 6. Valider | + | Fiche du groupe → ajouter/ |
| - | - Résolution | + | ==== Après toute modification |
| - | - Login en ligne : '' | + | |
| - | - **Login OFFLINE** : se connecter une fois en ligne, couper le réseau, re-tester. **C' | + | |
| - | ==== 7. Ne PAS désactiver kanidm-unixd avant validation ==== | + | Les changements LLDAP sont pris en compte par sssd selon ses délais de cache. Pour forcer un rafraîchissement immédiat sur un portable : |
| + | <code bash> | ||
| + | sudo sss_cache | ||
| + | # ou ciblé : | ||
| + | sudo sss_cache -u paul # un user | ||
| + | sudo sss_cache -g famille | ||
| + | </ | ||
| + | (N' | ||
| - | Garder | + | ===== Vérifications utiles (depuis |
| - | ===== Sécurité / notes ===== | + | <code bash> |
| + | # Test bind + lecture d'un user | ||
| + | LDAPTLS_CACERT=/ | ||
| + | ldapsearch -x -H ldaps:// | ||
| + | -D "uid=binduser,ou=people,dc=beafrancois, | ||
| + | -b "dc=beafrancois, | ||
| + | |||
| + | # Vérifier les objectClass d'un user / groupe | ||
| + | ... "(uid=testldap)" | ||
| + | ... " | ||
| + | </ | ||
| - | * **offline_credentials_expiration | + | ===== Accès distant |
| - | * Le port LDAP clair (3890) n'est jamais exposé | + | |
| - | * Compte bind en lecture seule ('' | + | |
| - | * Auth des serveurs (principal + proxy) : ne PAS passer par LLDAP/ | + | |
| - | * WiFi 192.168.115.x : redirection spécifique | + | |
| - | ===== Accès | + | **WireGuard** (prévu aussi pour les partages réseau). Le LDAPS reste fermé au WAN. Le cache offline sssd gère le "aucun réseau" |
| - | Pour les portables hors LAN : **WireGuard** (prévu aussi pour les partages réseau). Le LDAPS reste fermé au WAN ; le offline sssd gère le "aucun réseau", | ||
commun/serveur_d_authentification_lldap_sssd.1782192168.txt.gz · Dernière modification : de francois
