Zum Inhalt

spnego-http-auth: NGINX-Modul für HTTP SPNEGO-Authentifizierung

Erfordert den Pro-Plan (oder höher) des GetPageSpeed NGINX Extras-Abonnements.

Installation

Sie können dieses Modul in jeder RHEL-basierten Distribution installieren, einschließlich, aber nicht beschränkt auf:

  • RedHat Enterprise Linux 7, 8, 9 und 10
  • CentOS 7, 8, 9
  • AlmaLinux 8, 9
  • Rocky Linux 8, 9
  • Amazon Linux 2 und Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-spnego-http-auth
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-spnego-http-auth

Aktivieren Sie das Modul, indem Sie Folgendes an den Anfang von /etc/nginx/nginx.conf hinzufügen:

load_module modules/ngx_http_auth_spnego_module.so;

Dieses Dokument beschreibt nginx-module-spnego-http-auth v1.2.0, veröffentlicht am 14. Februar 2026.


Dieses Modul implementiert die Unterstützung für SPNEGO in nginx (http://nginx.org). Es unterstützt derzeit nur die Kerberos-Authentifizierung über GSSAPI.

Voraussetzungen

Die Authentifizierung wurde mit (mindestens) den folgenden getestet:

  • Nginx 1.2 bis 1.15
  • Internet Explorer 8 und höher
  • Firefox 10 und höher
  • Chrome 20 und höher
  • Curl 7.x (GSS-Negotiate), 7.x (SPNEGO/fbopenssl)

Die zugrunde liegende Kerberos-Bibliothek, die für diese Tests verwendet wurde, war MIT KRB5 v1.12.

Konfigurationsreferenz

Sie können die GSS-Authentifizierung pro Standort und/oder global konfigurieren:

Diese Optionen sind erforderlich. * auth_gss: ein/aus, um das Unsichern zu erleichtern, während andere Optionen in der Konfigurationsdatei verbleiben. * auth_gss_keytab: absoluter Pfad zum Keytab-Datei, die Dienstanmeldeinformationen enthält.

Diese Optionen sollten NUR angegeben werden, wenn Sie einen Keytab mit privilegierten Principals haben. In fast allen Fällen sollten Sie diese nicht in die Konfigurationsdatei einfügen, da gss_accept_sec_context das Richtige tun wird. * auth_gss_realm: Kerberos-Realm-Name. Wenn dies angegeben ist, wird der Realm nur an die nginx-Variable $remote_user übergeben, wenn er sich von diesem Standard unterscheidet. Um dieses Verhalten zu überschreiben, setzen Sie auth_gss_format_full auf on in Ihrer Konfiguration. * auth_gss_service_name: Dienstprinzipalname, der beim Erwerb von Anmeldeinformationen verwendet wird.

Wenn Sie nur eine bestimmte Gruppe von Principals autorisieren möchten, können Sie die Direktive auth_gss_authorized_principal verwenden. Die Konfigurationssyntax unterstützt mehrere Einträge, einen pro Zeile.

auth_gss_authorized_principal <primary1>@<realm>
auth_gss_authorized_principal <primary2>@<realm>

Principals können auch mithilfe eines Regex-Musters über die Direktive auth_gss_authorized_principal_regex autorisiert werden. Diese Direktive kann zusammen mit der Direktive auth_gss_authorized_principal verwendet werden.

auth_gss_authorized_principal <primary1>@<realm>
auth_gss_authorized_principal_regex ^(<primary2>)/(<instance>)@<realm>$

Der Remote-User-Header in nginx kann nur durch grundlegende Authentifizierung gesetzt werden. Daher setzt dieses Modul einen falschen Basic-Auth-Header, der Ihre Backend-Anwendung erreicht, um diesen Header/nginx-Variable zu setzen. Der einfachste Weg, dieses Verhalten zu deaktivieren, besteht darin, die folgende Konfiguration zu Ihrer Standortkonfiguration hinzuzufügen.

proxy_set_header Authorization "";

Eine zukünftige Version des Moduls könnte dieses Verhalten als Option anbieten, aber dies sollte vorerst eine ausreichende Umgehungslösung sein.

Wenn Sie GSS-Lokalisierungsregeln aktivieren möchten, um Benutzernamen umzuschreiben, können Sie die Option auth_gss_map_to_local angeben.

Anmeldelegation

Benutzeranmeldeinformationen können an nginx delegiert werden, indem die Direktive auth_gss_delegate_credentials verwendet wird. Diese Direktive aktiviert die uneingeschränkte Delegation, wenn der Benutzer sich entscheidet, seine Anmeldeinformationen zu delegieren. Die eingeschränkte Delegation (S4U2proxy) kann ebenfalls aktiviert werden, indem die Direktive auth_gss_constrained_delegation zusammen mit der Direktive auth_gss_delegate_credentials verwendet wird. Um den Namen der ccache-Datei anzugeben, in der das für die eingeschränkte Delegation verwendete Dienstticket gespeichert wird, setzen Sie die Direktive auth_gss_service_ccache. Andernfalls wird der Standard-ccache-Name verwendet.

auth_gss_service_ccache /tmp/krb5cc_0;
auth_gss_delegate_credentials on;
auth_gss_constrained_delegation on;

Die delegierten Anmeldeinformationen werden im temporären Verzeichnis des Systems gespeichert. Sobald die Anfrage abgeschlossen ist, wird die Anmeldeinformationsdatei gelöscht. Der Name der Anmeldeinformationsdatei wird innerhalb der nginx-Variable $krb5_cc_name angegeben. Die Verwendung der Variablen kann das Übergeben an ein FCGI-Programm über die Direktive fastcgi_param umfassen.

fastcgi_param KRB5CCNAME $krb5_cc_name;

Eingeschränkte Delegation wird derzeit nur mit dem Verhandlungsauthentifizierungsverfahren unterstützt und wurde nur mit MIT Kerberos getestet (Verwendung auf eigenes Risiko, wenn Sie Heimdal Kerberos verwenden).

Fallback auf grundlegende Authentifizierung

Das Modul fällt standardmäßig auf die grundlegende Authentifizierung zurück, wenn vom Client keine Verhandlung versucht wird. Wenn Sie SPNEGO ohne SSL verwenden, wird empfohlen, den Fallback auf die grundlegende Authentifizierung zu deaktivieren, da das Passwort im Klartext gesendet wird. Dies geschieht, indem auth_gss_allow_basic_fallback in der Konfigurationsdatei gesetzt wird.

auth_gss_allow_basic_fallback off

Diese Optionen beeinflussen den Betrieb der grundlegenden Authentifizierung: * auth_gss_realm: Kerberos-Realm-Name. Wenn dies angegeben ist, wird der Realm nur an die nginx-Variable $remote_user übergeben, wenn er sich von diesem Standard unterscheidet. Um dieses Verhalten zu überschreiben, setzen Sie auth_gss_format_full auf 1 in Ihrer Konfiguration. * auth_gss_force_realm: Erzwingt die Authentifizierung mit dem im auth_gss_realm konfigurierten Realm oder dem Systemstandard-Realm, wenn auth_gss_realm nicht gesetzt ist. Dies wird $remote_user umschreiben, wenn der Client einen anderen Realm angegeben hat. Wenn auth_gss_format_full nicht gesetzt ist, wird $remote_user keinen Realm enthalten, selbst wenn einer vom Client angegeben wurde.

Fehlersuche

Überprüfen Sie die Protokolle. Wenn Sie einen Hinweis auf NTLM sehen, versucht Ihr Client, sich über NTLMSSP zu verbinden, was nicht unterstützt und unsicher ist.

Überprüfen Sie, ob Sie einen HTTP-Prinzipal in Ihrem Keytab haben

MIT Kerberos-Dienstprogramme

$ KRB5_KTNAME=FILE:<path to your keytab> klist -k

oder

$ ktutil
ktutil: read_kt <path to your keytab>
ktutil: list

Heimdal Kerberos-Dienstprogramme

$ ktutil -k <path to your keytab> list

HTTP-Prinzipal erhalten

Wenn Sie feststellen, dass Sie den HTTP-Dienstprinzipal nicht haben, in einer Active Directory-Umgebung arbeiten, und an die Domäne gebunden sind, sodass Samba-Tools ordnungsgemäß funktionieren

$ env KRB5_KTNAME=FILE:<path to your keytab> net ads -P keytab add HTTP

Wenn Sie in einer anderen Kerberos-Umgebung arbeiten, können Sie wahrscheinlich

$ env KRB5_KTNAME=FILE:<path to your keytab> krb5_keytab HTTP

Maximale erlaubte Headergröße erhöhen

In einer Active Directory-Umgebung enthält das SPNEGO-Token im Authorization-Header PAC (Privilege Access Certificate)-Informationen, die alle Sicherheitsgruppen umfassen, zu denen der Benutzer gehört. Dies kann dazu führen, dass der Header über das Standardlimit von 8 kB hinauswächst und folgende Fehlermeldung verursacht:

400 Bad Request
Request Header Or Cookie Too Large

Aus Leistungsgründen ist die beste Lösung, die Anzahl der Gruppen, zu denen der Benutzer gehört, zu reduzieren. Wenn dies unpraktisch ist, können Sie auch die erlaubte Headergröße erhöhen, indem Sie die Anzahl und Größe der Nginx-Headerpuffer explizit festlegen:

large_client_header_buffers 8 32k;

Debugging

Das Modul gibt alle Arten von Debugging-Informationen aus, wenn nginx mit der Option --with-debug kompiliert wurde und die Direktive error_log ein debug-Level hat.

NTLM

Beachten Sie, dass das Modul NTLMSSP in Negotiate nicht unterstützt. NTLM, sowohl v1 als auch v2, ist ein ausnutzbares Protokoll und sollte nach Möglichkeit vermieden werden.

Windows

Für Windows KDC/AD-Umgebungen siehe die Dokumentation hier.

Hilfe

Wenn Sie nicht weiterkommen, zögern Sie bitte nicht, ein Problem auf Github zu eröffnen, und ich werde mein Bestes tun, um Ihnen zu helfen.