Школьный сервер LDAP + Kerberos + NFS: различия между версиями

Материал из IT в школе
Перейти к навигацииПерейти к поиску
Строка 1: Строка 1:




Строка 50: Строка 49:
Вы можете поднять DNS для разрешения имён ''[поможет ли в этом Avahi?]''. Но для надёжности и независимости от службы DNS можно создать статические записи для всех компьютеров - на каждом компьютере будут прописаны доменные имена других компьютеров. На клиенте достаточно прописать имя и адрес сервера, на сервере необходимо прописать имена всех подключённых к нему компьютеров в локальной сети.
Вы можете поднять DNS для разрешения имён ''[поможет ли в этом Avahi?]''. Но для надёжности и независимости от службы DNS можно создать статические записи для всех компьютеров - на каждом компьютере будут прописаны доменные имена других компьютеров. На клиенте достаточно прописать имя и адрес сервера, на сервере необходимо прописать имена всех подключённых к нему компьютеров в локальной сети.


На сервере запишите в файл /etc/hostname единственную строку<syntaxhighlight lang="ini">
На сервере выполните команду<syntaxhighlight lang="bash">
server.sch179.local
hostnamectl set-hostname server.sch179.local
</syntaxhighlight>На клиенте в аналогичный файл запишите его имя<syntaxhighlight lang="ini">
</syntaxhighlight>На клиенте выполните аналогичную команду<syntaxhighlight lang="bash">
ws01.sch179.local
hostnamectl set-hostname ws01.sch179.local
</syntaxhighlight>В файл /etc/hosts на сервере добавьте для всех клиентских компьютеров - строки вида<syntaxhighlight lang="ini">
</syntaxhighlight>В файл /etc/hosts на сервере добавьте адреса и имена всех клиентских компьютеров - строки вида<syntaxhighlight lang="ini">
192.168.1.1 ws01.sch179.local ws01
192.168.1.1 ws01.sch179.local ws01


Строка 62: Строка 61:
192.168.0.1 server.sch179.local server
192.168.0.1 server.sch179.local server


</syntaxhighlight>Если вам нужна графическая оболочка на сервере, установите lxqt - лёгкую и нетребовательную к ресурсам оболочку (команда от root).<syntaxhighlight lang="bash">
dnf install -y task-lxqt
</syntaxhighlight>Если вы тестируете установку в VirtualBox, установите гостевые расширения  (команда от root).<syntaxhighlight lang="bash">
dnf install -y virtualbox-guest-additions
</syntaxhighlight>
</syntaxhighlight>
==Установка и настройка OpenLDAP на сервере==
==Установка и настройка OpenLDAP на сервере==


Строка 75: Строка 69:
</syntaxhighlight>
</syntaxhighlight>


После установки наблюдались ошибки с правами на /etc/openldap/slapd.d, помогло удалить и переустановить пакет openldap-servers (уточнить - какие должны быть права? проверить воспроизводимость проблемы).
При этом в скриптах пакета openldap-servers есть [https://forum.rosa.ru/viewtopic.php?p=121370 ошибка], поэтому этот пакет после установки нужно повторно переустановить.


Запуск службы LDAP  (команда от root).<syntaxhighlight lang="bash">
Включите и запустите службу LDAP  (команда от root).<syntaxhighlight lang="bash">
systemctl enable --now slapd
systemctl enable --now slapd



Версия 22:47, 25 июня 2025


Это черновик статьи, он может содержать ошибки!

При установке на реальное железо нужно проверить, что SELINUX отключён.

Функционал системы

Целью является создание школьного сервера со следующим функционалом:

  1. Сервер является сервером авторизации для учащихся школы. Каждому учащемуся выдаётся логин и пароль, при помощи которого он может авторизоваться на любом компьютере, включенным в "школьный домен".
  2. Домашние каталоги учащихся монтируются по NFS, у каждого учащегося домашний каталог (то есть настройки приложений, файлы) будут идентичны на любом компьютере.

Предлагаемые технологии для этого:

  1. LDAP для хранения базы пользователей.
  2. Kerberos для хранения паролей и авторизации.
  3. SSSD для подключения к LDAP и Kerberos.
  4. NFS для доступа к домашним каталогам - /home на клиентах является сетевым разделом, монтируемым с сервера.

Для реализации будет использоваться платформа РОСА 13, как более современная. В настоящий момент для реализации такой конфигурации можно использовать:

  1. Роса "Фреш" 13, версия Server для сервера.
  2. Роса "Фреш" 13, версия с Plasma 6 или МОС-13 (альфа-версия) для клиентских компьютеров.

Скорее всего эти инструкции можно применить для дистрибутивов на базе РОСА-2021.1 (МОС-12) без изменений.

Установка дистрибутивов и общие идеи конфигурации

Дистрибутивы Роса "Фреш" 13 можно скачать по ссылке. Дистрибутивы Роса "Фреш" доступны для бесплатного использования без каких-либо ограничений (см. лицензионное соглашение при установке).

Важно! Поскольку будут настраиваться механизмы авторизации и доступа в домашние каталоги, необходимо при установке как сервера, так и клиентов разрешить вход пользователю root. Это упростит починку системы, если будет что-то сломано в механизмах авторизации или доступа к домашним каталогам /home.

На клиентских компьютерах удобно помимо сетевых пользователей завести общий логин типа "user" или "student", функционирование которого не было бы привязано к работе сервера. Это позволит использовать компьютерные классы при проблемах с сетью или сервером. При этом домашний каталог такого пользователя НЕ ДОЛЖЕН находиться в /home, т.к. при проблемах использование этого каталога будет невозможно. Предлагается разместить домашний каталог такого пользователя в /usr/local/home. Туда же следует перенести и домашний каталог локального администратора системы [уточнить, как это сделать].

На сервере необходимо вынести /home в отдельный раздел, чтобы при отсутствии свободного места на нём это не повлияло на работу сервера. Рекомендуется использование файловой системы XFS на этом разделе, она считается наиболее быстрой. Наоборот, BTRFS не рекомендуется, т.к. нет смысла создавать снимки на этом разделе.

Желательный размер квоты на одного пользователя - 2-3 гигабайта, поэтому в масштабах одного школьного здания на хранение файлов пользователей следует выделять порядка 1 террабайта дискового пространства.

Настройка доменных имён

Для работы Kerberos необходимо, чтобы все компьютеры имели имена (FQDN) и взаимодействовали друг с другом с использованием FQDN.

Мы предположим, что наша сеть имеет следующий вид.

Локальный домен называется sch179.local. Далее в инструкциях измените название этого домена на своё.

Сервер имеет IP-адрес 192.168.0.1 и имя server.sch179.local

Клиентский компьютер в дальнейших инструкциях имеет IP-адрес 192.168.1.1 и имя ws01.sch179.local

Вы можете поднять DNS для разрешения имён [поможет ли в этом Avahi?]. Но для надёжности и независимости от службы DNS можно создать статические записи для всех компьютеров - на каждом компьютере будут прописаны доменные имена других компьютеров. На клиенте достаточно прописать имя и адрес сервера, на сервере необходимо прописать имена всех подключённых к нему компьютеров в локальной сети.

На сервере выполните команду

hostnamectl set-hostname server.sch179.local

На клиенте выполните аналогичную команду

hostnamectl set-hostname ws01.sch179.local

В файл /etc/hosts на сервере добавьте адреса и имена всех клиентских компьютеров - строки вида

192.168.1.1 ws01.sch179.local ws01

Одна строка соответствует одному компьютеру. Замените в этой строке IP-адрес компьютера, его полное и короткое имя. На клиентском компьютере запишите в этот файл адрес и имя сервера.

192.168.0.1 server.sch179.local server

Установка и настройка OpenLDAP на сервере

Установка и запуск LDAP

Установите на сервере пакеты (команда от root).

dnf install -y openldap-servers openldap-clients

При этом в скриптах пакета openldap-servers есть ошибка, поэтому этот пакет после установки нужно повторно переустановить.

Включите и запустите службу LDAP (команда от root).

systemctl enable --now slapd

Проверьте, что LDAP запущен и отвечает на запросы (команда от root).

ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config dn
systemctl status slapd.service

Настройка базы данных LDAP

Создание хеша пароля администратора

slappasswd

Пример результата:

{SSHA}GmLFgTlVi1ilt4IW0duB4/eCr3tpIuDu

Файл create-db.ldif

dn: olcDatabase={2}mdb,cn=config
changetype: add
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: {2}mdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=sch179,dc=local
olcRootDN: cn=admin,dc=sch179,dc=local
olcRootPW: {SSHA}GmLFgTlVi1ilt4IW0duB4/eCr3tpIuDu

Применение изменений:

ldapmodify -Y EXTERNAL -H ldapi:/// -f create-db.ldif

Проверка созданной базы

ldapsearch -Y EXTERNAL -H ldapi:/// -b "cn=config" "(olcDatabase=*)"

Создание базовой структуры LDAP

dn: dc=sch179,dc=local
objectClass: top
objectClass: organization
objectClass: dcObject
o: Sch179 School
dc: sch179

dn: ou=people,dc=sch179,dc=local
objectClass: organizationalUnit
ou: people

dn: ou=groups,dc=sch179,dc=local
objectClass: organizationalUnit
ou: groups

dn: cn=admin,dc=sch179,dc=local
objectClass: organizationalRole
cn: admin
description: LDAP Administrator

Добавление в LDAP:

ldapadd -x -D "cn=admin,dc=sch179,dc=local" -W -f base.ldif

Добавление схем

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif

Проверка схем:

ldapsearch -Y EXTERNAL -H ldapi:/// -b "cn=schema,cn=config" dn

Добавление групп пользователей

Создайте файл groups.ldif:

dn: cn=admins,ou=groups,dc=sch179,dc=local
objectClass: top
objectClass: posixGroup
cn: admins
gidNumber: 1000
description: System administrators

dn: cn=teachers,ou=groups,dc=sch179,dc=local
objectClass: top
objectClass: posixGroup
cn: teachers
gidNumber: 2000
description: School teachers

dn: cn=misc,ou=groups,dc=sch179,dc=local
objectClass: top
objectClass: posixGroup
cn: misc
gidNumber: 3000
description: Miscellaneous people

dn: cn=students,ou=groups,dc=sch179,dc=local
objectClass: top
objectClass: posixGroup
cn: students
gidNumber: 4000
description: Students

Добавление:

ldapadd -x -D "cn=admin,dc=sch179,dc=local" -W -f groups.ldif

Проверка:

ldapsearch -x -b "ou=groups,dc=sch179,dc=local" "(objectClass=posixGroup)"

Добавление пользователя (например, dk)

Создание пароля

slappasswd -s t9cdw3qR -v

user-dk.ldif

dn: cn=dk,ou=groups,dc=sch179,dc=local
objectClass: posixGroup
cn: dk
gidNumber: 1001
description: Primary group for user dk

dn: uid=dk,ou=people,dc=sch179,dc=local
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: dk
sn: Кириенко
givenName: Денис
cn: Денис Кириенко
uidNumber: 1001
gidNumber: 1001
homeDirectory: /home/dk
loginShell: /bin/bash
userPassword: {SSHA}rKkuYpM736DjDANzimaJOW0vV8bO8dN9
description: User Denis Kirienko

Добавление:

ldapadd -c -x -D "cn=admin,dc=sch179,dc=local" -W -f user-dk.ldif

Проверка:

ldapsearch -x -b "ou=people,dc=sch179,dc=local" "(uid=dk)"
ldapsearch -x -b "ou=groups,dc=sch179,dc=local" "(cn=dk)"

Настройка Kerberos

Установка пакетов

dnf install -y krb5-server krb5-libs krb5-workstation

Конфигурация /etc/krb5.conf

[libdefaults]
 default_realm = SCH179.LOCAL
 dns_lookup_realm = false
 dns_lookup_kdc = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true

[realms]
 SCH179.LOCAL = {
  kdc = 127.0.0.1
  admin_server = 127.0.0.1
 }

[domain_realm]
 .sch179.local = SCH179.LOCAL
 sch179.local = SCH179.LOCAL

Создание базы данных

kdb5_util create -s

Задайте мастер-пароль, например: `3yomdiYp`

Конфигурация /var/kerberos/krb5kdc/kdc.conf

[realms]
 SCH179.LOCAL = {
  database_name = /var/kerberos/krb5kdc/principal
  admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
  acl_file = /var/kerberos/krb5kdc/kadm5.acl
  key_stash_file = /var/kerberos/krb5kdc/.k5.SCH179.LOCAL
  kdc_ports = 88
  kdc_tcp_ports = 88
  max_life = 24h
  max_renewable_life = 7d
  default_principal_flags = +forwardable
 }

ACL файл

Файл: /var/kerberos/krb5kdc/kadm5.acl

*/admin@SCH179.LOCAL *

Запуск служб

systemctl enable --now krb5kdc
systemctl enable --now kadmin

Создание принципалов

kadmin.local
addprinc kadmin/admin
quit

Однострочная команда для создания пароля для заданного пользователя.

kadmin.local addprinc -pw xWnp7NoX dk

Интеграция LDAP и Kerberos через SSSD

Установка пакетов

dnf install -y sssd sssd-krb5 sssd-ldap oddjob-mkhomedir

Конфигурация SSSD

Файл: /etc/sssd/sssd.conf

[sssd]
domains = sch179.local
services = nss, pam

[domain/sch179.local]
id_provider = ldap
auth_provider = krb5

ldap_uri = ldap://localhost
ldap_search_base = dc=sch179,dc=local
ldap_id_use_start_tls = false
ldap_tls_reqcert = never

krb5_realm = SCH179.LOCAL
krb5_server = localhost

cache_credentials = true
enumerate = true

Права:

chmod 600 /etc/sssd/sssd.conf
chown root:root /etc/sssd/sssd.conf

NSS и PAM

Измените `/etc/nsswitch.conf, заменив в нём три строки на следующие:

passwd:     files sss
shadow:     files sss
group:      files sss

Измените `/etc/pam.d/system-auth`, добавив строки (НУЖЕН ПРИМЕР, КУДА ДОБАВЛЯТЬ):

auth        sufficient    pam_sss.so use_first_pass
account     [default=bad success=ok user_unknown=ignore] pam_sss.so
password    sufficient    pam_sss.so use_authtok
session     optional      pam_sss.so
session     required      pam_mkhomedir.so skel=/etc/skel umask=0077

Сделайте такие же правки в файле /etc/pam.d/pasword-auth

Запуск служб

systemctl enable --now sssd
systemctl enable --now oddjobd

Проверка возможности входа

getent passwd dk
su - dk

Настройка клиента

Установите нужные пакеты.

dnf install -y sssd sssd-ldap sssd-krb5 sssd-common oddjob-mkhomedir krb5-workstation openldap-clients

Создайте файл /etc/sssd/sssd.conf следующего содержания. В строках ldap_uri и krb5_server укажите адрес вашего сервера.

[sssd]
domains = sch179.local
services = nss, pam

[domain/sch179.local]
id_provider = ldap
auth_provider = krb5

ldap_uri = ldap://192.168.1.82
ldap_search_base = dc=sch179,dc=local
ldap_id_use_start_tls = false
ldap_tls_reqcert = never

krb5_realm = SCH179.LOCAL
krb5_server = 192.168.1.82

cache_credentials = true
enumerate = true

Установите права доступа на этот файл

chown root:root /etc/sssd/sssd.conf
chmod 600 /etc/sssd/sssd.conf

В файле /etc/nsswitch.conf замените три строки на такие:

passwd:     files sss
shadow:     files sss
group:      files sss

Исправьте файл /etc/krb5.conf, указав в двух местах адрес сервера.

[libdefaults]
 default_realm = SCH179.LOCAL
 dns_lookup_realm = false
 dns_lookup_kdc = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true

[realms]
 SCH179.LOCAL = {
  kdc = 192.168.1.82
  admin_server = 192.168.1.82
 }

[domain_realm]
 .sch179.local = SCH179.LOCAL
 sch179.local = SCH179.LOCAL

Добавьте в файлы /etc/pam.d/system-auth и /etc/pam-d/password-auth строки, как в настройках сервера. Запустите службы.

systemctl enable --now sssd
systemctl enable --now oddjobd

Теперь проверьте работу всех сервисов. Проверка ldap. Должна вывести информацию о пользователе.

getent passwd dk

Получение тикета керберос. Нужно ввести пароль пользователя dk.

kinit dk

После этого введите команду вывода информации о полученном тикете.

klist

Удалите полученный тикет командой

kdestroy

Попробуйте переключиться в пользователя.

su - dk

Наконец. попробуйте войти в систему в консоли и в десктоп-менеджере.

Установка NFS на сервере

Установите нужные пакеты.

dnf install -y nfs-utils krb5-server krb5-workstation

Включите и запустите нужные службы.

systemctl enable --now nfs-server 
systemctl enable --now rpcbind
systemctl enable --now gssproxy

Создадим ключи Kerberos на сервере. От имени пользователя root нужно запустить команду

kadmin.local

В приложении kadmin.local нужно ввести команды.

addprinc -randkey nfs/server.sch179.local
ktadd -k /etc/krb5.keytab nfs/server.sch179.local
quit

Проверим, что ключи были созданы, для этого введите команду от root

klist -k /etc/krb5.keytab

Вывод будет таким.

Keytab name: FILE:/etc/krb5.keytab
KVNO Principal
---- --------------------------------------------------------------------------
   2 nfs/server.sch179.local@SCH179.LOCAL
   2 nfs/server.sch179.local@SCH179.LOCAL

Созданный в результате файл /etc/krb5.keytab необходимо будет скопировать на каждый клиентский компьютер - иначе kerberos будет отказываться устанавливать соединение с этим компьютером. Теперь настроим экспорт файловой системы /home сервера по сети. Для этого в файле /etc/exports напишем строку

/home 192.168.0.0/16(rw,sec=krb5p,sync,no_subtree_check)

192.168.0.0/16 - сеть, из которой разрешён доступ (можете поменять)

krb5p - уровень безопасности Kerberos, означающий полное шифрование всех передаваемых данных. Это наиболее безопасно и даёт дополнительную нагрузку на процессор. Для уменьшения нагрузки можно использовать варианты без шифрования (но тогда возможен перехват данных): krb5 (только авторизация) или krb5i (проверка контрольных сумм данных для защиты от подмены).

Примените изменения командой

exportfs -ra

Проверьте, что система экспортируется, выполнив команду

exportfs -v

Установка NFS на клиенте

Установите нужные пакеты.

dnf install nfs-utils krb5-workstation

Скопируйте файл с ключами /etc/krb5.keytab с сервера на клиентскую машину. Установите владельца root:root и права доступа 600 на этот файл. Запустите нужные службы.

systemctl enable --now nfs-client.target
systemctl enable --now gssproxy

Теперь попробуем подмонтировать каталог /home с сервера. Это тестовая процедура, чтобы убедиться в том, что связка NFS + Kerberos настроена правильно.

Выполняйте все последующие действия под пользователем root.

Монтирование разделов при помощи NFS+Kerberos требует, чтобы у пользователя был действующий билет Kerberos. Этот билет нужно получить командой (выполним её от root)

kinit dk

Понадобится ввести пароль пользователя dk. Убедитесь, что билет получен, введя команду

klist

Имея билет, можно выполнить команду монтирования. Создайте на компьютере точку для монтирования, например, /root/home. Затем дайте команду.

mount -t nfs -o sec=krb5p server.sch179.local:/home /root/home

Эта команда подмонтирует раздел /home с сервера в каталог /root/home на клиенте.

Автомонтирование домашних каталогов при помощи autofs

Поскольку монтирование раздела через NFS+Kerberos требует получение билета, а получение билета происходит при авторизации в системе, домашние каталоги пользователей могут монтироваться только после авторизации в системе. Настроим на клиенте autofs, чтобы домашний каталог пользователя монтировался автоматически после входа.

Установим нужные пакеты.

sudo dnf install autofs

Создадим файл /etc/autofs/auto.master.d/home.autofs и запишем в него

/home /etc/auto.home --timeout=60

Создадим файл /etc/auto.home и запишем в него

* -sec=krb5p,rw server.sch179.local:/home/&

Включим и запустим службу autofs

sudo systemctl enable --now autofs