
Ich habe eine Nginx-Instanz im Internet, die eine Anwendung als Proxy verwendet. Ich möchte bei jeder Anfrage aus dem Internet, die versucht, sich bei der Anwendung zu authentifizieren, eine 404-Antwort zurückgeben, da alle öffentlichen Teile davon anonymen Zugriff zulassen. Nur Benutzer im lokalen Netzwerk sollten sich bei ihr authentifizieren können.
Ich kann mir vorstellen, dass ich einen einfachen if-Block verwenden kann, da ich nur „404 zurückgeben“ verwende, bin mir aber nicht sicher, welche if-Bedingung am zuverlässigsten ist, um das Vorhandensein von Authentifizierungsheadern zu erkennen:
if (auth headers exist) {
return 404;
}
Hat jemand Vorschläge, was ich in den If-Block einfügen kann, um dies zu überprüfen?
Antwort1
Im Allgemeinen sind if-Anweisungen nicht zu empfehlen, oder Sie sollten sich zumindest einiger der Nebenwirkungen bewusst sein. Lesen Sie„If is Evil“ im Nginx-Blogum mehr zu lernen.
Um Ihre Frage zu beantworten: Angenommen, der Header, den Sie überprüfen möchten, heißt „Autorisierung“, dann war Ihre ursprüngliche Annahme bereits sehr zutreffend.
if ($authorization) {
return 404;
}
Das sollte schon reichen. Wenn Sie dies zusätzlich nur für den öffentlichen Serverblock erzwingen möchten, können Sie denngx_http_access_module
Antwort2
Sie können überprüfen, ob in der Anfrage der Authorization-Header vorhanden ist, der normalerweise zur Authentifizierung von Anfragen verwendet wird. Sie können dies tun, indem Sie die Variable $http_authorization im if-Block verwenden:
if ($http_authorization) {
return 404;
}
Alternativ können Sie prüfen, ob bestimmte Authentifizierungsheader vorhanden sind, die Ihre Anwendung verwendet. Wenn Ihre Anwendung beispielsweise X-Auth-Token als Authentifizierungsheader verwendet, können Sie dies folgendermaßen prüfen:
if ($http_x_auth_token) {
return 404;
}
Denken Sie daran, dass der if-Block nur ausgewertet wird, wenn die Anfrage an einen durch die auth_basic-Direktive geschützten Ort gesendet wird. Wenn Sie in allen Anfragen das Vorhandensein von Authentifizierungsheadern überprüfen möchten, können Sie stattdessen die map-Direktive verwenden:
map $http_authorization $block_public_auth {
default 0;
"~" 1;
}
server {
...
location / {
if ($block_public_auth) {
return 404;
}
...
}
}
Oben werden alle Anfragen mit einem Autorisierungsheader blockiert, unabhängig vom Speicherort, an den sie gerichtet sind.