Apache-Site-Zugriffe automatisch über Active Directory authentifizieren lassen

Gerade in größeren IT-Umgebungen wird heterogene Software eingesetzt. Und bei dem Start fast jeder Anwendung heißt es dann für den Anwender: „Bitte geben Sie Ihren Benutzernamen und Ihr Passwort ein“…

Viele Single-Sign-On-Lösungen versuchen – mehr oder minder erfolgreich – diesen Missstand einzudämmen – in der Regel mit mäßigem Komfort-Gewinn.

Zumindest bei webbasierter Software kann der Webhäuptling recht einfach dabei helfen, sehr komfortabel eine sichere Umgebung zu bieten – und das, ohne dass der Anwender überhaupt mitbekommt, dass hier eine Authentifizierung durchgeführt wird.

Möglich wird das durch die Einbindung der Kerberos-Authentifzierung in die Apache-Konfiguration.

Voraussetzungen

Neben dem installierten Apache werden auf einem Debian-basierten System noch folgende Pakete benötigt:

# aptitude install krb5-config krb5-clients
# aptitude install samba-client
# aptitude install libapache2-mod-auth-kerb

Damit werden zunächst einmal die erforderlichen Kerberos-Komponenten installiert. Für den danach benötigten Domänen-Beitritt des Servers folgt dann der Samba-Client, und damit dann auch der Webserver die Domänen-Anmeldung nutzen kann, wird abschließend noch das entsprechende Modul im Dateisystem bereitgestellt.

Schritt 1 – Kerberos und Samba konfigurieren

Zunächst muss es Kerberos ermöglicht werden, an die Domäne angebunden zu werden. Dazu bedarf es der Erstellung einer passenden Konfigurationsdatei in /etc/krb5.conf:

# /etc/krb5.conf
[libdefaults]
   default_realm = MEINEDOMAIN.LOCAL
   kdc_timesync = 1
   ccache_type = 4
   forwardable = true
   proxiable = true
   fcc-mit-ticketflags = true
   default_keytab_name = FILE:/etc/krb5.keytab 

[realms]
   MEINEDOMAIN.LOCAL = {
      kdc = erster-dc.meinedomain.local
      kdc = zweiter-dc.meinedomain.local

      master_kdc = erster-dc.meinedomain.local
      admin_server = erster-dc.meinedomain.local
      default_domain = meinedomain.local
   }

[domain_realm]
   .meinedomain.local = MEINEDOMAIN.LOCAL
   meinedomain.local = MEINEDOMAIN.LOCAL

Samba benötigt folgende Einstellungen in /etc/samba/smb.conf:

# /etc/samba/smb.conf
netbios name = meinserver
realm = MEINEDOMAIN.LOCAL
security = ADS
encrypt passwords = yes
password server = erster-dc.meinedomain.local
workgroup = MEINEDOMAIN

Schritt 2 – Domäne anbinden und Service-Keys erstellen

Ist die Konfiguration der Dienste an die eigene Umgebung angepasst, kann schon die erste Kerberos-Anmeldung erfolgen, es sollte ein Ticket Granting Ticket (TGT) ausgestellt werden, mit dem man in die Lage versetzt wird, weitere Tickets für andere Dienste anzufordern:

# kinit Administrator
Password for Administrator@MEINEDOMAIN.LOCAL:
# _

„klist“ sollte nun eine Ausgabe wie folgt generieren:

# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: Administrator@MEINDOMAIN.LOCA

Valid starting     Expires           Service principal
02/11/13 20:08:45  02/12/13 06:09:16 krbtgt/MEINEDOMAIN.LOCAL@MEINEDOMAIN.LOCAL
        renew until 02/12/13 20:08:45
# _

Der Beitritt des Servers in die Domäne ist ähnlich simpel:

# net ads join -U Administrator
Using short domain name -- MEINEDOMAIN
Joined 'meinserver' to realm 'MEINEDOMAIN.LOCAL'
# _

Das ermöglicht nun die lezte Vorbereitung vor der Einrichtung des Webservers, die Erstellung eines Service-Keys für den httpd:

# net ads keytab add HTTP -U Administrator
Processing principals to add...
Enter Administrator's password:
# _

Nach der Eingabe des Passwortes für den Domänen-Admin sollte nun eine fertige und für den geplanten Zweck nutzbare krb5.keytab unter /etc liegen. Da der Apache-Prozess die Keytab später benötigt, müssen die Zugriffsrechte auf die Datei noch ein klein wenig erweitert werden:

# chgrp www-data /etc/krb5.keytab
# chmod g+r /etc/krb5.keytab

Und damit kommen wir zum abschließenden:

Schritt 3 – Einrichtung der Apache-Konfiguration

Um für eine Website nun die Kerberos-Anmeldung zu erzwingen, muss deren Konfigurationsdatei erweitert werden, hier ein einfaches Beispiel:

# /etc/apache2/sites-enabled/sicheresite
<VirtualHost *:80>
   ServerName sicheresite.meinedomain.local
   ServerAdmin administrator@meinedomain.local

   DocumentRoot /var/www/websites/sicheresite/html

   <Directory />
      Options FollowSymLinks
      AllowOverride None
   </Direcotry>
   <Directory /var/www/websites/sicheresite/html>
      Options -Indexes FollowSymLinks MultiViews
      AllowOverride All
      Order allow,deny
      allow from all
   </Directory>

   <Location />
      AuthType Kerberos
      AuthName Login
      KrbMethodNegotiate On
      KrbMethodK5Passwd On
      KrbAuthRealms MEINEDOMAIN.LOCAL
      Krb5KeyTab /etc/krb5.keytab
      require valid-user
   </Location>
</Virtualbost>

Wichtig ist hier der Bereich im Abschnitt Location. Hier wird die Anmeldung auf Kerberos umgestellt, die oben angelegte /etc/krb5.keytab zur Nutzung referenziert und jedem an der Domäne angemeldeten Benutzer der Zugriff auf die Webseite erlaubt.

Was sich so alles mit dem auth_kerb-Modul anstellen lässt, ist unter http://modauthkerb.sourceforge.net/configure.html nachzulesen.

Bevor es nun an’s Testen der neu eingerichteten Funktionalität gehen kann, sollte noch sichergestellt werden, dass das Modul auch geladen wird:

# a2enmod auth_kerb
Enabling module auth_kerb.
Run '/etc/init.d/apache2 restart' to activate new configuration!
# apache2ctl restart
# _

Fallstricke

Hier noch zwei kleine Stolperfallen, die man auf jeden Fall kennen sollte:

  • Es muss sichergestellt sein, dass die Uhrzeit des Servers, auf dem der Apache läuft mit der des Domain-Controllers übereinstimmt. Hier könnte der ntpd helfen
  • Die Browser, die einen Single-Sign-On durchführen sollen, müssen entsprechend eingestellt sein, beim Internet-Explorer beispielsweise muss die Option „Integrierte Windows Authentifzierung“ aktiviert werden.

Und nun: Happy Single Sign On