Задача проста: Нужно адаптировать работу 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:

Стартовая страница управления OpenLDAP имя которой PHPLDAPADMIN

в левом фрейме нажимаю «Войти» и указываю идентификационные данные:

если видите надпись «Внимание: Соединение с сервером нешифровано.» не стоит об этом волноваться, т. к. мой сервис slapd работает по порт 389, как и развернутая служба каталогов Active Directory на Windows. Да, обмен данными идет без шифрования, по умолчанию. Пока оставляю так, главное чтобы все заработало, после поправим.

  • Login DN: cn=admin,dc=polygon,dc=local
  • Пароль: 712mbddr@

и нажимаю «Авторизация», в случае успеха и отсутствия ошибок «Аутентификация на сервере выполнена успешно и произведен вход на сервер»

Вход в домен polygon.local на OpenLDAP выполнен успешно.

В левой части где представлена структура домена: 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: уже генерируется сам, в моем случае это уже 504
  • Group: group4
  • Users: отмечаем учетные записи галочкой все имеющие место быть в домене какие нужно добавить в группу.

а после нажимаю 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.

От ekzorchik

Всем хорошего дня, меня зовут Александр. Я под ником - ekzorchik, являюсь автором всех написанных, разобранных заметок. Большинство вещей с которыми мне приходиться разбираться, как на работе, так и дома выложены на моем блоге в виде пошаговых инструкции. По сути блог - это шпаргалка онлайн. Каждая новая работа где мне случалось работать вносила новые знания и нюансы работы и соответственно я расписываю как сделать/решить ту или иную задачу. Это очень помогает. Когда сам разбираешь задачу, стараешься ее приподнести в виде структурированной заметки чтобы было все наглядно и просто, то процесс усвоения идет в гору. Также прошу на https://win.ekzorchik.ru https://lin.ekzorchik.ru https://net.ekzorchik.ru https://voip.ekzorchik.ru https;//home.ekzorchik.ru