| |
Для начала хорошей идеей будет ознакомиться с этими источниками:
Хорошая статья на русском в вики Archlinux про sudo
Где работаем: 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. Если так, то продолжаем.
Где работаем: 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 закончена.
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |