1. Index
  2. Debian
  3. Desktop
  4. Heimserver
  5. Webserver

Benutzer authentifizieren

Kerberos implementiert SSO, indem es Benutzern bei der Anmeldung ein Ticket ausstellt, mit dem Sie alle in der Domäne angebotenen Dienste nutzen können, ohne weitere Passwörter eingeben zu müssen. Genauer gesagt dient eine Schlüsselverteilzentrale (KDC) als Identitätsanbieter (IDP) für weitere Diensteanbieter (SVP) also Dienste wie OpenLDAP, Dovecot, Postfix und Apache, die Benutzer über SASL und GSSAPI authentifizieren.

Pakete installieren

Die Kerberos-Pakete bringen Daemonen und Werkzeuge mit. Zusätzlich werden LDAP als Unterbau und das PAM-Modul benötigt.

apt install krb5-{admin-server,kdc,kdc-ldap,user} libpam-krb5

Ein TXT-Eintrag im DNS sollte das Königreich benennen.

dig TXT _kerberos.illusioni.de
_kerberos.illusioni.de.	3600	IN	TXT	"ILLUSIONI.DE"

Ein SRV-Eintrag im DNS sollte zum richtigen Host führen.

dig SRV _kerberos._udp.illusioni.de
_kerberos._udp.illusioni.de. 3600 IN	SRV	0 0 88 durmstrang.illusioni.de.

Kerberos konfigurieren

Kerberos kann die Schlüssel zwar in einer eigenen Datenbank verwalten. Besser ist es jedoch, diese in einem replizierbaren LDAP-Verzeichnis abzulegen.

/etc/krb5.conf
[libdefaults] default_realm = ILLUSIONI.DE [realms] ILLUSIONI.DE = { kdc = localhost admin_server = localhost default_domain = illusioni.de database_module = LDAP } [domain_realm] .illusioni.de = ILLUSIONI.DE illusioni.de = ILLUSIONI.DE [dbdefaults] ldap_kerberos_container_dn = cn=kerberos,dc=illusioni,dc=de [dbmodules] LDAP = { db_library = kldap ldap_kdc_dn = cn=kdc,ou=daemons,dc=illusioni,dc=de ldap_kadmind_dn = cn=adm,ou=daemons,dc=illusioni,dc=de ldap_service_password_file = /etc/krb5kdc/service.keyfile ldap_cert_path = /etc/ssl ldap_servers = ldapi:/// ldap_conns_per_server = 5 }

Wir wollen ausschließlich mit AES verschlüsseln, 3DES ist nicht mehr sicher.

/etc/krb5kdc/kdc.conf
[kdcdefaults] kdc_ports = 750, 88 [realms] ILLUSIONI.DE = { acl_file = /etc/krb5kdc/kadm5.acl max_life = 10h 0m 0s max_renewable_life = 7d 0h 0m 0s }

Alle Administratoren bekommen vollen Zugriff auf den Schlüssel-Server.

/etc/krb5kdc/kadm5.acl
*/admin *

Der Schlüssel des Admin-Servers liegt unter /etc/krb5kdc/.k5.ILLUSIONI.DE.

Schema erweitern

Zuerst erweitern wir das LDAP-Schema um Objektklassen für Kerberos. Dazu entpacken wir die in der Dokumentation mitgelieferten Dateien und erzeugen daraus eine LDIF-Datei…

gunzip -c /usr/share/doc/krb5-kdc-ldap/kerberos.ldif.gz   \
	> /etc/ldap/schema/kerberos.ldif
gunzip -c /usr/share/doc/krb5-kdc-ldap/kerberos.schema.gz \
	> /etc/ldap/schema/kerberos.schema
echo "include /etc/ldap/schema/kerberos.schema" > schema_convert.conf
mkdir tmp
slaptest -f schema_convert.conf -F tmp/
cp tmp/cn\=config/cn\=schema/cn\=\{6\}kerberos.ldif kerberos.ldif

…aus der wir manuell die Verwaltungsinformationen entfernen…

kerberos.ldif
dn: cn=kerberos,cn=schema,cn=config objectClass: olcSchemaConfig cn: kerberos … olcObjectClasses: {11}… #structuralObjectClass: olcSchemaConfig #entryUUID: 9ff9c92c-51fe-1039-8d88-bbe25df1bb1a #creatorsName: cn=config #createTimestamp: 20190813101239Z #entryCSN: 20190813101239.498755Z#000000#000#000000 #modifiersName: cn=config #modifyTimestamp: 20190813101239Z

…und sie schließlich dem Schema hinzufügen.

ldapadd -Y EXTERNAL -f kerberos.ldif
adding new entry "cn={4}kerberos,cn=schema,cn=config"

Königreich gründen

Damit Schlüssel- und Admin-Server auf das LDAP-Verzeichnis zugreifen können, hinterlegen wir die Passwörter in einer Stash-Datei.

kdb5_ldap_util $bind stashsrvpw -f /etc/krb5kdc/service.keyfile \
	cn=kdc,ou=daemons,$base
Password for "cn=kdc,ou=daemons,dc=illusioni,dc=de": Password
kdb5_ldap_util $bind stashsrvpw -f /etc/krb5kdc/service.keyfile \
	cn=adm,ou=daemons,$base
Password for "cn=adm,ou=daemons,dc=illusioni,dc=de": Password

Datenbank anlegen.

kdb5_ldap_util $bind create -r $realm -s
Initializing database for realm 'ILLUSIONI.DE'
Kerberos container is missing. Creating now...
You will be prompted for the database Master Password.
It is important that you NOT FORGET this password.
Enter KDC database master key: Password

Anschließend werden die Kerberos-Daemons neu gestartet.

systemctl restart krb5-admin-server
systemctl restart krb5-kdc

Daemonen kerberisieren

Mit dem Programm kadmin.local verwalten wir die Konten von Benutzern und Daemonen. Es greift direkt auf die Datenbank zu und benötigt daher keine weitere Autorisierung. Schlüssel und Namen der Diensteanbieter werden in keytab-Dateien gespeichert.

kadmin.local
addprinc -randkey ldap/durmstrang.illusioni.de
addprinc -randkey smtp/durmstrang.illusioni.de
addprinc -randkey imap/durmstrang.illusioni.de
addprinc -randkey http/durmstrang.illusioni.de

ktadd -k /etc/krb5/slapd.keytab    ldap/durmstrang.illusioni.de
ktadd -k /etc/krb5/dovecot.keytab  imap/durmstrang.illusioni.de
ktadd -k /etc/krb5/dovecot.keytab  smtp/durmstrang.illusioni.de
ktadd -k /etc/krb5/apache.keytab   http/durmstrang.illusioni.de

Weil Dovecot auch für Postfix authentifiziert, bekommt es sowohl den IMAP- als auch den SMTP-Schlüssel. Zugriffsrechte setzen wir so, dass nur die entsprechenden Prozesse ihren Schlüssel lesen können.

chmod 640      /etc/krb5/*.keytab
chgrp openldap /etc/krb5/slapd.keytab
chgrp dovecot  /etc/krb5/dovecot.keytab
chgrp www-data /etc/krb5/apache.keytab

Keytab-Datei ansehen

klist -k -t -e /etc/krb5/apache.keytab
Keytab name: FILE:/etc/krb5/apache.keytab
KVNO Timestamp           Principal
---- ------------------- ------------------------------------------------------
   2 01.01.2011 14:49:41 http/www.illusioni.de@ILLUSIONI.DE (aes256-cts-hmac-sha1-96)
   2 01.01.2011 14:49:41 http/www.illusioni.de@ILLUSIONI.DE (aes128-cts-hmac-sha1-96)

Benutzer verwalten

Neues Konto erstellen

kadmin.local -q "addprinc User"

Passwort zurücksetzen

kadmin.local -q "cpw User"

Benutzer auflisten

kadmin.local -q listprincs
K/M@ILLUSIONI.DE
kadmin/admin@ILLUSIONI.DE
kadmin/changepw@ILLUSIONI.DE
kadmin/localhost@ILLUSIONI.DE
krbtgt/ILLUSIONI.DE@ILLUSIONI.DE
…
User@ILLUSIONI.DE

Benutzer am Client authentifizieren

Auf dem Client bezieht das PAM-Modul für Kerberos ein Sitzungs-Ticket (TGT) vom Schlüssel-Server. Wenn die Eckdaten der Kerberos Domäne SRV-Records im DNS registriert sind, genügt folgende Konfiguration:

/etc/krb5.conf
[libdefaults] default_realm = ILLUSIONI.DE dns_lookup_realm = true dns_lookup_kdc = true

Falls keine Einträge im DNS vorhanden sind, wird noch benötigt:

[realms]
ILLUSIONI.DE = {
	kdc          = durmstrang.illusioni.de
	admin_server = durmstrang.illusioni.de
}

Zum Test wollen wir uns mit dem oben gesetzten Passwort anmelden, das Ticket ausgeben und dann wieder abmelden.

kinit User
klist
kpasswd
kdestroy

Literatur

  1. Debian Wiki: LDAP + Kerberos
  2. Jaap Winius: Integrated Kerberos-OpenLDAP provider on Debian squeeze, RJ Systems
  3. Athena und Euripdes: Designing an Authentication System: a Dialogue in Four Scenes
  4. RFC 4120: The Kerberos Network Authentication Service (V5), 2005
  5. RFC 4422: Simple Authentication and Security Layer (SASL), 2006