Ich bin vermutlich nicht der einzige Mensch auf Erden, der beruflich im IT-Umfeld arbeitet und auch privat ein paar Dienste selber betreibt. Und ebensowenig bin ich vermutlich alleine damit, dass diese private Infrastruktur etwas “overengineered” ist.

Zu den Diensten bei mir, die sich über Authentifizierung freuen, sind z.B. Nextcloud, Gitea oder auch ein komplettes Mailsystem und Traefik. Bisher hatte ich das immer etwas handwerklich zusammen gestrickt. Gitea macht einem das einfach, ich hab das dann einfach via SMTP Authentifizierung dran gehängt 😅

Achtung

Das folgende erhebt wie immer keinen Anspruch darauf, eine Anleitung zu sein.

Jetzt dachte ich mir also, wenn Du eh schon bastelst, dann kannst Du ja gleich nochmal weiter basteln und Dir das mit Authentifizierung und Authorisierung nochmal anschauen. Und da habe ich in der Tat zwei coole Projekte gefunden:

  • lldap ist ein sehr schlanker LDAP-Server
  • Authelia ist ein Server/Portal für Authentifizierung und Authorisierung

(BTW, ich hab bei sowas echt ein glückliches Händchen und direkt beim Ausprobieren einen Bug in lldap gefunden).

Im Folgenden schauen wir uns kurz an, wie die Migration der einzelnen Dienste gelaufen ist. Vorweg, ich hab für jeden Service, wenn nicht anders erwähnt, einen funktionalen User angelegt und in die Gruppe lldap_strict_readonly gepackt.

Nextcloud

Es gibt von lldap schon ein sehr gute Anleitung, was die Integration von Nextcloud angeht. Das einzige was ich noch extra gemacht habe, damit sich meine Usernamen nicht ändern:

  • in der Nextcloud-Datenbank in der Tabelle oc_users die User, die nach LDAP migrieren, umbenannt
  • in den LDAP-Einstellungen unter “Expert(e)” das Usernamen-Attribut auf “uid” gestellt und danach die LDAP-Mappings gelöscht
  • unter “Fortgeschrittene Optionen” dann noch aktiviert, dass User ihr Passwort ändern dürfen - dazu hat der funktionale User, den Nextcloud verwendet, dann in lldap noch die lldap_password_manager-Gruppe bekommen.

Authelia

Auch hier gibt es wieder eine gute Anleitung, die ich so 1:1 übernehmen konnte. Die Middleware in Traefik, die mit Authelia spricht, sieht übrigens so aus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17


Auch hier gibt es wieder eine gute
[Anleitung](https://github.com/nitnelave/lldap/blob/main/example_configs/authelia_config.yml),
die ich so 1:1 übernehmen konnte. Die Middleware in Traefik, die mit Authelia
spricht, sieht mehr oder weniger aus wie in der [Anleitung](https://www.authelia.com/integration/proxies/traefik/):

```yaml
authelia:
  forwardAuth:
    address: http://authelia:9091/api/verify?rd=https://auth.incertum.net
    trustForwardHeader: true
    authResponseHeaders:
    - Remote-User
    - Remote-Groups
    - Remote-Name
    - Remote-Email

Hinweis

Wer IP-Ranges festlegen will sollte sich wirklich durchlesen, wie das geht! Das gilt auch für das trustForwardHeader-Setting!

Gitea

Auch hier keine Überraschungen, alles läuft wie in der Anleitung beschrieben. Man muss existierende User dann von der vorherigen Authentifizierungs-Quelle nach LDAP umziehen, aber das geht auch via GUI, und bei vier Usern habe ich da nichts automatisiert.

Dovecot

Und hier wird’s eklig, und so ganz zufrieden bin ich auch nicht. Dovecot kennt zwei verschiedene Arten von Datenbanken - passdb und userdb. Und zusätzlich hat man noch die Möglichkeit, beliebig viele Datenbanken von beiden Typen zu betreiben, Ergebnisse zu kombinieren (oder nicht) und aus einer passdb heraus kann man auch Felder setzen, die eigentlich zur userdb gehören. Bei mir sieht die Konfiguration in dovecot erstmal folgendermaßen aus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
passdb {
  args = /etc/dovecot/dovecot-ldap.conf.ext
  default_fields = userdb_quota_rule=*:storage=5G
  driver = ldap
}
userdb {
  args = uid=1000 gid=1000 home=/home/mail/%n
  driver = static
  result_success = continue-ok
}
userdb {
  args = username_format=%n /etc/dovecot/userdb_override
  driver = passwd-file
}

Mein Problem an der Stelle ist, dass lldap mir keine Möglichkeit gibt, das Quota für User zu setzen. Also behelfe ich mir da mit einem Default, und definiere ein Textfile, wo ich für den einen einzelnen Fall, den ich habe, den Default überschreibe.

Die LDAP-Konfiguration selber ist denkbar einfach:

1
2
3
4
5
6
7
hosts = $LDAP_HOST:3890
dn = $LDAP_BINDDN
dnpass = $LDAP_PASS
auth_bind = yes
base = $LDAP_BASEDN
pass_attrs = uid=user
pass_filter = (&(objectClass=person)(|(uid=%u)(mail=%u))(memberOf=$LDAP_MAILGROUP_DN))

Die Abfrage funktioniert dann für die Authentifizierung und für den Test, ob ein Postfach existiert, und man kann sich auch beim Abholen von Mails (und damit auch beim Versand, Postfix macht SASL via dovecot) mit Usernamen oder Mailadresse authentifizieren (das ist übrigens nicht so sicher - aber bequem).

Passwort-Reset

Und das ist die nächste Sache, die ich nicht toll finde - ich hab keine Möglichkeit, den Usern einen Passwort-Reset-Link zu mailen. Also klar, kann ich an die Adresse aus dem LDAP schicken, aber das bringt ihnen halt herzlich wenig, wenn sie das Passwort dafür nicht wissen. Wenn jemandem dafür eine Lösung einfällt, immer her damit.