Hallo Buster, hallo alle -
mir ist dann auch aufgefallen, dass es mod_auth_kerberos gar nicht mehr gibt.
gssapi war dann die Lösung, Dankeschön! Bei dem Rest hat mir dann die KI geholfen.
Man muss sich also nicht mehr bei der Webseite anmelden, der Webserver kennt mich durch das Kerberos-Ticket. Anleitung, wer es nachbauen möchte:
(ERSETZE it.gymnasium-hochdahl.de durch deine Domain)
Installation
also mittels apt install einige Pakete installiert: apache2, libapache2-mod-auth-gssapi installiert, dazu noch php und php_ldap.
Samba-Kerberos-keytab anpassen
Dann muss man noch die secrets.keytab in /var/lib/samba/private anpassen:
sudo samba-tool spn add \
HTTP/server.it.gymnasium-hochdahl.de \
SERVER$
und dann exportieren in dieselbige Datei:
sudo samba-tool domain exportkeytab \
/var/lib/samba/private/secrets.keytab \
--principal=HTTP/server.it.gymnasium-hochdahl.de
Prüfen, ob HTTP richtig exportiert wurde:
sudo klist -k /var/lib/samba/private/secrets.keytab | grep HTTP
Apache Config von 000-default.conf
In /etc/apache2/sites-available dann die 000-default.conf editiert:
<VirtualHost *:80>
ServerName server.it.gymnasium-hochdahl.de
DocumentRoot /var/www/html
<Location />
AuthType GSSAPI
AuthName "Kerberos Test"
GssapiCredStore keytab:/var/lib/samba/private/secrets.keytab
GssapiAllowedMech krb5
GssapiLocalName On
Require valid-user
</Location>
</VirtualHost>
Hier Port 80, und nicht 443, weil der Port schon durch die LMN-webui belegt ist, das hat aber leider Auswirkungen, denn moderne Browser weigern sich wohl, bei HTTP überhaupt etwas mit Kerberos zu machen - will ich hier trotzdem, Netzwerk ist ja „nur“ intern. Also Firefox anpassen:
Firefox Config
Ich habe dann, damit Firefox via „normalem“ http überhaupt Kerberos-Ticket schickt noch
network.negotiate-auth.trusted-uris = http://server.it.gymnasium-hochdahl.de
bei about:config in Firefox eintragen müssen.
Webseite
...
</head>
<body>
<?php
$user = $_SERVER['REMOTE_USER'];
if (!$user) {
die("Kein Benutzer");
}
// Verbindung zum lokalen LDAP (Samba AD)
$ldap = ldap_connect("ldap://localhost");
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);
// Bind anonym, da Apache auf DC läuft
$binddn = "CN=global-binduser,OU=Management,OU=GLOBAL,DC=it,DC=gymnasium-hochdahl,DC=de";
$bindpw = "************************"; //hier Passwort versteckt.
$res = @ldap_bind($ldap, $binddn, $bindpw);
$baseDn = "DC=it,DC=gymnasium-hochdahl,DC=de";
$filter = "(sAMAccountName=$user)";
$attrs = ["givenName", "sn", "displayName"];
$search = ldap_search($ldap, $baseDn, $filter, $attrs);
if (!$search)
echo ldap_error($ldap);
$entries = ldap_get_entries($ldap, $search);
?>
<header>
<h1>Schlossgymnasium Hochdahl – Intern</h1>
...
<?php
if ($entries["count"] === 1) {
// Vornamen ausgeben
$given = $entries[0]["givenname"][0] ?? $user;
echo " Hallo <strong>" . htmlspecialchars($given) . "</strong>!";
} else {
echo " Hallo <strong>" . htmlspecialchars($user) . "</strong>!";
}
?>
<main>
...
Apache Neustart, fertig
„Peter“ steht hier, weil der normale REMOTE_USER dann per ldap-Anfrage nachgesehen wird und entsprechende Attribute wie hier givenname abgefragt werden.
Wozu?
weil es geht… und weil ich so zum Beispiel andere Inhalte für Lehrer:innen und Schüler:innen darstellen kann. (mittels LDAP-memberof-Attribut)