Задача проста: Нужно адаптировать работу Web—интерфейса для управления LDAP сервером к сервису slapd. Да есть такая обертка, имя ей phpldapadmin. С ее помощью я смогу в удобном виде создавать группы, учетные записи, включать в группу учетные записи и т. д. Вообще последующая цель — это чтобы в локальной сети был сервис по типу службы каталогов Active Directory, но на Ubuntu 18.04 Server через который все мои сервисы, такие как: Redmine, OwnCloud, GLPI и т.д которыми я пользуюсь в повседневности могли авторизоваться централизованно. А не как сейчас для каждой системы, свой логин и свой пароль.
Работает!!! от 19.05.2019 23:57
Шаг №1: Подготавливаю систему Ubuntu 18.04 Server для последующего использования (образ который использовал: ubuntu-18.04.2-server-amd64.iso)
ekzorchik@srv-bionic:~$ hg clone --insecure https://ekzorchik@172.35.35.8/hg/dproject ekzorchik@srv-bionic:~$ sudo ./dproject/default ekzorchik@srv-bionic:~$ sudo nano /etc/hosts 172.33.33.6 srv-bionic.polygon.local srv-bionic
Шаг №2: Устанавливаю необходимые компоненты, т. е. OpenLDAP, Apache2 и т.д.
ekzorchik@srv-bionic:~$ sudo apt-get install apache2 php7.2-ldap php7.2-xml ldapscripts unzip libapache2-mod-php7.2 slapd ldap-utils -y
Administrator password: 712mbddr@Confirm password: 712mbddr@
Создаваемый пароль выше — это для учетной записи cn=admin в Вашем OpenLDAP-сервисе.
ekzorchik@srv-bionic:~$ echo "ServerName localhost" | sudo tee -a /etc/apache2/apache2.conf
ServerName localhost
ekzorchik@srv-bionic:~$ sudo unlink /etc/apache2/sites-available/000-default.conf
ekzorchik@srv-bionic:~$ sudo unlink /etc/apache2/sites-available/default-ssl.conf
ekzorchik@srv-bionic:~$ sudo unlink /etc/apache2/sites-enabled/000-default.conf
ekzorchik@srv-bionic:~$ sudo rm -f /var/www/html/index.html
ekzorchik@srv-bionic:~$ sudo nano /etc/apache2/sites-available/phpldapadmin.conf
<VirtualHost *:80>
ServerName 172.33.33.6
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/phpldapadmin_error.log
CustomLog ${APACHE_LOG_DIR}/phpldapadmin_access.log combined
<Location /phpldapadmin>
Order deny,allow
Deny from all
Allow from 127.0.0.1 172.33.33.0/24
</Location>
</VirtualHost>
ekzorchik@srv-bionic:~$ sudo a2ensite phpldapadmin.conf
ekzorchik@srv-bionic:~$ sudo apache2ctl configtest
Syntax OK
ekzorchik@srv-bionic:~$
Шаг №3: Затем запускаю режим конфигурирования разворачиваемого LDAP—сервера:
ekzorchik@srv-bionic:~$ sudo dpkg-reconfigure slapd Omit OpenLDAP server configuration? No DNS domain name: polygon.local Organization name: polygon Administrator password: 712mbddr@ Confirm password: 712mbddr@ Database backend to use: MDB
- BDB → База данных Беркли
- HDB → Иерархическая база данных Беркли
- MDB → обновления данных никогда не перезаписывают существующие данные; вместо этого обновления производят запись в новые страницы, таким образом создаётся новая версия базы данных. Те, кто выполняет чтение базы данных, когда бы они не производили доступ, всегда видят снимок базы данных в том состоянии, в котором она находилась перед началом транзакции на чтение, таким образом, они полностью изолированы от тех, кто производит запись. Из-за такой изоляции доступы на чтение не требуют блокировок, представление базы данных для них всегда самосогласовано.
Do you want the database to be removed when slapd is purged? No Move old database? Yes
Чтобы протестировать LDAP-соединение нужна утилита ldapwhoami:
ekzorchik@srv-bionic:~$ ldapwhoami -H ldap:// -x
anonymous → данный ответ, есть результат, поскольку команда ldapwhoami была запущена без аутентификации на сервере LDAP.
(если нужно использовать вторую версию протокола, то в конфигурационном файле slapd.conf нужно будет добавить опцию: allow bind_v2)
Чтобы в последствии найти конфигурационный файл slapd.conf:
ekzorchik@srv-bionic:~$ sudo find / -name slapd.conf /usr/share/slapd/slapd.conf /usr/share/doc/slapd/examples/slapd.conf ekzorchik@srv-bionic:~$ sudo nano /usr/share/slapd/slapd.conf allow bind_v2
Теперь проверяю, что доступ к развернутому LDAP—серверу присутствует:
ekzorchik@srv-bionic:~$ ldapsearch -x -b dc=polygon,dc=local
если в выводе присутствует строки содержимого, а не сообщение об ошибке, то значит LDAP-сервер работает, в противном случае, нужно проверить, а запущен ли сервис LDAP-сервера:
ekzorchik@srv-bionic:~$ sudo systemctl status slapd | head -n5 ● slapd.service - LSB: OpenLDAP standalone server (Lightweight Directory Access Protocol) Loaded: loaded (/etc/init.d/slapd; generated) Drop-In: /lib/systemd/system/slapd.service.d └─slapd-remain-after-exit.conf Active: active (running) since Sun 2019-05-19 21:56:18 MSK; 1min 55s ago ekzorchik@srv-bionic:~$ sudo systemctl restart slapd && sudo systemctl status slapd | head -n5 ● slapd.service - LSB: OpenLDAP standalone server (Lightweight Directory Access Protocol) Loaded: loaded (/etc/init.d/slapd; generated) Drop-In: /lib/systemd/system/slapd.service.d └─slapd-remain-after-exit.conf Active: active (running) since Sun 2019-05-19 21:58:36 MSK; 15ms ago
Шаг №4: Далее устанавливаю сам phpLdapAdmin (после Административный интерфейс по управлению LDAP-сервером будет через URL вида: http://IP&DNS/phpldapadmin). Установку из дефолтных репозитариев Ubuntu 18.04 Server не произвожу, т. к. идут многочисленные ошибки при авторизации которые либо патчатся определенными строками, но после порождают еще ошибки и так вечный круг.
ekzorchik@srv-bionic:~$ wget https://github.com/breisig/phpLDAPadmin/archive/master.zip
ekzorchik@srv-bionic:~$ unzip master.zip
ekzorchik@srv-bionic:~$ rm -f master.zip
ekzorchik@srv-bionic:~$ sudo mv phpLDAPadmin-master/ /var/www/html/phpldapadmin
ekzorchik@srv-bionic:~$ sudo cp /var/www/html/phpldapadmin/config/config.php.example /var/www/html/phpldapadmin/config/config.php
ekzorchik@srv-bionic:~$ sudo nano /var/www/html/phpldapadmin/config/config.php
$servers->setValue('server','name','srv-bionic.polygon.local');
$servers→setValue('server','host','172.33.33.6');
$servers→setValue('server','port',389);
$servers->setValue('server','base',array('dc=polygon,dc=local'));
$servers->setValue('login','bind_id','cn=admin,dc=polygon,dc=local');
$servers→setValue('login','bind_pass','712mbddr@');
$config->custom->appearance['hide_template_warning'] = true;
ekzorchik@srv-bionic:~$ sudo systemctl restart apache2 && sudo systemctl status apache2 | head -n5
● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
Drop-In: /lib/systemd/system/apache2.service.d
└─apache2-systemd.conf
Active: active (running) since Sun 2019-05-19 23:36:24 MSK; 22ms ago
Шаг №5: Открываю браузер и обращаюсь к текущему серверу на которой документирую шаги по разворачиванию Web—оснастки phpldapadmin (Version 1.2.3 на момент написания данной заметки) on Ubuntu 18.04 Server: http://IP&DNS/phpldapdmin && http://172.33.33.6/phpldapadmin, вижу Web-оснастку, по сути такую же как я раньше смотрел что есть phpldapadmin на Ubuntu Trusty Server:
в левом фрейме нажимаю «Войти» и указываю идентификационные данные:
если видите надпись «Внимание: Соединение с сервером нешифровано.» не стоит об этом волноваться, т. к. мой сервис slapd работает по порт 389, как и развернутая служба каталогов Active Directory на Windows. Да, обмен данными идет без шифрования, по умолчанию. Пока оставляю так, главное чтобы все заработало, после поправим.
Login DN: cn=admin,dc=polygon,dc=localПароль: 712mbddr@
и нажимаю «Авторизация», в случае успеха и отсутствия ошибок «Аутентификация на сервере выполнена успешно и произведен вход на сервер»
В левой части где представлена структура домена: dc=polygon,dc=local спускаемся чуть ниже и видим строку с именем «Create new entry here» («Создать новый») нажимаем по ней, затем выбираем шаблон «Templates» («Шаблоны») — Generic: Organizational Role произойдет перекидывание на мастер создания объекта где нужно заполнять следующие поля:
Organisational Unit: IT
и нажимаю кнопку «Create Object» («Создать LDAP-запись») — “Commit” («Подтвердить»)
После перехожу в данный контейнер IT и внутри него по аналогии создаю учетную запись : -> «Create a child entry«: («Создать потомка”) шаблон («Templates«) – «Generic: User Account» («Общее: Пользователь«), но вот что заметил, мастер сообщает что в данном шаблоне не предопределен атрибут [gidNumber]
Error trying to get a non-existant value (appearance,password_hash)
This template uses a selection list for attribute [gidNumber], however the selection list is empty.
You may need to create some dependancy entries in your LDAP server so that this attribute renders with values. Alternatively, you may be able to define the appropriate selection values in the template file.
, т.е. при создании пользователя параметр “GID Number” никак нельзя предопределить, а это должен быть числовой идентификатор. Кстати говоря в Ubuntu Trusty при установке пакета phpldapadmin из дефолтных репозитариев ошибка была один в один, а значит и решается также:
ekzorchik@srv-bionic:~$ sudo nano +2469 /var/www/html/phpldapadmin/lib/TemplateRender.php
было:
$default
= $this->getServer()->getValue('appearance','password_hash');
изменил на:
$default = $this->getServer()->getValue('appearance','password_hash_custom');
ekzorchik@srv-bionic:~$ sudo systemctl restart apache2
Пробую снова и все та же ошибка.
На заметку: Механизм манипуляции данными LDIF — хранит записи в текстовых файлах в формате LDIF и использует файловую систему для создания древовидной структуры базы данных.
Ладно, а если создавать пользователей, группы, через консоль командной строки, возможно это дело в данной оснастке и в ней что-то по-дефолту не так:
ekzorchik@srv-bionic:~$ nano alektest.ldiff
dn: uid=alektest,ou=it,dc=polygon,dc=local
objectClass: top
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
cn: alektest
uid: alektest
uidNumber: 16859
gidNumber: 100
homeDirectory: /home/alektest
loginShell: /bin/bash
gecos: alektest
userPassword: {crypt}x
shadowLastChange: 0
shadowMax: 0
shadowWarning: 0
На основе схемы (LDIF файла → текстовый формат, описывающий представление содержимого каталога LDAP) создаю пользователя в данном домене Polygon.local:
ekzorchik@srv-bionic:~$ sudo ldapadd -x -W -D "cn=admin,dc=polygon,dc=local" -f alektest.ldiff Enter LDAP Password: 712mbddr@ adding new entry "uid=alektest,ou=it,dc=polygon,dc=local"
А теперь назначаю созданному пользователю, пароль через консоль:
ekzorchik@srv-bionic:~$ sudo ldappasswd -s Aa1234567 -W -D "cn=admin,dc=polygon,dc=local" -x "uid=alektest,ou=it,dc=polygon,dc=local" Enter LDAP Password: 712mbddr@
Создаю LDIF файл для новой группы:
ekzorchik@srv-bionic:~$ nano new_group.ldiff dn: cn=group1,ou=IT,dc=polygon,dc=local objectClass: top objectClass: posixGroup gidNumber: 501 ekzorchik@srv-bionic:~$ sudo ldapadd -x -W -D "cn=admin,dc=polygon,dc=local" -f new_group.ldiff Enter LDAP Password: 712mbddr@ adding new entry "cn=group1,ou=IT,dc=polygon,dc=local"
А вот что еще, теперь если уже через Web-интерфейс создавать пользователя то проблем уже нет никаких, ошибки касательно отсутствия атрибута gidNumber уже больше нет.
Чтобы получить информацию по пользователю alektest в домене:
ekzorchik@srv-bionic:~$ sudo ldapsearch -W -x -D "cn=admin,dc=polygon,dc=local" -b "dc=polygon,dc=local" "uid=alektest" Enter LDAP Password: 712mbddr@ # extended LDIF # # LDAPv3 # base <dc=polygon,dc=local> with scope subtree # filter: uid=alektest # requesting: ALL # # alektest, IT, polygon.local dn: uid=alektest,ou=IT,dc=polygon,dc=local objectClass: top objectClass: account objectClass: posixAccount objectClass: shadowAccount cn: alektest uid: alektest uidNumber: 16859 gidNumber: 100 homeDirectory: /home/alektest loginShell: /bin/bash gecos: alektest shadowLastChange: 0 shadowMax: 0 shadowWarning: 0 userPassword:: e1NTSEF9a3UyT2djNGlVdG52dWd4dnpTTnlseTIyRmdSVS85WUE= # search result search: 2 result: 0 Success # numResponses: 2 # numEntries: 1
Чтобы создать группу и добавить в нее учетную запись через Web—интерфейс управления нужно использовать шаблон: Generic: Posix Group
GID Number: уже генерируется сам, в моем случае это уже 504Group: group4Users: отмечаем учетные записи галочкой все имеющие место быть в домене какие нужно добавить в группу.
а после нажимаю Create Object – Commit и все. Информационное сообщение в самом верху явное тому подтверждение: Creation successful! DN: cn=group4,ou=IT,dc=polygon,dc=local has been created.
Но можно из без ручного создания, к примеру:
Внутри ou=IT — Создать потомка - «Общее: Группа POSIX»Внутри ou=IT — Создать потомка - «Общее: Пользователь»и указываем созданную группу выше и учетная запись создастся без каких-либо ошибок. Вот все должно быть сделано по порядку, а в обратном порядке и получаем ошибку отсутствия аттрибутаgidNumber.
Работает. На этом у меня всё, дальше буду связывать сервисы через LDAP этого сервера с ролью OpenLDAP, с уважением автор блога Олло Александр aka ekzorchik.

