When implementing LDAP-based authentication systems, the need to query group membership efficiently is paramount. The memberOf overlay in OpenLDAP provides reverse group membership maintenance - automatically updating the memberOf attribute whenever group membership changes. This becomes particularly crucial when:
- Building applications that need to check group membership frequently
- Implementing access control based on LDAP groups
- Maintaining referential integrity between groups and members
For OpenLDAP 2.4+ with cn=config runtime configuration, we need three key components:
# 1. Load the memberof module
dn: cn=module{0},cn=config
objectClass: olcModuleList
cn: module{0}
olcModuleLoad: memberof.la
# 2. Configure the overlay for your database
dn: olcOverlay=memberof,olcDatabase={1}hdb,cn=config
objectClass: olcMemberOf
objectClass: olcOverlayConfig
olcOverlay: memberof
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfNames
olcMemberOfMemberAD: member
olcMemberOfMemberOfAD: memberOf
# 3. Enable referential integrity
dn: olcOverlay=refint,olcDatabase={1}hdb,cn=config
objectClass: olcRefintConfig
objectClass: olcOverlayConfig
olcOverlay: refint
olcRefintAttribute: memberof member
The key challenge lies in making the overlay work with existing group entries. Here's how to ensure proper behavior:
# For existing groups (groupOfNames), add this attribute:
dn: cn=mygroup,ou=groups,dc=example,dc=com
changetype: modify
add: objectClass
objectClass: groupOfNames
# Then add members with this LDIF:
dn: cn=mygroup,ou=groups,dc=example,dc=com
changetype: modify
add: member
member: uid=user1,ou=people,dc=example,dc=com
member: uid=user2,ou=people,dc=example,dc=com
To confirm the overlay is working correctly:
# Search for a user's memberOf attributes
ldapsearch -x -D "cn=admin,dc=example,dc=com" -W -b "uid=user1,ou=people,dc=example,dc=com" memberOf
# Expected output:
dn: uid=user1,ou=people,dc=example,dc=com
memberOf: cn=mygroup,ou=groups,dc=example,dc=com
If the memberOf attributes aren't being created:
- Check slapd logs for overlay-related errors
- Verify the overlay is loaded:
ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config '(olcOverlay=memberof)'
- Ensure the group entry has groupOfNames objectClass
- Confirm the member attributes use full DNs
For large directories:
- Set
olcMemberOfDangling: ignore
to skip invalid member references - Consider
olcMemberOfMemberAD
if using custom member attributes - For read-heavy systems, add an equality index for memberOf:
dn: olcDatabase={1}hdb,cn=config changetype: modify add: olcDbIndex olcDbIndex: memberOf eq
Here's a full LDIF for testing:
dn: ou=people,dc=example,dc=com
objectClass: organizationalUnit
ou: people
dn: ou=groups,dc=example,dc=com
objectClass: organizationalUnit
ou: groups
dn: uid=testuser,ou=people,dc=example,dc=com
objectClass: inetOrgPerson
uid: testuser
cn: Test User
sn: User
dn: cn=testgroup,ou=groups,dc=example,dc=com
objectClass: groupOfNames
cn: testgroup
member: uid=testuser,ou=people,dc=example,dc=com
The memberOf overlay in OpenLDAP provides automatic maintenance of reverse group membership (memberOf) attributes when group membership changes. This is particularly useful when you need to:
- Implement access control based on group membership
- Maintain referential integrity between groups and members
- Enable efficient memberOf queries without manual maintenance
From your description, you've successfully:
# Partial configuration shown
dn: olcOverlay={0}memberof
objectClass: olcMemberOf
objectClass: olcOverlayConfig
olcOverlay: {0}memberof
olcMemberOfRefInt: TRUE
The key issues you're facing with existing group modifications can be addressed through proper configuration. Here's what you need to add:
1. Adding Referential Integrity
While you have olcMemberOfRefInt enabled, you might need additional indexes:
dn: olcDatabase={1}hdb,cn=config
changetype: modify
add: olcDbIndex
olcDbIndex: memberof eq
2. Handling Existing Group Modifications
For existing groups, you need to trigger the overlay manually after changes:
# Example of adding member to existing group
dn: cn=existinggroup,ou=groups,dc=example,dc=com
changetype: modify
add: member
member: uid=user1,ou=people,dc=example,dc=com
Here's a full working configuration for Ubuntu/Debian systems:
# 1. Enable module
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: memberof
# 2. Configure overlay
dn: olcOverlay=memberof,olcDatabase={1}hdb,cn=config
objectClass: olcMemberOf
objectClass: olcOverlayConfig
olcOverlay: memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfNames
olcMemberOfMemberAD: member
olcMemberOfMemberOfAD: memberOf
After making changes, verify with these commands:
# Check if overlay is loaded
ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config '(olcOverlay=memberof)'
# Test group modification
ldapmodify -x -D "cn=admin,dc=example,dc=com" -W -f modify_group.ldif
# Verify memberOf attribute
ldapsearch -x -D "cn=admin,dc=example,dc=com" -W -b "uid=user1,ou=people,dc=example,dc=com" memberOf
If you encounter problems:
- Check slapd logs:
tail -f /var/log/slapd.log
- Verify schema includes groupOfNames
- Ensure all DNs in member attributes exist
- Restart slapd after configuration changes
For more control, consider these additional parameters:
olcMemberOfDangling: error|drop|ignore
olcMemberOfMemberAD: member
olcMemberOfGroupOC: groupOfNames|groupOfUniqueNames
olcMemberOfMemberOfAD: memberOf