Школьный сервер LDAP + Kerberos + NFS: различия между версиями
Dkirienko (обсуждение | вклад) |
Dkirienko (обсуждение | вклад) |
||
| Строка 1: | Строка 1: | ||
| Строка 50: | Строка 49: | ||
Вы можете поднять DNS для разрешения имён ''[поможет ли в этом Avahi?]''. Но для надёжности и независимости от службы DNS можно создать статические записи для всех компьютеров - на каждом компьютере будут прописаны доменные имена других компьютеров. На клиенте достаточно прописать имя и адрес сервера, на сервере необходимо прописать имена всех подключённых к нему компьютеров в локальной сети. | Вы можете поднять DNS для разрешения имён ''[поможет ли в этом Avahi?]''. Но для надёжности и независимости от службы DNS можно создать статические записи для всех компьютеров - на каждом компьютере будут прописаны доменные имена других компьютеров. На клиенте достаточно прописать имя и адрес сервера, на сервере необходимо прописать имена всех подключённых к нему компьютеров в локальной сети. | ||
На сервере | На сервере выполните команду<syntaxhighlight lang="bash"> | ||
server.sch179.local | hostnamectl set-hostname server.sch179.local | ||
</syntaxhighlight>На клиенте | </syntaxhighlight>На клиенте выполните аналогичную команду<syntaxhighlight lang="bash"> | ||
ws01.sch179.local | hostnamectl set-hostname ws01.sch179.local | ||
</syntaxhighlight>В файл /etc/hosts на сервере добавьте | </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> | </syntaxhighlight> | ||
==Установка и настройка OpenLDAP на сервере== | ==Установка и настройка OpenLDAP на сервере== | ||
| Строка 75: | Строка 69: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
При этом в скриптах пакета openldap-servers есть [https://forum.rosa.ru/viewtopic.php?p=121370 ошибка], поэтому этот пакет после установки нужно повторно переустановить. | |||
Включите и запустите службу LDAP (команда от root).<syntaxhighlight lang="bash"> | |||
systemctl enable --now slapd | systemctl enable --now slapd | ||
Версия 22:47, 25 июня 2025
Это черновик статьи, он может содержать ошибки!
При установке на реальное железо нужно проверить, что SELINUX отключён.
Функционал системы
Целью является создание школьного сервера со следующим функционалом:
- Сервер является сервером авторизации для учащихся школы. Каждому учащемуся выдаётся логин и пароль, при помощи которого он может авторизоваться на любом компьютере, включенным в "школьный домен".
- Домашние каталоги учащихся монтируются по NFS, у каждого учащегося домашний каталог (то есть настройки приложений, файлы) будут идентичны на любом компьютере.
Предлагаемые технологии для этого:
- LDAP для хранения базы пользователей.
- Kerberos для хранения паролей и авторизации.
- SSSD для подключения к LDAP и Kerberos.
- NFS для доступа к домашним каталогам - /home на клиентах является сетевым разделом, монтируемым с сервера.
Для реализации будет использоваться платформа РОСА 13, как более современная. В настоящий момент для реализации такой конфигурации можно использовать:
- Роса "Фреш" 13, версия Server для сервера.
- Роса "Фреш" 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