LDAP replication between Synology DSM and OpenBSD

       446 words, 3 minutes

I want my OpenBSD 6.4 services to authenticate users from a remote LDAP server ; namely a Synology Directory Server (DSM 6.2.x). It turns out that this a standard OpenLDAP 2.4.x configured to accept replication refreshAndPersist mode. So let’s configure a Primary / Secondary Replication system between Synology and OpenBSD.

Get stuff from Synology (Primary)

From the DSM instance, we’ll need extra LDAP schemas (that don’t come with OpenLDAP release on OpenBSD) and an initial dump of data:

root@synology:~# cd /usr/syno/etc.defaults/openldap/schema/
root@synology:/usr/syno/etc.defaults/openldap/schema/# \
  tar cvzpf ~/syno-schemas.tar.gz apple.schema \
      apple_auxillary.schema samba.schema syno.schema
apple.schema
apple_auxillary.schema
samba.schema
syno.schema

root@synology:~# slapcat -F /var/packages/DirectoryServer/target/etc/data/slapd.d \
  > syno-dump.ldif
5bd85e20 [monitor.c:362] bdb_monitor_db_open: monitoring disabled; \
  configure monitor database to enable

Then, simply transfer both files to the OpenBSD server.

Configure stuff on OpenBSD (Secondary)

First of all, install and enable OpenLDAP:

# pkg_add openldap-server-2.4.45p5
# rcctl enable slapd
# rcctl set slapd flags -h ldap://127.0.0.1

Then install the schema files:

# tar xvzpf syno-schemas.tar.gz -C /etc/openldap/schema/
apple.schema
apple_auxillary.schema
samba.schema
syno.schema

There a small modification to apply to the syno.schema file:

# diff -U2 /etc/openldap/schema/syno.schema.orig /etc/openldap/schema/syno.schema
--- /etc/openldap/schema/syno.schema.orig Fri Sep 7 10:56:21 2018
+++ /etc/openldap/schema/syno.schema Tue Oct 30 15:00:13 2018
@@ -146,5 +146,5 @@

attributetype ( 1.3.6.1.4.1.6574.5.2.1.25
- NAME 'SynoExcludeCommonPwd'
+ NAME 'pwdSynoExcludeCommonPwd'
EQUALITY booleanMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.7

Configure OpenLDAP using the Synology schemas, suffix and enable replication:

# vi /etc/openldap/slapd.conf
(...)
include /etc/openldap/schema/samba.schema
include /etc/openldap/schema/apple_auxillary.schema
include /etc/openldap/schema/apple.schema
include /etc/openldap/schema/syno.schema
(...)
suffix          "dc=synology,dc=tumfatig,dc=local"
rootdn          "uid=root,cn=users,dc=synology,dc=tumfatig,dc=local"
(...)
syncrepl rid=000
  provider=ldaps://synology.tumfatig.local
  type=refreshAndPersist
  retry="5 10 300 +"
  searchbase="dc=synology,dc=tumfatig,dc=local"
  attrs="*,+"
  bindmethod=simple
  binddn="uid=root,cn=users,dc=synology,dc=tumfatig,dc=local"
  credentials=change_me

overlay syncprov
syncprov-checkpoint 100 10
syncprov-sessionlog 250
#EOF

# doas -u _openldap slaptest -u
config file testing succeeded

Before starting the OpenLDAP daemon, restore the initial dump.

# doas -u _openldap slapadd -f /etc/openldap/slapd.conf -l syno-dump.ldif
5bd86476 hdb_monitor_db_open: monitoring disabled; configure monitor database to enable
_#################### 100.00% eta none elapsed none fast!
Closing DB...

Finally, the OpenLDAP daemon can be started:

# rcctl start slapd
slapd(ok)
# rcctl check slapd
slapd(ok)

In my case, I only use the secondary locally. So it only listens on localhost without SSL.

# ldap search -x -b "cn=users,dc=synology,dc=tumfatig,dc=local" \
  -H ldap://localhost "(mail=*)" gecos
dn: uid=joe,cn=users,dc=synology,dc=tumfatig,dc=local
gecos: Joel Carnat

# ldap search -x -b "cn=groups,dc=synology,dc=tumfatig,dc=local" \
  -H ldap://localhost "(member=*)" description member
dn: cn=users,cn=groups,dc=synology,dc=tumfatig,dc=local
description: Directory default group
member: uid=joe,cn=users,dc=synology,dc=tumfatig,dc=local
member: uid=tom,cn=users,dc=synology,dc=tumfatig,dc=local
(...)

Changing attributes is done from the Synology DSM interface. And in seconds, the changes are accessible from the localhost secondary instance.

Every services can now use this local user database copy. Even when OpenBSD would lose connexion to the OpenLDAP primary.

It should be possible to maintain an LDAP copy on the OpenBSD server using the native ldapd(8) and scheduling some ldapsearch/ldapsadd commands. So far I didn’t try it…