Guide des technologies

Clients légers LTSP : DHCP, partages Windows et SSH Kerberos

8 min read Administration système Mis à jour 22 Oct 2025
Clients légers LTSP : DHCP, partages Windows, Kerberos
Clients légers LTSP : DHCP, partages Windows, 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 :

Bureau d’un client léger avec thème XPGnome

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/logon

Ajoutez cette entrée au fichier /etc/fstab pour monter NETLOGON :

//dc.domain.internal/netlogon      /mnt/logon           cifs   username=public,password=password 0  0

Puis montez les systèmes :

sudo mount -a

Le 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\IT

Script 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.sh

Script 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.

Fenêtre Préférences — Applications au démarrage

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.deb

Exemple 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.log

Ajoutez la ligne suivante à /etc/pam.d/common-session pour activer pam_script.so :

session     optional              pam_script.so

Testez 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 yes

Sur le poste de travail Linux (/etc/ssh/ssh_config) :

GSSAPIAuthentication yes
GSSAPIDelegateCredentials yes

Test d’authentification Kerberos pour SSH :

ssh -v thinserver

Si 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 metacity
  • PROBLÈ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

  1. Préparer l’environnement de test (réseau isolé).
  2. Déployer la configuration DHCP et valider PXE boot d’un client.
  3. Installer win_share.sh et mount.pl, générer .mount.sh pour un utilisateur test.
  4. Configurer l’entrée Startup Applications et tester login/logout.
  5. Installer libpam-script et configurer pam_script_ses_close pour démonter.
  6. Vérifier Kerberos (kinit, klist) puis tester SSH GSSAPI.
  7. 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.INTERNAL

Mini 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.

Auteur
Édition

Matériaux similaires

Installer et utiliser Podman sur Debian 11
Conteneurs

Installer et utiliser Podman sur Debian 11

Guide pratique : apt-pinning sur Debian
Administration système

Guide pratique : apt-pinning sur Debian

OptiScaler : activer FSR 4 dans n'importe quel jeu
Jeux PC

OptiScaler : activer FSR 4 dans n'importe quel jeu

Dansguardian + Squid NTLM sur Debian Etch
réseau

Dansguardian + Squid NTLM sur Debian Etch

Corriger l'erreur d'installation Android sur SD
Android, Dépannage

Corriger l'erreur d'installation Android sur SD

KNetAttach et remote:/ — Dossiers réseau KDE
Tutoriel

KNetAttach et remote:/ — Dossiers réseau KDE