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.

Schematischer Aufbau Kerberos Authentifizierung mit Apache

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 />"; 
?>