Samstag, 24. April 2021

ActiveDirectory SSO mit Apache

Sollen Benutzer für Intranet Anwenungen per SSO authentifiziert werden, muss es nicht immer der IIS sein. Dank Kerberos und der flexiblen Authentifizierungsmodule im Apache, klappt auch hier die Anbindung. Häufig ist die Authentifizierung per Kerberos aber nur ein Teil der Anmeldung, Weitere Benutzerinformationen müssen im Fall der Anbindung ans Active Directory zusätzlich per LDAP(S) abgefragt werden. Für beide Zwecke muss im AD ein Proxy-Benutzer eingerichtet sein.

Anlegen eines Active Directory Proxy Benutzers

 Der Benutzer sollte das Kennwort nicht ändern können und es sollte nie ablaufen. Wichtig ist desweiteren der Verschlüsselungsalgorithmus der für die Kerberos Keytab verwendet wird, hier z.B. AES-256. Als Kennwort kann ein langer zufälliger String verwendet werden, es wird nur noch einmal im nächsten Schritt verwendet.

Erstellen einer Kerberos Keytab

Die Kerberos Keytab repräsentiert das Passwort des Proxy-Benutzers und erlaubt die Authentifizierung am AD. Die Identität wird dabei an Hostnamen gebunden. Deshalb ist es wichtig, dass eine für den Webserver passende Keytab erstellt wird. Im Beispiel wird die SSO gesicherte Webseite unter webserver1.domain.com erreichbar sein.

Auf dem Windows Domain Controller wird die zum oben erstellten Konto passende Keytab folgendermaßen erstellt (in der @DOMAIN Notation muss bei Kerberos-Authentifizierung die Domain in Großbuchstaben geschrieben werden!):
ktpass -princ HTTP/webserver1.domain.com@DOMAIN.COM -mapuser idp@DOMAIN.COM -pass * -crypto AES256-SHA1 -ptype KRB5_NT_PRINCIPAL -out C:\webserver1.keytab -setupn

Die webserver.keytab Datei kan nun auf sicherem Wege auf den Webserver verschoben werden. Sie sollte dort nur vom Apache Prozess lesbar sein (z.B. chown root:www-data webserver1.keytab && chmod 640 webserver1.keytab).

Anlegen des ServicePrincipleNames für das Konto

Bei Windows verbindet der Service Principal Name die Kerberos Identität mit dem AD Konto.

setspn -s HTTP/webserver1.domain.com idp

Apache Konfiguration

Es gibt eine Reihe von Kerberos-Modulen für Apache das bestgepflegteste scheint mod_auth_gssapi zu sein. (Bei Debian im Paket libapache2-mod-auth-gssapi enhalten).

<Location "/sso.php">
 AuthName "Benutzer mit Domainteil (getrennt durch @) in GROSSBUCHSTABEN - sollte auf 'DOMAIN.COM' enden"
 AuthType GSSAPI
 GssapiBasicAuth On
 GssapiCredStore keytab:/etc/krb5/webserver1.keytab
 Require valid-user
</Location>

Sollte der Browser keine SPNEGO mit bestehender Session aushandeln können, bekommt der Benutzer ein Anmeldefenster für die HTTP Basic Authentifizierung.

Die Keytab auf mehreren Servern oder verschiedene Server in eienr Keytab

Soll eine weitere Keytab für einen anderen Webserver erstellt werden, so muss auf dem Domain Controller zunächst der SPN ergänzt werden:

 setspn -s HTTP/webserver2.domain.com idp 
Mit dem folgenden Kommando lassen sich registrierte SPNs für einen Account abfragen:
setspn -L idp

Registrierte Dienstprinzipalnamen (SPN) für CN=IDP proxy user,CN=Managed Service Accounts,DC=domain,DC=com:
 HTTP/webserver1.domain.com
 HTTP/webserver2.domain.com
Anschließend kann eine weitere Keytab exportiert werden. Wichtig ist die Angabe -setpass (im Gegensatz zum Default +setpass) die dafür sorgt, dass die KVNO erhalten bleibt (kein geändertes Passwort und damit auch die erste Keytab gültig bleibt).
ktpass -princ HTTP/webserver2.domain.com@DOMAIN.COM -mapuser idp@DOMAIN.COM -pass * -crypto AES256-SHA1 -ptype KRB5_NT_PRINCIPAL -out C:\webserver2.keytab  -setupn -setpass
Sollen stattdessen zwei Dienstidentitäten in einer Keytab gespeichert werden, so benutzt man die erste Keytab als Input:
ktpass -princ HTTP/webserver2.domain.com@DOMAIN.COM -mapuser idp@DOMAIN.COM -pass * -crypto AES256-SHA1 -ptype KRB5_NT_PRINCIPAL -out C:\webserver1.keytab  -setupn -setpass -in C:\webserver.keytab

Keine Kommentare:

Kommentar posten