habilitar JMX en un entorno de producción
Esta anotación describe como habilitar las extensiones JMX con autenticación y/o SSL. Hace poco tuvimos que hacerlo en el trabajo y dado que no he encontrado documentación al respecto en casi ningún sitio, se queda aquí para que no se me olvide.
JMX por cierto, es una de las técnicas que se usa para interactuar con una JVM remota:

Casi cualquier tutorial disponible en Internet tiende a centrarse más en el uso del API que en su configuración, la cual se suele resumir en arrancar la máquina virtual con al menos tres parámetros (java -D..):
- com.sun.management.jmxremote.port: puerto a través del cuál nos conectamos a la JVM remota, por poner un ejemplo, el 8888.
- com.sun.management.jmxremote.ssl: establece el uso de SSL; para no complicarse mucho la vida se suele poner a false.
- com.sun.management.jmxremote.authenticate: establece si hay que identificarse para poder conectarse a la JVM remota; para no complicarse mucho la vida se suele poner a false.
Esto, que está muy bien para hacer pruebecillas caseras, no es muy aconsejable en entornos de producción. De hecho, no es nada aconsejable: los servidores de aplicaciones suelen publicar MBeans JMX que permiten interactuar con prácticamente cualuiqer funcionalidad del servidor, por ejemplo, pueden permitir ejecutar una query (cualquier query) SQL para "comprobar" el estado de un pool de conexiones, se puede mandar una orden al servidor para que se apague... Como éstas, se pueden hacer 200 más, por lo que se hace necesario securizar el acceso por JMX a una JVM. Para esto tenemos dos opciones, no exclusivas:
1) Securizar el acceso usando usuario/contraseña
Tal cómo se explica en javapassion, hay que configurar dos ficheros, la propiedad com.sun.management.jmxremote.authenticate debe ir a true, y deben añadirse dos propiedades más cuándo se lanza la JVM:
- com.sun.management.jmxremote.access.file: especifica la ruta al fichero de acceso.
- com.sun.management.jmxremote.password.file: especifica la ruta al fichero de contraseñas.
Por motivos de seguridad, ambos ficheros deben ser accesibles únicamente por el usuario que arranca la JVM. Bajo Linux/Unix esto se consigue con las órdenes:
$ chmod 0600 jmx.password
Bajo Windows hay que dar alguna vuelta más, o bien se puede ejecutar desde una consola de comandos las siguientes órdenes, que para el caso va a ser lo mismo:
$ cacls jmxremote.access /P [username]:R
siendo [username] el usuario con el que queremos tener acceso al fichero. En caso de no aplicar estas políticas de seguridad a los ficheros, nos encontraremos con errores del tipo "Password file read access must be restricted".
2) Securizar el acceso usando SSL
Por un lado, la JVM que monitoriza (el cliente JMX) debe arrancarse con la propiedad com.sun.management.jmxremote.ssl.need.client.auth a true, mientras que la JVM monitorizada debe ir con la propiedad com.sun.management.jmxremote.ssl a true. Una vez esta última propiedad está a true, se deben indicar el resto de propiedades com.sun.management.jmxremote.ssl.*, que vienen convenientemente detalladas en el enlace anterior.
