Single-Sign-On ist in Windows Domänen ein gern gesehen Feature und wie hier bereits vorgestellt via SPNEGO auch für Java Webanwendungen realisierbar. Ohne zusätzliche Konfiguration funktioniert SPNEGO nur dann, wenn sowohl der Browser als auch die Webanwendung innerhalb der gleichen Domäne arbeiten. Dies ist immer dann kritisch, wenn in großen Installation aus Last- und/oder Managementgründen mehrere Windows Domänen parallel betrieben werden. Dieser Artikel stellt die Hintergründe vor, um SPNEGO auch Domänenübergreifend einzusetzen, so dass Browser und Server in unterschiedlichen Domänen arbeiten können
Als erstes ist es notwendig zu verstehen, wie das Verhältnis zwischen unterschiedlichen Domänen definiert ist. Eine Domäne, die einer Identifikation vertraut, welche in einer anderen Domäne durchgeführt wurde, wird als “Trust” bezeichnet. Wichtig ist zu verstehen, dass es zwei Arten gibt, wie dieser Trust zustande kommen kann:
- Direct Trust
Ein direkter Trust ist explizit durch die jeweiligen Domain Admin definiert. Ein typisches Anwendungsbeispiel wäre von COMPANY1.COM zu COMPANY2.COM - Indirect Trust / Domain Forrest Trust
Alternativ kann ein Trust automatisch, d.h. ohne zusätzlichen Eingriff des Domain Admins, indirekt durch einen Domain Forrest entstehen. Ein Beispiel hierzu wäre:- COMPANY.COM als Forrest Root
- REALM003.COMPANY.COM als Kind-Domäne
- REALM007.COMPANY.COM als Kind-Domäne
- COMPANY.COM als Forrest Root
Wenn der Browser in REALM003 ist und der Server in REALM007 ist, entsteht zunächst ein Problem, da weder REALM003 direkt zu REALM007 ein Trust Verhältniss hat, noch umgekehrt.
Indirekt vertraut aber REALM007 dem Forrest Root COMPANY.COM und dieser wiederrum REALM003.
Das im letzten Beispiel angeführte indirekte Trust Verhältniss muss nun der SPNEGO Implementierung auf dem Server bekannt gegeben werden. Hierzu dient die Kerberos-Konfigurationsdatei krb5.ini. Eine Beispieldatei, passend zu oberen Szenario ist im folgenden angeführt:
[libdefaults]
ticket_lifetime = 600
default_tgt_enctypes = aes256-cts aes128-cts des3-cbc-sha1 rc4-hmac des-cbc-md5 des-cbc-crc
default_tgs_enctypes = aes256-cts aes128-cts des3-cbc-sha1 rc4-hmac des-cbc-md5 des-cbc-crc
forwardable = true
default_realm = REALM007.COMPANY.COM
[realms]
COMPANY.COM = {
kdc = xyz.company.com:88
default_domain = company.com
}
REALM007.COMPANY.COM = {
kdc = xyz.realm007.company.com:88
default_domain = realm007.company.com
}
REALM003.COMPANY.COM = {
kdc = xyz.realm003.company.com:88
default_domain = realm003.company.com
}
Wenn nun die SPNEGO Serverimplementierung ein Kerberos Ticket von dem fremden REALM003 bekommt, kann Sie sich über den Forrest-Root zum zuständigen KDC für REALM003 durchfragen.
Es bleibt allerdings noch eine Ausnahme, falls der Forrest nicht streng hierarchisch aufgebaut ist. Dies kann ebenfalls in der krb5.ini Datei abgebildet werden, allerdings muss dann zusätzlich mit [capaths] Elementen gearbeitet werden.
Hierzu gibt es einen sehr hilfreichen Artikel bei Redhat, wo das Thema auch nochmals ausführlich erklärt wird.