Neben der Basic Authentifizierung über eine htaccess Zugriffsverwaltung für Seitenzugriffe, will ich eine Methode mittels Kerberos vorstellen. Hierbei wird über einen zentral verwalteten Kerberos Server bestimmte Webseiteninhalte für Personen administriert.
Schematischer Aufbau
In diesem Beispiel habe ich einem Apache Webserver unter Debian aufgesetzt. In diesem Testaufbau lautet die Windows Domäne OUTBACK. Zudem existiert in dem Netzwerk ein Windows Server 2012 R2 als Domain Controller.
In der ersten Phase wird beim Login vom Key Distribution Center (KDC) ein Ticket Granting Ticket (TGT) angefordert. Dies geschieht in der Regel immer dann, wenn der Benutzer sich mit seinem Rechner an eine Windows Domäne anmeldet. Dieses Ticket ist dem eines Mastertickets vergleichbar, indem die Authentität eines Benutzers beglaubigt wird.
Wenn der Benutzer nun ein Service, wie in diesem Beispiel eine Apache Webseite, benutzen will, muss der Client speziell für diesen Service ein sogenanntes Ticket Granding Service (TGS) mit seinem schon zugewiesen TGT generieren.
Installation benötigter Komponenten
In diesem Aufbau müssen folgende Pakete auf einem grundinstallierten Raspbian (Debian Distribution) installiert werden:
apt-get install krb5-kdc krb5-admin-server apache2 libapache2-mod-auth-kerb
Konfiguration von Kerberos auf dem Webserver
Als erstes muss die Kerberos Konfiguration wie folgt angepasst
[libdefaults]
default_realm = OUTBACK
[realms]
OUTBACK = {
kdc = dc1.outback
kdc = dc2.outback
admin_server = dc1.outback
}
[domain_realm]
.outback = OUTBACK
[logging]
kdc = FILE:/var/log/krb5/krb5kdc.log
admin_server = FILE:/var/log/krb5/kadmind.log
default = SYSLOG:NOTICE:DAEMON
Nach der Anpassung der Konfigurationsdatei solle nun eine Kerberos Authentifizierung an dem Domain Controller funktionieren:
kinit -VV melzer@outback
Using new cache: :/run/user/0/krb5cc/tkthuIrJH
Using principal: melzer@OUTBACK
Password for melzer@OUTBACK: ******
Authenticated to Kerberos v5
Server Keytab am Domain Controller
Damit der Webserver als Host und Service sich nicht immer mit einem Passwort am KDC Authentifizieren muss, wird ein keytab Datei (Passwortdatei) am Domain Controller erstellt. Hierbei wird die Passwortdatei an den AD Benutzerkonto kerberosuser angebunden. Als Principal Name definierte Host und Service wird als <SERVICE>/<FQDN>@<Domäne> beschrieben.
ktpass -princ HTTP/raspberry.outback@OUTBACK -mapuser kerberosuser@outback -crypto RC4-HMAC-NT -ptype KRB5_NT_PRINCIPAL -mapop set -pass XXXXX -out c:\TEMP\keytab_for_raspberry
Targeting domain controller: windows.OUTBACK
Successfully mapped HTTP/raspberry.outback to kerberosuser.
Password successfully set!
Key created.
Output keytab to c:\TEMP\keytab_for_raspberry:
Keytab version: 0x502
keysize 75 HTTP/raspberry.outback@OUTBACK ptype 1 (KRB5_NT_PRINCIPAL) vno 5 etype 0x17 (RC4-HMAC) keylength 16 (0x71759c927b4f62f134f9e20511dba7b1)
Die erstelle Keytab Datei muss nun auf dem Apache Webserver kopiert werden. Hierbei sollte das Verzeichnis für den Apache Daemon erreichbar sein. Zum Test der Authentifizierung kan folgender Befehl benutzt werden:
kinit -VV -k -t /etc/apache2/keytabs/keytab_for_raspberry HTTP/raspberry.outback@OUTBACK
Das Ergebnis sollte wie folgt aussehen:
Using new cache: :/run/user/0/krb5cc/tktsFVM3C
Using principal: HTTP/raspberry.outback@OUTBACK
Using keytab: /etc/apache2/keytabs/keytab_for_raspberry
Authenticated to Kerberos v5
Anpassung Apache Konfiguration
Damit Apache nun Kerberos als Authentifizierungmethode verwendet, muss die Konfigurationsdatei wie folgt angepasst werden:
…
LoadModule auth_kerb_module /usr/lib64/apache2/mod_auth_kerb.so
…
<Directory "/">
AllowOverride None
Options +ExecCGI -Includes
Order allow,deny
allow from all
AuthType Kerberos
AuthName "Kerberos SSO"
KrbAuthRealms OUTBACK
KrbServiceName HTTP/raspberry.outback@OUTBACK
Krb5Keytab /etc/apache2/keytabs/keytab_for_raspberry
KrbMethodNegotiate on
KrbMethodK5Passwd on
KrbLocalUserMapping on
require valid-user
…
Testen mit PHP
Zum Testen der Authentifizierung können folgende PHP Zeilen verwendet werden.
<?php
echo "Authentication: " . $_SERVER['AUTH_TYPE'] . "<br />";
echo "User: " . $_SERVER['REMOTE_USER'] . "<br />";
?>