У нас есть собственное приложение, использующее 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-страницу.)