Guía de tecnologías

Configuración de thinserver: LTSP, shares y Kerberos

7 min read DevOps Actualizado 22 Oct 2025
LTSP y Kerberos en thinserver
LTSP y Kerberos en thinserver

Glosario breve

  • LTSP: Thin Client Server — entorno para clientes ligeros que inician por red.
  • Kerberos: Sistema de autenticación de red basado en tickets.
  • CIFS/SMB: Protocolo para acceder a compartidos Windows desde Linux.
  • NETLOGON: Compartido típico en controladores de dominio con scripts de inicio.

Índice

  • DHCP y arranque PXE
  • Personalización del cliente ligero
  • Montar compartidos Windows al iniciar sesión
  • Quitar compartidos al cerrar sesión
  • SSH sin contraseña con Kerberos
  • Problemas comunes y soluciones
  • Checklist de despliegue y pruebas
  • Playbook de actualización y seguridad

DHCP Server Settings

A continuación están las entradas de ejemplo que necesitas en tu servidor DHCP para que un cliente ligero arranque desde thinserver. Conserva exactamente el contenido de los bloques de código cuando lo apliques.

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";
}

Nota: ajusta direcciones IP, MAC y rutas de root-path según tu entorno. Mantén coherencia entre DHCP, TFTP y el sistema de archivos LTSP.

Personalización y aplicaciones en clientes ligeros

Para facilitar el uso a los clientes ligeros instalé el tema XPGnome y modifiqué los menús de inicio. También instalé Adobe Reader 9 y Skype en el entorno del cliente.

Si falta el icono de “Cerrar sesión” en el entorno GNOME, puedes buscar un icono de 48×48 y redimensionarlo con GIMP a 32×32, 24×24, 22×22 y 16×16. Renombra el icono a system-log-out.png y guárdalo en /usr/share/icons/GnomeXP/{tamaño}/actions en el servidor.

El resultado final se ve así:

Escritorio del cliente ligero con tema XPGnome mostrando menú y barra

Para aplicar estas preferencias por defecto a todos los usuarios que inician sesión en thinserver, copia desde la carpeta del usuario que instaló el tema XPGnome los directorios .config, .gconf, .icons, .local y .themes a /etc/skel. A partir de entonces, cualquier cambio adicional que quieras aplicar a todos los usuarios deberá copiarse también a /etc/skel.

Important: Mantén un usuario “plantilla” que sirva como origen de /etc/skel y documenta los cambios.

Montar compartidos Windows al iniciar sesión

Hay varias maneras de montar compartidos Windows en Linux. En este entorno opté por usar scripts Bash y Perl junto con “Startup Applications” de Ubuntu para que el proceso se ejecute en el contexto del usuario (no como root), aprovechando Kerberos para autenticación sin contraseña.

Requisitos previos:

  • Asegúrate de que el compartido NETLOGON del controlador de dominio (dc.domain.internal) esté montado en thinserver.domain.internal.
  • Crea una cuenta de dominio con permisos limitados para listar el contenido del AD (ejemplo: usuario “public” con contraseña “password” en este tutorial). Usa una cuenta con privilegios mínimos.

Crea la carpeta de montaje para NETLOGON:

sudo mkdir /mnt/logon

Añade esta línea a /etc/fstab para montar NETLOGON (ajusta nombres si es necesario):

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

Monta todas las entradas de fstab:

sudo mount -a

El flujo que seguí hace que cada usuario tenga su propio archivo .mount.sh y .umount.sh generados dinámicamente a partir de su script de logon (por ejemplo, jdoe.bat) que reside en el compartido NETLOGON.

Un ejemplo de batch (jdoe.bat):

@echo off
NET USE S: \\server\common
NET USE T: \\server\IT

Script win_share.sh (guardar en /usr/local/bin/) — este script comprueba y regenera .mount.sh y .umount.sh y luego ejecuta el montaje:

#!/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 (guardar en /usr/local/bin/) — genera dinámicamente los scripts de montaje/desmontaje por usuario basado en su .bat de NETLOGON:

#!/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;
}

Ejemplo del contenido que genera .mount.sh para 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 

Una vez que tienes win_share.sh y mount.pl en /usr/local/bin, crea una entrada en “Startup Applications” para ejecutar win_share.sh al iniciar sesión (Preferencias > Aplicaciones al inicio).

Ventana Preferencias > Aplicaciones de inicio en Ubuntu

Nota: configura la aplicación de inicio para ejecutarse en el contexto del usuario, no como root.

Quitar compartidos Windows al cerrar sesión

Para desmontar los compartidos cuando el usuario cierra sesión usé pam_script.so, un módulo PAM que permite ejecutar scripts en eventos de sesión. No usé pam_script para el inicio porque sus scripts se ejecutan como root y los scripts de montaje dependen de la variable $USER.

Instala libpam-script (ajusta nombre y versión según tu repositorio):

sudo dpkg -i libpam-script_1.1.4-1_i386.deb

Ejemplo de .umount.sh (generado por mount.pl para 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 

Crea y edita /usr/share/libpam-script/pam_script_ses_close con el siguiente contenido:

#!/bin/sh
# pam_script_ses_close script to remove windows shares

/home/$PAM_USER/.umount.sh 2>&1 >> /var/log/umount.log

Añade la siguiente línea a /etc/pam.d/common-session:

session     optional               pam_script.so

Prueba el cierre de sesión y revisa /var/log/umount.log para verificar que los desmontajes se realizaron correctamente.

SSH sin contraseña con Kerberos

Si tu servidor y estación de trabajo Linux están en el dominio con Kerberos configurado correctamente, puedes habilitar login por SSH sin contraseña usando GSSAPI.

En thinserver, edita /etc/ssh/sshd_config y añade/ajusta:

# GSSAPI options
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
UseDNS yes

En la estación de trabajo, edita /etc/ssh/ssh_config y añade/ajusta:

GSSAPIAuthentication yes
GSSAPIDelegateCredentials yes

Prueba la conexión desde la estación de trabajo con depuración:

ssh -v thinserver

Si Kerberos funciona verás mensajes como:

*debug1: Next authentication method: gssapi-keyex
debug1: No valid Key exchange context
debug1: Next authentication method: gssapi-with-mic
debug1: Delegating credentials
debug1: Delegating credentials
debug1: Authentication succeeded (gssapi-with-mic).*

Important: Asegúrate de que la hora entre controlador de dominio, servidor y estaciones esté sincronizada (NTP). Kerberos falla con desajustes de tiempo.

Problemas comunes y soluciones

Estos son problemas reales que encontré y las soluciones aplicadas. Úsalos como referencia rápida.

Checklist de despliegue para administradores (rol: sysadmin)

  • Preparación del servidor:
    • Verificar conectividad DHCP/TFTP/HTTP entre PXE y servidor
    • Comprobar rutas de root-path y permisos en /opt/ltsp
    • Sincronizar hora (NTP)
    • Revisar kerberos/krb5.conf y registros
  • Scripts y fstab:
    • Colocar mount.pl y win_share.sh en /usr/local/bin con permisos 755
    • Añadir línea del NETLOGON en /etc/fstab y ejecutar mount -a
  • Seguridad:
    • Evitar dejar credenciales en texto plano; usar tickets Kerberos cuando sea posible
    • Restringir cuenta usada para listar NETLOGON
  • Pruebas de aceptación:
    • Cliente ligero arranca por PXE y carga entorno LTSP
    • Usuario inicia sesión y se montan los compartidos definidos en su .bat
    • Al cerrar sesión, los recursos se desmontan y no quedan mounts residuales
    • SSH auth GSSAPI funcionando desde estación

Mini playbook: desplegar ajustes por defecto a todos los usuarios

  1. Preparar usuario plantilla (ej: “template”) y personalizar el escritorio.
  2. Copiar .config, .gconf, .icons, .local y .themes de /home/template a /etc/skel.
  3. Verificar permisos y propiedad en /etc/skel.
  4. Reiniciar servicio de gestión de usuarios o crear nuevo usuario de prueba para verificar herencia.
  5. Documentar cambios y versionar /etc/skel en control de configuración.

Criterios de aceptación y pruebas (KPI cualitativos)

  • Arranque PXE: clientes ligeros obtienen IP y TFTP sirve pxelinux.0
  • Montajes: al iniciar sesión, los directorios /home//{Home,common,IT,…} están montados y accesibles
  • Desmontaje: tras cerrar sesión, no existen entradas CIFS en /proc/mounts para esos puntos
  • SSH: iniciar sesión por SSH desde una estación con Kerberos no solicita contraseña

Seguridad y privacidad

  • Evita almacenar contraseñas en /etc/fstab en texto claro; en su lugar usa credenciales de máquina o tickets Kerberos.
  • Limita el alcance de la cuenta “public” utilizada para listar NETLOGON. Usa permisos mínimos.
  • Revisa logs regularmente (/var/log/auth.log, /var/log/umount.log) y aplica rotación de logs.
  • GDPR/privacidad: si compartes carpetas con datos personales asegúrate de documentar retención y accesos; aplica controles y auditoría.

Alternativas y cuándo no usar este método

  • Si no tienes Kerberos en el dominio, deberás usar credenciales en fstab o soluciones de autenticación alternativas (SSHFS con claves, winbind con mount.cifs y credenciales seguras).
  • Si los clientes son PCs completas (no thin clients), una solución basada en AD GPO (Windows) puede ser más apropiada.

Resumen

  • Configura DHCP y rutas PXE correctamente para LTSP.
  • Personaliza el escritorio y copia la plantilla a /etc/skel para aplicarlo globalmente.
  • Usa mount.pl y win_share.sh para generar montajes dinámicos por usuario desde NETLOGON, aprovechando Kerberos para evitar contraseñas en tiempo de sesión.
  • Usa pam_script para desmontar recursos al cerrar sesión.
  • Habilita GSSAPI en SSH para acceso sin contraseña.

Notas: valida cada paso en un entorno de pruebas antes de aplicarlo en producción. Mantén respaldo de configuraciones y procedimientos de reversión.

Autor
Edición

Materiales similares

Podman en Debian 11: instalación y uso
DevOps

Podman en Debian 11: instalación y uso

Apt-pinning en Debian: guía práctica
Sistemas

Apt-pinning en Debian: guía práctica

OptiScaler: inyectar FSR 4 en casi cualquier juego
Guía técnica

OptiScaler: inyectar FSR 4 en casi cualquier juego

Dansguardian + Squid NTLM en Debian Etch
Redes

Dansguardian + Squid NTLM en Debian Etch

Arreglar error de instalación Android en SD
Android

Arreglar error de instalación Android en SD

Conectar carpetas de red con KNetAttach
Redes

Conectar carpetas de red con KNetAttach