Login: Zugang nicht gestattet

Mit Relution 26.4.0 wurde der interne Anwendungsserver von Undertow auf Tomcat umgestellt. Läuft der Reverse-Proxy (z.B. nginx oder Traefik) auf einem anderen Server als Relution selbst, kann es dadurch beim Login zu folgendem Fehler kommen:

Login-Fehler “Zugang nicht gestattet” im Relution-Browser-Login

Im Server-Log von Relution erscheint dazu ein entsprechender ERROR-Eintrag mit dem Hinweis TLS required.


Ursache

Damit eine Anmeldung möglich ist, muss die Verbindung zwischen Reverse-Proxy und Relution zwei Bedingungen gleichzeitig erfüllen:

  1. Der Reverse-Proxy muss von einer als intern eingestuften IP-Adresse mit Relution kommunizieren. Als intern gelten dabei standardmäßig nur die privaten IPv4-Bereiche 10.x.x.x, 172.16.x.x172.31.x.x und 192.168.x.x sowie localhost.
  2. Der Header X-Forwarded-Proto muss vom Reverse-Proxy mit dem Wert https gesendet werden.

Nur wenn beide Bedingungen erfüllt sind, stuft Tomcat die eingehende Verbindung als TLS-gesichert ein. Läuft der Reverse-Proxy auf einem separaten Server mit eigener (externer) IP-Adresse, ist bereits die erste Bedingung nicht erfüllt. Fehlt zusätzlich oder stattdessen der X-Forwarded-Proto-Header, wird die Verbindung ebenfalls nicht als sicher erkannt. In beiden Fällen bricht Relution den Login mit TLS required im Server-Log ab, im Browser erscheint dazu die Meldung Zugang nicht gestattet.


Fehler bestätigen (optional)

Um die Ursache zu bestätigen, kann das DEBUG-Logging der zuständigen Tomcat-Komponente aktiviert werden. Dazu folgenden Eintrag auf oberster Ebene in die application.yml einfügen:

logging:
  level:
    org.apache.catalina.valves.RemoteIpValve: DEBUG

Anschließend einen erneuten Login-Versuch durchführen. Erscheint im Log danach ein Eintrag wie folgt, ist die IP des Reverse-Proxys die Ursache: Die Anfrage wird nicht als vertrauenswürdig eingestuft.

DEBUG ... ina.valves.RemoteIpValve: Skip RemoteIpValve for request /api/device/v1/currentDevice/actions/next with originalRemoteAddr '<externe-IP-des-Proxys>' []

Erscheint dieser Eintrag nicht, die Fehlermeldung aber weiterhin auftritt, liegt es stattdessen am fehlenden bzw. falschen X-Forwarded-Proto-Header, siehe Lösung →.


Lösung

Je nachdem, welche der beiden Bedingungen aus dem Abschnitt Ursache nicht erfüllt ist, ist eine der beiden folgenden Anpassungen nötig — bei Bedarf auch beide.

IP des Reverse-Proxys als vertrauenswürdig hinterlegen

Damit Relution die Anfragen des Reverse-Proxys akzeptiert, muss dessen IP-Adresse explizit als vertrauenswürdiger interner Proxy bekannt gemacht werden. Dazu folgenden Eintrag auf oberster Ebene in die application.yml eintragen:

server:
  tomcat:
    remoteip:
      internal-proxies: '<Proxy-IP>|127\.\d{1,3}\.\d{1,3}\.\d{1,3}|0:0:0:0:0:0:0:1|::1'

<Proxy-IP> muss dabei durch die tatsächliche, mit Punkten maskierte IP-Adresse des Reverse-Proxys ersetzt werden, z. B. 194\.95\.62\.71. Bei mehreren Proxy-Servern lassen sich weitere IPs, jeweils getrennt durch |, ergänzen.

X-Forwarded-Proto Header setzen

Zusätzlich muss der Reverse-Proxy den Header X-Forwarded-Proto mit dem Wert https an Relution weiterleiten. Im location /-Block der nginx-Konfiguration muss dazu folgende Zeile gesetzt sein:

proxy_set_header X-Forwarded-Proto $scheme;

Diese Zeile ist im Standard-Template relution-nginx.conf bereits enthalten. Bei einer eigenen bzw. angepassten Reverse-Proxy-Konfiguration, oder wenn sich ein weiterer Proxy davor befindet, ist zu prüfen, ob der Header korrekt gesetzt und nicht durch einen vorgelagerten Proxy überschrieben wird.

Nach dem Anpassen der application.yml bzw. der Reverse-Proxy-Konfiguration muss der Relution-Dienst bzw. Container (und ggf. der Reverse-Proxy) neu gestartet werden, damit die Änderung wirksam wird.


Temporärer Workaround

Kann die Konfiguration des Reverse-Proxys kurzfristig nicht angepasst werden, lässt sich die Prüfung auf eine gesicherte Verbindung serverseitig auch vorübergehend deaktivieren. Dazu folgenden Eintrag auf oberster Ebene in die application.yml eintragen:

relution:
  server:
    jwt-secure-flag-enabled: false

Weitere Hinweise

  • Dieses Problem betrifft in erster Linie Installationen, bei denen der Reverse-Proxy nicht auf demselben Host wie Relution läuft.
  • Betroffen sind Relution-Installationen ab Version 26.4.0.
  • Die Meldung Zugang nicht gestattet ist eine allgemeine Fehlermeldung, die im Portal für verschiedenste, vom Server abgelehnte Anfragen angezeigt wird. Die in diesem Artikel beschriebene Lösung ist nur dann zutreffend, wenn im Server-Log zusätzlich der ERROR-Eintrag TLS required erscheint.
  • Siehe auch: Docker Installation - Optional: nginx →
Top