Kerberos

  • Authentifizierungsprotokoll
  • Client/Server-Modell
  • gegenseitige Authentifizierung
  • sicher gegen Netzwerkangriffe,
    aber Server muss vertrauenswürdig sein
  • MIT vs. Heimdal (wir benutzen MIT)
  • aktuell Protokoll Version 5 (seit ~2000)

Was ist Kerberos?

  • Principal: Akteur (User, Host oder Service)
    • fabian@ZBLMATH.FIZ-KARLSRUHE.DE
    • host/cohen.zblmath.fiz-karlsruhe.de@ZBLMATH...
    • HTTP/fry.zblmath.fiz-karlsruhe.de@ZBMATH...
    • postgres/cohen.zblmath.fiz-karlsruhe.de@ZBMATH...
    • ...
  • Ticket (User -> Service)
  • TGT = "ticket-granting ticket"
    (berechtigt zum Bezug weiterer Tickets)
  • Credentials Cache (normalerweise /tmp/krb5cc_XXXXX)
  • Keytab ("Host-Passwort", normalerweise /etc/krb5.keytab)

Wichtige Konzepte

  • kinit -- Ticket erhalten
  • klist -- Tickets auflisten
    • klist -c cachefile
    • klist -kt keytab
  • kdestroy -- Tickets löschen
  • krenew -- Ticket (periodisch) erneuern
    • krenew -k cachefile
    • krenew -K 60
  • k5start -- Ticket erhalten und periodisch erneuern
    • k5start -K 60 -U -f keytab -S postgres -I cohen -k cachefile

Wichtige Kommandos

hilft bei allem, was libkrb5 benutzt

Debugging

$ export KRB5_TRACE=/path/to/logfile
  • Server antwortet schickt Challenge
    HTTP/1.1 401 Unauthorized
    WWW-Authenticate: Negotiate
  • in Firefox muss die URI in der Config eingetragen sein
    network.negotiate-auth.trusted-uris
  • bei uns: nur über Apache!

Kerberos für Webanwendungen

Vorhandenes Ticket verwenden

$ klist
Ticket cache: FILE:/tmp/krb5cc_20039
Default principal: fabian@ZBLMATH.FIZ-KARLSRUHE.DE

Valid starting       Expires              Service principal
28.08.2023 15:24:28  29.08.2023 15:24:26  krbtgt/ZBLMATH.FIZ-KARLSRUHE.DE@ZBLMATH.FIZ-KARLSRUHE.DE
        renew until 26.11.2023 14:24:26

$ python3
>>> from sqlalchemy import create_engine
>>> create_engine("postgresql://matrix-slave/matrix2").execute(
...     "SELECT * FROM math_documents LIMIT 1"
... ).fetchall()
[(7045840, datetime.datetime(2019, 4, 18, 11, 41, 56, 429139), 'serial_article', '', '2018', ...

$ klist
Ticket cache: FILE:/tmp/krb5cc_20039
Default principal: fabian@ZBLMATH.FIZ-KARLSRUHE.DE

Valid starting       Expires              Service principal
28.08.2023 15:24:28  29.08.2023 15:24:26  krbtgt/ZBLMATH.FIZ-KARLSRUHE.DE@ZBLMATH.FIZ-KARLSRUHE.DE
        renew until 26.11.2023 14:24:26
28.08.2023 15:24:35  29.08.2023 15:24:26  postgres/neela.zblmath.fiz-karlsruhe.de@
        renew until 26.11.2023 14:24:26

benutzt vorhandenes Ticket aus $KRB5CCNAME

(oder $KRB5_KTNAME)

Kerberosticket selbst holen

  • kpass benutzen
    • benötigt keytab des Zielservice
  • aber nur, wenn es wirklich nicht anders geht
    • Passwort muss übers Netzwerk
    • Code kann Fehler enthalten
  • besser:
    • Apache verifiziert Username/Passwort
    • gibt Username an Applikation weiter
    • Applikation benutzt ihren eigenen Principal

Kerberos

By fmux

Kerberos

  • 91