Tomat: запустить / остановить / перезагрузить приложение от JMX? Как управлять запуском / остановкой / перезапуском приложения программой? - PullRequest
1 голос
/ 08 мая 2019

Справочная информация: У меня есть задача start/stop/reload приложение JMX, развернутое в tomcat, jboss, weblogic или websphere.(Вероятно, известно, что на упомянутых серверах веб-приложений уже есть страница менеджера для ее реализации, мы просто хотим сосредоточить функцию start/stop/reload всех этих четырех основных администраторов веб-серверов на JMX на одной странице).

Вопрос с котом: У меня есть пример приложения с именем JMXWebExample1-0.1.Я мог посетить страницу менеджера, введя tomcat/tomcat(username/password) на страницу входа в систему, и я вижу следующую ссылку, нажав кнопку остановки рядом с именем приложения.

http://localhost:8080/manager/html/stop;jsessionid=49CDCBA3DDB3081BA3D6C5BCD9E4C8A3?path=/JMXWebExample1-0.1&org.apache.catalina.filters.CSRF_NONCE=59E98C1BA757DD3E7D9FDEA4504D3423

Ссылка имеет jsessionid=49CDCBA3DDB3081BA3D6C5BCD9E4C8A3 и CSRF token org.apache.catalina.filters.CSRF_NONCE=59E98C1BA757DD3E7D9FDEA4504D3423.

Поэтому, когда я вызываю http://localhost:8080/manager/html/stop?path=/JMXWebExample1-0.1, он всегда дает мне 403 кода состояния (доступ запрещен). Вопрос как я могу остановить приложение JMXWebExample1-0.1 аналогично странице менеджера tomcat?

Несколько шагов перед запуском tomcat У меня есть следующие шаги перед запуском tomcat:1) Включите JMX, добавив% CATALINA_OPTS%,

CATALINA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9000 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"

2) tomcat-users.xml: Я поставил следующую конфигурацию:

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

3) context.xml, который находится под E:\apache-tomcat-9.0.12\webapps\manager\META-INF\context.xml, я комментирую следующую строку:

<Context antiResourceLocking="false" privileged="true" >

 <!--  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|\d+\.\d+\.\d+\.\d+" />  -->
  <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>

Обновлен: E:\apache-tomcat-9.0.12\conf\tomcat-users.xml, при входе в систему я использую tomcat.

<role rolename="tomcat"/>
  <role rolename="role1"/>
  <role rolename="admin-script" />
  <role rolename="manager-gui"/>
  <role rolename="manager-status"/>
  <role rolename="manager-script"/>
  <role rolename="manager-jmx"/>
  <role rolename="admin-gui"/>
  <role rolename="admin-jmx" />
  <user username="tomcat" password="tomcat" roles="manager-gui,manager-jmx"/>
  <user username="both" password="both" roles="tomcat,role1"/>
  <user username="role1" password="role1" roles="role1"/>
  <user username="all" password="all" roles="tomcat,role1,manager-script,manager-jmx" />

В E:\apache-tomcat-9.0.12\webapps\manager\META-INF\context.xml:

<Context antiResourceLocking="false" privileged="true" >

 <!--  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|\d+\.\d+\.\d+\.\d+" />  -->
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow=".*" />
  <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>

Команда для вызова: http://localhost:8080/manager/html/stop?path=/JMXWebExample1-0.1

1 Ответ

0 голосов
/ 08 мая 2019

Прежде всего, tomcat предлагает интерфейсы HTML и JMX, к которым нужно обращаться по-другому.
вы пытаетесь использовать html один, для этого вы должны отправить запрос POST на

http://localhost:8080/manager/html/stop?path=/sample&org.apache.catalina.filters.CSRF_NONCE=A2D857324A2C4F5F3EAE0DE2934502BA

Страница / manager защищена от CSRF параметром org.apache.catalina.filters.CSRF_NONCE. В случае удаления выдается ошибка 403 с объяснением:

Интерфейс HTML защищен от CSRF, а интерфейс для текста и JMX - нет. Для поддержания защиты CSRF:

Пользователям с ролью manager-gui не следует назначать роли manager-script или manager-jmx.

Итак, если вы хотите остановить приложение, отправьте запрос POST с допустимым токеном CSRF.

Остановить приложение через JMX
Во-первых, вы отключили аутентификацию с помощью -Dcom.sun.management.jmxremote.authenticate=false, вы можете изменить это. jconsole можно использовать для управления tomcat через JMX, подключившись к удаленному приложению по адресу <ip address>:9000.
Затем, чтобы остановить приложение, использующее Catalina -> WebModule MBean, вы увидите несколько доступных операций, найдите stop() и используйте его:

enter image description here

Наконец, как показано в документах , я думаю, вам следует изменить шаблон проверки или вообще удалить атрибут allow. Комментарий к клапану, вероятно, отключает эту функцию.

<Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow=".*"/>

Кроме того, роль для доступа JMX равна manager-jmx.

Знайте о безопасности здесь!

...