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
Patrick
Vielen Dank für diese Anleitung!
Klappt super! 🙂
Gemeinde Ebersdorf b.Coburg
Anfänger-Linux Frage: In welcher Datei wird der obige Ausszug angelegt:
Da ich kein großer Freund von .htaccess Dateien bin lege ich die Kerberos Konfiguration direkt im vHost an.
Steffen Wöhner
Wo finde ich die vHost Datei für die Kerberos Konfiguration?
schman
Hallo
Ich bin auch kein großer Fan von .htacces Dateien 🙂
Ich vermute mal du meinst die vHost Datei. Je nach Linux Distro kann dies variieren, in meinem Fall habe ich das ganze so aufgebaut, dass ich pro (Sub)Domäne eine eigene vHost Datei angelegt habe.
Diese liegen (bei einer Apache2 Instalation) unter /etc/apache2/site-available/sso.test.local.conf.