如何激活密码策略以在 OpenLDAP/windows 中使用扩展操作进行密码重置
Posted
技术标签:
【中文标题】如何激活密码策略以在 OpenLDAP/windows 中使用扩展操作进行密码重置【英文标题】:How to activate password policy to use Extended operation for password reset in OpenLDAP/windows 【发布时间】:2015-03-24 12:30:20 【问题描述】:我已经按照 OpenLDAP 提到的程序创建了密码策略 但是当我通过扩展操作更改用户密码时,我没有观察到它的效果。我得到了响应控制,但它只有警告而不是错误。
所以问题是我身边缺少什么? 如何强制执行密码策略以使用扩展操作来重置密码? 一旦我定义了密码策略,它是否适用于 OpenLDAP 服务器中的所有现有用户?还是只适用于新用户?
【问题讨论】:
您是否定义了默认策略对象?并在配置中指定为默认? 您是否以用户自己的身份执行更改密码操作?如果您将其作为 ManagerDN 执行,则会绕过策略覆盖。您不应该将 ManagerDN 帐户用于自己的任何事情,这仅用于服务器本身。 @EJP:是的。我在 slapd.conf 中定义了策略对象并在配置中指定了与默认值相同的内容,如下所示 overlay ppolicy ppolicy_default "cn=default,ou=policies,dc=maxcrc,dc=com" ppolicy_use_lockout @EJP - 我正在使用您在 oracle 论坛 [此处] (community.oracle.com/thread/1157421) 上发布的代码。我正在以用户自己的身份执行更改密码操作,如下ExtendedRequest per = new PasswordExtendedRequest(ctx,"cn=bhal,dc=maxcrc,dc=com","Something1","Nothing123"); ExtendedResponse extRes = ExtendedResponse)ctx.extendedOperation(per); ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, "cn=bhal,dc=maxcrc,dc=com"); ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, "Nothing123"); ctx.reconnect(new Control[]new PasswordRequestControl(true));
VG。你能回答我关于你使用的帐户的问题吗?
【参考方案1】:
您不得将 ManagerDN 帐户用于任何事情。它绕过所有覆盖,让您可以无限访问 DIT,这是您不想要的。
您的应用程序应该以用户身份运行,并且 DIT 中的条目在配置中被赋予了适当的权限。
我为此定义了管理员组,所有应用程序和人工管理员都是其中的一部分,这使得配置更简单(以及以后添加/更改管理员或应用程序很多 更简单)。我的内容是这样的,在slapd.conf
语法中:将其转换为slapd.d
在线语法留给读者作为练习。请注意,您必须更改基本 DN 等以适合您自己的 DIT,可能还有组类和属性名称。
access to attrs=userPassword
by dn.exact="cn=Manager,dc=XXX,dc=com" write
by group/groupOfUniqueNames/uniqueMember="cn=LDAP admins,ou=Groups,dc=XXX,dc=com" write
by group/groupOfUniqueNames/uniqueMember="cn=Applications,ou=Groups,dc=XXX,dc=com" write
by anonymous auth
by self write
by * none
access to *
by self write
by dn="cn=Replicator,dc=XXX,dc=com,c=us" write
by dn.exact="cn=Manager,dc=XXX,dc=com" write
by group/groupOfUniqueNames/uniqueMember="cn=LDAP admins,ou=Groups,dc=XXX,dc=com" write
by group/groupOfUniqueNames/uniqueMember="cn=Applications,ou=Groups,dc=XXX,dc=com" write
by users read
by anonymous search
by * none
请注意,此设置还允许用户更改自己的密码,因此您现在可以将 绑定为用户。
【讨论】:
完成您建议的更改。但是在尝试执行extendedOperation 本身时出现以下错误。javax.naming.NoPermissionException: [LDAP: error code 50 - Must supply old password to be changed as well as new one]; remaining name ''
另外请注意,我们需要编写支持所有 LDAP 风格的通用代码,例如 Sun One LDAP、Tivoli、ADAM、Novell 目录服务、Oracle Internet 目录等。这种方法适用于所有 LDAP 吗?
EJP - 你能回答我的问题并看看我在执行扩展操作时遇到的异常吗?
阅读错误信息即可。您必须提供旧密码和新密码。我编写的扩展请求代码支持这一点。您的 UI 应该向用户请求旧密码和新密码。通常,您将请求两次新的以避免拼写错误。这种方法适用于所有支持密码策略草案的 LDAP 服务器。这样的服务器将在最上面的条目上有一个supportedControl
属性,其值为1.3.6.1.4.1.42.2.27.8.5.1
。
但这与我的用例不相关。密码管理员(应该重置任何用户的密码)如何知道任何用户的旧密码?它应该只要求输入两次新密码。理想情况下,我期望以下。 1. change-password 的扩展操作应该仅询问新密码(可能是两次 - 再次确认)并且应该成功。 2. 在下一次“绑定”操作时,它应该得到passwordExpiration Exception,这意味着用户必须立即更改他/她的密码。
以 AD 为例,当 pwdLastSet 被管理员设置为 0 并且下一个绑定操作收到 passwordExpiration 异常时,相同的用例也有效。在所有具有通用代码的 LDAP 风格的情况下也是如此。我没有在您的代码中看到 PasswordModifyExtendedRequest 和 PasswordModifyExtendedResponse 类,这可能让我清楚地知道如何处理此错误。最后,我正在使用 Apache Directory Studio 进行 LDAP 浏览,但我没有看到 1.3.6.1.4.1.42.2.27.8 .5.1 在 LDAP 的根 DSE 的supportedControl 列表中。我想知道我是否走在正确的轨道上??以上是关于如何激活密码策略以在 OpenLDAP/windows 中使用扩展操作进行密码重置的主要内容,如果未能解决你的问题,请参考以下文章
如何使用自定义策略模式实现 jwt 令牌基础身份验证以在 .net 核心中进行授权?