Configurando um Ambiente de Produção no JBoss AS 6.1

Postado em Atualizado em

Segue abaixo alguns passos básicos para a instalação de instância JBoss AS 6.1 de produção, visando basicamente a segurança baseada em Banco de Dados.

 Sistema Operacional

1 – Configurar Linux File Descriptors and Too Many Open Files
https://jbossdivers.wordpress.com/2011/09/16/linux-file-descriptors-e-too-many-open-files/

2 – Configurar Timezone do Servidor / Brasil (UTC-3)
http://www.centos.org/docs/5/html/Deployment_Guide-en-US/ch-dateconfig.html

3 – Configuração dos Protocolos TCP / UDP –  Remoção de Warnings
https://jbossdivers.wordpress.com/2011/09/30/dica-rapida-removendo-alguns-warnings-do-jboss-as-6-1/

4 – Configurar Huge Pages (S.O. x86)

Ambiente Java

Instalar e configurar JDK

  cd /opt/
  wget http://download.oracle.com/otn-pub/java/jdk/6u29-b11/jdk-6u29-linux-x64.bin
  sh jdk-6u29-linux-x64.bin
  ln -s jdk1.6.0_29 jdk
  vi /etc/profile.d/java.sh

Adicionar:

#!/bin/bash
 export JAVA_HOME=/opt/jdk
 export PATH=$PATH:$JAVA_HOME/bin

Carregar a Variável de Ambiente e Verificar se está correto.

source /etc/profile.d/java.sh
java -version

Obs: Se estiver tudo correto a seguinte mensagem será apresentada:
java version “1.6.0_29”
Java(TM) SE Runtime Environment (build 1.6.0_29-b11)
Java HotSpot(TM) 64-Bit Server VM (build 20.4-b02, mixed mode)

 Instalar JBoss AS 6.1

 cd /opt/
 wget http://download.jboss.org/jbossas/6.1/jboss-as-distribution-6.1.0.Final.zip
 unzip jboss-as-distribution-6.1.0.Final.zip
 ln -s jboss-6.1.0.Final jboss

  Configurações Iniciais

Inicialmente deve-se criar um perfil, baseando-se nos requisitos da aplicação ( All, Default …)

cd /opt/jboss/server/
cp -Rap all instance01

Subistituir o HSQLDB Por um Banco de Dados de Produção

Inicialmente criar um novo datasource padrão DefaultDS

 vi /opt/jboss/server/instance01/deploy/default-ds.xml

Deixá-lo como Abaixo:

<?xml version="1.0" encoding="UTF-8"?>

<!-- See http://www.jboss.org/community/wiki/Multiple1PC for information about local-tx-datasource -->
 <!-- $Id: mysql-ds.xml 97536 2009-12-08 14:05:07Z jesper.pedersen $ -->
 <!--  Datasource config for MySQL using 3.0.9 available from:
 http://www.mysql.com/downloads/api-jdbc-stable.html
 -->

<datasources>
 <local-tx-datasource>
 <jndi-name>DefaultDS</jndi-name>
 <connection-url>jdbc:mysql://192.168.1.5:3306/my_database</connection-url>
 <driver-class>com.mysql.jdbc.Driver</driver-class>

<security-domain>DefaultDbRealm</security-domain>

<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
 <!-- should only be used on drivers after 3.22.1 with "ping" support
 <valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLValidConnectionChecker</valid-connection-checker-class-name>
 -->
 <!-- sql to call when connection is created
 <new-connection-sql>some arbitrary sql</new-connection-sql>
 -->
 <!-- sql to call on an existing pooled connection when it is obtained from pool - MySQLValidConnectionChecker is preferred for newer drivers
 <check-valid-connection-sql>some arbitrary sql</check-valid-connection-sql>
 -->

<!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) -->
 <metadata>
 <type-mapping>mySQL</type-mapping>
 </metadata>
 </local-tx-datasource>
 </datasources>

Estamos utilizando o MySQL 5, para isso devemos realizar o download do driver JDBC no seguinte endereço:

http://www.mysql.com/downloads/connector/j/

Em seguida o driver JDBC deverá ser copiado para o diretório:

opt/jboss/server/instance01/lib

Devemos criptografar a senha que se encontra nesse Data Source.

Como não encontrei a biblioteca jboss-logging-spi.jar no JBoss 6.1 baixei de uma fonte alternativa.

 wget http://www.java2s.com/Code/JarDownload/jboss-logging-spi.jar.zip
 unzip jboss-logging-spi.jar.zip
 cp jboss-logging-spi.jar /opt/jboss/client/
 cd /opt/jboss/

Para gerar o Hash ( Senha ) Faça como abaixo:

java -cp client/jboss-logging-spi.jar:lib/jbosssx.jar org.jboss.resource.security.SecureIdentityLoginModule passwordmydb

Vai gerar algo parecido com isso: Encoded password: 5dfc52b51bd35553593cb9b8a3c13c4a

Agora edite:

 vi /opt/jboss/server/instance01/conf/login-config.xml

Comentar:

<!-- Security domains for testing new jca framework
 <application-policy name="HsqlDbRealm">
 <authentication>
 <login-module code="org.jboss.resource.security.ConfiguredIdentityLoginModule"
 flag="required">
 <module-option name="principal">sa</module-option>
 <module-option name="userName">sa</module-option>
 <module-option name="password"></module-option>
 <module-option name="managedConnectionFactoryName">jboss.jca:service=LocalTxCM,name=DefaultDS</module-option>
 </login-module>
 </authentication>
 </application-policy> -->

Agora adicionar o application policy abaixo juntamente com o hash gerado anteriormente:

<application-policy name="DefaultDbRealm">
 <authentication>
 <login-module code="org.jboss.resource.security.SecureIdentityLoginModule" flag="required">
 <module-option name="username">usuario_database</module-option>
 <module-option name="password">5dfc52b51bd35553593cb9b8a3c13c4a</module-option>
 <module-option name="managedConnectionFactoryName">jboss.jca:name=DefaultDS,service=LocalTxCM</module-option>
 </login-module>
 </authentication>
 </application-policy>

Vamos Utilizar o Banco configurado em DefaultDS, para armazenar as tabelas para criação da estrutura de usuário que poderão acessar o admin-console e jmx-console. Mas antes faça o seguinte, comente o bloco abaixo:

<!-- A template configuration for the jmx-console web application. This
 defaults to the UsersRolesLoginModule the same as other and should be
 changed to a stronger authentication mechanism as required.
 <application-policy name="jmx-console">
 <authentication>
 <login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule"
 flag="required">
 <module-option name="usersProperties">props/jmx-console-users.properties</module-option>
 <module-option name="rolesProperties">props/jmx-console-roles.properties</module-option>
 </login-module>
 </authentication>
 </application-policy>
 -->

E  adicionar:

<application-policy name="jmx-console">
 <authentication>
 <login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule" flag="required">
 <module-option name="unauthenticatedIdentity">guest</module-option>
 <module-option name="dsJndiName">java:/DefaultDS</module-option>
 <module-option name="principalsQuery">select password from users where username=?</module-option>
 <module-option name="rolesQuery">select rolename, 'Roles' from roles where username=?</module-option>
 <module-option name="hashAlgorithm">MD5</module-option>
 <module-option name="hashEncoding">hex</module-option>
 </login-module>
 </authentication>
 </application-policy>

Comentar:

 <!-- A template configuration for the web-console web application. This
 defaults to the UsersRolesLoginModule the same as other and should be
 changed to a stronger authentication mechanism as required.
 <application-policy name="web-console">
 <authentication>
 <login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule"
 flag="required">
 <module-option name="usersProperties">web-console-users.properties</module-option>
 <module-option name="rolesProperties">web-console-roles.properties</module-option>
 </login-module>
 </authentication>
 </application-policy>
 -->

E Adicionar

<application-policy name="web-console">
 <authentication>
 <login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule" flag="required">
 <module-option name="unauthenticatedIdentity">guest</module-option>
 <module-option name="dsJndiName">java:/DefaultDS</module-option>
 <module-option name="principalsQuery">select password from users where username=?</module-option>
 <module-option name="rolesQuery">select rolename, 'Roles' from roles where username=?</module-option>
 <module-option name="hashAlgorithm">MD5</module-option>
 <module-option name="hashEncoding">hex</module-option>
 </login-module>
 </authentication>
 </application-policy>

Faça algo similar para todos os application policy que for utilizar.

Agora vamos adicionar segurança no jmx-console

 vi /opt/jboss/common/deploy/jmx-console.war/WEB-INF/web.xml

Devemos descomentar o seguinte bloco:

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

Agora edite:

 vi /opt/jboss/common/deploy/jmx-console.war/WEB-INF/jboss-web.xml

Deve ficar como abaixo:

<jboss-web>
 <!-- Uncomment the security-domain to enable security. You will
 need to edit the htmladaptor login configuration to setup the
 login modules used to authentication users.
 -->
 <security-domain>java:/jaas/jmx-console</security-domain>
 </jboss-web>

Como o admin console já vem por padrão com os blocos acima habilitados não será necessário edita-lo.

Por ultimo edite:

  vi /opt/jboss/server/instance01/deploy/httpha-invoker.sar/invoker.war/WEB-INF/web.xml

Devemos limitar o acesso ao invoker/JMXInvokerServlet deixando-o como abaixo:

<servlet-mapping>
 <servlet-name>JNDIFactory</servlet-name>
 <url-pattern>/restricted/JNDIFactory/*</url-pattern>
 </servlet-mapping>
 <servlet-mapping>
 <servlet-name>JMXInvokerServlet</servlet-name>
 <url-pattern>/*</url-pattern>
 </servlet-mapping>

<!-- An example security constraint that restricts access to the HTTP invoker
 to users with the role HttpInvoker Edit the roles to what you want and
 configure the WEB-INF/jboss-web.xml/security-domain element to reference
 the security domain you want.
 -->
 <security-constraint>
 <web-resource-collection>
 <web-resource-name>HttpInvokers</web-resource-name>
 <description>An example security config that only allows users with the
 role HttpInvoker to access the HTTP invoker servlets
 </description>
 <url-pattern>/*</url-pattern>
 <http-method>GET</http-method>
 <http-method>POST</http-method>
 </web-resource-collection>
 <auth-constraint>
 <role-name>HttpInvoker</role-name>
 </auth-constraint>
 </security-constraint>
 <login-config>
 <auth-method>BASIC</auth-method>
 <realm-name>JBoss HTTP Invoker</realm-name>
 </login-config>

<security-role>
 <role-name>HttpInvoker</role-name>
 </security-role>

Agora deve-se verificar se JBoss WEB Thread Pool,Logging e Data Source estão adequados as suas necessidades.

Ainda deve-se alterar a Stack size ( JAVA_OPTS ) conforme os requisitos.

Finalizando podemos utilizar o mod_jk ou mod_cluster para realizar o balanceamento de carga.

Aqui está só o básico de um ambiente JBoss AS 6.1, ainda existem muitos outros parâmetros que podem ser melhorados e outros atributos que devem ser verificados.

Talvez tenha esquecido de alguma coisa:/, Se alguem quiser adicionar algo ou corrigir é só dizer.

Happy Coding
[]s

Ps: Abaixo a estrutura das tabelas🙂

 create database my_database;
 create table users (username varchar(32) not null primary key,password varchar(32) not null);
 create table roles (username varchar(32) not null,rolename varchar(32) not null,primary key (username, rolename));

 insert into users (username, password) values ("skywalker", md5('c3po'));
 insert into roles values ("skywalker", "JBossAdmin");
 insert into roles values ("skywalker", "HttpInvoker");

Ps2: Desculpem a Falta de Acentuacao o teclado tá meio ruim:/

2 comentários em “Configurando um Ambiente de Produção no JBoss AS 6.1

    Mauricio Magnani disse:
    2 de dezembro de 2011 às 22:49

    Heasuashauashu esqueci de adicionar no post o driver jdbc do MySql…na pasta lib do perfil.
    Segunda Feira corrigo🙂

    Mauricio Magnani respondido:
    5 de dezembro de 2011 às 10:41

    Corrigido…

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s