SSO mit Apache2, Kerberos und Active Directory

Hier möchte ich meine Installation bzw. Konfigurations Schritte für Single-Sign-On (SSO) festhalten. Für eine Anwendung die unsererseits eingesetzt wird, bietet es sich an SSO zu verwenden.

Ausgangslage

Es muss SSO über Kerberos und Microsoft Active Directory (aktuell Microsoft Windows Server 2008 R2) eingerichtet werden. Das Betriebssystem für den Webserver (Apache2.4) wird Ubuntu 16.04 LTS verwendet. Die Webanwendung ist über https://sso.test.localerreichbar. Diese ist für jeden zugänglich. Auf der Seite https://sso.test.local gibt es einen geschützten Bereich. Um diesen aufrufen zu können wird SSO verwendet. Die Benutzer (in meinem Fall testms) ist mitglied der Domäne. Als Client wird Microsoft Windows 7 verwendet.

Ich gehe hiervon aus, dass das Active Directory richtig konfiguriert wurde, über die Installation vom Windows 7 Client möchte ich kein Wort verlieren ;). Die Grund Installation eines Ubuntusystems wird ebenfalls nicht mehr erwähnt.

Installation der benötigten Pakete (Webserver)

Damit SSO funktioniert werden folgende Pakete benötigt:

  • krb5-user
  • libapache2-mod-auth-kerb
  • apache2
sudo apt install libapache2-mod-auth-kerb krb5-user

Kerberos Konfiguration (Webserver)

Nun kann mit der Grundkonfiguration von Kerberos begonnen werden. Die Konfigurationsdatei befindet sich /etc/krb5.conf. Folgende Zeilen müssen eingefügt bzw. ergänzt werden

[libdefaults]
    default_realm = TEST.LOCAL
  
[realms]
    TEST.LOCAL = {
        kdc = DC.TEST.LOCAL
        master_kdc = DC.TEST.LOCAL
        admin_server = DC.TEST.LOCAL
        default_domain = TEST.LOCAL
    }

[login]
    krb4_convert = true
    krb4_get_tickets = false

Eigentlich sollte die Konfiguration selbsterklärend sein, lediglich der Hinweis, dass DC.TEST.LOCAL der Microsoft Server (Active Directory) ist. Alles was hier großgeschrieben ist muss auch großgeschrieben sein :).

Standardmäßig legt die Installation von Apache2 das /var/www/html Verzeichnis an, dieses werden wir verwenden. Ich lege noch für Demonstrationszwecke innerhalb das Verzeichnis secure an.

sudo mkdir /var/www/html/secure

Da ich kein großer Freund von .htaccess Dateien bin lege ich die Kerberos Konfiguration direkt im vHost an.

<VirtualHost *:80>
  ServerName sso.test.local
  Redirect permanent / https://sso.test.local
</VirtualHost>

<VirtualHost *:443>
  # Standardoptionen für SSL (Pfad zu den key files etc.)
  include /usr/local/share/ca-certificates/options-ssl-test.local.conf
  
  ServerName sso.test.local

  DocumentRoot "/var/www/html"

  # Sollte das Modul nicht geladen sein wird dieses geladen
  <IfModule !mod_auth_kerb.c>
    LoadModule auth_kerb_module /usr/lib/apache2/modules/mod_auth_kerb.so
  </IfModule>

  # Wenn AD User vielen Gruppen zugehörigen sind kann die FieldSize schnell ausgereizt werden und man rennt in einen Fehler
  # Deshalb wird diese hier vergrößert
  LimitRequestFieldSize 32768
  <Location "/secure">
    AuthType Kerberos
    KrbAuthRealms TEST.LOCAL
    KrbServiceName HTTP
    Krb5Keytab /etc/krb5.keytab
    KrbMethodNegotiate on
    KrbMethodK5Passwd off
    require valid-user
  </Location>

  #Für Debugging ist dieses LogLevel von Vorteil, im Produktiveinsatz kann dies auskommentiert werden.
  LogLevel trace8
  ErrorLog /var/log/apache2/sso.test.local-error.log
  CustomLog /var/log/apache2/sso.test.local-access.log combined
</VirtualHost>

Hierbei handelt es sich um eine Grundkonfiguration (die kann definitiv noch verbessert werden ;)). Ich habe die innerhalb der Konfiguration so gut wie möglich dokumentiert was welche Zeile bedeutet.

Kerberos Konfiguration (Active Directory)

Damit Apache2 die Tickets überprüfen bzw. anfordern darf, wird ein Benutzer (Active Directory) benötigt. Dieser muss nun auf dem AD eingerichtet werden. In meinem Beispiel nenn ich den User suakerberos (SUA = Service User Account). Der Benutzer benötigt keine speziellen Rechte, muss also nicht zB in die Administratoren Gruppe gejoint werden.

AD User “verknüpfen”.

In diesem Schritt müssen wir im AD den soeben angelegten Benutzer “verknüpfen” und die *.keytab Datei anlegen. Hierzu wird die ktpass.exe verwendet, diese ist bestandteil der Windows Serverrolle Active Directory.

ktpass -princ HOST/sso.test.local@TEST.LOCAL -mapuser suaapache2@TEST.LOCAL -crypto RC4-HMAC-NT -ptype KRB5_NT_PRINCIPAL -pass "meincoolespw" -out c:\krb5.keytab
ktpass -princ HTTP/sso.test.local@TEST.LOCAL -mapuser suaapache2@TEST.LOCAL -crypto RC4-HMAC-NT -ptype KRB5_NT_PRINCIPAL -pass "meincoolespw" -out c:\krb5.keytab -in c:\krb5.keytab

Nun wird die krb5.keytab Datei auf den Webserver kopiert. Jetzt muss nur noch dafür Sorge getragen werden, dass der Apache2 User die Datei lesen darf.

sudo chown root:www-data /etc/krb5.keytab
sudo chmod 0640 /etc/krb5.keytab

Nach Neustart des Indianers kann nun SSO verwendet werden.

sudo service apache2 restart

Hinweis

Ich hatte bei manchen Benutzern das Problem das SSO nicht funkioniert, da der Benutzer Mitglied zu vieler Gruppen war. Hierzu muss lediglich (im vHost) die LimitRequestFiledSize erhöht werden. Dies sieht dann folgendermaßen aus:

LimitRequestFieldSize 32768