Задача – создать несколько отдельных DIT – Информационное дерево каталога (Data Information Tree
) и разграничить доступ к ним.
В примере будет использоваться:
# cat /etc/redhat-release CentOS release 6.5 (Final)
# rpm -qa | grep openldap openldap-clients-2.4.23-34.el6_5.1.x86_64 openldap-servers-2.4.23-34.el6_5.1.x86_64 openldap-2.4.23-34.el6_5.1.x86_64
Сервер сконфигурирован на использование файла конфигурации /etc/openldap/slapd.conf
, а не записи cn=config
.
Для каждой базы создадим отдельный каталог:
# mkdir /var/lib/ldap/db_1
# mkdir /var/lib/ldap/db_2
Устанавливаем владельца:
# chown ldap:ldap /var/lib/ldap/db_1
# chown ldap:ldap /var/lib/ldap/db_2
Копиреум файлы настроек:
# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/db_1/DB_CONFIG
# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/db_2/DB_CONFIG
Устанавливаем владельца:
# chown ldap:ldap /var/lib/ldap/db_1/DB_CONFIG
# chown ldap:ldap /var/lib/ldap/db_2/DB_CONFIG
Останавливаем OpenLDAP сервер:
# service slapd stop Stopping slapd: [ OK ]
# service slapd status slapd is stopped
Генерируем хеши паролей для пользователей баз:
# slappasswd -s passwd1 -h {MD5} {MD5}eeJiqB3RnUCuAI9061ntzg==
# slappasswd -s passwd2 -h {MD5} {MD5}MJgloJUbPPHyXie2HO6CQw==
Редактируем файл /etc/openldap/slapd.conf
и добавляем записи о новых базах:
####################################################################### # BDB database definitions ####################################################################### suffix "dc=db_1" checkpoint 1024 15 rootdn "cn=root,dc=db_1" rootpw {MD5}80AY1UdLJTVLVKtRmmtwQw== directory /var/lib/ldap/db_1 access to dn.base="dc=db_1" by * read database bdb suffix "dc=db_2" checkpoint 1024 15 rootdn "cn=root,dc=db_2" rootpw {MD5}jwDprtHRLi5NeV7uxaMIdA== directory /var/lib/ldap/db_2 access to dn.base="dc=db_2" by * read
Сохраняем, выходим и проверяем корректность файла конфигурации:
# slaptest -u config file testing succeeded
# service slapd start Starting slapd: [ OK ]
# service slapd status slapd (pid 27457) is running...
Проверим созданные DIT-ы:
# ldapsearch -x -s base -b "" + | grep naming namingContexts: dc=db_1 namingContexts: dc=db_2
Готово.
Кратко – о назначении прав доступа. В примере выше мы разделили права на доступ к разным DIT для разных rootdn
– писать в каталоги друг-друга они не могут, но могут читать (при этом для “своего” дерева у каждого пользователя есть полный доступ).
Давайте посмотрим как это выглядит.
Выполним поиск в базе db_1
от пользователя cn=root,dc=db_1
:
# ldapsearch -x -D "cn=root,dc=db_1" -W -b "dc=db_1" "o=db_1" Enter LDAP Password: .... # db_1 dn: dc=db_1 objectClass: dcObject objectClass: organization objectClass: top dc: db_1 o: db_1
И поищем запись под этим же пользователем – но во второй базе:
# ldapsearch -x -D "cn=root,dc=db_1" -W -b "dc=db_2" "o=db_2" Enter LDAP Password: ... # db_2 dn: dc=db_2 objectClass: dcObject objectClass: organization objectClass: top dc: db_2 o: db_2
Поиск работает для одного пользователя в обеих базах.
Теперь – попробуем отредактировать какую-то запись с помощью ldapmodify
:
# ldapmodify -x -W -D "cn=root,dc=db_1" Enter LDAP Password: dn: dc=db_1 changetype: modify replace: o o: db_modified modifying entry "dc=db_1"
# ldapsearch -x -D "cn=root,dc=db_1" -W -b "dc=db_1" "o=db_modified" Enter LDAP Password: ... # db_1 dn: dc=db_1 objectClass: dcObject objectClass: organization objectClass: top dc: db_1 o: db_modified
ОК, в “своей” базе мы отредактировали запись.
Попробуем в “чужой”:
# ldapmodify -x -W -D "cn=root,dc=db_1" Enter LDAP Password: dn: dc=db_2 changetype: modify replace: o o: db_modified modifying entry "dc=db_2" ldap_modify: Insufficient access (50)
Что и требовалось.
Ссылки по теме:
http://www.zytrax.com
http://www.linuxtopia.org
http://www.ghacks.net