Гид по технологиям

Интеграция sudoers с OpenLDAP: централизованное управление sudo

• 6 min read • Linux • Обновлено 27 Nov 2025
Интеграция sudoers с OpenLDAP
Интеграция sudoers с OpenLDAP

Этот пошаговый гид показывает, как централизовать управление правами sudo через OpenLDAP и SSSD: импортировать схему sudo, создать ou=sudo, добавить правила и пользователей, настроить клиент и проверить работу. В конце — чеклисты, методология и раздел по поиску и устранению неисправностей.

Обзор интеграции Sudo и OpenLDAP

Sudo — приложение, которое позволяет получить root- или административные привилегии в Linux/Unix. Большинство дистрибутивов уже содержат sudo, а разграничение прав можно централизовать через OpenLDAP, разместив правила sudo в LDAP-каталоге. Клиентские машины с настроенным SSSD получают правила sudo из OpenLDAP и применяют их для пользователей каталога.

В этом руководстве показано, как импортировать схему sudo в OpenLDAP, создать организационную единицу для sudo, определить стандартные параметры и правила, добавить пользователей и настроить клиент (SSSD + nsswitch) для применения правил sudo.

Важно: все команды в примерах выполнялись на Rocky Linux 9; адаптируйте команды под ваш дистрибутив и домен.

Что вы получите

  • Централизованное хранение правил sudo в OpenLDAP
  • Возможность быстро назначать/отключать sudo для пользователей без правки /etc/sudoers на каждом хосте
  • Поддержка SSSD как поставщика sudo на клиенте

Предварительные требования

  • Сервер с установленным и настроенным OpenLDAP (slapd).
  • Клиент с настроенным OpenLDAP-клиентом и SSSD.
  • На RHEL-подобных системах SELinux рекомендуется в режиме Permissive во время настройки.

В примере используются две машины:

Hostname    IP Address      Used as              Domain/FQDN
--------------------------------------------------------------
ldap        192.168.5.25    OpenLDAP Server      ldap.hwdomain.lan
client      192.168.5.80    OpenLDAP Client      client.hwdomain.lan

Шаг 1 — Импорт схемы sudo в OpenLDAP

Схема sudo определяет атрибуты и объектные классы, необходимые для хранения правил sudo в LDAP. Импорт производится через LDIF и ldapadd.

Скопируйте стандартную схему sudo в каталог OpenLDAP:

sudo cp /usr/share/doc/sudo/schema.OpenLDAP  /etc/openldap/schema/sudo.schema

Создайте LDIF-файл для конфигурации схемы:

sudo nano /etc/openldap/schema/sudo.ldif

Вставьте в файл следующие строки (сохраните точно как в примере):

dn: cn=sudo,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: sudo
olcAttributeTypes: ( 1.3.6.1.4.1.15953.9.1.1 NAME 'sudoUser' DESC 'User(s) who may  run sudo' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: ( 1.3.6.1.4.1.15953.9.1.2 NAME 'sudoHost' DESC 'Host(s) who may run sudo' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: ( 1.3.6.1.4.1.15953.9.1.3 NAME 'sudoCommand' DESC 'Command(s) to be executed by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: ( 1.3.6.1.4.1.15953.9.1.4 NAME 'sudoRunAs' DESC 'User(s) impersonated by sudo (deprecated)' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: ( 1.3.6.1.4.1.15953.9.1.5 NAME 'sudoOption' DESC 'Options(s) followed by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: ( 1.3.6.1.4.1.15953.9.1.6 NAME 'sudoRunAsUser' DESC 'User(s) impersonated by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: ( 1.3.6.1.4.1.15953.9.1.7 NAME 'sudoRunAsGroup' DESC 'Group(s) impersonated by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcObjectClasses: ( 1.3.6.1.4.1.15953.9.2.1 NAME 'sudoRole' SUP top STRUCTURAL DESC 'Sudoer Entries' MUST ( cn ) MAY ( sudoUser $ sudoHost $ sudoCommand $ sudoRunAs $ sudoRunAsUser $ sudoRunAsGroup $ sudoOption $ description ) )

Сохраните и закройте файл.

Измените владельца файла на ldap, чтобы slapd мог его прочитать:

sudo chown ldap:ldap /etc/openldap/schema/sudo.ldif

Добавьте схему в конфигурацию через ldapadd (ldapi):

sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/sudo.ldif

Успешный вывод будет похож на: adding new entry “cn=sudo,cn=schema,cn=config”.

Вывод ldapadd: добавление схемы sudo

После этого создадим OU для хранения записей sudo.

Шаг 2 — Создание организационной единицы ou=sudo

Создайте LDIF с описанием OU «sudo» (замените dc=hwdomain,dc=lan на ваш домен):

sudo nano sudoers.ldif

Вставьте:

# sudoers.ldif

dn: ou=sudo,dc=hwdomain,dc=lan
objectClass: organizationalUnit
objectClass: top
ou: sudo
description: Default ou for SUDO

Сохраните и примените:

sudo ldapadd -x -D cn=Manager,dc=hwdomain,dc=lan -W -f sudoers.ldif

При успехе вы увидите: adding new entry “ou=sudo,dc=hwdomain,dc=lan”.

Создание OU sudo в OpenLDAP

Проверьте наличие:

sudo ldapsearch -x -b "dc=hwdomain,dc=lan" ou=sudo

Вы должны увидеть запись ou=sudo в выводе.

Проверка наличия ou=sudo через ldapsearch

Шаг 3 — Добавление стандартной конфигурации sudo (defaults)

Создайте файл конфигурации sudo по умолчанию:

sudo nano sudoconf.ldif

Вставьте:

# sudoconf.ldif

dn: cn=defaults,ou=sudo,dc=hwdomain,dc=lan
objectClass: sudoRole
objectClass: top
cn: defaults
sudoOption: env_reset
sudoOption: mail_badpass
sudoOption: secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
#sudoOrder: 1

Примените:

sudo ldapadd -x -D cn=Manager,dc=hwdomain,dc=lan -W -f sudoconf.ldif

При успехе появится сообщение о добавлении записи defaults в ou=sudo.

Добавление конфигурации sudoconf в OpenLDAP

Теперь все записи в ou=sudo будут наследовать эти опции по умолчанию.

Шаг 4 — Добавление пользователей/ролей sudo в OpenLDAP

Вы можете либо добавить существующего пользователя в ou=sudo, либо создать нового пользователя и сразу поместить запись sudo.

Пример: добавление существующего пользователя “rocky” в ou=sudo:

nano adduser_sudo.ldif
# adduser_sudo.ldif

dn: cn=rocky,ou=sudo,dc=hwdomain,dc=lan
objectClass: sudoRole
objectClass: top
cn: rocky
sudoCommand: ALL
sudoHost: ALL
sudoRunAsUser: ALL
sudoUser: rocky

Примените:

sudo ldapadd -x -D cn=Manager,dc=hwdomain,dc=lan -W -f adduser_sudo.ldif

Вы увидите: adding new entry “cn=rocky,ou=sudo,dc=hwdomain,dc=lan”.

Добавление пользователя rocky в ou=sudo

Если вы хотите создать нового пользователя и одновременно добавить его в ou=sudo, используйте LDIF, который создаёт записи в ou=People, ou=Group и ou=sudo. Пример приведён ниже (замените userPassword, uidNumber, gidNumber, домен):

# adduser.ldif

dn: uid=rocky,ou=People,dc=hwdomain,dc=lan
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: rocky
sn: temp
userPassword: {SSHA}cDG5NuQd+rYn6rWh1r5UnysUOwJlt1uk
loginShell: /bin/bash
uidNumber: 2000
gidNumber: 2000
homeDirectory: /home/rocky
shadowLastChange: 0
shadowMax: 0
shadowWarning: 0

dn: cn=rocky,ou=Group,dc=hwdomain,dc=lan
objectClass: posixGroup
cn: rocky
gidNumber: 2000
memberUid: rocky

dn: cn=rocky,ou=sudo,dc=hwdomain,dc=lan
objectClass: sudoRole
objectClass: top
cn: rocky
sudoCommand: ALL
sudoHost: ALL
sudoRunAsUser: ALL
sudoUser: rocky

После добавления проверьте список в ou=sudo:

sudo ldapsearch -x -b "ou=sudo,dc=hwdomain,dc=lan"

Вывод ldapsearch: список sudo-пользователей

Шаг 5 — Настройка клиентской машины (SSSD + nsswitch)

На клиенте нужно прописать источник sudo в nsswitch и включить поддержку sudo в sssd.conf.

  1. В /etc/nsswitch.conf добавьте sudoers: files sss
sudo nano /etc/nsswitch.conf

Добавьте/отредактируйте строку:

sudoers: files sss

Запись sudoers в /etc/nsswitch.conf

  1. Отредактируйте /etc/sssd/sssd.conf, добавьте провайдера sudo и базу поиска sudo:
sudo nano /etc/sssd/sssd.conf

В секции [domain/default] добавьте:

[domain/default]
....
sudoers_base ou=sudo,dc=hwdomain,dc=lan
sudo_provider = ldap

[sssd]
services = nss, pam, autofs, sudo
domains = default

[nss]
homedir_substring = /home

[sudo]

Описание параметров:

  • sudoers_base — DN, где хранятся sudo-правила.
  • sudo_provider — ldap указывает, что sudo берётся из LDAP.
  • в services нужно включить sudo, чтобы SSSD запрашивал правила sudo.

Сохраните конфигурацию и перезапустите службу SSSD:

sudo systemctl restart sssd

sssd.conf с включенным sudo_provider и services = ...

После перезапуска клиент начинает получать правила sudo из OpenLDAP.

Шаг 6 — Проверка интеграции

С сервера подключитесь к клиенту под учётной записью OpenLDAP-пользователя (rocky):

ssh [email protected]

Войдите под паролем. Проверьте идентификацию:

id
whoami

Затем попробуйте повысить привилегии:

sudo su

Введите пароль пользователя rocky. Если всё настроено корректно, вы получите shell root. Проверьте:

id
whoami

SSH-подключение к клиенту как пользователь rocky

Если sudo работает — интеграция завершена.

Проверка и устранение распространённых проблем

  1. SSSD не получает записи sudo:

    • Проверьте, что в /etc/sssd/sssd.conf включён sudo в services и задан sudo_provider = ldap.
    • Убедитесь, что sudoers_base корректен и доступен для пользователя, под которым выполняется запрос (обычно sssd).
    • Проверьте логи SSSD: journalctl -u sssd -e и /var/log/sssd/sssd_*.log.
  2. ldapadd отклоняет LDIF:

    • Убедитесь, что используете правильный формат DN и objectClass для cn=sudo в конфигурации cn=config.
    • Для ldapi:/// используйте -Y EXTERNAL. Для сетевого подключения используйте -x -D -W.
  3. Клиент не показывает пользователя OpenLDAP:

    • Проверьте /etc/nsswitch.conf — должно быть passwd: files sss, group: files sss, sudoers: files sss.
    • Убедитесь, что SSSD имеет корректный конфиг домена и может связаться с LDAP-сервером.
  4. Проблемы с правами доступа slapd:

    • Проверьте, что файлы LDIF доступны пользователю ldap и имеют корректные права (chown ldap:ldap).
  5. SELinux блокирует доступ:

    • При сомнениях временно переведите SELinux в Permissive или просмотрите /var/log/audit/audit.log.

Короткие команды для отладки:

sudo ldapsearch -x -LLL -b "ou=sudo,dc=hwdomain,dc=lan"
journalctl -u sssd -f
getent passwd rocky
getent sudoers

getent sudoers покажет правила sudo, которые получает система (может зависеть от версии getent).

Ролевые чеклисты

Администратор LDAP (сервер):

  • Импортировал схему sudo в cn=config.
  • Создал ou=sudo и cn=defaults.
  • Добавил записи sudoRole для нужных пользователей/групп.
  • Проверил выдачу ldapsearch по ou=sudo.

Администратор клиента:

  • Добавил строку sudoers: files sss в /etc/nsswitch.conf.
  • Включил sudo в services в /etc/sssd/sssd.conf.
  • Указал sudoers_base и sudo_provider.
  • Перезапустил sssd и проверил логи.

Оператор (проверка на хосте):

  • Вошёл под LDAP-пользователем.
  • Выполнил sudo su.
  • Проверил uid/gid и whoami после sudo.

Мини-методология внедрения (кратко)

  1. Тестируйте на изолированной лабораторной среде (VM).
  2. Импортируйте схему sudo и создайте ou=sudo.
  3. Добавьте тестового пользователя и правило sudo (минимально привилегированное).
  4. Настройте один клиент, проверьте работоспособность.
  5. Массово тиражируйте конфиг SSSD через конфигурационный менеджер (Ansible, Puppet).
  6. Переводите правила из /etc/sudoers в LDAP постепенно, отслеживая инциденты.

Когда централизованный sudo не подходит (контрпримеры)

  • Небольшие окружения с 1–2 машинами: проще управлять /etc/sudoers.
  • Системы с жесткими требованиями к аудиту/локальным журналам, где централизованное управление усложняет трассировку.
  • Если сеть нестабильна и клиенты не могут регулярно связаться с LDAP — требуется локальный fallback.

Критерии приёмки

  • Запись cn=defaults присутствует в ou=sudo и возвращается ldapsearch.
  • Клиент получает правила sudo через SSSD (getent sudoers / sudo su работает для LDAP-пользователя).
  • Логи SSSD не содержат ошибок аутентификации/парсинга sudo.
  • Для тестового пользователя соблюдаются заданные sudoCommand/sudoHost ограничения.

Краткая справка (1‑строчная глоссарий)

  • OpenLDAP: LDAP-сервер с открытым исходным кодом для хранения каталога.
  • SSSD: System Security Services Daemon, клиент для доступа к удалённым каталогам/аутентификации.
  • sudoRole: объектный класс в LDAP для хранения правил sudo.
  • sudoers_base: DN, в котором SSSD ищет записи sudoRole.

Рекомендации по безопасности

  • Минимизируйте набор sudoCommand и sudoHost для ролей — не давайте ALL без необходимости.
  • Храните резервную копию исходных LDIF-файлов и конфигурации sssd.conf.
  • Настройте мониторинг логов SSSD и slapd на предмет ошибок аутентификации и отказов.

Сопроводительные шаблоны и примеры команд

  • Быстрая проверка наличия sudo-записей в LDAP:
ldapsearch -x -LLL -b "ou=sudo,dc=hwdomain,dc=lan" cn
  • Перезапуск SSSD и просмотр логов:
sudo systemctl restart sssd
journalctl -u sssd -f
  • Отладка доступных sudo правил на клиенте:
getent passwd rocky
getent group
getent sudoers || sudo -l

Итог

Вы настроили централизованное хранение и управление sudo через OpenLDAP и SSSD: импортировали схему, создали ou=sudo, определили настройки по умолчанию, добавили правило для пользователя и настроили клиент для получения sudo через SSSD. После проверки sudo su работает для LDAP-пользователя.

Важно: переносите правила поэтапно и тестируйте на одном хосте перед массовым развёртыванием.

Дальше: читайте официальную документацию OpenLDAP для деталей по cn=config и ldapadd; документация sudo/sudoers описывает формат записей и возможные опции sudoOption.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро