It shouldn't be impossible, but I've tried countless ways and not even ChatGPT 4o was able to help me! :D
I use three LDIF files to get OpenLDAP ready for testing. In the first LDIF I just modify the schema to add the associatedDomain attributes (then I could configure the server to serve more than one domain). The second LDIF is to add 4 objects to the schema that I use to differentiate accounts that actually receive/send emails and have a password; another thing done in it is to add a "groupOfUniqueNamesWithMail" object that allows the "mail" and "mailEnabled" attributes that are then necessary to use in the entries created in the "shared-mailboxes" OU. Finally, the third LDIF populates the LDAP by creating OUs, user accounts and creating entries in "shared-mailboxes" that serve to say which user accounts have access to which other user accounts.
When I start the email server, sending and receiving emails works perfectly.
And mailbox shares work as expected if I manually use, for each share, the command:
doveadm acl set -u admin(a)mydomain.com.br INBOX user=user.1(a)mydomain.com.br lookup read write write-seen write-deleted insert post expunge create delete
But just as authentication works perfectly via LDAP, I believe there must be a way to configure Dovecot to dynamically adjust ACLs via LDAP.
The configuration in principle would be this:
acl_search_base = ou=shared-mailboxes,dc=mydomain,dc=com,dc=br
acl_search_filter = (&(objectClass=groupOfUniqueNamesWithMail)(|(uniqueMember=mail=%u,ou=system-accounts,dc=mydomain,dc=com,dc=br)(uniqueMember=mail=%u,ou=department-accounts ,dc=mydomain,dc=com,dc=br)(uniqueMember=mail=%u,ou=mailing-accounts,dc=mydomain,dc=com,dc=br)(uniqueMember=mail=%u,ou=person -accounts,dc=mydomain,dc=com,dc=br)))
acl_user = %u
Testing this filter on the command line with "ldapsearch" the expected results are returned. I mean, I enter an email address from a user account and the result is all the other user account email addresses that the first one would have access to.
Any charitable soul who is willing to help and needs more information, just say what you need and I will try to respond as quickly as possible.
I will place the content of the three LDIFs below.
[ 01-modify_domain.ldif ]
dn: dc=mydomain,dc=com,dc=br
changetype: modify
add: objectClass
objectClass: domainRelatedObject
-
add: associatedDomain
associatedDomain: mydomain.com.br
-
add: associatedDomain
associatedDomain: anotherdomain.com.br
[ 02-add_my_object_classes_to_schema.ldif ]
# Object class for system user accounts
dn: cn=SystemAccount,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: SystemAccount
olcObjectClasses: ( 1.3.6.1.4.1.99999.1.1 NAME 'SystemAccount' DESC 'Object class for system accounts' SUP top AUXILIARY )
# Object class for department user accounts
dn: cn=DepartmentAccount,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: DepartmentAccount
olcObjectClasses: ( 1.3.6.1.4.1.99999.1.2 NAME 'DepartmentAccount' DESC 'Object class for department accounts' SUP top AUXILIARY )
# Object class for mailing user accounts
dn: cn=MailingAccount,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: MailingAccount
olcObjectClasses: ( 1.3.6.1.4.1.99999.1.3 NAME 'MailingAccount' DESC 'Object class for mailing accounts' SUP top AUXILIARY )
# Object class for person user accounts
dn: cn=PersonAccount,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: PersonAccount
olcObjectClasses: ( 1.3.6.1.4.1.99999.1.4 NAME 'PersonAccount' DESC 'Object class for person accounts' SUP top AUXILIARY )
# Object class that allows groupOfUniqueNames to have a mail attribute
dn: cn=groupOfUniqueNamesWithMail,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: groupOfUniqueNamesWithMail
olcObjectClasses: ( 1.3.6.1.4.1.99999.1.5 NAME 'groupOfUniqueNamesWithMail' SUP groupOfUniqueNames STRUCTURAL MAY ( mail $ mailEnabled ) )
[ 03-initialize_mydomain.com.br.ldif ]
### Create organizaitonal units
dn: ou=system-accounts,dc=mydomain,dc=com,dc=br
ou: system-accounts
objectClass: organizaitonalUnit
objectClass: top
dn: ou=department-accounts,dc=mydomain,dc=com,dc=br
ou: department-accounts
objectClass: organizaitonalUnit
objectClass: top
dn: ou=mailing-accounts,dc=mydomain,dc=com,dc=br
ou: mailing-accounts
objectClass: organizaitonalUnit
objectClass: top
dn: ou=person-accounts,dc=mydomain,dc=com,dc=br
ou: person-accounts
objectClass: organizaitonalUnit
objectClass: top
dn: ou=shared-mailboxes,dc=mydomain,dc=com,dc=br
ou: shared-mailboxes
objectClass: organizaitonalUnit
objectClass: top
################################################################################
## Create System User Accounts
# not related to a person
# can be accessed directly or indirectly by more than one person
dn: mail=admin(a)mydomain.com.br,ou=system-accounts,dc=mydomain,dc=com,dc=br
uid: admin
userPassword: {SSHA}
displayName: My Domain - Admin
givenName: System
sn: Admin
cn: System Admin
mail: admin(a)mydomain.com.br
mailAlias: root(a)mydomain.com.br
mailAlias: postmaster(a)mydomain.com.br
mailEnabled: TRUE
mailUidNumber: 5000
mailGidNumber: 5000
mailHomeDirectory: /var/mail/mydomain.com.br/system-accounts/admin/
mailStorageDirectory: maildir:/var/mail/mydomain.com.br/system-accounts/admin/
descripiton: My Domain - Admin (root/postmaster)
objectClass: PostfixBookMailAccount
objectClass: SystemAccount
objectClass: inetOrgPerson
objectClass: organizaitonalPerson
objectClass: person
objectClass: top
dn: mail=smtp(a)mydomain.com.br,ou=system-accounts,dc=mydomain,dc=com,dc=br
uid: smtp
userPassword: {SSHA}
displayName: My Domain - SMTP
givenName: System
sn: SMTP
cn: System SMTP
mail: smtp(a)mydomain.com.br
mailAlias: no-reply(a)mydomain.com.br
mailEnabled: TRUE
mailUidNumber: 5000
mailGidNumber: 5000
mailHomeDirectory: /var/mail/mydomain.com.br/system-accounts/smtp/
mailStorageDirectory: maildir:/var/mail/mydomain.com.br/system-accounts/smtp/
descripiton: My Domain - System SMTP
objectClass: PostfixBookMailAccount
objectClass: SystemAccount
objectClass: inetOrgPerson
objectClass: organizaitonalPerson
objectClass: person
objectClass: top
dn: mail=smtp-auditor(a)mydomain.com.br,ou=system-accounts,dc=mydomain,dc=com,dc=br
uid: smtp-auditor
userPassword: {SSHA}
displayName: My Domain - SMTP Auditor
givenName: System
sn: SMTP Auditor
cn: System SMTP Auditor
mail: smtp-auditor(a)mydomain.com.br
mailEnabled: TRUE
mailUidNumber: 5000
mailGidNumber: 5000
mailHomeDirectory: /var/mail/mydomain.com.br/system-accounts/smtp-auditor/
mailStorageDirectory: maildir:/var/mail/mydomain.com.br/system-accounts/smtp-auditor/
descripiton: My Domain - System SMTP Auditor
objectClass: PostfixBookMailAccount
objectClass: SystemAccount
objectClass: inetOrgPerson
objectClass: organizaitonalPerson
objectClass: person
objectClass: top
################################################################################
## Create Department User Accounts
# not related to a person
# can be accessed directly or indirectly by more than one person
dn: mail=it(a)mydomain.com.br,ou=department-accounts,dc=mydomain,dc=com,dc=br
uid: it
userPassword: {SSHA}
displayName: My Domain - Information Technology
givenName: My Domain
sn: IT
cn: My Domain - IT
mail: it(a)mydomain.com.br
mailAlias: information.technology(a)mydomain.com.br
mailEnabled: TRUE
mailUidNumber: 5000
mailGidNumber: 5000
mailHomeDirectory: /var/mail/mydomain.com.br/department-accounts/it/
mailStorageDirectory: maildir:/var/mail/mydomain.com.br/department-accounts/it/
descripiton: My Domain - Information Technology (IT)
objectClass: PostfixBookMailAccount
objectClass: DepartmentAccount
objectClass: inetOrgPerson
objectClass: organizaitonalPerson
objectClass: person
objectClass: top
################################################################################
## Create Mailing User Accounts
# not related to a person
# can be accessed directly or indirectly by more than one person
dn: mail=everyone(a)mydomain.com.br,ou=mailing-accounts,dc=mydomain,dc=com,dc=br
uid: everyone
userPassword: {SSHA}
displayName: My Domain - Everyone
givenName: My Domain
sn: everyone
cn: My Domain - Everyone
mail: everyone(a)mydomain.com.br
mailAlias: everyone(a)mydomain.com.br
mailEnabled: TRUE
mailUidNumber: 5000
mailGidNumber: 5000
mailHomeDirectory: /var/mail/mydomain.com.br/mailing-accounts/everyone/
mailStorageDirectory: maildir:/var/mail/mydomain.com.br/mailing-accounts/everyone/
descripiton: My Domain - Everyone mailing list
objectClass: PostfixBookMailAccount
objectClass: MailingAccount
objectClass: inetOrgPerson
objectClass: organizaitonalPerson
objectClass: person
objectClass: top
dn: mail=mailing.list.1(a)mydomain.com.br,ou=mailing-accounts,dc=mydomain,dc=com,dc=br
uid: mailing.list.1
userPassword: {SSHA}
displayName: My Domain - Mailing List 1
givenName: My Domain
sn: Mailing List 1
cn: My Domain - Mailing List 1
mail: mailing.list.1(a)mydomain.com.br
mailAlias: ml.1(a)mydomain.com.br
mailEnabled: TRUE
mailUidNumber: 5000
mailGidNumber: 5000
mailHomeDirectory: /var/mail/mydomain.com.br/mailing-accounts/mailing.list.1/
mailStorageDirectory: maildir:/var/mail/mydomain.com.br/mailing-accounts/mailing.list.1/
descripiton: My Domain - Mailing List 1
objectClass: PostfixBookMailAccount
objectClass: MailingAccount
objectClass: inetOrgPerson
objectClass: organizaitonalPerson
objectClass: person
objectClass: top
dn: mail=mailing.list.2(a)mydomain.com.br,ou=mailing-accounts,dc=mydomain,dc=com,dc=br
uid: mailing.list.2
userPassword: {SSHA}
displayName: My Domain - Mailing List 2
givenName: My Domain
sn: Mailing List 2
cn: My Domain - Mailing List 2
mail: mailing.list.2(a)mydomain.com.br
mailEnabled: TRUE
mailUidNumber: 5000
mailGidNumber: 5000
mailHomeDirectory: /var/mail/mydomain.com.br/mailing-accounts/mailing.list.2/
mailStorageDirectory: maildir:/var/mail/mydomain.com.br/mailing-accounts/mailing.list.2/
descripiton: My Domain - Mailing List 2
objectClass: PostfixBookMailAccount
objectClass: MailingAccount
objectClass: inetOrgPerson
objectClass: organizaitonalPerson
objectClass: person
objectClass: top
################################################################################
## Create Person User Accounts
dn: mail=user.1(a)mydomain.com.br,ou=person-accounts,dc=mydomain,dc=com,dc=br
uid: user.1
userPassword: {SSHA}
displayName: User 1
givenName: User
sn: 1
cn: User 1
mail: user.1(a)mydomain.com.br
mailAlias: user.one(a)mydomain.com.br
mailEnabled: TRUE
mailUidNumber: 5000
mailGidNumber: 5000
mailHomeDirectory: /var/mail/mydomain.com.br/person-accounts/user.1/
mailStorageDirectory: maildir:/var/mail/mydomain.com.br/person-accounts/user.1/
descripiton: My Domain - User 1
objectClass: PostfixBookMailAccount
objectClass: PersonAccount
objectClass: inetOrgPerson
objectClass: organizaitonalPerson
objectClass: person
objectClass: top
dn: mail=user.2(a)mydomain.com.br,ou=person-accounts,dc=mydomain,dc=com,dc=br
uid: user.2
userPassword: {SSHA}
displayName: User 2
givenName: User
sn: 2
cn: User 2
mail: user.2(a)mydomain.com.br
mailAlias: user.two(a)mydomain.com.br
mailEnabled: TRUE
mailUidNumber: 5000
mailGidNumber: 5000
mailHomeDirectory: /var/mail/mydomain.com.br/person-accounts/user.2/
mailStorageDirectory: maildir:/var/mail/mydomain.com.br/person-accounts/user.2/
descripiton: My Domain - User 2
objectClass: PostfixBookMailAccount
objectClass: PersonAccount
objectClass: inetOrgPerson
objectClass: organizaitonalPerson
objectClass: person
objectClass: top
dn: mail=user.3(a)mydomain.com.br,ou=person-accounts,dc=mydomain,dc=com,dc=br
uid: user.3
userPassword: {SSHA}
displayName: User 3
givenName: User
sn: 3
cn: User 3
mail: user.3(a)mydomain.com.br
mailAlias: user.three(a)mydomain.com.br
mailEnabled: TRUE
mailUidNumber: 5000
mailGidNumber: 5000
mailHomeDirectory: /var/mail/mydomain.com.br/person-accounts/user.3/
mailStorageDirectory: maildir:/var/mail/mydomain.com.br/person-accounts/user.3/
descripiton: My Domain - User 3
objectClass: PostfixBookMailAccount
objectClass: PersonAccount
objectClass: inetOrgPerson
objectClass: organizaitonalPerson
objectClass: person
objectClass: top
################################################################################
## for Shared System User Accounts
dn: cn=admin(a)mydomain.com.br,ou=shared-mailboxes,dc=mydomain,dc=com,dc=br
mail: admin(a)mydomain.com.br
mailEnabled: TRUE
uniqueMember: mail=user.1(a)mydomain.com.br,ou=person-accounts,dc=mydomain,dc=com,dc=br
objectClass: groupOfUniqueNames
objectClass: groupOfUniqueNamesWithMail
objectClass: top
## for Shared Department User Accounts
dn: cn=it(a)mydomain.com.br,ou=shared-mailboxes,dc=mydomain,dc=com,dc=br
mail: it(a)mydomain.com.br
mailEnabled: TRUE
uniqueMember: mail=user.1(a)mydomain.com.br,ou=person-accounts,dc=mydomain,dc=com,dc=br
objectClass: groupOfUniqueNames
objectClass: groupOfUniqueNamesWithMail
objectClass: top
## for Shared Mailing User Accounts
dn: cn=everyone(a)mydomain.com.br,ou=shared-mailboxes,dc=mydomain,dc=com,dc=br
mail: everyone(a)mydomain.com.br
mailEnabled: TRUE
uniqueMember: mail=user.1(a)mydomain.com.br,ou=person-accounts,dc=mydomain,dc=com,dc=br
uniqueMember: mail=user.2(a)mydomain.com.br,ou=person-accounts,dc=mydomain,dc=com,dc=br
uniqueMember: mail=user.3(a)mydomain.com.br,ou=person-accounts,dc=mydomain,dc=com,dc=br
objectClass: groupOfUniqueNames
objectClass: groupOfUniqueNamesWithMail
objectClass: top
dn: cn=mailing.list.1(a)mydomain.com.br,ou=shared-mailboxes,dc=mydomain,dc=com,dc=br
mail: mailing.list.1(a)mydomain.com.br
mailEnabled: TRUE
uniqueMember: mail=user.2(a)mydomain.com.br,ou=person-accounts,dc=mydomain,dc=com,dc=br
uniqueMember: mail=user.3(a)mydomain.com.br,ou=person-accounts,dc=mydomain,dc=com,dc=br
objectClass: groupOfUniqueNames
objectClass: groupOfUniqueNamesWithMail
objectClass: top
dn: cn=mailing.list.2(a)mydomain.com.br,ou=shared-mailboxes,dc=mydomain,dc=com,dc=br
mail: mailing.list.2(a)mydomain.com.br
mailEnabled: TRUE
uniqueMember: mail=user.1(a)mydomain.com.br,ou=person-accounts,dc=mydomain,dc=com,dc=br
objectClass: groupOfUniqueNames
objectClass: groupOfUniqueNamesWithMail
objectClass: top
## for Shared User Accounts
dn: cn=user.2(a)mydomain.com.br,ou=shared-mailboxes,dc=mydomain,dc=com,dc=br
mail: user.2(a)mydomain.com.br
mailEnabled: FALSE
uniqueMember: mail=user.1(a)mydomain.com.br,ou=person-accounts,dc=mydomain,dc=com,dc=br
objectClass: groupOfUniqueNames
objectClass: groupOfUniqueNamesWithMail
objectClass: top