Source: projects/identity-management/ldap-shop-seeding/README.md

> Source: projects/identity-management/ldap-shop-seeding/README.md

LDAP Shop Seeding - Plan v0.1

Goal

Create a small fictional LDAP entitlement catalog in the sandbox OpenDJ directory so One Identity Manager can be used to test:

No LDAP or OneIM mutation is part of this plan. Implementation should be a separate, locked sandbox change.

Current Sandbox Evidence

Live OneIM v10 DB checks on 2026-04-27 confirm these LDAP tables exist:

AreaTables / views
LDAP objectsLDAPAccount, LDAPGroup, LDAPContainer
LDAP membershipsLDAPAccountInLDAPGroup, LDAPGroupInLDAPGroup, LDAPGroupCollection, LDAPGroupExclusion
IT Shop publicationBaseTreeHasLDAPGroup, ITShopOrgHasLDAPGroup

LDAPGroup has the IT Shop publication columns needed for the same basic pattern used for AD groups:

Current OpenDJ/OIM inventory, checked read-only on 2026-04-27:

Object typeCurrent stateConflict result
Containersdc=ldap,dc=com, ou=People, ou=Groupsou=oim-managed,dc=ldap,dc=com does not exist yet
Accounts14 inetOrgPerson entries under ou=People; user IDs like ANDREASN, BERITA, SER_OIMplanned ldap.* user IDs do not collide
Groups4 groupOfNames entries under ou=Groups: Linux Admins, Oracle DBA, Team Development Sweden, Team IT Swedenplanned ldap_* group CNs do not collide
OIM membershipsLDAPAccountInLDAPGroup = 0, LDAPGroupInLDAPGroup = 0membership import still needs a focused proof test

Design decision from this inventory: keep the seed in a new ou=oim-managed,dc=ldap,dc=com subtree instead of adding to the existing ou=People / ou=Groups containers. This avoids collisions and makes cleanup/reset unambiguous.

No LDAP-specific PWODecisionMethod was found by name. For v1, prefer a generic approval policy over reusing an AD-named policy.

Recommended v1 approval policy:

UIDIdent
QER-D00B0CE0F1DA984A83D4E565D2880067Recipient's manager and product owner (with peer group analysis)

No LDAP-specific policy was found by name. Avoid reusing the AD-named policy for LDAP products.

If sandbox manager/product-owner routing is incomplete, use a simpler temporary test policy only for cart-flow validation.

LDAP DIT Structure

Discovery result from 2026-04-27:

dn:
namingContexts: dc=ldap,dc=com
vendorName: Open Identity Platform Community
vendorVersion: OpenDJ Server 5.1.0

Use dc=ldap,dc=com below for the discovered writable suffix.

Proposed project-owned subtree:

ou=oim-managed,dc=ldap,dc=com
  ou=people
    ou=employees
    ou=service-accounts
    ou=anchors
  ou=groups
    ou=applications
      ou=docsuite
      ou=codeforge
      ou=packagehub
      ou=observatory
      ou=learnlab
    ou=platform
    ou=business-roles
    ou=access-bundles
    ou=distribution

Design choices:

LDAP Entry Model

Recommended group object class for v1:

objectClass: top
objectClass: groupOfNames
cn: ldap_app_docsuite_reader
description: [OIM-SANDBOX-SEED:ldap-shop-seeding:v1] ...

Why groupOfNames:

LDAP account model:

LDAP accounts are not created by this seed. They should be provisioned from OneIM by assigning or ordering the related LDAP account definition. The ou=people subtree remains as a target area for account-definition provisioning tests.

LDAP Account Provisioning

Do not seed LDAP accounts directly in OpenDJ for this project. Use OneIM account definitions so later sync evidence distinguishes:

Fictional LDAP Entitlement Catalog

Total v1 groups: 41.

Application Groups - 20

Five fictional LDAP-backed applications with four tiers each:

AppCodeGroups
DocSuite Wikidocsuiteldap_app_docsuite_reader, ldap_app_docsuite_contributor, ldap_app_docsuite_publisher, ldap_app_docsuite_admin
CodeForge Reposcodeforgeldap_app_codeforge_reader, ldap_app_codeforge_developer, ldap_app_codeforge_maintainer, ldap_app_codeforge_admin
PackageHub Registrypackagehubldap_app_packagehub_reader, ldap_app_packagehub_publisher, ldap_app_packagehub_curator, ldap_app_packagehub_admin
Observatory Metricsobservatoryldap_app_observatory_viewer, ldap_app_observatory_operator, ldap_app_observatory_editor, ldap_app_observatory_admin
LearnLab LMSlearnlabldap_app_learnlab_learner, ldap_app_learnlab_author, ldap_app_learnlab_instructor, ldap_app_learnlab_admin

Platform Groups - 6

GroupPurpose
ldap_platform_linux_ssh_usersLinux SSH access simulation
ldap_platform_linux_sudo_readonlylow-risk privileged command simulation
ldap_platform_linux_sudo_operatorhigher-risk privileged command simulation
ldap_platform_file_projects_rwproject share read/write simulation
ldap_platform_secrets_readerssecrets read access simulation
ldap_platform_service_accountstechnical account grouping

Business-Role Marker Groups - 6

These are LDAP marker groups, not native OneIM business roles:

GroupPurpose
ldap_br_engineeringengineering population marker
ldap_br_operationsoperations population marker
ldap_br_financefinance population marker
ldap_br_hrHR population marker
ldap_br_salessales population marker
ldap_br_supportsupport population marker

Access Bundle Groups - 5

These can later become native ESet system roles, but v1 keeps them as LDAP groups for connector testing:

GroupIntended included groups
ldap_bundle_workforce_basedocsuite reader, learnlab learner
ldap_bundle_engineering_corecodeforge developer, packagehub reader, observatory viewer
ldap_bundle_ops_oncallobservatory operator, linux ssh users, file projects rw
ldap_bundle_analytics_userobservatory viewer, docsuite reader
ldap_bundle_privileged_supportlinux sudo operator, secrets readers

Distribution-List-Shaped Groups - 4

These are LDAP static groups only, not mail-enabled distribution lists:

GroupPurpose
ldap_dl_allstaffall-staff style test group
ldap_dl_engineeringengineering communication group
ldap_dl_operationsoperations communication group
ldap_dl_release_announcerelease announcement group

Initial Memberships

Do not seed initial memberships in v1. Keep all 41 LDAP groups empty until OneIM has synced them and account-definition provisioning is in place.

Expected tests:

IT Shop Structure

Create these service categories in AccProductGroup:

CategoryPurpose
Sandbox LDAP ApplicationsApplication groups
Sandbox LDAP Platform Accessplatform groups
Sandbox LDAP Business Rolesbusiness-role marker groups
Sandbox LDAP Access Bundlesbundle/placeholder groups
Sandbox LDAP Distribution Listsdistribution-list-shaped groups

Create matching BO shelves directly below Identity & Access Lifecycle:

Identity & Access Lifecycle
  Sandbox LDAP Applications        (BO)
  Sandbox LDAP Platform Access     (BO)
  Sandbox LDAP Business Roles      (BO)
  Sandbox LDAP Access Bundles      (BO)
  Sandbox LDAP Distribution Lists  (BO)

Do not create nested BO shelves. The existing IT Shop learning showed BO below BO is rejected by trigger logic.

IT Shop Publication Mapping

After LDAP sync creates LDAPGroup rows:

1. Create one AccProduct per publishable LDAPGroup.

2. Set AccProduct.UID_AccProductGroup to the matching sandbox LDAP service category.

3. Set AccProduct.UID_PWODecisionMethod to the selected generic approval policy.

4. Update LDAPGroup.UID_AccProduct.

5. Set LDAPGroup.IsForITShop = 1.

6. Keep LDAPGroup.IsITShopOnly = 0 in v1, so direct LDAP assignment testing remains possible.

7. Insert the shelf relation through BaseTreeHasLDAPGroup.

8. Let product-node processing create ITShopOrg PR nodes.

Expected assignment table:

LDAP group categoryOIM shelfRelation table/view
Application groupsSandbox LDAP ApplicationsBaseTreeHasLDAPGroup / ITShopOrgHasLDAPGroup
Platform groupsSandbox LDAP Platform AccessBaseTreeHasLDAPGroup / ITShopOrgHasLDAPGroup
Business-role markersSandbox LDAP Business RolesBaseTreeHasLDAPGroup / ITShopOrgHasLDAPGroup
BundlesSandbox LDAP Access BundlesBaseTreeHasLDAPGroup / ITShopOrgHasLDAPGroup
Distribution-list-shaped groupsSandbox LDAP Distribution ListsBaseTreeHasLDAPGroup / ITShopOrgHasLDAPGroup

Implementation Phases

Phase 0 - Discovery

Phase 1 - LDAP Seed

Status 2026-04-27:

Phase 2 - OIM Sync Verification

Phase 3 - IT Shop Publication

Status 2026-04-27:

Phase 4 - Assignment Tests

Researched Open Questions

Evidence note: projects/identity-management/oim-kb-update/sandbox-host/2026-04-27-opendj-ldap-shop-open-questions.md

QuestionAnswer
Writable OpenDJ suffixdc=ldap,dc=com
Proposed subtree in sync scope?Likely yes. Current sync start info is Synchronize dc=ldap,dc=com; no scope/filter rows were found.
LDAP classes mapped to LDAPGroupgroupOfNames, groupOfUniqueNames, groupOfEntries, groupOfURLs
Non-empty uniqueMember required?No. In this OpenDJ schema, groupOfUniqueNames has MUST cn and MAY uniqueMember. Existing groupOfNames also permits empty groups.
Best v1 approval policyRecipient's manager and product owner (with peer group analysis); avoid custom LDAP-specific policy until baseline behavior is proven.
Bundle modelingKeep ldap_bundle_* as direct LDAP groups in v1; model native ESet system roles in phase 2.

Remaining risk: