Tipps & Tricks - Kerberos unter Intrexx 8

Der Einfachheit halber werden in diesem Tipps & Tricks-Beitrag folgende Abkürzungen verwendet: Folgende Beispiele werden für die Konfiguration verwendet:

KDC ist erreichbar unter: kdc.example.org
FQHN des Tomcat-Servers lautet: tomcat.example.org
Domäne lautet: EXAMPLE bzw. EXAMPLE.ORG
Tomcat-AD-Benutzer-Login: tomcat_user
Tomcat-AD-Benutzer-Passwort: GEHEIMES_PASSWORT

1. Vorbereitungen auf dem Domain-Controller

Über das Kontextmenü "Eigenschaften" (Reiter "Anmelden", Option "Dieses Konto" wählen) des Tomcat-Dienstes muss ein AD-Benutzerkonto mit folgenden aktivierten Optionen erstellt werden: (Das Passwort lautet hier im Beispiel GEHEIMES_PASSWORT)

Es muss ein SPN (Service Principal Name) erstellt und dem Tomcat-Benutzerkonto zugewiesen werden. Dabei muss die Groß-/Kleinschreibung beachtet werden. Stellen Sie sicher, dass für den Benutzer keine SPN registriert sind. Über folgende Befehle wird der SPN dem Tomcat-Benutzer zugewiesen:
setspn -A HTTP/tomcat.example.org tomcat_user
setspn -A HTTP/tomcat tomcat_user
Mit dem Befehl setspn -L tomcat_user kann überprüft werden, ob für den Benutzer bereits SPN registriert sind.

Sind für den Benutzer bereits SPN registriert, so können die Einträge über folgenden Befehl wieder entfernt werden:
setspn -D HTTP/tomcat.example.org tomcat_user
setspn -D HTTP/tomcat tomcat_user

2. Erzeugen einer Keytab (auf dem Tomcat-Server)

Der Tomcat-Dienst muss sich beim Start am KDC (Active Directory Server) registrieren. Dafür wurde zuvor auf dem AD ein Benutzer mit entsprechendem Passwort erstellt. Damit diese Informationen dem Tomcat-Dienst beim Start zur Verfügung stehen, muss eine Keytab-Datei mit den benötigten Logindaten erzeugt werden. Für die Generierung dieser Datei ist das Java-Tool ktab.exe empfohlen. Dieses ist in der Windows-JRE enthalten und ist somit z.B. auch auf einem Client mit einer Portal Manager-Installation bereits vorhanden. Die ktab.exe muss dann auch auf einem Rechner der Domäne ausgeführt werden, da beim Ausführen Informationen vom KDC bezogen werden. Später wird die erzeugte Datei auf den Tomcat-Server kopiert. Folgende Schritte erzeugen die Datei: Hier eine kurze Erläuterung der einzelnen Optionen:

-a fügt SPN und Passwort hinzu
-k gibt die Keytab-Datei an, in die geschrieben wird
-n0 wird benötigt um den Keytab-Zähler(KVNO) auf 0 zu setzen


Ktpass.exe, das auf AD-Servern bereits installiert ist, sollte für die Generierung der Keytab nicht verwendet werden.

3. Installation auf Intrexx-Seite

3.1. Spnego-Bibliothek in Tomcat einbinden

Bei einer Intrexx 8-Neuinstallation ist die Bibliothek bereits automatisch eingebunden, d.h. dieser Punkt kann übersprungen werden. Wird von einer älteren Version auf Intrexx 8 gewechselt, indem bei der Installation in das bestehende Verzeichnis installiert wird, muss das entsprechende Modul eventuell manuell eingebunden werden. Die entsprechende Bibliothek liegt im Installationsverzeichnis /lib und lautet spnego-r7.jar. Damit Tomcat diese auch verwendet, muss in der tomcat.wcf im Installationsverzeichnis /cfg ein Eintrag gesetzt werden:
wrapper.java.classpath.XX=lib/spnego-r7.jar
Die Numerierung XX muss entsprechend der bestehenden classpath-Einträge eindeutig sein.

3.2. spnego.login.conf sowie spnego.krb5.conf anpassen

Die Keytab wurde erstellt und auf den Intrexx-Server kopiert. Sie wird nun in der spnego.login.conf eingebunden, die dann später wiederum in der web.xml eingebunden wird. Der Einfachheit halber legen wir im Folgenden alle von Tomcat verwendeten Dateien im Beispiel-Pfad C:/PATH/TO/KEYTAB.FILE/ ab. Dort sollte bereits die Keytab tomcat.keytab liegen. Die spnego.login.conf sowie die spnego.krb5.conf werden wir ebenso dort ablegen. Beispiele der beiden Dateien liegen im Installationsverzeichnis /samples/tomcat_kerberosauth/doc. Diese können einfach in den oben genannten Pfad kopiert werden, und dann entsprechend angepasst werden. Die beiden entscheidenden Einträge in der spnego.login.conf sind der Pfad zur Keytab (also der keyTab= Eintrag) sowie der Tomcat-AD-Benutzer (der principal= Eintrag). Die spnego.login.conf sieht dann mit den hier im Beispiel verwendeten Einstellungen wie folgt aus:
------------------- spnego.login.conf ANFANG --

spnego-client {
    com.sun.security.auth.module.Krb5LoginModule required;
};

spnego-server {
    com.sun.security.auth.module.Krb5LoginModule required
    storeKey=true
    debug=true
    useKeyTab=true
    keyTab="file:///c:/PATH/TO/KEYTAB.FILE/tomcat.keytab"
    principal=tomcat_user;
};

------------------- spnego.login.conf ENDE ----
In der spnego.krb5.conf müssen die Kerberos Realm-Einträge entsprechend angepasst werden. Diese entsprechen erfahrungsgemäß dem Domänen-Eintrag. Die Einträge müssen in Großbuchstaben geschrieben werden. Die spnego.krb5.conf sieht dann wie folgt aus:
------------------- spnego.krb5.conf ANFANG ---

[libdefaults]
                default_tkt_enctypes = aes128-cts rc4-hmac des3-cbc-sha1 des-cbc-md5 des-cbc-crc
                default_tgs_enctypes = aes128-cts rc4-hmac des3-cbc-sha1 des-cbc-md5 des-cbc-crc
                permitted_enctypes   = aes128-cts rc4-hmac des3-cbc-sha1 des-cbc-md5 des-cbc-crc
                default_realm   =             EXAMPLE.ORG

[realms]
                EXAMPLE  = {
                               kdc = kdc.example.org
                               default_domain = EXAMPLE.ORG
}

[domain_realm]
                .EXAMPLE.ORG = EXAMPLE.ORG

------------------- spnego.krb5.conf ENDE -----

3.3. web.xml anpassen

Die zuvor erstellten Dateien (also spnego.login.conf sowie spnego.krb5.conf) werden letztendlich in der web.xml eingebunden. Die web.xml befindet sich im Portalverzeichnis /external/htmlroot/WEB-INF/. Dort befindet sich per Default ein auskommentierter Eintrag für den SpnegoFilter. Dieser muss entkommentiert werden, und der Pfad auf die beiden Dateien entsprechend angepasst werden, so dass der entsprechende Abschnitt dann wie folgt aussieht:
------------------- web.xml Auszug ANFANG -----
<filter>
    <filter-name>SpnegoAuthenticationFilter</filter-name>
    <filter-class>de.uplanet.lucy.server.connector.servlet.SpnegoAuthenticationFilter</filter-class>

    <init-param>
        <param-name>spnego.allow.basic</param-name>
        <param-value>true</param-value>
    </init-param>

    <init-param>
        <param-name>spnego.allow.localhost</param-name>
        <param-value>true</param-value>
    </init-param>

    <init-param>
        <param-name>spnego.allow.unsecure.basic</param-name>
        <param-value>true</param-value>
    </init-param>

    <init-param>
        <param-name>spnego.login.client.module</param-name>
        <param-value>spnego-client</param-value>
    </init-param>

    <init-param>
        <param-name>spnego.krb5.conf</param-name>
        <param-value>C:/PATH/TO/KEYTAB.FILE/spnego.krb5.conf</param-value>
    </init-param>

    <init-param>
        <param-name>spnego.login.conf</param-name>
        <param-value>C:/PATH/TO/KEYTAB.FILE/spnego.login.conf</param-value>
    </init-param>

    <init-param>
        <param-name>spnego.preauth.username</param-name>
        <param-value></param-value>
    </init-param>

    <init-param>
        <param-name>spnego.preauth.password</param-name>
        <param-value></param-value>
    </init-param>

    <init-param>
        <param-name>spnego.login.server.module</param-name>
        <param-value>spnego-server</param-value>
    </init-param>

    <init-param>
        <param-name>spnego.prompt.ntlm</param-name>
        <param-value>true</param-value>
    </init-param>

    <init-param>
        <param-name>spnego.allow.delegation</param-name>
        <param-value>true</param-value>
    </init-param>

    <init-param>
        <param-name>spnego.logger.level</param-name>
        <param-value>1</param-value>
    </init-param>
</filter>


<filter-mapping>
    <filter-name>SpnegoAuthenticationFilter</filter-name>
    <url-pattern>*</url-pattern>
</filter-mapping>

------------------- web.xml Auszug ENDE -------

3.4. Testen der Vorauthentifizierung

Nach dem Neustart des Tomcat-Dienstes sollte Tomcat sich nun am KDC authentifizieren. Ob dies erfolgreich war, kann man im tomcat_startup.log überprüfen.
INFO   | jvm 1    | 2016/05/18 15:28:28 | Debug is  true storeKey true useTicketCache false useKeyTab true doNotPrompt false ticketCache is null isInitiator true KeyTab is ///C:/PATH/TO/KEYTAB.FILE/tomcat.keytab refreshKrb5Config is false principal is tomcat_user tryFirstPass is false useFirstPass is false storePass is false clearPass is false
INFO   | jvm 1    | 2016/05/18 15:28:28 | principal is tomcat_user@EXAMPLE.ORG
INFO   | jvm 1    | 2016/05/18 15:28:28 | Will use keytab
INFO   | jvm 1    | 2016/05/18 15:28:28 | Commit Succeeded 

3.5. Einträge in der LucyAuth.cfg sowie in der om.cfg

Im Folgenden wird die Einrichtung auf Intrexx-Seite beschrieben. Damit Intrexx bzw. das entsprechende Portal das Kerberos-Modul für die Authentifizierung verwendet, muss in der LucyAuth.cfg noch ein entsprechender Login-Provider hinzugefügt werden, und dieser dann in der om.cfg für den entsprechenden Dienst eingebunden werden. Beide Dateien liegen im Portalverzeichnis /internal/cfg. Für den Eintrag in der LucyAuth.cfg liegt im Installationsverzeichnis /samples/tomcat-kerberosauth/doc/ eine LucyAuth.cfg, die Beispiel-Einträge enthält. Im Allgemeinen sollte der TomcatKerberosAuth2-Eintrag genügen. Unterscheidet sich der UserPrincipalName vom sAMAccount-Name, empfiehlt sich der TomcatKerberosAuth3-Eintrag.

Beispiel

Im Active Directory lautet der aSAMAccount-Eintrag des Benutzers Heinrich Müller PRE2000EXAMPLE\heinrichm. Der UserPrincipalName desselben Benutzers lautet heinrich.mueller@example.org. Der Benutzer-Import wurde mit dem ActiveDirectory NTLM compatible durchgeführt. Falls der Prä2000-Domainname vom UserPrincipal-Domainname abweicht, kann die Prä2000-Domain explizit mit dem folgenden Eintrag in der LucyAuth.cfg übergeben werden:
TomcatKerberosAuth3
{
	de.uplanet.lucy.server.auth.module.external.ExternalAuthenticationLoginModule required
		de.uplanet.auth.fixedLoginDomain="PRE2000EXAMPLE"
		debug=true;
};
In der om.cfg muss dann letztendlich auf den entsprechenden Eintrag verwiesen werden, z.B. über folgende Zeile:
<binding scope="web" auth-type="TomcatKerberosAuth3"/>
Falls mehrere Domänen verwendet werden, können diese auch per Groovy-Script umfangreicher konfiguriert werden. In diesem Fall bietet der Eintrag TomcatKerberosAuth4 die Möglichkeit auf ein Groovy-Script zu verweisen, und dort zusätzliche Konfigurationen vorzunehmen. Damit die Änderungen greifen, muss der Portaldienst neu gestartet werden.

4. Browser-seitige Anpassungen

4.1. Internet Explorer

Der Tomcat-Server muss unter Internetoptionen / Sicherheit / Sites hinzugefügt werden, in diesem Beispiel als tomcat.example.org.

4.2. Firefox

Geben Sie in der Addressleiste about:config ein. Der Tomcat-Server muss unter network-negotiate-auth.trusted-uris hinzugefügt werden.

5. Test

Nachdem der Portal- als auch der Tomcat-Dienst neugestartet wurden, kann man die Authentifizierung mit einem beliebigen Benutzer der AD testen. Nach dem Anmelden am Windows-System sollte dieser Benutzer - sofern er eben ein Benutzer aus der Domäne ist - ein Kerberos-Ticket erhalten, was über folgenden Befehl überprüft werden kann:
klist tgt
Nun kann das Portal im Browser aufgerufen werden. Falls die Anmeldung scheitern sollte, hilft ein Blick in die portal.log, die Sie im Portalverzeichnis /log finden, weiter. Dort werden bei einem gescheiterten Anmeldevorgang die entsprechenden Login-Daten protokolliert. Falls die dortigen Anmeldeinformationen nicht mit den Login-Daten des entpsrechenden Intrexx-Benutzers übereinstimmen, muss das bei der Benutzer-Replikation entsprechend berücksichtigt werden, indem bspw. ein anderes Profil verwendet wird bzw. das verwendete Replikationsprofil entsprechend angepasst wird.

Ob eine Kerberos-Authentifizierung unter Tomcat auf dem Zielsystem erfolgreich umgesetzt werden kann, ist stark von der Systemumgebung (Active Directory / Netzwerk) abhängig.