Хранение информации об учетных записях

Posted by

В мою задачу входит, как развернуть единый центр аутентификации пользователей, т. е. Что-то своего рода, как Active Directory на Windows, но с уклоном на Ubuntu. И вот что у меня из этой затеи вышло, об этом в шагах ниже. Для меня это интересно, а главное что такое я смогу в дальнейшем применять где угодно.

И так в роле центра единой аутентификации выступит сервер LDAP для хранения информации об учетных записях пользователей. Сервер LDAP (в расшифровке: Lightweight Directory Access Protocol) не только хранит сведения об учетных записях, но и позволяет управлять группами, доменами, аутентификацией, т. е. Проходить авторизацию на любом компьютере где клиентская часть настроена на текущий сервер.

Пакет из репозитариев .5 Server amd64 имеет наименование — ответственный за данную задачу. А для более простого управления я еще в добавок подниму 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

Далее установлю сам (после Административный интерфейс по управлению 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 сервер), если все сделано правильно будет отображена вот такая вот страница:

Развернутый LDAP сервер

Как указано на представленном скриншоте выше, нажимаю ссылке с надписью “Login” и окно аутентификации предстает в грозном виде, что трафик не зашифрован (Warning: This web connection is unencrypted.), но ничего страшного авторизуемся:

  • Login DN: cn=admin,dc=polygon,dc=local
  • Password: указываю административный пароль при инсталляции, т. е. 712mbddr@

и нажимаю на кнопку Authenticate. Авторизация проходит успешно и передо мной предстает удобный интерфейс по управлению LDAP сервером:

Успешная авторизация в OpenLDAP сервере через PHP Ldap AdminТеперь в мою задачу входит показать (задокументировать) шаги по добавлению организационных юнитов, групп и самих учетных записей:

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

а после нажимаю Create ObjectCommit и все. Информационное сообщение в самом верху явное тому подтверждение: Creation successful! DN: cn=group4,ou=IT,dc=polygon,dc=local has been created.

Странно в общем, через Web-интерфейс не получается, а через консоль командной строки все получается, значит либо что-то я не понимаю, либо наоборот.

На этом собственно и все, с уважением автор блога — Олло Александр aka ekzorchik. В дальнейшем я буду дополнять данную заметку и производные от нее на основе приобретенного опыта.