Wie kann der Zugriff auf einen Kontext im Reverse-Proxy-Tomcat-Kontext eingeschränkt werden?

Wie kann der Zugriff auf einen Kontext im Reverse-Proxy-Tomcat-Kontext eingeschränkt werden?

Ich habe eine Tomcat-Anwendung mit einem Apache-Reverse-Proxy laufen. Ich versuche, den Zugriff auf dieManagerUndHost-ManagerKontexte nur vom lokalen Host.

Daher habe ich die folgende Zeile in der Datei context.xml aus beiden Kontexten auskommentiert:

<!--
Remove the comment markers from around the Valve below to limit access to
the manager application to clients connecting from localhost
-->
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
     allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />

Wenn ich jedoch versuche, vom lokalen Host aus auf diese Kontexte zuzugreifen, wird mir immer die Fehlerseite 403 angezeigt.

Ich habe nicht verstanden,d+Sache in dererlaubenAttribut, also habe ich auch versuchterlauben="127\.0\.0\.1|::1|0:0:0:0:0:0:0:0:1"auch ohne Erfolg.

Stimmt etwas mit meiner context.xml-Konfiguration nicht?

Verhält es sich anders, wenn Verbindungen gefiltert werden, wenn diese zuerst durch Apaches mod_proxy laufen (ProxyPass ajp://localhost:8009)?

Danke

Antwort1

Hier kommen zwei verschiedene Mechanismen zum Tragen: die Einschränkung des Zugriffs auf einen Kontext (die mithilfe von erfolgt RemoteAddrValve) und das in integrierte RBAC server.xml:

<Resource name="UserDatabase" auth="Container"
          type="org.apache.catalina.UserDatabase"
          description="User database that can be updated and saved"
          factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
          pathname="conf/tomcat-users.xml" />

Folgendes wurde getestet mit tomcat-8.0.23:

Eine Standardkonfiguration, die lediglich geändert wurde, um den Zugriff localhostauf den managerKontext einzuschränken, indem die apache-tomcat-8.0.23/webapps/manager/META-INF/context.xmlDatei geändert wurde, um die Kommentare auf dem Ventil zu entfernen:

<Valve className="org.apache.catalina.valves.RemoteAddrValve"
      allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> 

Ohne weitere Änderungen schlägt der Versuch, auf den Kontext zuzugreifen, mit einem 401-HTTP-Fehler fehl:

$ curl -v -L localhost:8080/manager/
*   Trying ::1...
* Connected to localhost (::1) port 8080 (#0)
> GET /manager/ HTTP/1.1
> User-Agent: curl/7.40.0
> Host: localhost:8080
> Accept: */*
>
< HTTP/1.1 302 Found
< Server: Apache-Coyote/1.1
< Set-Cookie: JSESSIONID=F3F2A25463ED1CD49E154FA5428B853A; Path=/manager/; HttpOnly
< Location: http://localhost:8080/manager/html;jsessionid=F3F2A25463ED1CD49E154FA5428B853A?org.apache.catalina.filters.CSRF_NONCE=B5CB272DF379F59A8158583826850550
< Content-Type: text/html;charset=ISO-8859-1
< Content-Length: 0
< Date: Sun, 14 Jun 2015 08:47:27 GMT
<
* Connection #0 to host localhost left intact
* Issue another request to this URL: 'http://localhost:8080/manager/html;jsessionid=F3F2A25463ED1CD49E154FA5428B853A?org.apache.catalina.filters.CSRF_NONCE=B5CB272DF379F59A8158583826850550'
* Found bundle for host localhost: 0x256e460
* Re-using existing connection! (#0) with host localhost
* Connected to localhost (::1) port 8080 (#0)
> GET /manager/html;jsessionid=F3F2A25463ED1CD49E154FA5428B853A?org.apache.catalina.filters.CSRF_NONCE=B5CB272DF379F59A8158583826850550 HTTP/1.1
> User-Agent: curl/7.40.0
> Host: localhost:8080
> Accept: */*
>
< HTTP/1.1 401 Unauthorized
< Server: Apache-Coyote/1.1
< Cache-Control: private
< Expires: Thu, 01 Jan 1970 01:00:00 GMT
< WWW-Authenticate: Basic realm="Tomcat Manager Application"
< Content-Type: text/html;charset=ISO-8859-1
< Content-Length: 2474
< Date: Sun, 14 Jun 2015 08:47:27 GMT

Fügen Sie der apache-tomcat-8.0.23/conf/tomcat-users.xmlDatei nach der Änderung Folgendes hinzu:

<role rolename="manager-gui"/>
<user username="tomcat" password="tomcat" roles="manager-gui"/>

und der Versuch, auf den Kontext zuzugreifen, diesmal mithilfe der Authentifizierung, ist erfolgreich:

$ curl -v -L -utomcat:tomcat localhost:8080/manager/
*   Trying ::1...
* Connected to localhost (::1) port 8080 (#0)
* Server auth using Basic with user 'tomcat'
> GET /manager/ HTTP/1.1
> Authorization: Basic dG9tY2F0OnRvbWNhdA==
> User-Agent: curl/7.40.0
> Host: localhost:8080
> Accept: */*
>
< HTTP/1.1 302 Found
< Server: Apache-Coyote/1.1
< Set-Cookie: JSESSIONID=7890CA71EC221A152BDB4F04B66BE49E; Path=/manager/; HttpOnly
< Location: http://localhost:8080/manager/html;jsessionid=7890CA71EC221A152BDB4F04B66BE49E?org.apache.catalina.filters.CSRF_NONCE=92DAD506CB8E9E24E8454BBA94567F84
< Content-Type: text/html;charset=ISO-8859-1
< Content-Length: 0
< Date: Sun, 14 Jun 2015 08:48:09 GMT
<
* Connection #0 to host localhost left intact
* Issue another request to this URL: 'http://localhost:8080/manager/html;jsessionid=7890CA71EC221A152BDB4F04B66BE49E?org.apache.catalina.filters.CSRF_NONCE=92DAD506CB8E9E24E8454BBA94567F84'
* Found bundle for host localhost: 0x69e4c0
* Re-using existing connection! (#0) with host localhost
* Connected to localhost (::1) port 8080 (#0)
* Server auth using Basic with user 'tomcat'
> GET /manager/html;jsessionid=7890CA71EC221A152BDB4F04B66BE49E?org.apache.catalina.filters.CSRF_NONCE=92DAD506CB8E9E24E8454BBA94567F84 HTTP/1.1
> Authorization: Basic dG9tY2F0OnRvbWNhdA==
> User-Agent: curl/7.40.0
> Host: localhost:8080
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: Apache-Coyote/1.1
< Cache-Control: private
< Expires: Thu, 01 Jan 1970 01:00:00 GMT
< Set-Cookie: JSESSIONID=42B0B26688726A802B665B0B33D1690B; Path=/manager/; HttpOnly
< Content-Type: text/html;charset=utf-8
< Transfer-Encoding: chunked
< Date: Sun, 14 Jun 2015 08:48:09 GMT

Wenn Sie nun versuchen, eine andere Schnittstelle zum Ausführen der Anforderung zu verwenden (also nicht localhost), wird ein 403-HTTP-Fehler angezeigt, unabhängig davon, ob Sie die Authentifizierung verwenden oder nicht:

$ curl --interface wlp6s0 -v -L -utomcat:tomcat localhost:8080/manager/
*   Trying ::1...
*   Trying 127.0.0.1...
* Local Interface wlp6s0 is ip 192.168.1.187 using address family 2
* SO_BINDTODEVICE wlp6s0 failed with errno 1: Operation not permitted; will do regular bind
* Local port: 0
* Connected to localhost (127.0.0.1) port 8080 (#0)
* Server auth using Basic with user 'tomcat'
> GET /manager/ HTTP/1.1
> Authorization: Basic dG9tY2F0OnRvbWNhdA==
> User-Agent: curl/7.40.0
> Host: localhost:8080
> Accept: */*
>
< HTTP/1.1 403 Forbidden
< Server: Apache-Coyote/1.1
< Set-Cookie: JSESSIONID=2F3ADE627300D4D264478927D1F0BBFC; Path=/manager/; HttpOnly
< Content-Type: text/html;charset=ISO-8859-1
< Content-Length: 3196
< Date: Sun, 14 Jun 2015 09:06:52 GMT
<

Dies ist wie erwartet, da wir den Zugriff localhostnur von einschränken.

Kurz gesagt, wenn Sie eine 403-Fehlerantwort erhalten, überprüfen Sie die Schnittstelle, die Tomcat überwacht:

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />

$ ss -tulpan | grep LISTEN.*8080

und die Schnittstelle, die Sie für die Anfrage verwenden.

  tcp    LISTEN     0      100                   :::8080                 :::*      users:(("java",pid=32490,fd=48))

Antwort2

Da ich wusste, dass meine Anfragen von der öffentlichen IP meines Servers gesendet wurden, habe ich meine context.xml wie folgt geändert:

<Valve className="org.apache.catalina.valves.RemoteAddrValve"
 allow="xxx\.xxx\.xxx\.xxx|127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />

Woxxx.xxx.xxx.xxxist die öffentliche IP des Servers. Es funktioniert jetzt.

Danke fürs Helfen

verwandte Informationen