6. Настройка OpenLDAP в качестве хранилища правил sudo

Для начала хорошей идеей будет ознакомиться с этими источниками:

Официальный сайт sudo

Руководство по sudoers и LDAP

Файл README.LDAP проекта sudo

Хорошая статья на русском в вики Archlinux про sudo

6.1 Конвертация файла sudoers в конфигурацию OpenLDAP

Где работаем: ldap-srv

Для удобства создадим новый каталог:

$  mkdir ~/sudo
$  cd ~/sudo

За основу возьмём вот такой вполне обычный файл с правилами sudo и сохраним его как 6.1-sudoers.source:

Defaults  env_reset
Defaults  mail_badpass
Defaults  secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

root      ALL=(ALL) ALL

%sysadmin ALL=(ALL) ALL

Для конвертации этого файла в LDIF воспользуемся скриптом /usr/share/doc/sudo-ldap/sudoers2ldif.gz из пакета sudo-ldap:

$  zcat /usr/share/doc/sudo-ldap/sudoers2ldif.gz > 6.1-sudoers2ldif
$  SUDOERS_BASE=ou=sudo,ou=services,dc=example,dc=com perl 6.1-sudoers2ldif 6.1-sudoers.source > 6.1-sudoers.ldif

Между прочим, можно и не создавать отдельный файл 6.1-sudoers.source, а просто в последней команде вместо него указать Ваш текущий /etc/sudoers. Таким образом Вы преобразуете в LDIF свою любимую конфигурацию. :)

Итак, у нас теперь есть sudoers в формате LDIF. Но в нашей службе каталогов нет контейнера для правил sudo! У нас, в сущности, даже нет контейнера для служб. Поэтому добавим в начало получившегося у нас 6.1-sudoers.ldif несколько строк для контейнера служб (первый блок строк) и входящего в него контейнера правил sudo (второй блок строк). Итоговый файл 6.1-sudoers.ldif для 6.1-sudoers.source будет выглядеть так:

dn: ou=services,dc=example,dc=com
ou: Services
objectClass: top
objectClass: organizationalUnit
description: Group all services under this OU

dn: ou=sudo,ou=services,dc=example,dc=com
objectClass: organizationalUnit
description: sudo
objectClass: top

dn: cn=defaults,ou=sudo,ou=services,dc=example,dc=com
objectClass: top
objectClass: sudoRole
cn: defaults
description: Default sudoOption's go here
sudoOption: env_reset
sudoOption: mail_badpass
sudoOption: secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
sudoOrder: 1

dn: cn=root,ou=sudo,ou=services,dc=example,dc=com
objectClass: top
objectClass: sudoRole
cn: root
sudoUser: root
sudoHost: ALL
sudoRunAsUser: ALL
sudoCommand: ALL
sudoOrder: 2

dn: cn=%sysadmin,ou=sudo,ou=services,dc=example,dc=com
objectClass: top
objectClass: sudoRole
cn: %sysadmin
sudoUser: %sysadmin
sudoHost: ALL
sudoRunAsUser: ALL
sudoCommand: ALL
sudoOrder: 3

Заметьте, директива secure_path определена без использования кавычек!

Небольшое примечание по поводу скрипта sudoers2ldif. Если в Вашем sudoers файле встречаются строки вида

env_keep = COLORS
то после всех проведённых с файлом sudoers.ldif манипуляций надо сделать ещё один фокус — убрать лишние пробелы. Так, чтобы получилось
env_keep=COLORS
Иначе при загрузке LDIF мы получим ошибки. Провернуть это можно с помощью одной команды:

$  sed -i.bak -e "s/ = /=/g" -re 's/= {0,2}"/=/g' -e 's/"$//g' -e "s/p \+/p+/g" 6.1-sudoers.ldif

Загрузим нашу конфигурацию в каталог:

$  ldapmodify -axZZWD cn=admin,dc=example,dc=com -f 6.1-sudoers.ldif
Enter LDAP Password:
adding new entry "ou=services,dc=example,dc=com"
adding new entry "ou=sudo,ou=services,dc=example,dc=com"
adding new entry "cn=defaults,ou=sudo,ou=services,dc=example,dc=com"
adding new entry "cn=root,ou=sudo,ou=services,dc=example,dc=com"
adding new entry "cn=%sysadmin,ou=sudo,ou=services,dc=example,dc=com"

Убедимся, что обычные пользователи не могут просмотреть конфигурацию sudoers:

$  ldapsearch -xZZLLLWD cn=pablo,ou=users,dc=example,dc=com -b ou=sudo,ou=services,dc=example,dc=com
Enter LDAP Password:
No such object (32)

А вот наш пользователь nssproxy, напротив, должен иметь к ней доступ:

$  ldapsearch -xZZLLLWD cn=nssproxy,ou=users,dc=example,dc=com -b ou=sudo,ou=services,dc=example,dc=com
Enter LDAP Password:
dn: ou=sudo,ou=services,dc=example,dc=com
objectClass: organizationalUnit
...

Вы должны были увидеть вывод, почти идентичный содержимому файла 6.1-sudoers.ldif. Если так, то продолжаем.

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

Где работаем: ldap-client

Теперь, когда у нас есть работающая схема sudo (dn: cn={13}sudo,cn=schema,cn=config) и LDAP-версия файла sudoers, мы можем настроить клиентские машины для запроса данных sudoers с сервера OpenLDAP.

Прежде чем установить пакет sudo-ldap необходимо задать пароль для учетной записи root:

#  passwd
Введите новый пароль UNIX:
Повторите ввод нового пароля UNIX:

Установим sudo-ldap:

#  apt-get install sudo-ldap

Конфигурация LDAP для sudo по-умолчанию считывается из ссылки /etc/sudo-ldap.conf на /etc/ldap/ldap.conf. Нам это будет не очень удобно, потому что в эту конфигурацию надо снова поместить пароль nssproxy. Поэтому удалим эту символическую ссылку и заменим её на файл с таким же именем:

# rm /etc/sudo-ldap.conf
# touch /etc/sudo-ldap.conf

Запишем в файл /etc/sudo-ldap.conf:

BASE    dc=example,dc=com
URI     ldap://ldap-srv.example.com
BINDDN  cn=nssproxy,ou=users,dc=example,dc=com
BINDPW  пароль.пользователя.nssproxy
TLS_CACERTFILE  /etc/ssl/certs/rootca.crt
TLS_CRLFILE     /etc/ssl/rootca.crl 
TLS_CHECKPEER   no
TIMELIMIT       15
TIMEOUT         20
SUDOERS_BASE    ou=sudo,ou=services,dc=example,dc=com
#SUDOERS_DEBUG 2

Настроим права доступа на этот файл (в нём теперь есть пароль!):

#  chmod 600 /etc/sudo-ldap.conf
#  chown root:root /etc/sudo-ldap.conf

Файл сертификата нашего корневого удостоверяющего центра (rootca.crt) мы уже скопировали на ldap-client в разделе 5.

Убедимся, что в файле /etc/nsswitch.conf директива sudoers выглядит так или добавим её:

sudoers:        files ldap

Проверим работоспособность наших настроек:

$ sudo -l -U pablo 
Matching Defaults entries for pablo on ldap-client: 
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, env_reset, mail_badpass, secure_path=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin
 
User pablo may run the following commands on ldap-client: 
    (ALL) ALL

Мы видим как локальные настройки /etc/sudoers, так и информацию из нашего каталога OpenLDAP. Значит всё работает!

Где работаем: ldap-srv

Если мы вновь заглянем в журнал /var/log/slapd.log, то увидим там ошибки такого вида:

ldap-srv slapd[868]: <= mdb_equality_candidates: (sudoUser) not indexed

Для того, чтобы это исправить сделаем вот такой небольшой LDIF-файл 6.2-sudoers.indexes.ldif с новыми индексами:

dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcDbIndex
olcDbIndex: sudoUser eq,sub
-
add: olcDbIndex
olcDbIndex: sudoHost eq

И загрузим его в каталог:

$  ldapmodify -axZZWD cn=admin,dc=example,dc=com  -f 6.2-sudoers.indexes.ldif
Enter LDAP Password:
modifying entry "olcDatabase={1}mdb,cn=config"

Теперь при выполнении на ldap-client команд с sudo ошибок в журнале сервера быть не должно. На этом реализация хранилища настроек sudo закончена.

Pro-LDAP.ru 2015 г. Последнее изменение страницы — 3 мая 2015 г. Вопросы и предложения принимаются на форуме проекта.