Apache mit Kerberos
Version vom 18. Oktober 2026, 16:46 Uhr von Thomas.will (Diskussion | Beiträge) (Neue Seite (Kurs Linux - Samba))
| 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
- www tritt der Domäne bei wie ein Samba Mitgliedsserver.
- In der smb.conf:
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
- Tragen Sie den SPN HTTP/www.ad.it2XX.int ein und erzeugen Sie die Keytab für apache.
- Schützen Sie /intern mit mod_auth_gssapi und testen Sie mit curl.
- Lassen Sie sich auf der Seite den angemeldeten Benutzer anzeigen.
- Erlauben Sie nur max den Zugriff.
- Rufen Sie die Seite von win11 aus im Browser auf. Was ist nötig, damit kein Anmeldefenster kommt?
Vertiefung
- Richten Sie einen zweiten Namen intranet.ad.it2XX.int als DNS-Alias ein. Was müssen Sie tun, damit Kerberos auch dafür geht?
- Stellen Sie auf HTTPS um und schalten Sie GssapiBasicAuth ein.
- 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