Introducción
En un ambiente de producción se deben configurar ciertas características en JBoss las cuales son cuestiones de seguridad, rendimiento y disponibilidad. Factores como compilación de JSP, Frameworks para producción, logger, parámetros de la maquina virtual, clúster, scanner de aplicaciones, eliminación de servicios innecesarios, pool de conexiones (EJB's y base de datos), seguridad de consolas, etc.
Requisitos
JBoss 6.1 instalado correctamente
JDK instalado correctamente
jboss-native-2.0.9-windows-x64-ssl
*NOTA: [INSTANCIA] es considerada como "all" para esta ficha técnica y puede aplicar para aquellas instancias que contengan los servicios requeridos.
Cambiar contraseña default de HornetQ
En un ambiente de producción se deben configurar ciertas características en JBoss las cuales son cuestiones de seguridad, rendimiento y disponibilidad. Factores como compilación de JSP, Frameworks para producción, logger, parámetros de la maquina virtual, clúster, scanner de aplicaciones, eliminación de servicios innecesarios, pool de conexiones (EJB's y base de datos), seguridad de consolas, etc.
Requisitos
JBoss 6.1 instalado correctamente
JDK instalado correctamente
jboss-native-2.0.9-windows-x64-ssl
*NOTA: [INSTANCIA] es considerada como "all" para esta ficha técnica y puede aplicar para aquellas instancias que contengan los servicios requeridos.
Cambiar contraseña default de HornetQ
Agregar el usuario y contraseña al archivo:
JBOSS_HOME\server\[INSTANCIA]\deploy\hornetq\hornetq-configuration.xml
...
<name>HornetQ.main.config</name>
<cluster-user>HornetAdmin</cluster-user>
<cluster-password>TU_PASSSWORD_AQUI</cluster-password>
JBOSS_HOME\server\[INSTANCIA]\deploy\hornetq\hornetq-configuration.xml
...
<name>HornetQ.main.config</name>
<cluster-user>HornetAdmin</cluster-user>
<cluster-password>TU_PASSSWORD_AQUI</cluster-password>
<log-delegate-factory-class-name>org.hornetq.integration.logging.Log4jLogDelegateFactory
</log-delegate-factory-class-name>
...
Cambiar puerto http de 8080 a 80 y puerto https de 8443 a 443
Editar el archivo: JBOSS_HOME/server/[INSTANCIA]/conf/bindingservice.beans/META-INF/bindings-jboss-beans.xml
...
Cambiar puerto http de 8080 a 80 y puerto https de 8443 a 443
Editar el archivo: JBOSS_HOME/server/[INSTANCIA]/conf/bindingservice.beans/META-INF/bindings-jboss-beans.xml
Localizar conector HttpConnector y cambiar la propiedad del puerto por 80
...
<name>HornetQ.main.config</name>
<cluster-user>HornetAdmin</cluster-user>
<cluster-password>TU_PASSSWORD_AQUI</cluster-password>
<log-delegate-factory-class-name>org.hornetq.integration.logging.Log4jLogDelegateFactory</log-delegate-factory-class-name>
...
Editar el archivo: JBOSS_HOME/server/[INSTANCIA]/conf/bindingservice.beans/META-INF/bindings-jboss-beans.xml
Localizar el conector HttpsConnector y cambiar la propiedad del puerto por 443
...
<bean class="org.jboss.services.binding.ServiceBindingMetadata">
<property name="serviceName">jboss.web:service=WebServer</property>
<property name="bindingName">HttpsConnector</property>
<!-- <property name="port">8443</property>-->
<property name="port">443</property>
<property name="description">JBoss Web HTTPS connector socket</property>
</bean>
...
Habilitar puertos de Firewall
JBoss 6.1 requiere de los siguientes puertos
TCP: 1098, 1099, 4444, 4445, 8009, 8080, 8083, 8093, 1100, 1101, 1389, 3843, 3528, 3873, 4447
UDP: 1102, 1161, 1162, 45566
NOTA: Si se está trabajando en un servidor Windows se deben agregar estas reglas en el firewall como entradas (Inbound Rules) dependiendo del tipo de protocolo (UDP o TCP)
Clustering
Para iniciar JBoss 6.1 como clúster es necesario ejecutar el siguiente comando en cada instancia del clúster:
JBOSS_HOME\bin\run.bat -b [IP] -c all -Djboss.messaging.ServerPeerID=[ID] -g [NOMBRE]
Donde:
IP - Es la ip de la máquina.
ID - Es un identificador numérico único. Cada nodo del clúster debe tener un identificador distinto. ej. un nodo tendrá 1 y otro nodo 2 y así sucesivamente.
NOMBRE - Es el nombre de la partición. Este valor debe ser el mismo para todos los nodos que integran el clúster.
La consola debe mostrar la ip de los nodos involucrados en el clúster:
17:08:26,193 INFO [org.apache.coyote.http11.Http11Protocol] Starting Coyote HTTP/1.1 on http-10.0.1.46-80
17:08:26,208 INFO [org.apache.coyote.ajp.AjpProtocol] Starting Coyote AJP/1.3 on ajp-10.0.1.46-8009
17:08:26,208 INFO [org.jboss.bootstrap.impl.base.server.AbstractServer] JBossAS [6.1.0.Final "Neo"] Started in 32s:920ms
17:08:26,740 INFO [org.hornetq.core.server.cluster.impl.BridgeImpl] Connecting bridge sf.my-cluster.8623b9ae-d03f-11e0-b604-005056ab0077 to its destination [da62219f-cddf-11e0-93b2-005056ab0078]
17:08:27,130 INFO [org.jboss.ha.framework.server.ClusterPartition.lifecycle.jboss6partition] New cluster view for partition jboss6partition (id: 1, delta: 1, merge: false) : [10.0.1.46:1099, 10.0.1.45:1099]
17:08:27,130 INFO [org.infinispan.remoting.transport.jgroups.JGroupsTransport] Received new cluster view: [10.0.1.46:1099|1] [10.0.1.46:1099, 10.0.1.45:1099]
17:08:27,130 INFO [org.jboss.ha.core.framework.server.DistributedReplicantManagerImpl.jboss6partition] I am (10.0.1.46:1099) received membershipChanged event:
17:08:27,130 INFO [org.jboss.ha.core.framework.server.DistributedReplicantManagerImpl.jboss6partition] Dead members: 0 ([])
17:08:27,146 INFO [org.jboss.ha.core.framework.server.DistributedReplicantManagerImpl.jboss6partition] New Members : 1 ([10.0.1.45:1099])
17:08:27,146 INFO [org.jboss.ha.core.framework.server.DistributedReplicantManagerImpl.jboss6partition] All Members : 2 ([10.0.1.46:1099, 10.0.1.45:1099])
17:08:27,255 INFO [org.hornetq.core.server.cluster.impl.BridgeImpl] Bridge sf.my-cluster.8623b9ae-d03f-11e0-b604-005056ab0077 is connected [da62219f-cddf-11e0-93b2-005056ab0078-> sf.my-cluster.8623b9ae-d03f-11e0-b604-005056ab0077]
PROBLEMAS AL ARRANCAR
En caso de no arrancar JBoss en clúster puede deberse a:
La documentación menciona que debe estar habilitado el multicast en la red o subred en donde se encuentran los nodos para un correcto arranque. Para probar el multicast realizar:
...
<name>HornetQ.main.config</name>
<cluster-user>HornetAdmin</cluster-user>
<cluster-password>TU_PASSSWORD_AQUI</cluster-password>
<log-delegate-factory-class-name>org.hornetq.integration.logging.Log4jLogDelegateFactory</log-delegate-factory-class-name>
...
Editar el archivo: JBOSS_HOME/server/[INSTANCIA]/conf/bindingservice.beans/META-INF/bindings-jboss-beans.xml
Localizar el conector HttpsConnector y cambiar la propiedad del puerto por 443
...
<bean class="org.jboss.services.binding.ServiceBindingMetadata">
<property name="serviceName">jboss.web:service=WebServer</property>
<property name="bindingName">HttpsConnector</property>
<!-- <property name="port">8443</property>-->
<property name="port">443</property>
<property name="description">JBoss Web HTTPS connector socket</property>
</bean>
...
Habilitar puertos de Firewall
JBoss 6.1 requiere de los siguientes puertos
TCP: 1098, 1099, 4444, 4445, 8009, 8080, 8083, 8093, 1100, 1101, 1389, 3843, 3528, 3873, 4447
UDP: 1102, 1161, 1162, 45566
NOTA: Si se está trabajando en un servidor Windows se deben agregar estas reglas en el firewall como entradas (Inbound Rules) dependiendo del tipo de protocolo (UDP o TCP)
Clustering
Para iniciar JBoss 6.1 como clúster es necesario ejecutar el siguiente comando en cada instancia del clúster:
JBOSS_HOME\bin\run.bat -b [IP] -c all -Djboss.messaging.ServerPeerID=[ID] -g [NOMBRE]
Donde:
IP - Es la ip de la máquina.
ID - Es un identificador numérico único. Cada nodo del clúster debe tener un identificador distinto. ej. un nodo tendrá 1 y otro nodo 2 y así sucesivamente.
NOMBRE - Es el nombre de la partición. Este valor debe ser el mismo para todos los nodos que integran el clúster.
La consola debe mostrar la ip de los nodos involucrados en el clúster:
17:08:26,193 INFO [org.apache.coyote.http11.Http11Protocol] Starting Coyote HTTP/1.1 on http-10.0.1.46-80
17:08:26,208 INFO [org.apache.coyote.ajp.AjpProtocol] Starting Coyote AJP/1.3 on ajp-10.0.1.46-8009
17:08:26,208 INFO [org.jboss.bootstrap.impl.base.server.AbstractServer] JBossAS [6.1.0.Final "Neo"] Started in 32s:920ms
17:08:26,740 INFO [org.hornetq.core.server.cluster.impl.BridgeImpl] Connecting bridge sf.my-cluster.8623b9ae-d03f-11e0-b604-005056ab0077 to its destination [da62219f-cddf-11e0-93b2-005056ab0078]
17:08:27,130 INFO [org.jboss.ha.framework.server.ClusterPartition.lifecycle.jboss6partition] New cluster view for partition jboss6partition (id: 1, delta: 1, merge: false) : [10.0.1.46:1099, 10.0.1.45:1099]
17:08:27,130 INFO [org.infinispan.remoting.transport.jgroups.JGroupsTransport] Received new cluster view: [10.0.1.46:1099|1] [10.0.1.46:1099, 10.0.1.45:1099]
17:08:27,130 INFO [org.jboss.ha.core.framework.server.DistributedReplicantManagerImpl.jboss6partition] I am (10.0.1.46:1099) received membershipChanged event:
17:08:27,130 INFO [org.jboss.ha.core.framework.server.DistributedReplicantManagerImpl.jboss6partition] Dead members: 0 ([])
17:08:27,146 INFO [org.jboss.ha.core.framework.server.DistributedReplicantManagerImpl.jboss6partition] New Members : 1 ([10.0.1.45:1099])
17:08:27,146 INFO [org.jboss.ha.core.framework.server.DistributedReplicantManagerImpl.jboss6partition] All Members : 2 ([10.0.1.46:1099, 10.0.1.45:1099])
17:08:27,255 INFO [org.hornetq.core.server.cluster.impl.BridgeImpl] Bridge sf.my-cluster.8623b9ae-d03f-11e0-b604-005056ab0077 is connected [da62219f-cddf-11e0-93b2-005056ab0078-> sf.my-cluster.8623b9ae-d03f-11e0-b604-005056ab0077]
PROBLEMAS AL ARRANCAR
En caso de no arrancar JBoss en clúster puede deberse a:
La documentación menciona que debe estar habilitado el multicast en la red o subred en donde se encuentran los nodos para un correcto arranque. Para probar el multicast realizar:
En el primer nodo:
Colocarse en JBOSS_HOME/server/[INSTANCIA]/lib
Ejecutar: java -cp jgroups.jar org.jgroups.tests.McastReceiverTest -mcast_addr 224.10.10.10 -port 5555
Colocarse en JBOSS_HOME/server/[INSTANCIA]/lib
Ejecutar: java -cp jgroups.jar org.jgroups.tests.McastReceiverTest -mcast_addr 224.10.10.10 -port 5555
En el segundo nodo:
Colocarse en JBOSS_HOME/server/[INSTANCIA]/lib
Ejecutar: java -cp jgroups.jar org.jgroups.tests.McastSenderTest -mcast_addr 224.10.10.10 -port 5555
Colocarse en JBOSS_HOME/server/[INSTANCIA]/lib
Ejecutar: java -cp jgroups.jar org.jgroups.tests.McastSenderTest -mcast_addr 224.10.10.10 -port 5555
El envío de mensajes se debe desplegar en la consola que recibe
Si se está trabajando con Windows verificar que tanto el protocolo de internet versión 4 como el 6 (TCP/IPv6, TCP/IPv4) están habilitados de lo contrario JBoss mandara un WARNING indicando este problema en la consola al momento de iniciarlo
Puertos bloqueados por algún Firewall (ver Habilitar puertos de Firewall)
Proteger consolas
JBoss 6.1 viene por default con 3 Consolas habilitadas y sin protección alguna (a excepción de Admin console cuya contraseña es admin) y una aplicación de inicio ROOT.WAR la cual se muestra al momento de colocar la ip en el puerto en un explorador
Admin console
Esta consola viene ya protegida sin embargo es necesario cambiar la contraseña ya que por default es admin
Cambiar la contraseña editando el archivo:
JBOSS_HOME\server\[INSTANCIA]\conf\props\jmx-console-users.properties
# A sample users.properties file for use with the UsersRolesLoginModule
# admin=admin
admin=NUEVACONTRASEÑA
JMX console
Des comentar el constraint para seguridad en el archivo:
JBOSS_HOME\common\deploy\jmx-console.war\WEB-INF\web.xml
...
<!-- A security constraint that restricts access to the HTML JMX console
to users with the role JBossAdmin. Edit the roles to what you want and
uncomment the WEB-INF/jboss-web.xml/security-domain element to enable
secured access to the HTML JMX console.
-->
<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>
</web-resource-collection>
<auth-constraint>
<role-name>JBossAdmin</role-name>
</auth-constraint>
</security-constraint>
...
Cambiar la contraseña editando el archivo:
JBOSS_HOME\server\[INSTANCIA]\conf\props\jmx-console-users.properties
NOTA: esta contraseña está compartida por admin-console, si ya se hizo el cambio ya no es necesario volver a cambiarla.
# A sample users.properties file for use with the UsersRolesLoginModule
# admin=admin
admin=NUEVACONTRASEÑA
Web Service Console
Des comentar el constraint para habilitar la seguridad en el archivo:
JBOSS_HOME\common\deploy\jbossws-console.war\WEB-INF\web.xml
...
<!-- A security constraint that restricts access
-->
<security-constraint>
<web-resource-collection>
<web-resource-name>ContextServlet</web-resource-name>
<description>An example security config that only allows users with the
role 'friend' to access the JBossWS console web application
</description>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>friend</role-name>
</auth-constraint>
</security-constraint>
...
Cambiar la contraseña editando el archivo:
JBOSS_HOME\server\[INSTANCIA]\conf\props\jbossws-users.properties
# A sample users.properties file for use with the UsersRolesLoginModule
kermit=NUEVA CONTRASEÑA
c. Comentar la opción unauthenticatedIdentity en el archivo:
JBOSS_HOME\server\[INSTANCIA]\conf\login-config.xml
<application-policy name="JBossWS">
<authentication>
<login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule"
flag="required">
<module-option name="usersProperties">props/jbossws-users.properties</module-option>
<module-option name="rolesProperties">props/jbossws-roles.properties</module-option>
<!-- <module-option name="unauthenticatedIdentity">anonymous</module-option> -->
</login-module>
</authentication>
</application-policy>
Instalar como servicio
Descargar la versión jboss-native para la arquitectura deseada (x86 o x64). Las versiones están disponibles en:
Subversion/FichasTecnicas/Alejo/Software/ jboss-native-2.0.9-windows-x64-ssl (para este caso en particular)
Descomprimir el archivo jboss-native-2.0.9-windows-x64-ssl y copiar las carpetas binv y licenses en el directorio JBOSS_HOME.
Los archivos se debe SOBREESCRIBIR
Configurar el servicio
Editar el archivo (agregando y modificando) JBOSS_HOME/bin/service.bat adecuando los siguientes parámetros a lo necesario:
...
set SVCNAME=JBAS61SVC
set SVCDISP=JBoss Application Server 6.1
set SVCDESC=JBoss Application Server 6.1.0 GA/Platform: Windows x64
REM Suppress killing service on logoff event
set JAVA_OPTS=-Xrs
rem Setup JBoss specific properties
set JAVA_OPTS=%JAVA_OPTS% -Xms1024m -Xmx1024m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:MaxNewSize=256m -XX:NewSize=256m -XX:+DisableExplicitGC
REM Figure out the running mode
if /I "%1" == "install" goto cmdInstall
if /I "%1" == "uninstall" goto cmdUninstall
if /I "%1" == "start" goto cmdStart
if /I "%1" == "stop" goto cmdStop
if /I "%1" == "restart" goto cmdRestart
if /I "%1" == "signal" goto cmdSignal
echo Usage: service install^|uninstall^|start^|stop^|restart^|signal
...
:cmdStart
REM Executed on service start
del .r.lock 2>&1 | findstr /C:"being used" > nul
if not errorlevel 1 (
echo Could not continue. Locking file already in use.
goto cmdEnd
)
echo Y > .r.lock
jbosssvc.exe -p 1 "Starting %SVCDISP%" > run.log
call run.bat -b 10.0.1.46 -c all -Djboss.messaging.ServerPeerID=2 -g jboss6partition < .r.lock >> run.log 2>&1
jbosssvc.exe -p 1 "Shutdown %SVCDISP% service" >> run.log
del .r.lock
goto cmdEnd
...
jbosssvc.exe -p 1 "Restarting %SVCDISP%" >> run.log
call run.bat -b 10.0.1.46 -c all -Djboss.messaging.ServerPeerID=2 -g jboss6partition < .r.lock >> run.log 2>&1
jbosssvc.exe -p 1 "Shutdown %SVCDISP% service" >> run.log
del .r.lock
...
Instalar el servicio
Abrir una consola COMO ADMINISTRADOR, colocarse en JBOSS_HOME/bin y ejecutar:
service.bat install
"5"
Encriptación de contraseña datasource
Colocarse en JBOSS_HOME en una consola y ejectutar:
java -cp client\jboss-logging.jar;lib\jbosssx.jar org.jboss.resource.security.SecureIdentityLoginModule TUPASSWORD
Donde:
TUPASSWORD: Es la clave de conexión a base de datos en el archivo *-ds.xml
Agregar la política de seguridad en el archivo:
JBOSS_HOME\server\[INSTANCIA]\conf\login-config.xml
<application-policy name="NOMBRE_POLITICA">
<authentication>
<login-module code="org.jboss.resource.security.SecureIdentityLoginModule" flag="required">
<module-option name="username">USUARIO_BD</module-option>
<module-option name="password">PASSWORD_ENCRIPTED</module-option>
<module-option name="managedConnectionFactoryName">jboss.jca:name=NOMBRE_JNDI_BD,service=LocalTxCM</module-option>
</login-module>
</authentication>
</application-policy>
Donde:
NOMBRE_POLITICA: Cualquier nombre que se le desea dar a la política
USUARIO_BD: Nombre de usuario de acceso a la base de datos
PASSWORD_ENCRIPTED: Contraseña encriptado, es el resultado del paso 1
NOMBRE_JNDI_BD: Nombre JNDI de la conexión a base de datos
Modificar el archivo JBOSS_HOME\server\[INSTANCIA]\deploy\*-ds.xml de tal forma que ya no contenga ni el usuario ni la contraseña, como se muestra a continuación:
<?xml version="1.0" encoding="UTF-8"?>
<datasources>
<local-tx-datasource>
<jndi-name>siac</jndi-name>
<connection-url>jdbc:oracle:thin:@(description=(address_list=(address=(protocol=tcp)(host=148.204.14.111)(port=1521)))(connect_data=(SERVER=DEDICATED)(service_name=DESCENAC)))</connection-url>
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
<security-domain>NOMBRE_POLITICA</security-domain>
</local-tx-datasource>
</datasources>
Donde:
NOMBRE_POLITICA: Nombre que se le dio a la política en el archivo login-config.xml
Datasource con Oracle Real Application Clusters (RAC)
Ejemplo de conexión a RAC:
<?xml version="1.0" encoding="UTF-8"?>
<datasources>
<local-tx-datasource>
<jndi-name>JNDI_NAME</jndi-name>
<connection-url>jdbc:oracle:thin:@(description=(address_list=(load_balance=on)(failover=on)(address=(protocol=tcp)(host=10.0.2.205)(port=1521))(address=(protocol=tcp)(host=10.0.2.206)(port=1521))(address=(protocol=tcp)(host=10.0.2.207)(port=1521)))(connect_data=(service_name=IPN)(failover_mode=(type=select)(method=basic))))</connection-url>
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
<user-name>USER_NAME</user-name>
<password>PASSWORD</password>
</local-tx-datasource>
</datasources>
Logger
Modificar el archivo: JBOSS_HOME\server\[INSTANCIA]\deploy\jboss-logging.xml para que solo envíe mensajes de nivel WARNING en adelante. Dado que los INFO no son importantes en un ambiente de producción, mucho menos los TRACE y DEBUG.
...
<periodic-rotating-file-handler
file-name="${jboss.server.log.dir}/server.log"
name="FILE"
autoflush="true"
append="true"
suffix=".yyyy-MM-dd"> <!-- To roll over at the top of each hour, use ".yyyy-MM-dd-HH" instead -->
<error-manager>
<only-once/>
</error-manager>
<level name="WARN"/>
<formatter>
<!-- To revert back to simple stack traces without JAR versions, change "%E" to "%e" below. -->
<!-- Uncomment this to get the class name in the log as well as the category
<pattern-formatter pattern="%d %-5p [%c] %C{1} (%t) %s%E%n"/>
-->
<!-- Uncomment this to log without the class name in the log -->
<pattern-formatter pattern="%d %-5p [%c] (%t) %s%E%n"/>
</formatter>
</periodic-rotating-file-handler>
...
Documento original
Si se está trabajando con Windows verificar que tanto el protocolo de internet versión 4 como el 6 (TCP/IPv6, TCP/IPv4) están habilitados de lo contrario JBoss mandara un WARNING indicando este problema en la consola al momento de iniciarlo
Puertos bloqueados por algún Firewall (ver Habilitar puertos de Firewall)
Proteger consolas
JBoss 6.1 viene por default con 3 Consolas habilitadas y sin protección alguna (a excepción de Admin console cuya contraseña es admin) y una aplicación de inicio ROOT.WAR la cual se muestra al momento de colocar la ip en el puerto en un explorador
Admin console
Esta consola viene ya protegida sin embargo es necesario cambiar la contraseña ya que por default es admin
Cambiar la contraseña editando el archivo:
JBOSS_HOME\server\[INSTANCIA]\conf\props\jmx-console-users.properties
# A sample users.properties file for use with the UsersRolesLoginModule
# admin=admin
admin=NUEVACONTRASEÑA
JMX console
Des comentar el constraint para seguridad en el archivo:
JBOSS_HOME\common\deploy\jmx-console.war\WEB-INF\web.xml
...
<!-- A security constraint that restricts access to the HTML JMX console
to users with the role JBossAdmin. Edit the roles to what you want and
uncomment the WEB-INF/jboss-web.xml/security-domain element to enable
secured access to the HTML JMX console.
-->
<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>
</web-resource-collection>
<auth-constraint>
<role-name>JBossAdmin</role-name>
</auth-constraint>
</security-constraint>
...
Cambiar la contraseña editando el archivo:
JBOSS_HOME\server\[INSTANCIA]\conf\props\jmx-console-users.properties
NOTA: esta contraseña está compartida por admin-console, si ya se hizo el cambio ya no es necesario volver a cambiarla.
# A sample users.properties file for use with the UsersRolesLoginModule
# admin=admin
admin=NUEVACONTRASEÑA
Web Service Console
Des comentar el constraint para habilitar la seguridad en el archivo:
JBOSS_HOME\common\deploy\jbossws-console.war\WEB-INF\web.xml
...
<!-- A security constraint that restricts access
-->
<security-constraint>
<web-resource-collection>
<web-resource-name>ContextServlet</web-resource-name>
<description>An example security config that only allows users with the
role 'friend' to access the JBossWS console web application
</description>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>friend</role-name>
</auth-constraint>
</security-constraint>
...
Cambiar la contraseña editando el archivo:
JBOSS_HOME\server\[INSTANCIA]\conf\props\jbossws-users.properties
# A sample users.properties file for use with the UsersRolesLoginModule
kermit=NUEVA CONTRASEÑA
c. Comentar la opción unauthenticatedIdentity en el archivo:
JBOSS_HOME\server\[INSTANCIA]\conf\login-config.xml
<application-policy name="JBossWS">
<authentication>
<login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule"
flag="required">
<module-option name="usersProperties">props/jbossws-users.properties</module-option>
<module-option name="rolesProperties">props/jbossws-roles.properties</module-option>
<!-- <module-option name="unauthenticatedIdentity">anonymous</module-option> -->
</login-module>
</authentication>
</application-policy>
Instalar como servicio
Descargar la versión jboss-native para la arquitectura deseada (x86 o x64). Las versiones están disponibles en:
Subversion/FichasTecnicas/Alejo/Software/ jboss-native-2.0.9-windows-x64-ssl (para este caso en particular)
Descomprimir el archivo jboss-native-2.0.9-windows-x64-ssl y copiar las carpetas binv y licenses en el directorio JBOSS_HOME.
Los archivos se debe SOBREESCRIBIR
Configurar el servicio
Editar el archivo (agregando y modificando) JBOSS_HOME/bin/service.bat adecuando los siguientes parámetros a lo necesario:
...
set SVCNAME=JBAS61SVC
set SVCDISP=JBoss Application Server 6.1
set SVCDESC=JBoss Application Server 6.1.0 GA/Platform: Windows x64
REM Suppress killing service on logoff event
set JAVA_OPTS=-Xrs
rem Setup JBoss specific properties
set JAVA_OPTS=%JAVA_OPTS% -Xms1024m -Xmx1024m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:MaxNewSize=256m -XX:NewSize=256m -XX:+DisableExplicitGC
REM Figure out the running mode
if /I "%1" == "install" goto cmdInstall
if /I "%1" == "uninstall" goto cmdUninstall
if /I "%1" == "start" goto cmdStart
if /I "%1" == "stop" goto cmdStop
if /I "%1" == "restart" goto cmdRestart
if /I "%1" == "signal" goto cmdSignal
echo Usage: service install^|uninstall^|start^|stop^|restart^|signal
...
:cmdStart
REM Executed on service start
del .r.lock 2>&1 | findstr /C:"being used" > nul
if not errorlevel 1 (
echo Could not continue. Locking file already in use.
goto cmdEnd
)
echo Y > .r.lock
jbosssvc.exe -p 1 "Starting %SVCDISP%" > run.log
call run.bat -b 10.0.1.46 -c all -Djboss.messaging.ServerPeerID=2 -g jboss6partition < .r.lock >> run.log 2>&1
jbosssvc.exe -p 1 "Shutdown %SVCDISP% service" >> run.log
del .r.lock
goto cmdEnd
...
jbosssvc.exe -p 1 "Restarting %SVCDISP%" >> run.log
call run.bat -b 10.0.1.46 -c all -Djboss.messaging.ServerPeerID=2 -g jboss6partition < .r.lock >> run.log 2>&1
jbosssvc.exe -p 1 "Shutdown %SVCDISP% service" >> run.log
del .r.lock
...
Instalar el servicio
Abrir una consola COMO ADMINISTRADOR, colocarse en JBOSS_HOME/bin y ejecutar:
service.bat install
"5"
Encriptación de contraseña datasource
Colocarse en JBOSS_HOME en una consola y ejectutar:
java -cp client\jboss-logging.jar;lib\jbosssx.jar org.jboss.resource.security.SecureIdentityLoginModule TUPASSWORD
Donde:
TUPASSWORD: Es la clave de conexión a base de datos en el archivo *-ds.xml
Agregar la política de seguridad en el archivo:
JBOSS_HOME\server\[INSTANCIA]\conf\login-config.xml
<application-policy name="NOMBRE_POLITICA">
<authentication>
<login-module code="org.jboss.resource.security.SecureIdentityLoginModule" flag="required">
<module-option name="username">USUARIO_BD</module-option>
<module-option name="password">PASSWORD_ENCRIPTED</module-option>
<module-option name="managedConnectionFactoryName">jboss.jca:name=NOMBRE_JNDI_BD,service=LocalTxCM</module-option>
</login-module>
</authentication>
</application-policy>
Donde:
NOMBRE_POLITICA: Cualquier nombre que se le desea dar a la política
USUARIO_BD: Nombre de usuario de acceso a la base de datos
PASSWORD_ENCRIPTED: Contraseña encriptado, es el resultado del paso 1
NOMBRE_JNDI_BD: Nombre JNDI de la conexión a base de datos
Modificar el archivo JBOSS_HOME\server\[INSTANCIA]\deploy\*-ds.xml de tal forma que ya no contenga ni el usuario ni la contraseña, como se muestra a continuación:
<?xml version="1.0" encoding="UTF-8"?>
<datasources>
<local-tx-datasource>
<jndi-name>siac</jndi-name>
<connection-url>jdbc:oracle:thin:@(description=(address_list=(address=(protocol=tcp)(host=148.204.14.111)(port=1521)))(connect_data=(SERVER=DEDICATED)(service_name=DESCENAC)))</connection-url>
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
<security-domain>NOMBRE_POLITICA</security-domain>
</local-tx-datasource>
</datasources>
Donde:
NOMBRE_POLITICA: Nombre que se le dio a la política en el archivo login-config.xml
Datasource con Oracle Real Application Clusters (RAC)
Ejemplo de conexión a RAC:
<?xml version="1.0" encoding="UTF-8"?>
<datasources>
<local-tx-datasource>
<jndi-name>JNDI_NAME</jndi-name>
<connection-url>jdbc:oracle:thin:@(description=(address_list=(load_balance=on)(failover=on)(address=(protocol=tcp)(host=10.0.2.205)(port=1521))(address=(protocol=tcp)(host=10.0.2.206)(port=1521))(address=(protocol=tcp)(host=10.0.2.207)(port=1521)))(connect_data=(service_name=IPN)(failover_mode=(type=select)(method=basic))))</connection-url>
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
<user-name>USER_NAME</user-name>
<password>PASSWORD</password>
</local-tx-datasource>
</datasources>
Logger
Modificar el archivo: JBOSS_HOME\server\[INSTANCIA]\deploy\jboss-logging.xml para que solo envíe mensajes de nivel WARNING en adelante. Dado que los INFO no son importantes en un ambiente de producción, mucho menos los TRACE y DEBUG.
...
<periodic-rotating-file-handler
file-name="${jboss.server.log.dir}/server.log"
name="FILE"
autoflush="true"
append="true"
suffix=".yyyy-MM-dd"> <!-- To roll over at the top of each hour, use ".yyyy-MM-dd-HH" instead -->
<error-manager>
<only-once/>
</error-manager>
<level name="WARN"/>
<formatter>
<!-- To revert back to simple stack traces without JAR versions, change "%E" to "%e" below. -->
<!-- Uncomment this to get the class name in the log as well as the category
<pattern-formatter pattern="%d %-5p [%c] %C{1} (%t) %s%E%n"/>
-->
<!-- Uncomment this to log without the class name in the log -->
<pattern-formatter pattern="%d %-5p [%c] (%t) %s%E%n"/>
</formatter>
</periodic-rotating-file-handler>
...
Documento original