Apache mit Kerberos

Aus Xinux Wiki
Version vom 18. Oktober 2026, 16:46 Uhr von Thomas.will (Diskussion | Beiträge) (Neue Seite (Kurs Linux - Samba))
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen
Kurs Lab Rechner Domäne
Linux - Samba Linux - Samba Lab www · 10.2XX.1.32 ad.it2XX.int

Einfach erklärt

  • Ein Intranet soll seine Benutzer kennen, ohne eigene Anmeldeseite.
  • apache2 prüft mit dem Modul mod_auth_gssapi das Kerberos-Ticket, das der Browser per Negotiate schickt.
  • Der Benutzername steht danach in der Variablen REMOTE_USER und kann von der Anwendung benutzt werden.
  • Das Prinzip ist dasselbe wie bei Squid mit Kerberos: SPN HTTP/www.ad.it2XX.int und eine Keytab für den Webserver.

Vorbereitung

sync machine password to keytab = /etc/krb5.keytab:spn_prefixes=host:account_name:sync_spns:sync_kvno:machine_password, /etc/apache2/http.keytab:spn_prefixes=HTTP:sync_kvno:machine_password
apt install apache2 libapache2-mod-auth-gssapi
net ads setspn add HTTP/www.ad.it201.int -U administrator
net ads keytab create
chgrp www-data /etc/apache2/http.keytab
chmod 640 /etc/apache2/http.keytab
a2enmod auth_gssapi

Konfiguration

  • /etc/apache2/conf-available/intern.conf
<Location /intern>
    AuthType GSSAPI
    AuthName "Intranet"
    GssapiCredStore keytab:/etc/apache2/http.keytab
    GssapiAllowedMech krb5
    GssapiLocalName On
    Require valid-user
</Location>
Zeile Bedeutung
AuthType GSSAPI Anmeldung per Negotiate
GssapiCredStore keytab: welche Keytab apache benutzt
GssapiAllowedMech krb5 nur Kerberos, kein NTLM
GssapiLocalName On REMOTE_USER ist max statt max@AD.IT201.INT
Require valid-user jeder mit gültigem Ticket
mkdir -p /var/www/html/intern
echo '<?php echo "Hallo " . $_SERVER["REMOTE_USER"]; ?>' > /var/www/html/intern/index.php
a2enconf intern
apache2ctl configtest
systemctl reload apache2
  • Ohne PHP reicht zum Test eine einfache HTML-Datei, den Namen sieht man dann im access.log.

Nur bestimmte Benutzer

Require user max erika
  • Für AD-Gruppen braucht es zusätzlich mod_authnz_ldap oder eine Prüfung in der Anwendung.

Passwort als Notlösung

  • Clients ohne Ticket, z.B. von außerhalb der Domäne, können sich mit Benutzer und Passwort anmelden:
GssapiBasicAuth On
  • Dann geht das Passwort im Klartext zum Server. Nur mit HTTPS.

Testen

kinit max
curl --negotiate -u : http://www.ad.it201.int/intern/
klist
tail /var/log/apache2/access.log
  • klist zeigt danach ein Ticket für HTTP/www.ad.it201.int, im access.log steht max.
  • Im Browser: wie bei squid, siehe Browser.

Stolperfallen

  • Aufruf per IP oder über einen anderen Namen als www.ad.it2XX.int: kein Ticket, 401.
  • Keytab nicht lesbar für www-data: im error.log ein Fehler von gss_acquire_cred.
  • Virtueller Host mit anderem Namen, z.B. intranet.ad.it2XX.int: Für jeden Namen braucht es einen eigenen SPN, und der Name muss in der Keytab stehen.
  • GssapiBasicAuth ohne HTTPS: Passwörter lassen sich mitlesen.

Übungen

Grundübungen

  1. Tragen Sie den SPN HTTP/www.ad.it2XX.int ein und erzeugen Sie die Keytab für apache.
  2. Schützen Sie /intern mit mod_auth_gssapi und testen Sie mit curl.
  3. Lassen Sie sich auf der Seite den angemeldeten Benutzer anzeigen.
  4. Erlauben Sie nur max den Zugriff.
  5. Rufen Sie die Seite von win11 aus im Browser auf. Was ist nötig, damit kein Anmeldefenster kommt?

Vertiefung

  1. Richten Sie einen zweiten Namen intranet.ad.it2XX.int als DNS-Alias ein. Was müssen Sie tun, damit Kerberos auch dafür geht?
  2. Stellen Sie auf HTTPS um und schalten Sie GssapiBasicAuth ein.
  3. Begrenzen Sie den Zugriff auf eine AD-Gruppe mit mod_authnz_ldap. Denken Sie an LDAPS, siehe Anwendungen an die Domäne anbinden.

Fehlersuche

1. curl --negotiate bekommt 401, klist zeigt kein Ticket für HTTP/www

Der Client hat kein Service-Ticket bekommen: SPN fehlt im AD oder die Seite wurde per IP aufgerufen. kvno HTTP/www.ad.it2XX.int auf lx.

2. klist zeigt ein Ticket für HTTP/www, apache antwortet trotzdem mit 401

apache kann das Ticket nicht prüfen. Keytab fehlt, ist nicht lesbar oder enthält eine alte kvno. Im error.log nachsehen, klist -k /etc/apache2/http.keytab

Vertiefung

Weiter