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

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”.

После этого создадим 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”.

Проверьте наличие:
sudo ldapsearch -x -b "dc=hwdomain,dc=lan" ou=sudoВы должны увидеть запись ou=sudo в выводе.

Шаг 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.

Теперь все записи в 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”.

Если вы хотите создать нового пользователя и одновременно добавить его в 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"
Шаг 5 — Настройка клиентской машины (SSSD + nsswitch)
На клиенте нужно прописать источник sudo в nsswitch и включить поддержку sudo в sssd.conf.
- В /etc/nsswitch.conf добавьте sudoers: files sss
sudo nano /etc/nsswitch.confДобавьте/отредактируйте строку:
sudoers: files sss
- Отредактируйте /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
После перезапуска клиент начинает получать правила sudo из OpenLDAP.
Шаг 6 — Проверка интеграции
С сервера подключитесь к клиенту под учётной записью OpenLDAP-пользователя (rocky):
ssh [email protected]Войдите под паролем. Проверьте идентификацию:
id
whoamiЗатем попробуйте повысить привилегии:
sudo suВведите пароль пользователя rocky. Если всё настроено корректно, вы получите shell root. Проверьте:
id
whoami
Если sudo работает — интеграция завершена.
Проверка и устранение распространённых проблем
SSSD не получает записи sudo:
- Проверьте, что в /etc/sssd/sssd.conf включён sudo в services и задан sudo_provider = ldap.
- Убедитесь, что sudoers_base корректен и доступен для пользователя, под которым выполняется запрос (обычно sssd).
- Проверьте логи SSSD: journalctl -u sssd -e и /var/log/sssd/sssd_*.log.
ldapadd отклоняет LDIF:
- Убедитесь, что используете правильный формат DN и objectClass для cn=sudo в конфигурации cn=config.
- Для ldapi:/// используйте -Y EXTERNAL. Для сетевого подключения используйте -x -D
-W.
Клиент не показывает пользователя OpenLDAP:
- Проверьте /etc/nsswitch.conf — должно быть passwd: files sss, group: files sss, sudoers: files sss.
- Убедитесь, что SSSD имеет корректный конфиг домена и может связаться с LDAP-сервером.
Проблемы с правами доступа slapd:
- Проверьте, что файлы LDIF доступны пользователю ldap и имеют корректные права (chown ldap:ldap).
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 sudoersgetent 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.
Мини-методология внедрения (кратко)
- Тестируйте на изолированной лабораторной среде (VM).
- Импортируйте схему sudo и создайте ou=sudo.
- Добавьте тестового пользователя и правило sudo (минимально привилегированное).
- Настройте один клиент, проверьте работоспособность.
- Массово тиражируйте конфиг SSSD через конфигурационный менеджер (Ansible, Puppet).
- Переводите правила из /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.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента