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.
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 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
.
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.ldifdn: 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"
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
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)
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
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