3 votes

Tomat : démarrer/arrêter/recharger une application par JMX ? Comment gérer le démarrage/arrêt/redémarrage d'une application par programme ?

Contexte :
J'ai une tâche à accomplir start/stop/reload une demande de JMX déployé dans tomcat, jboss, weblogic ou websphere. (On sait probablement que les serveurs d'application web mentionnés ont déjà une page de gestion pour l'implémenter, nous voulons simplement concentrer tous les administrateurs de ces quatre grands serveurs web'). start/stop/reload fonctionnalité par JMX en une seule page).

Question avec tomcat :
J'ai un exemple d'application nommé JMXWebExample1-0.1 . J'ai pu visiter la page du gestionnaire en entrant tomcat/tomcat(username/password) à la page de connexion demandée, et je vois le lien suivant en cliquant sur le bouton d'arrêt à côté du nom de l'application.

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

Le lien a jsessionid=49CDCBA3DDB3081BA3D6C5BCD9E4C8A3 et CSRF token org.apache.catalina.filters.CSRF_NONCE=59E98C1BA757DD3E7D9FDEA4504D3423 .

Ainsi, lorsque j'invoque, http://localhost:8080/manager/html/stop?path=/JMXWebExample1-0.1 Il me donne toujours un code d'état 403 (accès refusé). La question est la suivante comment je pourrais arrêter l'application JMXWebExample1-0.1 similaire à la page du gestionnaire de tomcat ?

Quelques étapes avant de démarrer tomcat
J'ai suivi les étapes suivantes avant le démarrage de tomcat :
1) Activer JMX en ajoutant %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 : J'ai mis la configuration suivante :

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

3) context.xml qui se trouve sous E:\apache-tomcat-9.0.12\webapps\manager\META-INF\context.xml Je commente la ligne suivante :

<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>

Mise à jour :
E:\apache-tomcat-9.0.12\conf\tomcat-users.xml Lors de la connexion, j'utilise 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-guimanager-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" />

En 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>

Commande à invoquer : http://localhost:8080/manager/html/stop?path=/JMXWebExample1-0.1

2voto

Luis Muñoz Points 256

Tout d'abord, Tomcat offre HTML y JMX qui doivent être accessibles d'une manière différente.
vous essayez d'utiliser la version html, pour cela vous devez envoyer une requête POST à

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

La page /manager est protégée contre le CSRF grâce à l'option org.apache.catalina.filters.CSRF_NONCE paramètre. S'il est supprimé, une erreur 403 est reçue, accompagnée d'une explication :

L'interface HTML est protégée contre le CSRF, mais les interfaces texte et JMX ne le sont pas. Pour maintenir la protection CSRF :

Les utilisateurs ayant le rôle de manager-gui ne doivent pas se voir accorder le droit d'accès à l'information, ni le droit d'accès à l'information. manager-script ou manager-jmx rôles.

Ainsi, si vous souhaitez arrêter une application, envoyez une requête POST avec un jeton CSRF valide.

Arrêter une application via JMX
Tout d'abord, vous avez désactivé l'authentification avec -Dcom.sun.management.jmxremote.authenticate=false Il se peut que vous souhaitiez le modifier. jconsole peut être utilisé pour contrôler tomcat via JMX en se connectant à une application distante à l'adresse <ip address>:9000 adresse.
Ensuite, pour arrêter une application, utilisez Catalina -> WebModule MBean, vous verrez plusieurs opérations disponibles. stop() et l'utiliser :

enter image description here

Enfin, comme indiqué sur les docs Je pense que vous devriez modifier le modèle de validation ou supprimer l'élément allow de l'attribut. Le fait de commenter la valve désactive probablement la fonctionnalité.

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

En outre, le rôle pour l'accès à JMX es manager-jmx .

Attention aux questions de sécurité !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X