Disable Password Expiry for Specific Users on OpenLDAP

|
Last Updated:
|
|

How can I prevent password expiration for a single specific LDAP user like the LDAP administrator, the replication user, the bind DN user? Well, it is actually possible to disable password expiry for specific users on OpenLDAP. That is what we are going to cover on this guide.

Disabling OpenLDAP Password Expiry for Specific Users

In our previous guide, we learnt how to implement OpenLDAP password policies.

Implement OpenLDAP Password Policies

The Default Password Policy

In our demo system, we created an OU container for storing password policies called pwpolicy.

ldapsearch -Y ExTERNAL -H ldapi:/// -b dc=ldapmaster,dc=kifarunix-demo,dc=com "(ou=pwpolicy)" -LLL -Q
dn: ou=pwpolicy,dc=ldapmaster,dc=kifarunix-demo,dc=com
objectClass: organizationalUnit
objectClass: top
ou: pwpolicy

Within this container, we set up a subentry with the default password policies which applies to every other user in our OpenLDAP database.

ldapsearch -Y ExTERNAL -H ldapi:/// -b ou=pwpolicy,dc=ldapmaster,dc=kifarunix-demo,dc=com -LLL -Q "(cn=default)"
dn: cn=default,ou=pwpolicy,dc=ldapmaster,dc=kifarunix-demo,dc=com
objectClass: person
objectClass: pwdPolicyChecker
objectClass: pwdPolicy
cn: pwpolicy
cn: default
sn: pwpolicy
pwdAttribute: userPassword
pwdMinAge: 0
pwdMaxAge: 5184000
pwdInHistory: 5
pwdCheckQuality: 2
pwdMinLength: 12
pwdExpireWarning: 432000
pwdGraceAuthNLimit: 5
pwdLockout: TRUE
pwdLockoutDuration: 0
pwdMaxFailure: 3
pwdFailureCountInterval: 0
pwdMustChange: TRUE
pwdAllowUserChange: TRUE
pwdSafeModify: FALSE

As you can see from our default password policies above, the password is set to expire after 60 days (5184000 seconds).

Creating User Specific Password Policies on OpenLDAP

In order to apply specific password policies to a specific category of users on an OpenLDAP server, you need to create specific policies and assign them to the respective users.

Assigning specific users specific password policies is made possible through the use of pwdPolicySubentry attribute.

According to man 5 slapo-ppolicy.

Every account that should be subject to password policy control should have a pwdPolicySubentry attribute containing the DN of a valid pwdPolicy entry, or they can simply use the configured default. In this way different users may be managed according to different policies.

This attribute refers directly to the pwdPolicy subentry that is to be used for this particular directory user. If pwdPolicySubentry exists, it must contain the DN of a valid pwdPolicy object. If it does not exist, the ppolicy module will enforce the default password policy rules on the user associated with this authenticating DN. If there is no default, or the referenced subentry does not exist, then no policy rules will be enforced.

Therefore, create an entry with specific password policies. For example, to create a policy that sets the password to not expire, create a DN entry with policies similar to the one below;

vim pwd_no_expire.ldif
dn: cn=pwd-no-expire,ou=pwpolicy,dc=ldapmaster,dc=kifarunix-demo,dc=com
objectClass: person
objectClass: pwdPolicyChecker
objectClass: pwdPolicy
cn: pwpolicy
cn: pwd-no-expire
sn: pwpolicy
pwdAttribute: userPassword
pwdMinAge: 0
pwdMaxAge: 0
pwdInHistory: 5
pwdCheckQuality: 1
pwdMinLength: 12
pwdLockout: TRUE
pwdLockoutDuration: 0
pwdMaxFailure: 3
pwdFailureCountInterval: 0

Note that we created a subentry, cn=pwd-no-expire,ou=pwpolicy,dc=ldapmaster,dc=kifarunix-demo,dc=com, with no password age limit (pwdMaxAge: 0).

According to man slapo-ppolicy, the pwdMaxAge attribute contains the number of seconds after which a modified password will expire. If this attribute is not present, or if its
value is zero (0), then passwords will not expire.

Update the OpenLDAP database with your policies now;

ldapadd -Y EXTERNAL -H ldapi:/// -f pwd_no_expire.ldif

You now have two policies, the default and let’s call it user specific policies.

ldapsearch -Y ExTERNAL -H ldapi:/// -b ou=pwpolicy,dc=ldapmaster,dc=kifarunix-demo,dc=com -LLL -Q
dn: ou=pwpolicy,dc=ldapmaster,dc=kifarunix-demo,dc=com
objectClass: organizationalUnit
objectClass: top
ou: pwpolicy

dn: cn=default,ou=pwpolicy,dc=ldapmaster,dc=kifarunix-demo,dc=com
objectClass: person
objectClass: pwdPolicyChecker
objectClass: pwdPolicy
cn: pwpolicy
cn: default
sn: pwpolicy
pwdAttribute: userPassword
pwdMinAge: 0
pwdInHistory: 5
pwdCheckQuality: 2
pwdMinLength: 12
pwdExpireWarning: 432000
pwdGraceAuthNLimit: 5
pwdLockout: TRUE
pwdLockoutDuration: 0
pwdMaxFailure: 3
pwdFailureCountInterval: 0
pwdMustChange: TRUE
pwdAllowUserChange: TRUE
pwdSafeModify: FALSE
pwdMaxAge: 5184000

dn: cn=pwd-no-expire,ou=pwpolicy,dc=ldapmaster,dc=kifarunix-demo,dc=com
objectClass: person
objectClass: pwdPolicyChecker
objectClass: pwdPolicy
cn: pwpolicy
cn: pwd-no-expire
sn: pwpolicy
pwdAttribute: userPassword
pwdMinAge: 0
pwdMaxAge: 0
pwdInHistory: 5
pwdCheckQuality: 1
pwdMinLength: 12
pwdLockout: TRUE
pwdLockoutDuration: 0
pwdMaxFailure: 3
pwdFailureCountInterval: 0

Add User to New Password Policy

Now, add all users you want to disable password expiry for to the new no password expiry policy create above.

In our demo, we have two user for demonstration purposes.

ldapsearch -Y ExTERNAL -H ldapi:/// -b ou=people,dc=ldapmaster,dc=kifarunix-demo,dc=com -LLL -Q dn
dn: uid=janedoe,ou=people,dc=ldapmaster,dc=kifarunix-demo,dc=com
dn: uid=johndoe,ou=people,dc=ldapmaster,dc=kifarunix-demo,dc=com

We will add the user, janedoe, to the new created policy with no password age limit defined (cn=pwd-no-expire,ou=pwpolicy,dc=ldapmaster,dc=kifarunix-demo,dc=com) by modifying its attributes and adding the pwdPolicySubentry which we gonna point it to the new policy as shown below;

vim janedoe.ldif
dn: uid=janedoe,ou=people,dc=ldapmaster,dc=kifarunix-demo,dc=com
changetype: modify
add: pwdPolicySubentry
pwdPolicySubentry: cn=pwd-no-expire,ou=pwpolicy,dc=ldapmaster,dc=kifarunix-demo,dc=com

Update user attributes;

ldapadd -Y EXTERNAL -H ldapi:/// -f janedoe.ldif

Verify Password Expiry Status

How can we verify that our user has been exempted from password expiry policy?

To quickly demonstrate this, we will reduce the password maximum age to two minutes on the default policy so that the password expiry notification can be generated quickly without having to wait for the next 55 days as per our default policy to generate the notification.

vim reduce-pwdmaxage.ldif
dn: cn=default,ou=pwpolicy,dc=ldapmaster,dc=kifarunix-demo,dc=com
changetype: modify
replace: pwdMaxAge
pwdMaxAge: 120

Well, apart from comparing the value of pwdChangedTime to the value of pwdMaxAge  to determine the password expiry date, let us try to verify user passwords using ldapwhoami command and check the logs in realtime.

Next, we will reset the passwords for the two users above, janedoe and johndoe, as per the specified policies. After that, we can verify whether LDAP sets the password expiry information.

To reset the passwords, run the command below on your OpenLDAP server. Replace the user entries accordingly;

ldappasswd -H ldapi:/// -Y EXTERNAL -S "uid=janedoe,ou=people,dc=ldapmaster,dc=kifarunix-demo,dc=com"

To be able to check the password expiry notification on the logs, verify your password with ldapwhoami command. While running these commands, open another terminal and tail the logs in real time;

ldapwhoami -h ldapmaster.kifarunix-demo.com -x -D "uid=johndoe,ou=people,dc=ldapmaster,dc=kifarunix-demo,dc=com" -W
ldapwhoami -h ldapmaster.kifarunix-demo.com -x -D "uid=janedoe,ou=people,dc=ldapmaster,dc=kifarunix-demo,dc=com" -W

Tailing the logs;

tail -f /var/log/slapd.log
Apr 17 23:54:24 ldapmaster slapd[4915]: conn=1003 fd=18 ACCEPT from IP=192.168.56.180:34722 (IP=0.0.0.0:389)
Apr 17 23:54:24 ldapmaster slapd[4915]: conn=1003 op=0 BIND dn="uid=johndoe,ou=people,dc=ldapmaster,dc=kifarunix-demo,dc=com" method=128
Apr 17 23:54:24 ldapmaster slapd[4915]: conn=1003 op=0 BIND dn="uid=johndoe,ou=people,dc=ldapmaster,dc=kifarunix-demo,dc=com" mech=SIMPLE ssf=0
Apr 17 23:54:24 ldapmaster slapd[4915]: ppolicy_bind: Setting warning for password expiry for uid=johndoe,ou=people,dc=ldapmaster,dc=kifarunix-demo,dc=com = 74 seconds
Apr 17 23:54:24 ldapmaster slapd[4915]: conn=1003 op=0 RESULT tag=97 err=0 text=
...
...
Apr 17 23:54:49 ldapmaster slapd[4915]: conn=1004 fd=18 ACCEPT from IP=192.168.56.180:34724 (IP=0.0.0.0:389)
Apr 17 23:54:49 ldapmaster slapd[4915]: conn=1004 op=0 BIND dn="uid=janedoe,ou=people,dc=ldapmaster,dc=kifarunix-demo,dc=com" method=128
Apr 17 23:54:49 ldapmaster slapd[4915]: conn=1004 op=0 BIND dn="uid=janedoe,ou=people,dc=ldapmaster,dc=kifarunix-demo,dc=com" mech=SIMPLE ssf=0
Apr 17 23:54:49 ldapmaster slapd[4915]: conn=1004 op=0 RESULT tag=97 err=0 text=
Apr 17 23:54:49 ldapmaster slapd[4915]: conn=1004 op=1 EXT oid=1.3.6.1.4.1.4203.1.11.3

As you can see from above logs, the password for the user, johndoe expiry warning is generated as it is using the default password policy with password maximum age set to 120 seconds.

No password expiry notification is generated for user janedoe as it is using the password policy with no password expiry set.

And that is how you can simply disable OpenLDAP password expiry for specific users on OpenLDAP server.

Related Tutorials

Setup OpenLDAP Master-Master Replication on CentOS 8

Configure OpenLDAP SSSD client on CentOS 6/7

Setup OpenLDAP Master-Slave Replication on CentOS 8

Setup LDAP Self Service Password Tool on CentOS 8

SUPPORT US VIA A VIRTUAL CUP OF COFFEE

We're passionate about sharing our knowledge and experiences with you through our blog. If you appreciate our efforts, consider buying us a virtual coffee. Your support keeps us motivated and enables us to continually improve, ensuring that we can provide you with the best content possible. Thank you for being a coffee-fueled champion of our work!

Photo of author
koromicha
I am the Co-founder of Kifarunix.com, Linux and the whole FOSS enthusiast, Linux System Admin and a Blue Teamer who loves to share technological tips and hacks with others as a way of sharing knowledge as: "In vain have you acquired knowledge if you have not imparted it to others".

Leave a Comment