Clients légers LTSP : DHCP, partages Windows et SSH Kerberos
Important : adaptez les adresses IP, noms de domaine et noms d’utilisateur aux conventions de votre infrastructure avant le déploiement. Ne publiez pas de mots de passe en clair en production.
Intentions de cet article
- Principal : Configurer un serveur LTSP pour clients légers, avec montage automatique de partages Windows et SSH Kerberos.
- Variantes liées : DHCP PXE pour LTSP, montage CIFS avec Kerberos, scripts d’init utilisateur, gestion PAM pour déconnexion.
Table des matières
- Paramètres du serveur DHCP
- Configuration des clients légers
- Montage des partages Windows à la connexion
- Suppression des partages Windows à la déconnexion
- SSH sans mot de passe avec Kerberos
- Problèmes courants et solutions
- Checklist par rôle
- SOP rapide pour mise en production
- Fiche pratique et glossaire
Paramètres du serveur DHCP
Ces paramètres permettent à un client léger de démarrer depuis le serveur LTSP (PXE). Placez ces lignes dans la configuration de votre serveur DHCP (ex. isc-dhcp-server). Ne changez que les adresses et chemins selon votre réseau.
default-lease-time 21600;
max-lease-time 21600;
option subnet-mask 255.255.255.0;
option broadcast-address 10.255.255.255;
option routers 10.0.0.1;
option domain-name-servers 10.0.0.10
option domain-name "domain.internal";
option root-path "/opt/ltsp/i386";
host thinclient1 {
next-server 10.0.0.10;
hardware ethernet 00:AA:BB:CC:DD:EE;
fixed-address 10.0.0.100;
filename "ltsp/i386/pxelinux.0";
option root-path "10.0.0.10:/opt/ltsp/i386";
}
host thinclient2 {
next-server 10.0.0.10;
hardware ethernet 00:BB:CC:DD:EE:FF;
fixed-address 10.0.0.101;
filename "ltsp/i386/pxelinux.0";
option root-path "10.0.0.10:/opt/ltsp/i386";
}
Notes rapides :
- default-lease-time et max-lease-time sont en secondes. 21600 = 6 heures.
- next-server doit pointer sur le serveur TFTP contenant pxelinux.0.
Configuration des clients légers
Pour offrir une expérience utilisateur homogène j’ai installé le thème XPGnome, modifié les menus et ajouté Adobe Reader 9 et Skype. Ces éléments sont optionnels ; l’important est de standardiser l’environnement présent dans /etc/skel pour que tous les utilisateurs héritent des mêmes paramètres.
Procédé conseillé pour uniformiser l’environnement graphique :
- Installez et personnalisez le thème et les préférences sur un compte de référence.
- Copiez .config, .gconf, .icons, .local et .themes vers /etc/skel pour propager ces paramètres aux nouveaux utilisateurs.
Problème fréquent : icône “Se déconnecter” absente. Solution appliquée :
- Trouvez une icône 48×48, redimensionnez avec GIMP en 32×32, 24×24, 22×22 et 16×16.
- Renommez en system-log-out.png et copiez-la dans /usr/share/icons/GnomeXP/{taille}/actions.
Le résultat final ressemblera à ceci :

Important : pour rendre ces paramètres par défaut pour tous les comptes, copiez les dossiers listés depuis le dossier personnel de l’utilisateur qui a configuré le thème vers /etc/skel. Toute modification ultérieure à propager devra être recopier manuellement.
Montage des partages Windows à la connexion
Approche retenue : scripts Bash + Perl lancés via l’application “Préférences/Startup Applications” (Applications au démarrage) de l’environnement utilisateur. Cette approche permet l’exécution avec $USER défini (contrairement à un hook PAM lancé en root).
Prérequis : le partage NETLOGON du contrôleur de domaine (dc.domain.internal) doit être monté sur thinserver.domain.internal. Pour cet exemple on utilise un compte de domaine générique nommé “public” avec le mot de passe “password” (ne pas conserver en clair en prod).
Créez le point de montage :
sudo mkdir /mnt/logonAjoutez cette entrée au fichier /etc/fstab pour monter NETLOGON :
//dc.domain.internal/netlogon /mnt/logon cifs username=public,password=password 0 0Puis montez les systèmes :
sudo mount -aLe principe : chaque utilisateur a un fichier batch (.bat) dans NETLOGON qui liste les partages à monter (par ex. jdoe.bat). Un script Perl transforme ce fichier batch en scripts .mount.sh et .umount.sh dans le dossier utilisateur, qui effectuent ensuite les mount.cifs et umount.cifs en utilisant l’authentification Kerberos (sec=krb5).
Exemple de fichier batch jdoe.bat (résidant dans /mnt/logonbat):
@echo off
NET USE S: \\server\common
NET USE T: \\server\ITScript win_share.sh
Placez /usr/local/bin/win_share.sh. Il supprime d’anciennes versions de .mount.sh/.umount.sh, invoque mount.pl pour les générer, puis lance le montage utilisateur.
#!/bin/sh
# Check to see if .mount.sh and .umount.sh exist, if so delete them!
if [ -f /home/$USER/.mount.sh ]; then
rm /home/$USER/.mount.sh
fi
if [ -f /home/$USER/.umount.sh ]; then
rm /home/$USER/.umount.sh
fi
# Create the .mount.sh and .umount.sh scripts from users batch file
/usr/local/bin/mount.pl $USER
# Mount network shares when logging on.
/home/$USER/.mount.shScript mount.pl (génération dynamique)
Placez le script Perl suivant dans /usr/local/bin/mount.pl et conservez exactement le contenu ci-dessous ; il parse le fichier .bat et génère .mount.sh et .umount.sh pour l’utilisateur :
#!/usr/bin/perl
# Build dynamic ~user/.mount.sh based on logon.bat
$user = $ARGV[0];
$file = "/mnt/logonbat/$user.bat"; # <-- Change this from $user to the name of the batch script if you only use one.
die if ! $user;
die if ! -e $file;
open (PAM_CONF, ">/home/$user/.mount.sh");
open (LOGOFF, ">/home/$user/.umount.sh");
print PAM_CONF qq{#!/bin/sh
if [ ! -d /home/$user/Home ]; then
mkdir /home/$user/Home
fi
mount.cifs //server/$user /home/$user/Home -o username=$user,sec=krb5
};
print LOGOFF qq{#!/bin/sh
if [ "`cat /proc/mounts | grep /home/$user/Home | wc -l`" -ge "1" ]; then
umount.cifs /home/$user/Home
fi \n};
my(@arr)=`cat /mnt/logonbat/$user.bat`;
$mounts = parse_batfile(\@arr);
foreach $mount (@$mounts) {
chomp($mount);
($server,$share) = $mount =~ /\\\\(.*)\\(.*)/;
$share =~ tr/\cM//d;
$mnt = $share;
# skip AUDIT. It's for PCs only
next if $mnt =~ /AUDIT/;
# skip personal shares.
next if lc("$mnt") eq lc("$user");
next if ! $mnt;
#strip dollar sign from mount point
$mnt =~ s/\$\$//;
# make sure mount point is unique
$mnt .= "-$server" if $seen{$mnt}++;
# upshift first letter of mnt point
$mnt =~ s/^(.)((.*))/\u$1$2/g;
# print PAM_CONF "volume $user cifs $server $share /home/$user/$mnt - - -\n";
print PAM_CONF qq{if [ ! -d /home/$user/$mnt ]; then
mkdir /home/$user/$mnt
fi
mount.cifs //$server/$mnt /home/$user/$mnt -o username=$user,sec=krb5 \n};
print LOGOFF qq{if [ "`cat /proc/mounts | grep /home/$user/$mnt | wc -l`" -ge "1" ]; then
umount.cifs /home/$user/$mnt
fi \n};
}
close PAM_CONF;
close LOGOFF;
system ("chown $user:16777729 /home/$user/.mount.sh"); # 16777729 is my GID for "Domain Users"
system ("chown $user:16777729 /home/$user/.umount.sh"); # 16777729 is my GID for "Domain Users"
system ("chmod +x /home/$user/.mount.sh");
system ("chmod +x /home/$user/.umount.sh");
# All done
sub parse_batfile {
my($file) = @_;
my(@mounts);
foreach $line (@$file) {
(@val) = split / /,$line;
if (uc($val[0]) eq "NET" && uc($val[1]) eq "USE") {
push (@mounts,$val[3]);
}
if ($val[0] eq "CALL") {
my($match) = $val[1] =~ /\\\\.*\\NETLOGON\\(.*)/ ;
if ($match) {
chop($match);
my(@arr)=`cat /mnt/logonbat/$match`;
$mounts = parse_batfile(\@arr);
unshift @mounts, @$mounts;
}
}
}
return \@mounts;
}Remarque : conservez les permissions et le propriétaire sur .mount.sh et .umount.sh pour éviter que d’autres comptes puissent les modifier.
Exemple de .mount.sh pour l’utilisateur jdoe
#!/bin/sh
if [ ! -d /home/jdoe/Home ]; then
mkdir /home/jdoe/Home
fi
mount.cifs //server/jdoe /home/jdoe/Home -o username=jdoe,sec=krb5
if [ ! -d /home/jdoe/common ]; then
mkdir /home/jdoe/common
fi
mount.cifs //server/common /home/jdoe/common -o username=jdoe,sec=krb5
if [ ! -d /home/jdoe/IT ]; then
mkdir /home/jdoe/IT
fi
mount.cifs //server/IT /home/jdoe/IT -o username=jdoe,sec=krb5 Lancement automatique
Une fois win_share.sh et mount.pl en place, créez une entrée dans l’application “Préférences/Startup Applications” (Applications au démarrage) pour exécuter /usr/local/bin/win_share.sh lors de la connexion interactive de l’utilisateur.

Suppression des partages Windows à la déconnexion
Pour démonter les partages au logout, utilisez le module PAM pam_script.so qui permet d’exécuter des scripts au début et à la fin d’une session. Nous n’utilisons pas pam_script pour le montage (login) car il s’exécute avec UID=0 et n’a pas la variable $USER définie comme attendu pour ces scripts.
Installez libpam-script (ex. paquet Debian) :
sudo dpkg -i libpam-script_1.1.4-1_i386.debExemple de .umount.sh généré pour jdoe :
#!/bin/sh
if [ "`cat /proc/mounts | grep /home/jdoe/Home | wc -l`" -ge "1" ]; then
umount.cifs /home/jdoe/Home
fi
if [ "`cat /proc/mounts | grep /home/jdoe/common | wc -l`" -ge "1" ]; then
umount.cifs /home/jdoe/common
fi
if [ "`cat /proc/mounts | grep /home/jdoe/IT | wc -l`" -ge "1" ]; then
umount.cifs /home/jdoe/IT
fi Créez ou éditez /usr/share/libpam-script/pam_script_ses_close avec le contenu suivant afin d’appeler le script utilisateur au moment de la fermeture de session :
#!/bin/sh
# pam_script_ses_close script to remove windows shares
/home/$PAM_USER/.umount.sh 2>&1 >> /var/log/umount.logAjoutez la ligne suivante à /etc/pam.d/common-session pour activer pam_script.so :
session optional pam_script.soTestez la séquence complète : login graphique => montages CIFS accessibles => logout => entrées démontées et log dans /var/log/umount.log.
SSH sans mot de passe avec Kerberos
Lorsque le serveur et la station client Linux sont intégrés au domaine Kerberos/AD, vous pouvez activer l’authentification GSSAPI pour SSH afin d’éviter les mots de passe interactifs.
Sur le serveur thinserver (/etc/ssh/sshd_config) :
# GSSAPI options
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
UseDNS yesSur le poste de travail Linux (/etc/ssh/ssh_config) :
GSSAPIAuthentication yes
GSSAPIDelegateCredentials yesTest d’authentification Kerberos pour SSH :
ssh -v thinserverSi Kerberos est bien configuré, la sortie verbose contiendra une ligne de confirmation analogique à :
debug1: Authentication succeeded (gssapi-with-mic).Important : vérifiez la validité des tickets Kerberos (klist), et que l’horloge des machines est synchronisée (NTP), car Kerberos est sensible à la dérive temporelle.
Problèmes et solutions
Voici des problèmes réels rencontrés et leurs solutions rapides pour gagner du temps en dépannage.
- PROBLÈME : Le client LTSP s’authentifie mais se déconnecte immédiatement
- SOLUTION :
gconftool-2 --direct --config-source xml:readwrite:/etc/gconf/gconf.xml.mandatory --type string --set /desktop/gnome/session/required_components/windowmanager metacityPROBLÈME : Pas de VNC sur les clients légers
- SOLUTION : consulter le tutoriel d’installation X11/VNC pour LTSP (ressource externe mentionnée dans l’original).
PROBLÈME : Changer l’écran de connexion par défaut
- SOLUTION : voir la documentation d’Edubuntu/Ubuntu pour personnalisation du greeter.
PROBLÈME : Définir un mot de passe root sur le client léger
- SOLUTION : se référer à la FAQ Edubuntu (ou config standard sudo/root selon la politique locale).
PROBLÈME : Icône de déconnexion absente
- SOLUTION : discussion et correctifs sur les forums Ubuntu (référence d’origine).
Notes : les solutions référencent des ressources publiques et des commandes standard. Adaptez toujours à la version d’Ubuntu/Debian en production.
Checklist par rôle
Administrateur système
- Vérifier la résolution DNS et PTR pour les hôtes impliqués.
- Confirmer que le serveur TFTP sert pxelinux.0.
- Valider la configuration DHCP et redémarrer le service.
- Monter NETLOGON manuellement puis valider la lecture de /mnt/logonbat.
Ingénieur de poste de travail
- Préparer un compte de référence avec le thème, menus et applications.
- Copier les dossiers de configuration dans /etc/skel.
- Tester le login d’un utilisateur « réel » et vérifier la présence des montages.
Opérations sécurité
- Revoir les comptes de service (public) et remplacer les mots de passe en clair par des mécanismes plus sûrs (keytab, Kerberos, ou secrets stockés).
- Restreindre l’accès à /mnt/logon et aux scripts (/usr/local/bin) avec ACL/permissions.
SOP rapide pour mise en production
- Préparer l’environnement de test (réseau isolé).
- Déployer la configuration DHCP et valider PXE boot d’un client.
- Installer win_share.sh et mount.pl, générer .mount.sh pour un utilisateur test.
- Configurer l’entrée Startup Applications et tester login/logout.
- Installer libpam-script et configurer pam_script_ses_close pour démonter.
- Vérifier Kerberos (kinit, klist) puis tester SSH GSSAPI.
- Documenter toute modification dans le runbook et planifier la réplication sur /etc/skel.
Fiche pratique et aide mémoire
Points clés :
- Les montages CIFS utilisent sec=krb5 pour éviter les mots de passe en clair.
- Les scripts .mount.sh/.umount.sh doivent appartenir à l’utilisateur et être exécutables.
- pam_script.so est utile pour actions à la fermeture de session mais s’exécute en root, donc éviter de l’utiliser pour des opérations dépendantes de $USER.
Snippet de vérification Kerberos :
klist
kinit user@DOMAIN.INTERNALMini glossaire (1 ligne chacun)
- LTSP : Thin client server qui permet le boot et l’exécution d’environnements légers.
- CIFS : Protocole de partage de fichiers Windows (SMB).
- Kerberos : Système d’authentification réseau basé sur tickets.
Résumé
- Configurez DHCP/PXE pour fournir pxelinux.0 et root-path LTSP.
- Automatisez le montage des partages Windows par des scripts utilisateur générés dynamiquement.
- Utilisez pam_script pour démonter les partages au logout.
- Activez GSSAPI dans SSH pour une authentification sans mot de passe via Kerberos.
Notes finales : testez chaque étape sur un environnement de pré-production, surveillez les logs (/var/log/syslog, /var/log/auth.log, /var/log/umount.log) et formalisez les procédures de rollback avant tout déploiement massif.
Matériaux similaires
Installer et utiliser Podman sur Debian 11
Guide pratique : apt-pinning sur Debian
OptiScaler : activer FSR 4 dans n'importe quel jeu
Dansguardian + Squid NTLM sur Debian Etch
Corriger l'erreur d'installation Android sur SD