В мою задачу входит, как развернуть единый центр аутентификации пользователей, т. е. Что-то своего рода, как Active Directory на Windows, но с уклоном на Ubuntu. И вот что у меня из этой затеи вышло, об этом в шагах ниже. Для меня это интересно, а главное что такое я смогу в дальнейшем применять где угодно.
И так в роле центра единой аутентификации выступит сервер LDAP для хранения информации об учетных записях пользователей. Сервер LDAP (в расшифровке: Lightweight Directory Access Protocol) не только хранит сведения об учетных записях, но и позволяет управлять группами, доменами, аутентификацией, т. е. Проходить авторизацию на любом компьютере где клиентская часть настроена на текущий сервер.
Пакет из репозитариев Ubuntu 14.04.5 Server amd64 имеет наименование — slapd ответственный за данную задачу. А для более простого управления я еще в добавок подниму Web-интерфейс для управления LDAP сервером.
ekzorchik@srv-mail:~$ uname -a && lsb_release -a
Linux srv-mail 4.4.0-70-generic #91~14.04.1-Ubuntu SMP Wed Mar 22 15:48:21 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04.5 LTS
Release: 14.04
Codename: trusty
ekzorchik@srv-mail:~$ sudo nano /etc/hosts
10.7.8.164 srv-mail.polygon.local srv-mail
ekzorchik@srv-mail:~$ sudo tasksel install lamp-server
New password for the MySQL "root" user: 712mbddr@
Repeat password for the MySQL "root" user: 712mbddr@
ekzorchik@srv-mail:~$ sudo apt-get install slapd ldap-utils -y
Administrator password: 712mbddr@
Confirm password: 712mbddr@
Затем запускаю режим конфигурирования разворачиваемого LDAP–сервера:
ekzorchik@srv-mail:~$ 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: BDB
BDB → База данных Беркли
HDB → Иерархическая база данных Беркли
- Do you want the database to be removed when slapd is purged? No
- Move old database? Yes
- Allow LDAPv2 protocol? No
(если нужно использовать вторую версию протокола, то в конфигурационном файле slapd.conf нужно будет добавить опцию: allow bind_v2)
Чтобы в последствии найти конфигурационный файл slapd.conf:
ekzorchik@srv-mail:~$ sudo find / -name slapd.conf
/usr/share/slapd/slapd.conf
/usr/share/doc/slapd/examples/slapd.conf
ekzorchik@srv-mail:~$ sudo nano /usr/share/slapd/slapd.conf
allow bind_v2
Теперь проверяю, что доступ к развернутому LDAP–серверу присутствует:
ekzorchik@srv-mail:~$ ldapsearch -x -b dc=polygon,dc=local
если в выводе присутствует строки содержимого, а не сообщение об ошибке, то значит LDAP-сервер работает, в противном случае, нужно проверить, а запущен ли сервис LDAP-сервера:
ekzorchik@srv-mail:~$ sudo /etc/init.d/slapd status
* slapd is not running
ekzorchik@srv-mail:~$ sudo /etc/init.d/slapd restart
* Stopping OpenLDAP slapd [ OK ]
* Starting OpenLDAP slapd
Далее установлю сам phpLdapAdmin (после Административный интерфейс по управлению LDAP-сервером будет через URL вида: http://IP&DNS/phpldapadmin). Также в роли оснастки управления LDAP сервером может быть и утилита Apache Directory Studio – ну это так для справки.
ekzorchik@srv-mail:~$ apt-cache search phpldapadmin
phpldapadmin - web based interface for administering LDAP servers
ekzorchik@srv-mail:~$ sudo apt-get install phpldapadmin -y
После следует настроить конфигурационный файл Web–интерфейса, но сперва, как всегда, нужно сделать резервную копию:
ekzorchik@srv-mail:~$ sudo cp /etc/phpldapadmin/config.php /etc/phpldapadmin/config.php.backup
Открываем файл конфигурации /etc/phpldapadmin/config.php и изменяем там вот такие вот строки:
ekzorchik@srv-mail:~$ sudo nano /etc/phpldapadmin/config.php
$servers->setValue('server','name','srv-mail.polygon.local');
$servers->setValue('server','host','10.7.8.164');
$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;
После перезагружаю Web–сервер Apache2:
ekzorchik@srv-mail:~$ sudo service apache2 restart
И вот на этом шаге подходит к концу настройка phpLdapAdmin.
Теперь запускаю веб-браузер и в строке адреса указываю:
http://IP&DNS/phpldapadmin (сервера где шагами выше был развернут LDAP сервер), если все сделано правильно будет отображена вот такая вот страница:
Как указано на представленном скриншоте выше, нажимаю ссылке с надписью “Login” и окно аутентификации предстает в грозном виде, что трафик не зашифрован (Warning: This web connection is unencrypted.), но ничего страшного авторизуемся:
- Login DN: cn=admin,dc=polygon,dc=local
- Password: указываю административный пароль при инсталляции, т. е. 712mbddr@
и нажимаю на кнопку Authenticate. Авторизация проходит успешно и передо мной предстает удобный интерфейс по управлению LDAP сервером:
Теперь в мою задачу входит показать (задокументировать) шаги по добавлению организационных юнитов, групп и самих учетных записей:
В левой части где представлена структура домена: dc=polygon,dc=local спускаемся чуть ниже и видим строку с именем Create new entry here нажимаем по ней, затем выбираем шаблон (Templates) — Generic: Organizational Role произойдет перекидывание на мастер создания объекта где нужно заполнять следующие поля:
- Organisational Unit: IT
и нажимаю кнопку Create Object – “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 все приходится допиливать. Итого для решения данной проблемы нужно:
ekzorchik@srv-mail:~$ sudo nano +2469 /usr/share/phpldapadmin/lib/TemplateRender.php
было:
$default = $this->getServer()->getValue('appearance','password_hash');
изменил на:
$default = $this->getServer()->getValue('appearance','password_hash_custom');
ekzorchik@srv-mail:~$ sudo service apache2 reload
Пробую снова и все та же ошибка.
Ладно, а если создавать пользователей, группы, через консоль командной строки, возможно это дело в данной оснастке и в ней что-то по-дефолту не так:
ekzorchik@srv-mail:~$ apt-cache search ldapadd
ldapscripts - Add and remove users and groups (stored in a LDAP directory)
, данный пакет представляет собой набор скриптов оболочки, которые оборачиваются вокруг утилит командной строки для более удобного управления учетными записями и группами.
ekzorchik@srv-mail:~$ sudo apt-get install ldapscripts -y
ekzorchik@srv-mail:~$ 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-mail:~$ 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-mail:~$ 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-mail:~$ nano new_group.ldiff
dn: cn=group1,ou=IT,dc=polygon,dc=local
objectClass: top
objectClass: posixGroup
gidNumber: 501
ekzorchik@srv-mail:~$ 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-mail:~$ 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.
Странно в общем, через Web-интерфейс не получается, а через консоль командной строки все получается, значит либо что-то я не понимаю, либо наоборот.
На этом собственно и все, с уважением автор блога – Олло Александр aka ekzorchik. В дальнейшем я буду дополнять данную заметку и производные от нее на основе приобретенного опыта.