Single Sign On mit Apache2 auf dem AD-Server

Liebe Gemeinde,
ich möchte gern die Benutzer auf der internen Schulhomepage (also nur innerhalb des pädagogischen Netzwerks erreichbar) auf dem AD-Server namentlich begrüßen. Dazu habe ich auch dem AD (LMN 7.3) Apache2 installiert. Ich möchte vermutlich $_SERVER[„REMOTE_USER“] in PHP via Apache2 setzen, das gelingt mir aber derzeit nicht.
Meine Lieblings-KI dreht sich im Kreis und sagt, mod_auth_kerberos sei veraltet, und das wäre in Linuxmuster doch schon irgendwie drin… also so nicht.

Ich finde nicht so viel, um das Kerberos System in Linuxmuster zu verstehen. Single-Sign-On am Proxy funktioniert super.

Jetzt also Apache2: Ich möchte also eine Webseite, die mir sagt: „Hallo Peter“, OHNE dass ich mich anmelde, habe ich ja schon am (Linux-)Client getan.

Hat das jemand bei sich am Laufen und kann mich in die richtige Richtung pushen? Oder ich habe es in der Doku überlesen? Da lese ich „nur“ vom Proxy…

LG
Peter

vielleicht lieg ich ja falsch aber ich wuerde das erstmal so sehen:

single sign uebers www sollte per oidc (keycloak) gemacht werden. ausser du hast den vpn schon sowieso da…? andere meinungen?

Hallo sucher,
Missverständnis. Das ist wirklich nur eine interne Homepage auf dem AD-Server - die Homepage ist nicht von außen erreichbar.
Also nur von innerhalb der Schule erreichbar. Sollte also irgendwie gehen, habs nur noch nicht geblickt.

hmm ok dann macht das natuerlich sinn…
aber… das kerberosticket bekommst du ja direkt beim windows login.
in der lmn webui webseite musst du dich aber trotzdem anmelden, oder? obwohl du schon ein kerberos ticket hast oder. der sso bezieht sich nur auf den webproxy in der firewall?

Kerberos kann ich ja grundsätzlich für alles verwenden, LMN benutzt das für den Proxy, aber ich müsste das eigentlich auch noch für etwas anderes nutzen können, eben z.B. mod_auth_kerberos - hatte gedacht, das hätten evtl. so einige im Einsatz. Echtes SSO bei bestimmten Webdiensten wäre schon cool.
LGP

Hi,

heutzutage wird wohl GitHub - gssapi/mod_auth_gssapi: GSSAPI Negotiate module for Apache empfohlen. Es ist laut projekteigener Beschreibung als Ersatz für mod_auth_kerb vorgesehen und wird auch in der Dokumentation und Support-Datenbank von Red Hat aufgeführt, was dafür spricht, dass dies kein Hobbyprojekt ist. Für Ubuntu und Debian gibt es libapache2-mod-auth-gssapi.

Ein Tutorial findet man auf Kerberos SSO with Apache on Linux

VG
Buster

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 "&nbsp;&nbsp;&nbsp;Hallo <strong>" . htmlspecialchars($given) . "</strong>!";
} else {
    echo "&nbsp;&nbsp;&nbsp;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)