Nginx – Wie gibt man 404 zurück, wenn Authentifizierungsheader vorhanden sind?

Nginx – Wie gibt man 404 zurück, wenn Authentifizierungsheader vorhanden sind?

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.

verwandte Informationen