Настройка тонких клиентов LTSP, DHCP и монтирование Windows-шар

Кратко
Кратко: пошаговое руководство по настройке DHCP для PXE-загрузки тонких клиентов LTSP, установке окружения рабочего стола, автоматическому монтированию Windows-шар (CIFS) при входе через Kerberos, безопасному размонтированию при выходе и включению SSH без пароля. Включены скрипты, чек-листы, варианты альтернатив и отладка.
Введение
Это руководство описывает практическую настройку тонких клиентов на базе LTSP и сервера thinserver: что изменить в DHCP, как подготовить профиль рабочего стола, как автоматически монтировать Windows-шары при входе пользователя с Kerberos-аутентификацией, как корректно размонтировать их при выходе и как включить passwordless SSH через GSSAPI. Примеры скриптов и конфигураций можно адаптировать под вашу сеть.
Важно
- Перед началом убедитесь, что вы понимаете влияние изменений в DHCP и что у вас есть доступ к консоли сервера.
- Не храните открытые пароли в /etc/fstab в продакшн-среде — рассмотрите использование ключей, kerberos или защищённых credential helpers.
Содержание
- DHCP Server Settings
- Настройка рабочего стола для тонких клиентов
- Как сделать профиль по умолчанию для всех пользователей
- Монтирование Windows-шар при входе
- Удаление шар при выходе
- Passwordless SSH через Kerberos
- Проблемы и решения
- Чек-листы и методика развертывания
- Краткая глоссарий и рекомендации по безопасности
DHCP Server Settings
Ниже приведён пример конфигурации DHCP, которую нужно добавить на сервер DHCP, если тонкие клиенты должны PXE-загружаться и получать статические IP для отдельных MAC-адресов. Комментарии здесь русифицированы для понятности — сами параметры и значения оставлены как в примере.
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";
}
Совет по отладке DHCP
- После изменения конфигурации перезапустите службу DHCP и наблюдайте лог (/var/log/syslog или /var/log/messages) при загрузке клиента.
- Убедитесь, что PXE-сервер (TFTP/next-server) доступен по адресу, указанному в next-server.
Настройка рабочего стола для тонких клиентов
Чтобы упростить работу пользователей тонких клиентов, автор установил тему XPGnome и изменил меню «Пуск», а также добавил Adobe Reader 9 и Skype. Вы можете повторить эти шаги для вашего образа.
Если у вас отсутствует иконка «Выйти», её можно сгенерировать из большого изображения и сохранить в наборах иконок. Автор сделал так:
- Взял иконку 48×48 с Google.
- В GIMP масштабировал в 32×32, 24×24, 22×22 и 16×16.
- Переименовал файл в system-log-out.png и разместил в /usr/share/icons/GnomeXP/{размер}/actions.
Результат выглядит так:
Сделать профиль по умолчанию для всех пользователей
Чтобы эти настройки стали стандартными для каждого вновь вошедшего пользователя, скопируйте из домашней папки установившего темы пользователя следующие каталоги в /etc/skel:
- .config
- .gconf
- .icons
- .local
- .themes
Дальше: любые изменения, которые вы хотите распространить на всех, нужно будет копировать в /etc/skel и при необходимости переподготавливать образ.
Монтирование Windows-шар при входе
Подход, выбранный автором, использует простой запуск bash/perl-скриптов через «Startup Applications» в Ubuntu. Альтернативы включают autofs, systemd-automount, pam_mount и другие. Ниже полный набор шагов, как это сделать на примере.
Предварительные условия
- NETLOGON шар DC должен быть доступен на thinserver.domain.internal.
- Нужен доменный аккаунт, который может читать содержимое NETLOGON, например public/password (в учебных примерах). В продакшне используйте защищённые методы хранения учётных данных.
Создайте точку монтирования для NETLOGON:
sudo mkdir /mnt/logon
Добавьте в /etc/fstab строку для автоматического монтирования NETLOGON через CIFS (для примера):
//dc.domain.internal/netlogon /mnt/logon cifs username=public,password=password 0 0
Затем выполните:
sudo mount -a
Структура и идея скриптов
- /usr/local/bin/win_share.sh — запускается при входе пользователя; удаляет старые .mount.sh/.umount.sh, генерирует новые и запускает .mount.sh.
- /usr/local/bin/mount.pl — парсит logon.bat (из NETLOGON) и генерирует для каждого пользователя ~/.mount.sh и ~/.umount.sh с нужными mount.cifs и umount.cifs.
Скрипт win_share.sh (сохраняйте в /usr/local/bin/ с правом исполнение):
#!/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
Скрипт mount.pl (поместите в /usr/local/bin/ и разрешите исполнение):
#!/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;
}
Пример ~/.mount.sh, сгенерированного для пользователя 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
Создание «Startup Application» для запуска win_share.sh
Добавьте запуск /usr/local/bin/win_share.sh в «Preferences → Startup Applications». На экране это выглядит так:
Альтернативы и когда их использовать
- autofs/systemd-automount: хороши для больших сетей, где нужно ленивое монтирование и масштабируемость.
- pam_mount: монтирует шары в момент сессии и разгружает работу от пользовательских скриптов, но требует настройки PAM и форматов конфигурации.
- Если нужна центральная политика: используйте скрипты, генерируемые на сервере, и распространяйте через конфигурационный менеджер (Ansible/Puppet).
Удаление Windows-шар при выходе
Автор использовал pam_script.so — PAM-модуль, который позволяет запускать скрипты при открытии и закрытии сессии. Поскольку входные скрипты у автора зависят от $USER, он запускал их от имени пользователя (через Startup Applications), а размонтирование выполняется через pam_script при закрытии сессии.
Установка libpam-script (пример .deb):
sudo dpkg -i libpam-script_1.1.4-1_i386.deb
Пример ~/.umount.sh для jdoe (сгенерировано mount.pl):
#!/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
Создайте /usr/share/libpam-script/pam_script_ses_close со следующим содержимым и разрешениями:
#!/bin/sh
# pam_script_ses_close script to remove windows shares
/home/$PAM_USER/.umount.sh 2>&1 >> /var/log/umount.log
Добавьте в /etc/pam.d/common-session строку:
session optional pam_script.so
Проверьте: войдите под пользователем, замонтируйте шары; выйдите и убедитесь, что umount выполнился и монтирования отсутствуют (проверка /proc/mounts и /var/log/umount.log).
Passwordless SSH через Kerberos
Если сервер и рабочая станция находятся в домене с Kerberos, можно включить GSSAPI-аутентификацию для SSH, чтобы пользователи не вводили пароль.
На сервере (в /etc/ssh/sshd_config) включите:
# GSSAPI options
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
UseDNS yes
На рабочей станции (в /etc/ssh/ssh_config) включите:
GSSAPIAuthentication yes
GSSAPIDelegateCredentials yes
Тестирование:
ssh -v thinserver
Если Kerberos аутентификация работает, вы увидите в выводе сообщение вроде:
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).
Если это не срабатывает — проверьте время на клиентах/сервере (Kerberos чувствителен к рассинхронизации), /etc/krb5.conf и доступность KDC.
Проблемы и решения
Ниже — краткие известные проблемы и решения, с которыми столкнулся автор.
PROBLEM : LTSP client authenticates but logs out immediately SOLUTION:
gconftool-2 --direct --config-source xml:readwrite:/etc/gconf/gconf.xml.mandatory --type string --set /desktop/gnome/session/required_components/windowmanager metacity
PROBLEM : No VNC on thin clients SOLUTION: http://bootpolish.net/home_ltsp_installx11vnconltsp5
PROBLEM : Change the default login screen to a custom one SOLUTION: https://help.ubuntu.com/community/EdubuntuFAQ
PROBLEM : How to setup root password on thin client SOLUTION: https://help.ubuntu.com/community/EdubuntuFAQ
PROBLEM : No logout icon SOLUTION: http://ubuntuforums.org/archive/index.php/t-815188.html
Расширенные рекомендации по диагностике
- Проверьте логи: /var/log/auth.log, /var/log/syslog и ~/.xsession-errors.
- Убедитесь, что права на ~/.mount.sh и ~/.umount.sh корректны и принадлежат пользователю.
- Для Kerberos проверьте klist и kinit для пользователя.
Чек-листы и методика развертывания
Мини-план развертывания для администратора (SOP)
- Подготовка сервера
- Обновить систему и установить LTSP-пакеты, tftpd-hpa, isc-dhcp-server.
- Настроить /etc/dhcp/dhcpd.conf согласно секции DHCP.
- Настройка PXE/TFTP
- Разместить pxelinux.0 и конфиги в /srv/tftp или эквивалент.
- Подготовка образа рабочего стола
- Настроить пользователя с нужными темами и программами.
- Скопировать .config/.gconf/.icons/.local/.themes в /etc/skel.
- Настройка NETLOGON
- Смонтировать NETLOGON в /mnt/logon; положить bat-файлы.
- Развернуть скрипты
- Разместить win_share.sh и mount.pl в /usr/local/bin/, chown/chmod.
- Настройка автозапуска
- Добавить win_share.sh в Startup Applications.
- Настройка pam_script для размонтирования
- Установить libpam-script, создать pam_script_ses_close и добавить pam_script.so в common-session.
- Тестирование
- Проверить логин/выход, корректность монтирования/размонтирования, Kerberos SSH.
Роли и обязанности
- Системный администратор: DHCP, TFTP, Kerberos, server-side конфигурации.
- Отдел поддержки: подготовка образов рабочего стола, иконок, приложений.
- Безопасность/инфраструктура: аудит fstab, прав доступа, контроль учётных данных.
Безопасность и соответствие
- Не храните пароли в /etc/fstab на постоянной основе. Используйте Kerberos или credential files с ограниченными правами и защитой.
- Логи размонтирования должны быть доступны аудиторам, но защищены от удаления пользователями.
- При работе с доменом проверяйте политику паролей и доступов. Если вы обрабатываете персональные данные (GDPR), убедитесь, что доступ к файловым шарам соответствует правилам хранения и разграничения прав.
Краткая методология внедрения (мини-метод)
- Разверните тестовый сервер и одну тестовую рабочую станцию.
- Настройте DHCP и PXE, убедитесь, что один тонкий клиент грузится корректно.
- Настройте NETLOGON и протестируйте парсинг .bat файлов вручную.
- Включите автоматическое монтирование и отладьте права и Kerberos.
- Разверните в пилоте на 5–10 пользователей, соберите обратную связь.
- Перенесите в продакшн, документируйте все изменения.
Мини-глоссарий
- LTSP — Lightweight Terminal Server Protocol, способ централизованной загрузки тонких клиентов.
- PXE — Preboot Execution Environment, загрузка по сети.
- CIFS/SMB — протоколы доступа к файлам Windows-шары.
- Kerberos — протокол сетевой аутентификации, поддерживающий SSO.
- GSSAPI — интерфейс для механизмов аутентификации (включая Kerberos) в SSH.
Резюме
- DHCP-конфигурация обеспечивает PXE-загрузку и статические привязки по MAC.
- Профиль рабочего стола можно централизованно распространить через /etc/skel.
- Скриптовый подход (win_share.sh + mount.pl) прост для кастомизации и подходит для небольших/средних сред; для крупных сред рассмотрите autofs или pam_mount.
- pam_script позволяет корректно снимать шар при выходе, а GSSAPI/Kerberos — получить вход по SSH без пароля.
Важно
Перед массовым внедрением обязательно тестируйте сценарии выхода, восстановления паролей и поведения при обрыве сети.
Дополнительные ресурсы
- Документация LTSP и Ubuntu Help для EdubuntuFAQ (ссылки в разделе Проблемы и решения).
Похожие материалы
Microsoft Mood Board: быстрый мудборд для идей

Замена слов в Microsoft Word: быстрый гид

Изменить GPS на iPhone с iToolab AnyGo

Установка Elasticsearch на Ubuntu

Не удаётся войти в аккаунт в Windows 11
