Форум проекта Pro-LDAP.ru
Администрирование OpenLDAP => Вопросы безопасности => Access Control List (ACL) => Тема начата: andr от 24 Июнь 2014, 18:26:06
-
Здравствуйте!
Хочу распределить доступ в дереве:
-пользователи могут менять свои пароли,
-админ контейнера может менять все в своем контейнере,
-группа админов может менять все во всем дереве.
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: to attrs=userPassword
by self write
by group.exact="cn=sadmins,ou=staff,o=lp" write
by anonymous auth
by * none
olcAccess: to dn.subtree="cn=ikni_staff,ou=staff,o=lp"
by dn.base="cn=ikni_adm,cn=ikni_staff,ou=staff,o=lp" write
by group.exact="cn=sadmins,ou=staff,o=lp" write
by * read
olcAccess: to *
by group.exact="cn=sadmins,ou=staff,o=lp" write
by anonymous read
by users read
by * auth
Не знаю, как разрешить смену паролей для админа контейнера :(
-
Здравствуйте!
Не знаю, как разрешить смену паролей для админа контейнера :(
Да точно также, как и во втором ACL:
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: to attrs=userPassword
by self write
by dn.base="cn=ikni_adm,cn=ikni_staff,ou=staff,o=lp" write
by group.exact="cn=sadmins,ou=staff,o=lp" write
by anonymous auth
by * none
olcAccess: to dn.subtree="cn=ikni_staff,ou=staff,o=lp"
by dn.base="cn=ikni_adm,cn=ikni_staff,ou=staff,o=lp" write
by group.exact="cn=sadmins,ou=staff,o=lp" write
by * read
olcAccess: to *
by group.exact="cn=sadmins,ou=staff,o=lp" write
by * read
Я заодно укоротил третий ACL -- так он более прост и логичен.
Егор
-
Хм, но cn=ikni_adm,cn=ikni_staff,ou=staff,o=lp должен менять только в своем контейнере cn=ikni_staff,ou=staff,o=lp. А с такими правилами он может менять пароль во всем дереве :(
-
Здравствуйте!
Хм, но cn=ikni_adm,cn=ikni_staff,ou=staff,o=lp должен менять только в своем контейнере cn=ikni_staff,ou=staff,o=lp. А с такими правилами он может менять пароль во всем дереве :(
Согласен, я поторопился. Правильней будет так:
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: to to dn.subtree="cn=ikni_staff,ou=staff,o=lp" attrs=userPassword
by self write
by dn.base="cn=ikni_adm,cn=ikni_staff,ou=staff,o=lp" write
by group.exact="cn=sadmins,ou=staff,o=lp" write
by anonymous auth
by * none
olcAccess: to attrs=userPassword
by self write
by group.exact="cn=sadmins,ou=staff,o=lp" write
by anonymous auth
by * none
olcAccess: to dn.subtree="cn=ikni_staff,ou=staff,o=lp"
by dn.base="cn=ikni_adm,cn=ikni_staff,ou=staff,o=lp" write
by group.exact="cn=sadmins,ou=staff,o=lp" write
by * read
olcAccess: to *
by group.exact="cn=sadmins,ou=staff,o=lp" write
by * read
или так:
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: to to dn.subtree="cn=ikni_staff,ou=staff,o=lp" attrs=userPassword
by dn.base="cn=ikni_adm,cn=ikni_staff,ou=staff,o=lp" write break
olcAccess: to attrs=userPassword
by self write
by group.exact="cn=sadmins,ou=staff,o=lp" write
by anonymous auth
by * none
olcAccess: to dn.subtree="cn=ikni_staff,ou=staff,o=lp"
by dn.base="cn=ikni_adm,cn=ikni_staff,ou=staff,o=lp" write
by group.exact="cn=sadmins,ou=staff,o=lp" write
by * read
olcAccess: to *
by group.exact="cn=sadmins,ou=staff,o=lp" write
by * read
Егор
-
Спасибо! Первый вариант сработал!
P.S. Странно, что через Self Service Password от ltb-project.org пользователю не удается изменить свой пароль... :(
-
Здравствуйте!
P.S. Странно, что через Self Service Password от ltb-project.org пользователю не удается изменить свой пароль... :(
Вы проверяли через ldappasswd? Если с правами пользователя пароль меняется, значит ACL работает как положено. Нужно смотреть в сторону прохождения аутентификации в утилите, которую Вы используете. Можно повысить уровень логирования OpenLDAP, чтобы посмотреть, что происходит в каталоге при изменении пароля через утилиту.
Егор
-
Здравствуйте!
Да, была проблема в настройках утилиты. Поправил и все работает.
Спасибо еще раз!
-
Здравствуйте! У меня похожая задача. Требуется разрешить пользователям менять пароли, админу ветки разрешить создавать, удалять пользователей в своей ветке, менять им пароли. Структура дерева такая
dn: dc=energy,dc=kz
objectClass: top
objectClass: dcObject
objectclass: organization
o: energy
dc: energy
dn: cn=ldaproot,dc=energy,dc=kz
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: ldaproot
userPassword: xxxxxxxx
dn: ou=ellipseast,dc=energy,dc=kz
objectClass: organizationalUnit
ou: ellipseast
dn: ou=staff,ou=ellipseast,dc=energy,dc=kz
objectClass: organizationalUnit
ou: staff
dn: ou=ellipsepe,dc=energy,dc=kz
objectClass: organizationalUnit
ou: ellipseast
dn: ou=staff,ou=ellipsepe,dc=energy,dc=kz
objectClass: organizationalUnit
ou: staff
dn: ou=ellipseskz,dc=energy,dc=kz
objectClass: organizationalUnit
ou: ellipseskz
dn: ou=staff,ou=ellipseskz,dc=energy,dc=kz
objectClass: organizationalUnit
ou: staff
В каждой ветке есть админ, который должен иметь права на создание, удаление пользователей в своей ветви, смену их паролей
#dn: uid=ldapadminskz,ou=staff,ou=ellipseskz,dc=energy,dc=kz
objectClass: person
objectClass: uidObject
objectClass: simpleSecurityObject
objectClass: top
cn: ldapadminskz
sn: ldapadminskz
uid: ldapadminskz
userPassword: ххх
dn: uid=ldapadminast,ou=staff,ou=ellipseast,dc=energy,dc=kz
objectClass: person
objectClass: uidObject
objectClass: simpleSecurityObject
objectClass: top
cn: ldapadminast
sn: ldapadminast
uid: ldapadminast
userPassword: ххх
dn: uid=ldapadminpe,ou=staff,ou=ellipsepe,dc=energy,dc=kz
objectClass: person
objectClass: uidObject
objectClass: simpleSecurityObject
objectClass: top
cn: ldapadminpe
sn: ldapadminpe
uid: ldapadminpe
userPassword: ххх
Для начала я сделал ACL для одной ветки
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to to dn.subtree="ou=ellipseast,dc=energy,dc=kz" attrs=userPassword
by self write
by dn.base="uid=ldapadminast,ou=staff,ou=ellipseast,dc=energy,dc=kz" write
by anonymous auth
by * none
olcAccess: {1}to attrs=userPassword
by self write
by anonymous auth
by * none
olcAccess: {2}to dn.subtree="ou=ellipseast,dc=energy,dc=kz"
by dn.base="uid=ldapadminast,ou=staff,ou=ellipseast,dc=energy,dc=kz" write
by * read
olcAccess: {3}to *
by * read
Текущие ACL такие
# ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=config '(olcAccess=*)' olcAccess olcSuffix
dn: olcDatabase={0}config,cn=config
olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external
,cn=auth manage by * break
dn: olcDatabase={1}monitor,cn=config
olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external
,cn=auth manage by * break
dn: olcDatabase={2}hdb,cn=config
olcSuffix: dc=energy,dc=kz
olcAccess: {0}to * by * read
Когда пытаюсь его загрузить получаю ошибку
# ldapmodify -Y EXTERNAL -H ldapi:/// -f ./2.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={2}hdb,cn=config"
ldap_modify: Other (e.g., implementation specific) error (80)
additional info: <olcAccess> handler exited with 1
По ошибке нашёл следующее:
ldap_add: Other (e.g., implementation specific) error (80)
additional info: <olcModuleLoad> handler exited with 1
You are trying to load the same module twice, e.g. you already ran ldapadd on db.ldif once and now you're doing it again.
Я ни как не могу понять, что я гружу дважды. Помогите пожалуйста!
Да, и ещё я не могу понять смысла этого выражения:
olcAccess: to to dn.subtree
Директива to повторяется 2 раза. Это ошибка или нет?
-
Здравствуйте! Теоретически, ACL должны заменяться. Может быть Вы напутали с пробелами, как здесь (http://serverfault.com/questions/490638/ldap-modify-other-e-g-implementation-specific-error-80-olcaccess-handl)?
Егор
-
Спасибо, вроде помогло.
-
Сделал такой ACL
ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=config '(olcAccess=*)' olcAccess olcSuffix
dn: olcDatabase={0}config,cn=config
olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external
,cn=auth manage by * break
dn: olcDatabase={1}monitor,cn=config
olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external
,cn=auth manage by * break
dn: olcDatabase={2}hdb,cn=config
olcSuffix: dc=energy,dc=kz
olcAccess: {0}to attrs=userPassword by self write by * auth
olcAccess: {1}to dn.subtree="ou=ellipseast,dc=energy,dc=kz" attrs=userPassword
by self write by dn.base="uid=ldapadminast,ou=staff,ou=ellipseast,dc=energy,
dc=kz" write by anonymous auth by * none
olcAccess: {2}to dn.subtree="ou=ellipseast,dc=energy,dc=kz" by dn.base="uid=ld
apadminast,ou=staff,ou=ellipseast,dc=energy,dc=kz" write by * read
olcAccess: {3}to dn.subtree="ou=ellipseskz,dc=energy,dc=kz" attrs=userPassword
by self write by dn.base="uid=ldapadminskz,ou=staff,ou=ellipseskz,dc=energy,
dc=kz" write by anonymous auth by * none
olcAccess: {4}to dn.subtree="ou=ellipseskz,dc=energy,dc=kz" by dn.base="uid=ld
apadminskz,ou=staff,ou=ellipseskz,dc=energy,dc=kz" write by * read
olcAccess: {5}to dn.subtree="ou=ellipsepe,dc=energy,dc=kz" attrs=userPassword
by self write by dn.base="uid=ldapadminpe,ou=staff,ou=ellipsepe,dc=energy,dc=
kz" write by anonymous auth by * none
olcAccess: {6}to dn.subtree="ou=ellipsepe,dc=energy,dc=kz" by dn.base="uid=lda
padminspe,ou=staff,ou=ellipsespe,dc=energy,dc=kz" write by * read
olcAccess: {7}to * by * read
В результате пользователи могут менять свои пароли, локальный админ может создавать, удалять пользователей в своей ветке, но не может менять пароль. Получается правило на доступ к атрибуту userPassword для локальных админов не работает, а к ветке в целом - работает. У меня это в голове не укладывается!
-
Здравствуйте! Всё дело в правиле с индексом {0} -- при обращении к userPassword оно срабатывает и до других дело просто не доходит. А в этом правиле про админов ничего не сказано, поэтому они не получают никаких прав. Если у Вас пользователи с паролями только в перечисленных ветках, то это правило можно вообще убрать и всё будет нормально работать. Если нет, то сначала нужно перечислить правила {1}, {3}, {5}, потом {0}, а затем все остальные.
Егор
-
Егор, большое Вам спасибо! Убрал правило {0} и всё заработало!