LINUX.ORG.RU
решено ФорумAdmin

Группа в LDAP с объектным классом groupofnames и авторизация пользователей из этой группы

 ,


0

1

Есть сервер с Redmine 3.1.7, есть сервер OpenLDAP, установлен на Centos 7 из yum, версия 2.4.40.

Схема дерева

dc=ldap,dc=centos
  |
  |-ou=People
  |       |--cn=u1 (posixAccount)
  |       |--cn=u2 
  |
  |-ou=Group
  |       |--cn=it
  |       |--cn=hr
  |       |--cn=pr
  |
  |-ou=test
          |--cn=test1 (posixGroup)
                  |--cn=u3 (posixAccount)
Дерево создано по этой инструкции.

Задача: настроить ldap на авторизацию пользователей в зависимости от принадлежности к группе. В группе cn=it пользователи cn=u1 и cn=u2 числятся member'ами. Однако авторизоваться ни одним из них на стороннем сервисе (в моем случае, это редмайн) не могу. Путь до каталога указываю cn=it,ou=Group,dc=ldap,dc=centos.

Через phpldapadmin: если создать отдельный ou=test, в нем cn=test1 (posixGroup) и уже в нем создать пользователя cn=u3(posixAccount), и в настройках сервиса прописать полный путь до записи cn=test1,ou=test,dc=ldap,dc=centos, пользователь u3 создается на лету и может авторизоваться.

Вопрос: с какими атрибутами и классами (минимальная комплектация) нужно создать:

1. пользователя в ou=Peolpe,

2. группу в ou=Group, чтобы пользователь мог авторизоваться на сервисах в зависимости от нахождения в группе? Например, пользователям в группе it доступна авторизация в редмайне, пользователям в группе pr - в астериске, пользователями в группе hr - в crm и т.д., т.е. каждый пользователь находится более, чем в одной группе, и именно группе разрешен вход.

slapcat
...
dn: ou=People,dc=ldap,dc=centos
objectClass: organizationalUnit
ou: People
structuralObjectClass: organizationalUnit

dn: ou=Group,dc=ldap,dc=centos
objectClass: organizationalUnit
ou: Group
description: generic groups branch
structuralObjectClass: organizationalUnit

dn: cn=it,ou=Group,dc=ldap,dc=centos
objectClass: groupOfNames
cn: it
description: IT security group
structuralObjectClass: groupOfNames
member: cn=u1,ou=People,dc=ldap,dc=centos
member: cn=u2,ou=People,dc=ldap,dc=centos

dn: cn=u1,ou=People,dc=ldap,dc=centos
objectClass: top
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
userPassword:: NDQ0
shadowLastChange: 15140
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 1004
gidNumber: 1004
structuralObjectClass: account
cn: u1
homeDirectory: /home/u1
uid: u1

dn: cn=u2,ou=People,dc=ldap,dc=centos
objectClass: inetOrgPerson
userPassword:: NTU1
homePhone: 555-111-2222
mail: u5@example.com
ou: it
structuralObjectClass: inetOrgPerson
cn: u2
description: new u2
sn: u2
uid: u2

dn: ou=test,dc=ldap,dc=centos
objectClass: organizationalUnit
objectClass: top
ou: test

dn: cn=test1,ou=test,dc=ldap,dc=centos
cn: test1
gidNumber: 502
objectClass: posixGroup
objectClass: top
structuralObjectClass: posixGroup

dn: cn=u3,cn=test1,ou=test,dc=ldap,dc=centos
sn: u3
cn:: IHUz
uid: u3
userPassword:: MzMz
uidNumber: 1000
gidNumber: 502
homeDirectory: /home/users/u3
loginShell: /bin/sh
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
structuralObjectClass: inetOrgPerson 

Кури, что смотрит redmine для определения принадлежности к группе.

TOXA ★★ ()

У нас настроена аутентификация и авторизация по LDAP в Redmine. Для аутентификации проверяется логин-пароль записи под DN ou=People, однако для того, чтобы работала авторизация по groupOfNames, вам нужно использовать memberof overlay.

Если используете новый стиль конфигурации (через cn=config), то настраивается так:

dn: cn=module,cn=config
objectClass: olcModuleList
objectClass: top
cn: module
olcModuleLoad: memberof
olcModulePath: /usr/lib/ldap
dn: olcOverlay=memberof,olcDatabase={1}mdb,cn=config
objectClass: olcConfig
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: top
olcOverlay: memberof

После этого вы сможете использовать фильтр вида memberOf=cn=it,ou=Group,dc=ldap,dc=centos в Redmine: http://i.imgur.com/EFCytyi.png.

По-умолчанию, в последней версии OpenLDAP на Debian 8, демон slapd не слушает порт 636, а Redmine не может в StartTLS. Рекомендую разобрать этот вопрос подробно. Нельзя, чтобы пароли в clear text летали.

zuzzas ()
Ответ на: комментарий от zuzzas

Спасибо за ответ!

Подключила модуль memberOf (по первому ldif, в Centos он по другому пути /usr/lib64/openldap), а при загрузке второго ldif - выдает ошибку:

cat memberof_load_configure.ldif
dn: olcOverlay=memberof,olcDatabase={1}hdb,cn=config
objectClass: olcConfig
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: top
olcOverlay: memberof

ldapadd -c -Y EXTERNAL -H ldapi:/// -f  memberof_load_configure.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "olcOverlay={0}memberof,olcDatabase={1}hdb,cn=config"
ldap_add: No such object (32)
        matched DN: cn=config
Конфигурация самого ldap-сервера, модули подключила два раза, из-за этого может быть ошибка?
ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=config dn
dn: cn=config
dn: cn=module{1}{0},cn=config
dn: cn=module{1},cn=config
dn: cn=schema,cn=config
dn: cn={0}core,cn=schema,cn=config
dn: cn={1}cosine,cn=schema,cn=config
dn: cn={2}nis,cn=schema,cn=config
dn: cn={3}inetorgperson,cn=schema,cn=config
dn: olcDatabase={-1}frontend,cn=config
dn: olcDatabase={0}config,cn=config
dn: olcDatabase={1}monitor,cn=config
dn: olcDatabase={2}hdb,cn=config

manik207 ()
Ответ на: Спасибо за ответ! от manik207

У вас X-ORDERED параметр отличается. Это число в фигурных скобках. Вот так нужно сделать:

dn: olcOverlay=memberof,olcDatabase={2}hdb,cn=config
objectClass: olcConfig
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: top
olcOverlay: memberof

Наверное, должно зайти и без X-ORDERED, т.к. hdb база всего одна, однако я предпочитаю их указывать. Только при создании нового RDN точно не нужно, автоматически инкрементируется.

zuzzas ()
Ответ на: комментарий от zuzzas

Спасибо за ответ!

Запись в таком виде добавлена!

Обновила дерево:

dn: cn=redmine,ou=Group,dc=ldap,dc=centos
objectClass: groupOfNames
cn: redmine1
member: uid=u3,ou=People,dc=ldap,dc=centos
member: uid=u4,ou=People,dc=ldap,dc=centos

dn: uid=u3,ou=People,dc=ldap,dc=centos
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: u3
sn: u3
userPassword:: MzMz
loginShell: /bin/bash
uidNumber: 1004
gidNumber: 1004
homeDirectory: /home/u3
structuralObjectClass: inetOrgPerson
uid: u3
В редмине отредактировала настройки. Пользователя с какими атрибутами создать для авторизации в редмине? С пустыми логином/паролем в настройках под u3 не могу авторизоваться - неверный пароль. http://clip2net.com/s/3IEqyol

manik207 ()
Ответ на: Спасибо за ответ! от manik207

Тоже пришлось пользователя создать, чтобы использовать в качестве BindDN, потому что redmine упорно не хотел анонимную аутентификацию делать.

dn: uid=redmine,ou=systems,ou=people,dc=secret,dc=org
objectClass: account
objectClass: simpleSecurityObject
objectClass: top
uid: redmine
userPassword:: e0NSWVBUfSQ2JEZldFhWUmJIJE9ghNalBqSE5veVo3TnlZV3BONEJ4UFlSa
 nJJS2RRak5dfsgdf5VT2piM0VZdborkedsha512hashnlQaWlCYWxXcTZYL2YzakdkUC93Q2MyOHlJZWFLMEVxcEVz
 ZzEw

zuzzas ()
Ответ на: Спасибо за ответ! от manik207

Ну, вы можете всё, что угодно в качестве RDN использовать. Так повелось, что у нас в организации uid уникален получается.

zuzzas ()
Ответ на: комментарий от zuzzas

Спасибо вам за разъяснения!

Оказалось авторизация возможна и без логина/пароля, мелкие недочеты помешали. Пользователь создан, и авторизация работает с ним. zuzzas, можно еще два вопроса?

1. Каким методом вы шифруете пароли? и

2. Как закрыть лдап от анонимного чтения?

manik207 ()
Ответ на: Спасибо вам за разъяснения! от manik207

1. Пароли хэширует сам OpenLDAP с помощью встроенной в glibc функции crypt(3). Пароли хранятся в SHA512 с солью в userPassword атрибуте пользователей. Клиенты посылают пароль в clear text, однако все используют StartTLS или TLS. При смене пароля, который меняется через passwd на серверах или другими способами, пароль солится и хэшируется. Всё это возможно благодаря ppolicy overlay, который настроен так, а стандартный тип хэша, алгоритм и размер соли настраивается так;

2. Вот полная документация по вопросу. Там рассмотрены варианты использования slapd.d (динамической конфигурации, cn=config) и slapd.conf (статической). Я использую cn=config, поэтому вот пример оттуда. Доступ к базам данных осуществляется через атрибут olcAccess в сущности с objectClass'ом olcDatabaseConfig. У меня база данных LMDB, рекомендуемая в последней версии OpenLDAP. Подсвеченную курсором запись нужно убрать. Также убедитесь, что у вас нет нежелательных записей в базе данных frontend, т.к. они применяется ко всем базам данных.

zuzzas ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.