Configure the 389 Directory Server memberOf Plugin

Tested on Rocky Linux 10.2 (Red Quartz)
Package 389-ds-base 3.2.0-8.el10_2
Applies to RHEL, Rocky Linux, AlmaLinux, Oracle Linux, CentOS Stream, Fedora
Privilege sudo or root
Scope Configure the 389 Directory Server memberOf plug-in for member and uniqueMember groups, nested membership, scopes, fixup tasks, and replication.
Related guides Install 389 Directory Server
Manage users and groups
dsconf commands
dsidm commands

Static groups store membership on the group entry through member or uniqueMember. Without memberOf, an application normally searches group entries for a member or uniqueMember value matching the user's DN. The MemberOf plug-in stores the reverse relationship on the member entry, allowing the application to retrieve group membership with a base search on that entry. SSSD ldap_access_filter rules that test memberOf depend on this plug-in; see the SSSD LDAP authentication guide for a client example. Apache Require ldap-filter against memberOf uses the same attribute; see the Apache LDAP authentication guide.

This guide covers the full reverse static-group membership workflow in 389 Directory Server:

  • How member and memberOf differ
  • Enabling and configuring the MemberOf plug-in
  • Supporting member and uniqueMember
  • Direct and nested group membership
  • Included and excluded scopes
  • MemberOf specific group scope in 389 DS 3.2
  • Membership across separate backends
  • Required object classes
  • Rebuilding existing values with the fixup task
  • Shared configuration
  • Replication topology design
  • Troubleshooting missing or incorrect memberOf values — see the memberOf troubleshooting guide

Before you start:

IMPORTANT
This guide configures reverse static-group membership only. It does not cover automatically assigning users to groups based on attributes (Auto Membership), removing stale group references after user deletion (Referential Integrity), general static and dynamic group creation (users and groups), LDAP roles (roles vs groups), or complete fractional-replication agreement management.

The primary lab instance is ldap1 on ldap1.example.com with LDAP port 389. Instance ldap2 on ports 1389 and 1636 is a second supplier that holds the same replicated suffix dc=example,dc=com for shared-configuration examples later in this guide.


How the memberOf plug-in works

The plug-in monitors membership attributes on static group entries and writes the corresponding group DN to the member entry's memberOf attribute.

text
Group entry
member: uid=user1,ou=People,dc=example,dc=com
        |
        | MemberOf plug-in
        v
User entry
memberOf: cn=developers,ou=Groups,dc=example,dc=com
Attribute Stored on Purpose
member Group entry Contains member DNs for groupOfNames
uniqueMember Group entry Alternative static membership attribute for groupOfUniqueNames
memberOf User or group entry Contains the groups the entry belongs to

The forward membership attribute on the group entry is the source of truth. The plug-in manages memberOf. Administrators should not normally edit memberOf directly.

The plug-in supports direct and indirect membership through nested groups, but it does not calculate membership for dynamic groups based on LDAP URL filters (memberURL). Dynamic membership remains outside this plug-in's scope.


Prepare static groups and test users

Use one consistent lab tree under dc=example,dc=com:

text
dc=example,dc=com
├── ou=People
│   ├── uid=user1
│   └── uid=user2
└── ou=Groups
    ├── cn=developers
    ├── cn=ops-unique
    └── cn=engineering

The lab includes:

  • cn=developersgroupOfNames using member
  • cn=ops-uniquegroupOfUniqueNames using uniqueMember
  • cn=engineering — nested parent group that will contain the Developers group DN

On my Rocky Linux 10.

Directory data changes in this section use dsidm commands.

bash
dsidm ldap1 group create --cn developers --description "Developers groupOfNames lab group"
output
Successfully created developers
bash
dsidm ldap1 uniquegroup create --cn ops-unique
output
Successfully created ops-unique
bash
dsidm ldap1 group create --cn engineering --description "Engineering parent group for nested membership"
output
Successfully created engineering

Check and enable the MemberOf plug-in

Before enabling the plug-in, Review its current configuration and confirm whether any user entries already carry memberOf values.

bash
dsconf ldap1 plugin memberof show

Sample output:

output
dn: cn=MemberOf Plugin,cn=plugins,cn=config
cn: MemberOf Plugin
memberofattr: memberOf
memberofgroupattr: member
nsslapd-pluginEnabled: off
nsslapd-pluginInitfunc: memberof_postop_init
nsslapd-pluginPath: libmemberof-plugin
nsslapd-pluginType: betxnpostoperation
objectClass: top
objectClass: nsSlapdPlugin
objectClass: extensibleObject

On a fresh instance the plug-in is usually disabled and monitors member only. The settings to review before you enable it include nsslapd-pluginEnabled, memberofgroupattr, memberofattr, memberofentryscope, memberofentryscopeexcludesubtree, memberofallbackends, memberofskipnested, memberofautoaddoc, memberOfSpecificGroupFilter, and nsslapd-pluginConfigArea.

Check whether users already contain memberOf values:

bash
ldapsearch -x -H ldap://ldap1.example.com:389 -D "cn=Directory Manager" -W -b "ou=People,dc=example,dc=com" "(memberOf=*)" dn memberOf

Sample output:

output
# numEntries: 0

An empty result is expected when the plug-in has not yet maintained reverse membership.

Enable the plug-in next:

bash
dsconf ldap1 plugin memberof enable
output
Enabled plugin 'MemberOf Plugin'

Restart the instance so the plug-in loads:

bash
dsctl ldap1 restart

The restart completes silently when the instance returns to the running state.

Verify the enabled state:

bash
dsconf ldap1 plugin memberof show

Sample output:

output
nsslapd-pluginEnabled: on
nsslapd-pluginId: memberof
memberofgroupattr: member

The nsslapd-pluginEnabled: on line confirms the plug-in is active. New group membership changes will begin updating memberOf from this point forward, but existing memberships are not repaired automatically.


Configure group membership attributes

By default the plug-in reads member only. If your directory uses both groupOfNames and groupOfUniqueNames, configure both member and uniqueMember. Many deployments standardize on only one group type.

bash
dsconf ldap1 plugin memberof set --groupattr member uniqueMember
output
Successfully changed the cn=MemberOf Plugin,cn=plugins,cn=config
Group object class Common membership attribute
groupOfNames member
groupOfUniqueNames uniqueMember

Restart the instance after changing MemberOf configuration:

bash
dsctl ldap1 restart

Verify the configuration:

bash
dsconf ldap1 plugin memberof show

Sample output:

output
memberofgroupattr: member
memberofgroupattr: uniqueMember

The memberOfGroupAttr setting is multi-valued, so one plug-in configuration can monitor multiple static-group membership attributes. Configuring only member is a common reason groupOfUniqueNames changes appear to be ignored.


Test direct and nested group membership

Direct membership

Add user1 to the Developers group. Save the LDIF as add-user1-developers.ldif:

ldif
dn: cn=developers,ou=Groups,dc=example,dc=com
changetype: modify
add: member
member: uid=user1,ou=People,dc=example,dc=com

Apply the change:

bash
ldapmodify -x -H ldap://ldap1.example.com:389 -D "cn=Directory Manager" -W -f add-user1-developers.ldif
output
modifying entry "cn=developers,ou=Groups,dc=example,dc=com"

Verify the group entry:

bash
ldapsearch -x -H ldap://ldap1.example.com:389 -D "cn=Directory Manager" -W -b "cn=developers,ou=Groups,dc=example,dc=com" -s base member

Sample output:

output
member: uid=user1,ou=People,dc=example,dc=com

Verify the user entry:

bash
ldapsearch -x -H ldap://ldap1.example.com:389 -D "cn=Directory Manager" -W -b "uid=user1,ou=People,dc=example,dc=com" -s base memberOf

Sample output:

output
memberOf: cn=developers,ou=Groups,dc=example,dc=com

The plug-in added the reverse membership automatically.

Add user2 to the groupOfUniqueNames group through uniqueMember. Save add-user2-ops-unique.ldif:

ldif
dn: cn=ops-unique,ou=Groups,dc=example,dc=com
changetype: modify
add: uniqueMember
uniqueMember: uid=user2,ou=People,dc=example,dc=com

Apply it:

bash
ldapmodify -x -H ldap://ldap1.example.com:389 -D "cn=Directory Manager" -W -f add-user2-ops-unique.ldif
output
modifying entry "cn=ops-unique,ou=Groups,dc=example,dc=com"

Verify user2:

bash
ldapsearch -x -H ldap://ldap1.example.com:389 -D "cn=Directory Manager" -W -b "uid=user2,ou=People,dc=example,dc=com" -s base memberOf

Sample output:

output
memberOf: cn=ops-unique,ou=Groups,dc=example,dc=com

Both member and uniqueMember updates produced memberOf values once uniqueMember was included in memberOfGroupAttr and the instance was restarted.

Nested membership

Nested layout for this lab:

output
cn=developers,ou=Groups,dc=example,dc=com
        member of
cn=engineering,ou=Groups,dc=example,dc=com

When Developers is a member of Engineering and user1 is a member of Developers, user1 should receive both group DNs:

text
memberOf: cn=developers,ou=Groups,dc=example,dc=com
memberOf: cn=engineering,ou=Groups,dc=example,dc=com

A group that is itself placed inside another group must allow the plug-in to add memberOf. For nested groups, add the auxiliary extensibleObject object class to the child group entry. In this example, cn=developers is the child group and therefore must include extensibleObject.

Check the Developers entry first:

bash
ldapsearch -x -H ldap://ldap1.example.com:389 -D "cn=Directory Manager" -W -b "cn=developers,ou=Groups,dc=example,dc=com" -s base objectClass

Sample output:

output
objectClass: top
objectClass: groupOfNames

If extensibleObject is absent, add it before creating the nested relationship. Save developers-extensibleObject.ldif:

ldif
dn: cn=developers,ou=Groups,dc=example,dc=com
changetype: modify
add: objectClass
objectClass: extensibleObject

Apply it:

bash
ldapmodify -x -H ldap://ldap1.example.com:389 -D "cn=Directory Manager" -W -f developers-extensibleObject.ldif
output
modifying entry "cn=developers,ou=Groups,dc=example,dc=com"

Add the Developers group DN to Engineering. Save nest-developers-in-engineering.ldif:

ldif
dn: cn=engineering,ou=Groups,dc=example,dc=com
changetype: modify
add: member
member: cn=developers,ou=Groups,dc=example,dc=com

Apply it:

bash
ldapmodify -x -H ldap://ldap1.example.com:389 -D "cn=Directory Manager" -W -f nest-developers-in-engineering.ldif
output
modifying entry "cn=engineering,ou=Groups,dc=example,dc=com"

Verify user1 still has direct membership and now also has indirect membership:

bash
ldapsearch -x -H ldap://ldap1.example.com:389 -D "cn=Directory Manager" -W -b "uid=user1,ou=People,dc=example,dc=com" -s base memberOf

Sample output:

output
memberOf: cn=developers,ou=Groups,dc=example,dc=com
memberOf: cn=engineering,ou=Groups,dc=example,dc=com

First, remove the nested relationship. Save remove-developers-from-engineering.ldif:

ldif
dn: cn=engineering,ou=Groups,dc=example,dc=com
changetype: modify
delete: member
member: cn=developers,ou=Groups,dc=example,dc=com

Apply it:

bash
ldapmodify -x -H ldap://ldap1.example.com:389 -D "cn=Directory Manager" -W -f remove-developers-from-engineering.ldif
output
modifying entry "cn=engineering,ou=Groups,dc=example,dc=com"

Verify user1:

bash
ldapsearch -x -H ldap://ldap1.example.com:389 -D "cn=Directory Manager" -W -b "uid=user1,ou=People,dc=example,dc=com" -s base memberOf

Sample output:

output
memberOf: cn=developers,ou=Groups,dc=example,dc=com

The indirect Engineering membership was removed while direct Developers membership remained.

Before the scope and skipnested exercises, re-apply nest-developers-in-engineering.ldif so user1 carries both memberships again.


Scope, nesting, and backend options

Several plug-in settings control how widely membership is calculated: nested expansion, subtree scope, cross-backend searches, and specific-group filters introduced in 389 DS 3.2.

Skip nested group processing

When only direct membership should be maintained:

bash
dsconf ldap1 plugin memberof set --skipnested on

Restart the instance:

bash
dsctl ldap1 restart
Setting Result
--skipnested off Direct and indirect memberships are maintained
--skipnested on Only direct memberships are maintained

On my lab host, with --skipnested on, user1 retained memberOf: cn=developers,... but lost the indirect cn=engineering,... value after I removed and re-added the nested relationship.

Restore the default behavior before continuing:

bash
dsconf ldap1 plugin memberof set --skipnested off
bash
dsctl ldap1 restart

After restoring memberOfSkipNested to off, run the MemberOf fixup task to rebuild indirect memberships using the updated configuration:

bash
dsconf ldap1 plugin memberof fixup --wait "dc=example,dc=com"

Alternatively, remove and then re-add the nested relationship to trigger recalculation through a new group modification.

The plug-in maintains direct and indirect memberships by default when memberOfSkipNested is off. Re-applying nest-developers-in-engineering.ldif while the forward member value already exists can fail with Type or value exists (20).

Included and excluded scopes

Limit the plug-in to the example suffix:

bash
dsconf ldap1 plugin memberof set --scope "dc=example,dc=com"

Exclude a private subtree:

bash
dsconf ldap1 plugin memberof set --exclude "ou=Private,dc=example,dc=com"

A few scope rules apply:

  • Both the group and the member must fall within the effective plug-in scope.
  • Excluded subtrees take precedence over the included scope.
  • Moving an entry outside the scope can remove the associated membership references.

I created ou=Private,dc=example,dc=com with a groupOfNames group and a test user. After adding the user to the private group, the user entry had no memberOf attribute because the subtree was excluded. A user under ou=People inside the included scope continued to receive memberOf values normally.

Membership across separate backends

By default the plug-in searches for members only in the same backend as the group. When users and groups are stored in separate backends, enable cross-backend searches:

bash
dsconf ldap1 plugin memberof set --allbackends on

Example layout when People and Groups are separate databases:

output
People backend:
ou=People,dc=example,dc=com

Groups backend:
ou=Groups,dc=example,dc=com

Different OUs do not automatically mean different backends. This option is required only when the People and Groups subtrees are mapped to separate Directory Server databases. If both OUs are stored in the same backend for dc=example,dc=com, leave memberOfAllBackends disabled.

The plug-in normally processes members in the group's database. memberOfAllBackends=on extends that search across configured databases. Use it only when the directory layout requires it, because cross-backend searches increase search work on large directories.

Limit processing to specific groups (389 DS 3.2)

389 Directory Server 3.2 adds memberOfSpecificGroupFilter, memberOfExcludeSpecificGroupFilter, and memberOfSpecificGroupOC so the plug-in can include or exclude individual groups by LDAP filter.

Choose either an include-filter model or an exclude-filter model. The following examples are alternatives and should not be applied sequentially.

Include-filter lab workflow. limit processing to Developers and Engineering:

bash
dsconf ldap1 plugin memberof set --specific-group-filter "(cn=developers)"

Add another included filter without replacing existing values:

bash
dsconf ldap1 plugin memberof add-attr --specific-group-filter "(cn=engineering)"

Alternative: exclude-filter model. use this only when no include filters exist:

bash
dsconf ldap1 plugin memberof set --exclude-specific-group-filter "(cn=internal-group)"

To switch from include filters to an exclude model, remove the existing include filters first:

bash
dsconf ldap1 plugin memberof del-attr --specific-group-filter "(cn=developers)" "(cn=engineering)"

Restrict which object classes identify a group entry:

bash
dsconf ldap1 plugin memberof set --specific-group-oc groupOfNames groupOfUniqueNames

A few rules apply to MemberOf specific group scope:

  • Do not configure include and exclude group filters simultaneously. An include filter already excludes all unmatched groups.
  • set replaces existing values where the option is multi-valued.
  • Use add-attr and del-attr when adding or removing individual filters.
  • Restart the instance and run fixup after changing which groups participate.

Restart and verify combined scope settings

After changing scope, backend, or specific-group settings, restart the instance:

bash
dsctl ldap1 restart

Verify the active configuration:

bash
dsconf ldap1 plugin memberof show

Sample output:

output
memberofgroupattr: member
memberofgroupattr: uniqueMember
memberofentryscope: dc=example,dc=com
memberofentryscopeexcludesubtree: ou=Private,dc=example,dc=com
memberofallbackends: on
memberofskipnested: off
memberofspecificgroupfilter: (cn=developers)
memberofspecificgroupfilter: (cn=engineering)
memberofspecificgroupoc: groupOfNames
memberofspecificgroupoc: groupOfUniqueNames

Only the lines that match your enabled configuration should appear in your environment.


New entries in this section are added with the ldapadd command.

Configure required object classes

The member entry must have an object class that permits the memberOf attribute. By default, when the plug-in needs to write memberOf to an entry that lacks a compatible object class, it adds nsMemberOf. This is independent of whether the entry was created with dsidm, ldapadd, an import, or another LDAP client.

Official documentation lists nsMemberOf as the default automatically added object class, with inetUser, inetAdmin, and inetOrgPerson as alternatives that already permit the attribute.

Configure another supported object class where required:

bash
dsconf ldap1 plugin memberof set --autoaddoc inetUser

Restart the instance:

bash
dsctl ldap1 restart

Verify the setting:

bash
dsconf ldap1 plugin memberof show

Sample output:

output
memberofautoaddoc: inetuser

If the plug-in cannot add a compatible object class and the entry schema does not allow memberOf, the modify fails with an object class violation:

output
Object class violation (65)

Choose an alternative object class with memberOfAutoAddOC only when your deployment standard requires it.


Rebuild memberOf values with the fixup task

Enabling the plug-in does not retroactively repair memberships that already existed. Run the fixup task when:

  • Groups existed before the plug-in was enabled
  • Users were imported with inconsistent memberOf values
  • Someone manually edited memberOf
  • Scope, nesting, group-attribute, or specific-group settings changed
  • A consumer initialization or total update left locally calculated memberOf values missing or inconsistent in your chosen replication design

Run one fixup task at a time and schedule large rebuilds during a maintenance window. Nested groups and multiple configured group attributes can increase processing time.

Run the task against the suffix:

bash
dsconf ldap1 plugin memberof fixup --wait "dc=example,dc=com"

Sample output:

output
Adding fixup task entry...
Waiting for fixup task "cn=memberOf_fixup_2026-07-16T19:27:06.364120,cn=memberOf task,cn=tasks,cn=config" to complete.
Fixup task successfully completed

Use a custom filter when additional object classes must be included explicitly. Once a custom filter is supplied, it determines which entries are processed:

bash
dsconf ldap1 plugin memberof fixup --wait -f "(|(objectClass=inetUser)(objectClass=inetAdmin)(objectClass=inetOrgPerson)(objectClass=nsMemberOf))" "dc=example,dc=com"

The documented default filter covers inetUser, inetAdmin, and nsMemberOf. A custom filter is needed when additional classes such as inetOrgPerson must be included.

On my lab host I manually deleted stale memberOf values from user1 while member values on the group entries remained unchanged, confirmed the user attribute was empty, then ran the fixup task. After completion, both cn=developers and cn=engineering appeared again on the user entry.

When you start fixup without --wait, monitor the background task with:

bash
dsconf ldap1 plugin memberof fixup-status --watch

Display task logs when troubleshooting:

bash
dsconf ldap1 plugin memberof fixup-status --show-log

The CLI also supports --wait, --watch, --show-log, and an optional task DN.

After fixup completes, sample a few expected users. For a broader validation pass on a small lab suffix:

bash
ldapsearch -x -H ldap://ldap1.example.com:389 -D "cn=Directory Manager" -W -b "dc=example,dc=com" "(memberOf=*)" dn memberOf

This query can be expensive on a large suffix. Use it sparingly in production and prefer targeted checks on representative users and groups.

The fixup task runs locally on the server where you start it. Whether the resulting values reach other replicas depends on whether those attribute changes are replicated:

  • When memberOf is excluded from replication and every server calculates it locally, run fixup on every server that needs rebuilding.
  • When suppliers calculate memberOf and replicate it to read-only consumers, run fixup on the appropriate supplier and allow the result to replicate to consumers.
  • A fixup on one supplier does not automatically repair another supplier when memberOf is excluded between writable servers.

Confirm reverse membership is removed on delete

After the fixup demonstration, remove user1 from Developers to confirm that reverse membership is cleared when forward membership is deleted. Save remove-user1-developers.ldif:

ldif
dn: cn=developers,ou=Groups,dc=example,dc=com
changetype: modify
delete: member
member: uid=user1,ou=People,dc=example,dc=com

Apply it:

bash
ldapmodify -x -H ldap://ldap1.example.com:389 -D "cn=Directory Manager" -W -f remove-user1-developers.ldif
output
modifying entry "cn=developers,ou=Groups,dc=example,dc=com"

Verify the user entry:

bash
ldapsearch -x -H ldap://ldap1.example.com:389 -D "cn=Directory Manager" -W -b "uid=user1,ou=People,dc=example,dc=com" -s base memberOf

Sample output:

output
dn: uid=user1,ou=People,dc=example,dc=com

The user entry returned with no memberOf attribute. That confirms the plug-in removes reverse membership when forward membership is deleted.


Share the plug-in configuration across servers

Two configuration models exist:

Model Configuration location
Per-server configuration cn=MemberOf Plugin,cn=plugins,cn=config
Shared configuration Replicated entry below the directory suffix

The shared configuration entry must reside under a suffix that is replicated and available with the same DN on every participating server. Once nsslapd-pluginConfigArea is set, the plug-in ignores the normal local settings and reads the referenced shared entry.

Create a shared configuration entry on ldap1:

bash
dsconf ldap1 plugin memberof config-entry add "cn=shared-memberof-config,dc=example,dc=com" --attr memberOf --groupattr member uniqueMember
output
Successfully created the cn=shared-memberof-config,dc=example,dc=com
MemberOf attribute nsslapd-pluginConfigArea (config-entry) was set in the main plugin config

Display the shared entry:

bash
dsconf ldap1 plugin memberof config-entry show "cn=shared-memberof-config,dc=example,dc=com"

Sample output:

output
dn: cn=shared-memberof-config,dc=example,dc=com
cn: shared-memberof-config
memberofattr: memberOf
memberofgroupattr: member
memberofgroupattr: uniqueMember
objectClass: top
objectClass: extensibleObject

Enable the MemberOf plug-in on ldap2 before pointing it at the shared entry. Red Hat lists enabling MemberOf on every participating server as a prerequisite for shared configuration. A disabled plug-in will not process memberships even when nsslapd-pluginConfigArea is set.

bash
dsconf ldap2 plugin memberof enable
output
Enabled plugin 'MemberOf Plugin'

Point ldap2 at the same shared entry DN after dc=example,dc=com is available on that host through replication:

bash
dsconf ldap2 plugin memberof set --config-entry "cn=shared-memberof-config,dc=example,dc=com"

Restart both instances. The official procedure requires the plug-in to be enabled and each instance restarted after setting the shared configuration:

bash
dsctl ldap1 restart
bash
dsctl ldap2 restart

Verify the plug-in state on the second server:

bash
dsconf ldap2 plugin memberof show

Sample output:

output
nsslapd-pluginEnabled: on
nsslapd-pluginConfigArea: cn=shared-memberof-config,dc=example,dc=com

Once shared configuration is enabled, settings stored in the normal per-server plug-in entry are ignored. Manage memberOfGroupAttr, scope, specific-group filters, and related attributes on the shared config entry instead.


Configure memberOf in a replication topology

Replication and MemberOf interact because memberOf is a derived attribute. Choose one of the two supported designs and apply it consistently.

Run the plug-in on every server

  • Enable the plug-in on suppliers and consumers.
  • Exclude memberOf from replication.
  • Let each server calculate its own values from member and uniqueMember.

Run the plug-in on supplier servers only

  • Enable the plug-in on all write-enabled suppliers.
  • Exclude memberOf between write-enabled suppliers.
  • Replicate memberOf to read-only consumers.
  • Keep the plug-in disabled on those consumers.

Do not allow both replication and local plug-in processing to update the same derived values without a deliberate design.

Verify your chosen model with:

  • Group modifications on each supplier
  • memberOf on every writable server
  • Read-only consumer values
  • Fractional replication exclusions for memberOf
  • Behavior after an initialization or total update

Complete fractional-replication configuration belongs in the dedicated replication chapter. This guide documents only the two MemberOf deployment models and the attribute-exclusion requirement.


Symptom Likely cause Fix
memberOf is not added to a user Plug-in disabled, missing restart, wrong group attribute, out-of-scope entry, excluded subtree, cross-backend layout, incompatible object class, specific-group filter mismatch, or dynamic group Enable the plug-in, restart, add uniqueMember to --groupattr, adjust scope or --allbackends, verify object classes and memberOfSpecificGroupFilter, confirm the group is static
Existing users have no memberOf values Data predates plug-in enablement or was imported without fixup Run dsconf ldap1 plugin memberof fixup --wait "dc=example,dc=com"
groupOfUniqueNames changes are ignored Only member is configured in memberOfGroupAttr dsconf ldap1 plugin memberof set --groupattr member uniqueMember then restart
Nested group membership is missing memberOfSkipNested is on or child group lacks extensibleObject Set --skipnested off, add extensibleObject to the child group, run fixup
Cross-backend membership is missing memberOfAllBackends is off dsconf ldap1 plugin memberof set --allbackends on, restart, and confirm both subtrees are in scope
Specific group changes are ignored memberOfSpecificGroupFilter excludes the group Review include/exclude filters and memberOfSpecificGroupOC, then run fixup
Object class violation (65) Entry lacks a schema that permits memberOf Configure --autoaddoc or add nsMemberOf / inetUser manually
Values differ between replicas Mixed replication and local plug-in processing, or fixup ran on one server only Pick one topology model, review fractional exclusions, align shared vs per-server configuration
Dynamic group membership is missing Expected behavior MemberOf manages static groups only; query dynamic groups through memberURL
Feature Purpose
MemberOf plug-in Maintains reverse static-group membership
Auto Membership Automatically adds entries to groups based on rules
Referential Integrity Removes or updates stale DN references
Dynamic groups Calculates membership from an LDAP URL
Roles Provides role-based membership through nsRoleDN

These features can complement each other but are not interchangeable. Auto Membership writes forward group membership. MemberOf derives the reverse memberOf attribute. Referential Integrity cleans stale member references after entry deletion or rename.


What's next

After you complete this guide, continue with:

Summary

  1. Enable the MemberOf plug-in and restart the instance.
  2. Configure every static-group membership attribute in use (member and uniqueMember).
  3. Decide whether nested groups should be expanded (--skipnested).
  4. Set the correct included and excluded scopes and specific-group filters.
  5. Enable all-backend searches only when groups and users are separated by database.
  6. Run the fixup task for existing or imported data.
  7. Choose a consistent replication topology design.
  8. Verify both group membership and reverse memberOf values.

References


Frequently Asked Questions

1. Does the memberOf plug-in work with dynamic groups?

No. The MemberOf plug-in monitors static membership attributes such as member and uniqueMember on group entries. It does not evaluate memberURL filters used by dynamic groups. For reverse membership on static groups, enable MemberOf. For filter-based membership, use dynamic groups or roles and query them directly.

2. Why is memberOf missing after I imported LDIF?

Enabling the plug-in does not retroactively repair existing memberships. Importing group entries updates member or uniqueMember, but memberOf is derived. Run the memberOf fixup task on the affected suffix after the plug-in is enabled and configured, then verify a sample of user entries.

3. Should memberOf be replicated between suppliers?

Choose one model and apply it consistently. Either exclude memberOf from replication and let every writable server calculate its own values, or calculate memberOf on suppliers and replicate the derived attribute to read-only consumers while keeping the plug-in disabled on those consumers. Do not let replication and local plug-in processing update the same attribute without a deliberate design.

4. What is the difference between memberOf and Auto Membership?

Auto Membership automatically adds entries to groups based on administrator-defined rules. MemberOf derives the reverse memberOf attribute on member entries when static group membership changes. Auto Membership writes forward membership on the group entry; MemberOf maintains the reverse view on the member entry.

5. Why are groupOfUniqueNames changes ignored by memberOf?

The default plug-in configuration monitors member only. Add uniqueMember to memberOfGroupAttr with dsconf ldap1 plugin memberof set --groupattr member uniqueMember so groupOfUniqueNames membership is included.
Deepak Prasad

R&D Engineer

Founder of GoLinuxCloud with more than 15 years of expertise in Linux, Python, Go, Laravel, DevOps, Kubernetes, Git, Shell scripting, OpenShift, AWS, Networking, and Security. With extensive experience, he excels across development, DevOps, networking, and security, delivering robust and efficient solutions for diverse projects.

  • Go (programming language)
  • Python (programming language)
  • DevOps
  • Computer Security
  • Cloud Computing
  • Kubernetes
  • Linux
  • Ansible (software)