Задача проста: Нужно адаптировать работу 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: уже генерируется сам, в моем случае это уже 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.