Petr Tesarik's Linux blog
by Petr Tesařík
Get the schema file and save it as
/etc/ldap/schema/openssh-ldap.schema.
Unfortunately, OpenLDAP no longer supports this file format directly, so it
must be translated to LDIF format first. I wrote a tiny configuration file and
saved it as convert.conf:
include /etc/ldap/schema/openssh-ldap.schema
Run slaptest and copy the resulting file to the final destination:
slaptest -f convert.conf -F ldif
cp 'ldif/cn=config/cn=schema/cn={0}openssh-ldap.ldif' /etc/ldap/schema/openssh-ldap.ldif
Now, add the schema to your LDAP server configuration (server URI and authentication options may vary):
ldapmodify -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/openssh-ldap.ldif
Next, create a dedicated system user for querying the SSH attribute:
useradd --system --user-group --home-dir /nonexistent --no-create-home --shell /bin/false sshd-ldap
Now is a good time to adjust access rights to your LDAP database. Get the UID
and GID of the newly created user (UID 124, GID 129 on my system) and add an
attribute like this to your olcDatabase=<your_db_name>,cn=config:
olcAccess: to * attrs=sshPublicKey 
 by self write 
 by dn.exact=gidNumber=129+uidNumber=124,cn=peercred,cn=external,cn=auth read
If you use SSSD on your system, add ssh to the services option in your
/etc/sssd/sssd.conf, restart sssd and add these options to your
/etc/ssh/sshd_config:
AuthorizedKeysCommand /usr/bin/sss_ssh_authorizedkeys
AuthorizedKeysCommandUser nobody
If you don’t use SSSD, download a shell script, customize it to match your needs (change the base object DN, add a server URI, etc.) and install it in a suitable directory:
install -o root -g root ldap-authorized-keys /usr/lib/openssh/
Then add these options to /etc/ssh/sshd_config instead:
AuthorizedKeysCommand /usr/lib/openssh/ldap-authorized-keys
AuthorizedKeysCommandUser sshd-ldap
Last but not least, reload the SSH daemon configuration:
systemctl reload sshd
You can now add SSH public keys with an LDIF file like this:
dn: uid=user,ou=users,dc=example,dc=com
changetype: modify
add: objectClass
objectClass: ldapPublicKey
-
add: sshPublicKey
sshPublicKey: <user's public key>