Назад | Перейти на главную страницу

Как заставить openldap соблюдать pwdReset = TRUE

У нас есть собственное приложение, использующее openldap (2.4.32) в качестве базы данных пользователей. По требованию заказчика я изменяю его, чтобы использовать оверлей ppolicy openldap. Требование состоит в том, чтобы заставить пользователя изменить свой пароль при первом создании или после сброса пароля администратора. После активации и настройки наложения и его политики по умолчанию я вижу, что к моим объектам добавляются новые скрытые поля для отслеживания истечения срока действия пароля, но я не могу заставить pwdMustChange и pwdReset работать.

Вот моя конфигурация оверлея:

MBP2:~ me$ ldapsearch -h 10.242.25.158 -D "cn=root,cn=config" -x -W -b "cn=config" -s  sub "olcOverlay=ppolicy"
Enter LDAP Password: 
# extended LDIF
#
# LDAPv3
# base <cn=config> with scope subtree
# filter: olcOverlay=ppolicy
# requesting: ALL
#

# {1}ppolicy, {1}bdb, config
dn: olcOverlay={1}ppolicy,olcDatabase={1}bdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcPPolicyConfig
olcOverlay: {1}ppolicy
olcPPolicyDefault: cn=default,ou=policies,dc=my,dc=domain,dc=com

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

И объект pwdPolicy по умолчанию:

MBP2:~ me$ ldapsearch -h 10.242.25.158 -D "cn=ldapadmin,dc=my,dc=domain,dc=com" -x -W -b "ou=policies,dc=my,dc=domain,dc=com" -s sub "cn=default"
Enter LDAP Password: 
# extended LDIF
#
# LDAPv3
# base <ou=policies,dc=my,dc=domain,dc=com> with scope subtree
# filter: cn=default
# requesting: ALL
#

# default, policies, my.domain.com
dn: cn=default,ou=policies,dc=my,dc=domain,dc=com
objectClass: person
objectClass: top
objectClass: pwdPolicy
cn: default
pwdAllowUserChange: TRUE
pwdAttribute: 2.5.4.35
pwdCheckQuality: 2
pwdExpireWarning: 600
pwdFailureCountInterval: 30
pwdGraceAuthNLimit: 5
pwdInHistory: 5
pwdLockout: TRUE
pwdLockoutDuration: 0
pwdMaxAge: 0
pwdMaxFailure: 5
pwdMinAge: 0
pwdMinLength: 5
pwdMustChange: TRUE
pwdSafeModify: TRUE
sn: dummy value

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

И пользователь, созданный после добавления модуля ppolicy. После некоторого поиска в Google я вручную установил pwdReset: TRUE, чтобы попытаться принудительно истечь срок действия пароля.

MBP2:~ cwikj$ ldapsearch -h 10.242.25.158 -D "cn=ldapadmin,dc=my,dc=domain,dc=com" -x -W -b "dc=my,dc=domain,dc=com" -s sub "uid=cs_j0000000002" +
Enter LDAP Password: 
# extended LDIF
#
# LDAPv3
# base <dc=my,dc=domain,dc=com> with scope subtree
# filter: uid=cs_j0000000002
# requesting: + 
#

# CS_J0000000002, identities, A63562018398.my.domain.com
dn: uid=CS_J0000000002,ou=identities,dc=A63562018398,dc=my,dc=domain,dc=com
structuralObjectClass: customIdentity
entryUUID: 2569c9a5-ba99-4275-85b4-50974e57c2ee
creatorsName: cn=ldapadmin,dc=my,dc=domain,dc=com
createTimestamp: 20121004201108Z
pwdChangedTime: 20121004201108Z
pwdReset: TRUE
entryCSN: 20121004211150.015110Z#000000#000#000000
modifiersName: cn=ldapadmin,dc=my,dc=domain,dc=com
modifyTimestamp: 20121004211150Z
entryDN: uid=CS_J0000000002,ou=identities,dc=A63562018398,dc=my,dc=domain,dc=com
subschemaSubentry: cn=Subschema
hasSubordinates: FALSE

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

После всего этого я пытаюсь выполнить привязку, но не получаю сообщения об истечении срока действия пароля.

MBP2:~ me$ ldapwhoami -h 10.242.25.158 -v -x -W -D "uid=CS_J0000000002,ou=identities,dc=A63562018398,dc=my,dc=domain,dc=com"
ldap_initialize( ldap://10.242.25.158 )
Enter LDAP Password:
dn:uid=CS_J0000000002,ou=identities,dc=A63562018398,dc=my,dc=domain,dc=com
Result: Success (0)

Как я могу получить срок действия пароля? Есть ли что-то в политике по умолчанию, что противоречит pwdReset: TRUE?

Чтобы увидеть дополнительную информацию из ppolicy, вам необходимо явно запросить расширение.

Для ldapsearch(1), ldapwhoami(1), и друзья, вы делаете это с -e ppolicy:

$ ldapwhoami -x -D uid=me,ou=users,dc=example,dc=org -W -e ppolicy -v
ldap_initialize( <DEFAULT> )
Enter LDAP Password: 
ldap_bind: Success (0); Password must be changed
dn:uid=me,ou=users,dc=example,dc=org
Result: Success (0)

Для вашего приложения это зависит от конкретной библиотеки, которую вы используете. Например, код для C api: Вот. (Извините, я не нашел для него man-страницу.)