Sécurité JMX sous JBoss

Cette page a été rédigée il y a fort fort longtemps, et n'a pas tellement été mise à jour.

 

Vous savez, moi je ne crois pas qu'il y ait de bonne ou de mauvaise page. Moi, si je devais résumer mon wiki aujourd'hui avec vous, je dirais que c'est d'abord des rencontres. Des gens qui m'ont tendu la main, peut-être à un moment où je ne pouvais pas, où j'étais seul chez moi. Et c'est assez curieux de se dire que les hasards, les rencontres forgent une destinée... Parce que quand on a le goût de la chose, quand on a le goût de la chose bien faite, le beau geste, parfois on ne trouve pas l'interlocuteur en face je dirais, le miroir qui vous aide à avancer. Alors ça n'est pas mon cas, comme je disais là, puisque moi au contraire, j'ai pu ; et je dis merci au wiki, je lui dis merci, je chante le wiki, je danse le wiki... je ne suis qu'amour ! Et finalement, quand des gens me disent « Mais comment fais-tu pour avoir cette humanité ? », je leur réponds très simplement que c'est ce goût de l'amour, ce goût donc qui m'a poussé aujourd'hui à entreprendre une construction logicielle... mais demain qui sait ? Peut-être simplement à me mettre au service de la communauté, à faire le don, le don de soi.

Les accès JMX (consoles, twiddle, RMI) permettent de manipuler les MBeans déployés dans JBoss. Celà leur confère une puissance sans limite vis-à-vis du serveur d’application : arrêt du serveur, déploiement d’applications, inspection des composants,…​

Il est donc absolument nécessaire de sécuriser tous les accès JMX au serveur.

Sécuriser les consoles

Les consoles JMX (jmx-console) et Web (web-console) sont des applications Web traditionnelles, elles doivent donc être sécurisées en tant que tel. Les configurations fournies avec JBoss permettent d’activer l’authentification très rapidement puisque tout le paramétrage est présent dans les fichiers web.xml et jboss-web.xml, mais en commentaire.

  <!-- web.xml -->
  <security-constraint>
    <web-resource-collection>
      <web-resource-name>HtmlAdaptor</web-resource-name>
      <description>An example security config that only allows users with the
        role JBossAdmin to access the HTML JMX console web application
      </description>
      <url-pattern>/*</url-pattern>
      <http-method>GET</http-method>
      <http-method>POST</http-method>
    </web-resource-collection>
    <auth-constraint>
      <role-name>JBossAdmin</role-name>
    </auth-constraint>
  </security-constraint>

  <login-config>
     <auth-method>BASIC</auth-method>
     <realm-name>JBoss JMX Console</realm-name>
  </login-config>

  <security-role>
     <role-name>JBossAdmin</role-name>
  </security-role>

Attention cependant, à utiliser le même "security-domain" pour les deux consoles, ce qui n’est pas le cas avec les exemples fournis. Il faut veiller aussi à changer les login et password par défaut dans les fichiers properties.

  <!-- jboss-web.xml -->
  <security-domain>java:/jaas/jmx-console</security-domain>

La sécurité de ces applications peut être renforcée en activant l’accès SSL.

Sécuriser le JMX Invoker

Authentification

Les accès via RMI et twiddle passent par le jmx-invoker. Pour le sécuriser, il faut décommenter la partie proposée en fin du fichier jmx-invoker-service.xml :

  <!-- deploy/jmx-invoker-service.xml -->
  <descriptors>
    <interceptors>
      <interceptor code="org.jboss.jmx.connector.invoker.AuthenticationInterceptor"
                   securityDomain="java:/jaas/jmx-console"/>
    </interceptors>
  </descriptors>

Un fois cette partie activée, les accès RMI nécessitent du authentification via un ClientLoginModule ou via la connexion à JNDI. Les accès par script (twiddle ou shutdown) nécessitent de renseigner les arguments -u et -p.

Restrictions réseau

La sécurité des accès distants peut encore être renforcée par un filtrage au niveau système.

Le jmx-invoker utilise un protocole de communication RMI qui s’appuie sur un invoker jrmp, pooled, iiop ou http. En standard, c’est l’invoker jrmp qui est utilisé. Par conséquent, les accès twiddle ou RMI se font via le port 4444. Si on crée un nouvel invoker, sur un autre port, il est alors possible de faire passer uniquement les invocations JMX par ce nouvel invoker. Il reste alors à paramétrer le firewall système du serveur pour qu’il n’accepte que les adresses IP des postes d’administrateur sur ce port.

Pour créer un nouvel invoker, on duplique l’invoker jrmp, du fichier conf/jboss-service.xml, en changeant le port et le nom du MBean ; puis on modifie le ProxyFactory du JmxInvoker.

  <!-- deploy/jmx-invoker-service.xml -->
  <mbean code="org.jboss.invocation.jrmp.server.JRMPProxyFactory"
     name="jboss.jmx:type=adaptor,name=Invoker,protocol=jrmp,service=proxyFactory">
     <depends optional-attribute-name="InvokerName">jboss:service=invoker,type=admin</depends>
  </mbean>

  <!-- RMI/JRMP invoker for Admin -->
  <mbean code="org.jboss.invocation.jrmp.server.JRMPInvoker"
     name="jboss:service=invoker,type=admin">
     <attribute name="RMIObjectPort">4449</attribute>
     <attribute name="ServerAddress">${jboss.bind.address}</attribute>
     <depends>jboss:service=TransactionManager</depends>
  </mbean>

Toutes ces choses peuvent d’automatiser par un petit script shell.

Testé avec JBoss 4.0.5

<span class="error">Attention : la clé de tri par défaut « SecureJMX » écrase la précédente clé « JBoss/SecureJMX ».</span>