Arquivo de janeiro \31\UTC 2012

Habilitando Log HTTP ( Request , Reponse ) no JBoss AS 5.1

 

Para verificar o funcionamento das requisições,  temos que adicionar ao JBossWeb uma válvula para que seja realizado o logging do request e response.
Sendo assim, edite o arquivo: JBOSS_HOME/server/<config>/deploy/jbossweb.sar/server.xml , e entre as tags Host, adicione o código abaixo:

<Host name="localhost">

<Valve className="org.apache.catalina.valves.RequestDumperValve"
prefix="localhost_access_log." suffix=".log"
pattern="common" directory="${jboss.server.log.dir}"
resolveHosts="false" />

</Host>

Inicie o JBoss, realize o deploy de sua aplicação, você deverá ver algo pareçido com o log abaixo:

01:35:50,269 INFO  [[localhost]] ===============================================================
01:36:00,128 INFO  [[localhost]] REQUEST URI       =/IETest/OutSimplePdf
01:36:00,128 INFO  [[localhost]]           authType=null
01:36:00,128 INFO  [[localhost]]  characterEncoding=null
01:36:00,128 INFO  [[localhost]]      contentLength=-1
01:36:00,128 INFO  [[localhost]]        contentType=null
01:36:00,128 INFO  [[localhost]]        contextPath=/IETest
01:36:00,128 INFO  [[localhost]]             cookie=JSESSIONID=DFD04B42EF225E194C19686823CF91D5
01:36:00,129 INFO  [[localhost]]             header=host=localhost:8080
01:36:00,129 INFO  [[localhost]]             header=user-agent=Mozilla/5.0 (X11; Linux i686; rv:9.0.1) Gecko/20100101 Firefox/9.0.1
01:36:00,129 INFO  [[localhost]]             header=accept=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
01:36:00,129 INFO  [[localhost]]             header=accept-language=en-us,en;q=0.5
01:36:00,129 INFO  [[localhost]]             header=accept-encoding=gzip, deflate
01:36:00,129 INFO  [[localhost]]             header=accept-charset=ISO-8859-1,utf-8;q=0.7,*;q=0.7
01:36:00,129 INFO  [[localhost]]             header=connection=keep-alive
01:36:00,129 INFO  [[localhost]]             header=referer=http://localhost:8080/IETest/index.jsp
01:36:00,130 INFO  [[localhost]]             header=cookie=JSESSIONID=DFD04B42EF225E194C19686823CF91D5
01:36:00,130 INFO  [[localhost]]             locale=en_US
01:36:00,130 INFO  [[localhost]]             method=GET
01:36:00,130 INFO  [[localhost]]           pathInfo=null
01:36:00,130 INFO  [[localhost]]           protocol=HTTP/1.1
01:36:00,130 INFO  [[localhost]]        queryString=null
01:36:00,130 INFO  [[localhost]]         remoteAddr=127.0.0.1
01:36:00,130 INFO  [[localhost]]         remoteHost=127.0.0.1
01:36:00,130 INFO  [[localhost]]         remoteUser=null
01:36:00,130 INFO  [[localhost]] requestedSessionId=DFD04B42EF225E194C19686823CF91D5
01:36:00,130 INFO  [[localhost]]             scheme=http
01:36:00,130 INFO  [[localhost]]         serverName=localhost
01:36:00,131 INFO  [[localhost]]         serverPort=8080
01:36:00,131 INFO  [[localhost]]        servletPath=/OutSimplePdf
01:36:00,131 INFO  [[localhost]]           isSecure=false
01:36:00,131 INFO  [[localhost]] ---------------------------------------------------------------
01:36:00,340 INFO  [[localhost]] ---------------------------------------------------------------
01:36:00,340 INFO  [[localhost]]           authType=null
01:36:00,340 INFO  [[localhost]]      contentLength=892
01:36:00,340 INFO  [[localhost]]        contentType=application/pdf
01:36:00,340 INFO  [[localhost]]             header=X-Powered-By=Servlet 2.5; JBoss-5.0/JBossWeb-2.1
01:36:00,341 INFO  [[localhost]]             header=Expires=0
01:36:00,341 INFO  [[localhost]]             header=Cache-Control=maxage=3600, must-revalidate, post-check=0, pre-check=0
01:36:00,341 INFO  [[localhost]]             header=Pragma=public
01:36:00,341 INFO  [[localhost]]             header=Content-Type=application/pdf
01:36:00,341 INFO  [[localhost]]             header=Content-Length=892
01:36:00,341 INFO  [[localhost]]             header=Date=Tue, 31 Jan 2012 03:36:00 GMT
01:36:00,341 INFO  [[localhost]]            message=null
01:36:00,341 INFO  [[localhost]]         remoteUser=null
01:36:00,341 INFO  [[localhost]]             status=200
01:36:00,341 INFO  [[localhost]] ===============================================================

Espero que tenha ajudado :)
Abraços!

, , ,

Deixe um comentário

JBoss Certified Application Administrator (JBCAA) – Parte 2

Continuando os meus estudos para JBCAA, hoje vamos abordar mais um tópico.

3 – Configuração dos conectores do JBoss Web (incluindo HTTPS)  ( Configure JBoss Web Connectors (including HTTPS) )

No Study Guide, podemos verificar as seguintes informações para esse tópico:

● JB336 JBoss for Administrators course
● JBoss EAP Administration and Configuration Guide3
● JBoss Web Documentation4
● http://community.jboss.org/wiki/SecureTheJmxConsole
● http://community.jboss.org/wiki/SSLSetup
● Creating an SSL Keystore Using the Java Keytool5
● http://java.sun.com/javase/6/docs/technotes/tools/index.html#security (look for keytool)
● Example configurations included with JBoss EAP

Vamos iniciar abordando a segurança no Jmx-Console, que já é bem conhecida pelos administradores mais experientes.

O primeiro passo é visualizar o web.xml, da app jmx-console.war, e verificar se o atributo  <security-constraint> não está comentado, e com as devidas configurações, abaixo temos uma exemplo em que tudo está correto:

Localização do arquivo:  JBOSS_HOME/server/instance01/deploy/jmx-console.war/WEB-INF/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>
 </web-resource-collection>
 <auth-constraint>
    <role-name>JBossAdmin</role-name>
 </auth-constraint>
 <user-data-constraint>
    <transport-guarantee>CONFIDENTIAL</transport-guarantee>
 </user-data-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>

Agora devemos verificar o arquivo jboss-web.xml, o <security-domain>, deve estar sem o  comentário, como abaixo:

Localização do arquivo: JBOSS_HOME/server/instance01/deploy/jmx-console.war/WEB-INF/jboss-web.xml

<!DOCTYPE jboss-web PUBLIC
"-//JBoss//DTD Web Application 5.0//EN"
"http://www.jboss.org/j2ee/dtd/jboss-web_5_0.dtd">

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

Obs: Segundo a security note – CVE-2010-0738, devemos remover do JBOSS_HOME/server/instance01/deploy/jmx-console.war/WEB-INF/web.xml  os métodos HTTP:

  <http-method>GET</http-method>
  <http-method>POST</http-method>

Deve-se ainda adicionar ao JBOSS_HOME/server/instance01/deploy/jmx-console.war/WEB-INF/web.xml , o atributo CONFIDENTIAL que garante o uso de HTTPS, que vamos ativar posteriormente.

<user-data-constraint>
   <transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>

Para finalizar, verificamos se os arquivos aonde estão armazenados os roles e users estão corretos.

Localização do Arquivo: JBOSS_HOME/server/instance01/conf/props/jmx-console-roles.properties

  # A sample roles.properties file for use with the UsersRolesLoginModule
  admin=JBossAdmin,HttpInvoker

Localização do Arquivo: JBOSS_HOME/server/instance01/conf/props/jmx-console-users.properties

  # A sample users.properties file for use with the UsersRolesLoginModule
  admin=admin

Application Policy do Jmx-Console:

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

Como já disse anteriormente, eu nunca fiz a prova e realmente não sei o que vai ser cobrado,  então  a aprenderem o máximo que puderem sobre os assuntos mencionados no study guide. Como recomendação para essa parte eu aconselho que os precedimentos acima sejam repetidos para o web-console e jbossws, qualquer dificuldade nessas tarefas deixem comentários.

Vamos gerar o nosso certificado ( keystore ), e habilitar o connetor HTTPS. Para obter o certificado execute o comando abaixo:

   keytool -genkey -alias example -keystore example.keystore -keypass 123456 -keyalg RSA

Por convenção geralmente o .keystore, fica armazenado no diretório JBOSS_HOME/server/instance01/conf/ .

Para visualizar informações do certificado execute:

  keytool -v -list -keystore example.keystore

Keystore type: JKS
Keystore provider: SUN

Your keystore contains 1 entry

Alias name: example
Creation date: Jan 29, 2012
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=Mauricio Magnani, OU=Home, O=Home, L=SP, ST=SP, C=BR
Issuer: CN=Mauricio Magnani, OU=Home, O=Home, L=SP, ST=SP, C=BR
Serial number: 4f25c7bf
Valid from: Sun Jan 29 20:27:11 BRST 2012 until: Sat Apr 28 19:27:11 BRT 2012
Certificate fingerprints:
MD5:  70:2F:D1:5E:23:E2:1A:3C:DF:E4:76:1D:82:28:AE:0A
SHA1: 03:EF:60:BF:2D:33:D1:29:6A:67:44:07:28:4B:09:E5:6F:56:70:D2
Signature algorithm name: SHA1withRSA
Version: 3

*******************************************
*******************************************

Finalmente vamos ativer o connector HTTPS, isso é bem simples, no arquivo JBOSS_HOME/server/instance01/deploy/jbossweb.sar/server.xml, descomente e altere o bloco abaixo:

<!-- SSL/TLS Connector configuration using the admin devl guide keystore-->
<Connector protocol="HTTP/1.1" SSLEnabled="true" port="8443" address="${jboss.bind.address}"
scheme="https" secure="true" clientAuth="false" keystoreFile="${jboss.server.home.dir}/conf/example.keystore"
keystorePass="123456" sslProtocol = "TLS" />

Agora acesse a url https://localhost:8443/ , e verifique se tudo está funcionando.

Não percam a próxima parte :)

abraços!

,

Deixe um comentário

Cluster de Servidores Standalone no JBoss AS 7.1 – Parte 1

Em aplicações sérias, é essencial que o ambiente ofereça escalabilidade e alta disponibilidade, esse objetivo pode ser alcançado através de ambientes clusterizados e altamente elásticos. Hoje vamos abordar uma das formas de criação de Cluster no JBoss AS 7.1, utilizando o conceito de servidores standalone.

As possíveis configurações de cluster  para servidores standalone podem ser divididos em dois cenários principais:

• Cluster de nós executando na mesma máquina
• Cluster de nós executando em máquinas diferentes

Cluster de Nós Executando na Mesma Máquina

A criação de cluster de servidores JBoss na mesma máquina, se aplica  quando possuímos ótimos recursos de hardware. A configuração de nós na mesma máquina exige que você duplique a sua distribuição do JBoss AS 7.  Também será necessário que você escolha entre duas opções:

1. Definir múltiplos endereços IP  na mesma máquina.
2. Definir um offset de portas para cada nó.

A primeira forma é conhecida como multi-homing,  possuir múltiplas conexões reduzem a chance de acontecer uma parada catastrófica se uma das conexões falhar. Para configurar multi-homing no Linux, é bem simples, basta especificar o IP que deverá responder em determinada interface:

# ifconfig eth0 192.168.0.10 up
# ifconfig eth1 192.168.0.20 up

Exemplo:

eth0      Link encap:Ethernet  Endereço de HW 08:00:27:53:CD:E5
          inet end.: 192.168.0.10  Bcast:192.168.0.255  Masc:255.255.255.0
          endereço inet6: fe80::a00:27ff:fe53:cde5/64 Escopo:Link
          UP BROADCASTRUNNING MULTICAST  MTU:1500  Métrica:1
          RX packets:4939 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4919 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:1000
          RX bytes:5269711 (5.0 MiB)  TX bytes:761430 (743.5 KiB)

eth1      Link encap:Ethernet  Endereço de HW 08:00:27:4A:3C:82
          inet end.: 192.168.0.20  Bcast:192.168.0.255  Masc:255.255.255.0
          endereço inet6: fe80::a00:27ff:fe4a:3c82/64 Escopo:Link
          UP BROADCASTRUNNING MULTICAST  MTU:1500  Métrica:1
          RX packets:118 errors:0 dropped:0 overruns:0 frame:0
          TX packets:190 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:1000
          RX bytes:32243 (31.4 KiB)  TX bytes:22900 (22.3 KiB)

O próximo passo agora é configurarmos o arquivo standalone-ha.xml, só para deixar claro, nós duplicamos os arquivos de instalação do JBoss AS 7, então temos JBossAS7-1 e JBossAS7-2 .

Edite o arquivo standalone-ha.xml do JBossAS7-1

   vim JBOSS_HOME/standalone/configuration/standalone-ha.xml

Atualize as interface public e management, com o IP configurado anteriormente.

 <interfaces>
         <interface name="management">
            <inet-address value="192.168.0.10"/>
         </interface>
         <interface name="public">
            <inet-address value="192.168.0.10"/>
         </interface>
 </interfaces>

Repita o Processo para o JBossAS-2

vim JBOSS_HOME/standalone/configuration/standalone-ha.xml

Atualize as interfaces:

 <interfaces>
         <interface name="management">
            <inet-address value="192.168.0.20"/>
         </interface>
         <interface name="public">
            <inet-address value="192.168.0.20"/>
         </interface>
 </interfaces>

Agora já estamos prontos para iniciar o cluster do JBoss AS 7, para isso execute os comandos abaixo:

JBossAS7-1 –>    ./JBOSS_HOME/bin/standalone.sh –server-config=standalone-ha.xm -Djboss.node.name=node1

JBossAS7-2 –>    ./JBOSS_HOME/bin/standalone.sh –server-config=standalone-ha.xm -Djboss.node.name=node2

Ao iniciarmos os servidores não encontramos detalhes sobre os nós do cluster, isso se deve ao fato de que o serviço de cluster só é  iniciado sob demanda no JBoss AS 7, por isso não conseguimos visualizar nada relacionado a isso no console.
Para habilitarmos o cluster, devemos realizar o deploy de uma aplicação que esteja utilizando a tag <distributable/>  no web.xml.

<web-app>
   <distributable/>
</web-app>

Ao realizar o deploy, podemos verificar que os serviços de cluster são ativados:

13:35:05,796 INFO  [stdout] (MSC service thread 1-2)
13:35:05,797 INFO  [stdout] (MSC service thread 1-2) -------------------------------------------------------------------
13:35:05,797 INFO  [stdout] (MSC service thread 1-2) GMS: address=node2/web, cluster=web, physical address=192.168.0.20:55200
13:35:05,797 INFO  [stdout] (MSC service thread 1-2) -------------------------------------------------------------------
13:35:06,177 INFO  [org.jboss.as.clustering.CoreGroupCommunicationService.web] (MSC service thread 1-2) JBAS010207: Number of cluster members: 2
13:35:08,184 INFO  [org.infinispan.remoting.transport.jgroups.JGroupsTransport] (MSC service thread 1-2) ISPN000078: Starting JGroups Channel
13:35:08,187 AVISO [org.infinispan.remoting.transport.jgroups.CommandAwareRpcDispatcher] (MSC service thread 1-2) Channel Muxer already has a default up handler installed (org.jboss.as.clustering.jgroups.ClassLoaderAwareUpHandler@35cfee57) but now it is being overridden
13:35:08,190 INFO  [org.infinispan.remoting.transport.jgroups.JGroupsTransport] (MSC service thread 1-2) ISPN000094: Received new cluster view: [node1/web|1] [node1/web, node2/web]
13:35:08,192 INFO  [org.infinispan.remoting.transport.jgroups.JGroupsTransport] (MSC service thread 1-2) ISPN000079: Cache local address is node2/web, physical addresses are [192.168.0.20:55200]
13:35:08,201 INFO  [org.infinispan.factories.GlobalComponentRegistry] (MSC service thread 1-2) ISPN000128: Infinispan version: Infinispan 'Brahma' 5.1.0.CR1
13:35:08,203 WARN  [org.infinispan.config.ConfigurationValidatingVisitor] (MSC service thread 1-1) ISPN000152: Passivation configured without a valid eviction policy. This could mean that the cache store will never get used unless code calls Cache.evict() manually.
13:35:08,681 INFO  [org.infinispan.jmx.CacheJmxRegistration] (MSC service thread 1-2) ISPN000031: MBeans were successfully registered to the platform mbean server.
13:35:08,805 INFO  [org.infinispan.jmx.CacheJmxRegistration] (MSC service thread 1-1) ISPN000031: MBeans were successfully registered to the platform mbean server.
13:35:09,469 INFO  [org.jboss.as.clustering] (MSC service thread 1-2) JBAS010301: Started registry cache from web container
13:35:09,474 INFO  [org.jboss.as.clustering] (MSC service thread 1-1) JBAS010301: Started repl cache from web container
13:35:09,939 INFO  [org.jboss.web] (MSC service thread 1-2) registering web context: /myapptest
13:35:10,124 INFO  [org.jboss.as.server] (DeploymentScanner-threads - 2) JBAS018559: Deployed "myapptest.war"

Lembrando que que não existe mais o conceito de farm deployment, mas você pode realizar o deploy de uma aplicação para todos as instâncias que fazem parte do mesmo grupo de servidores. Vamos abordar esse conceito mais a frente. Nesse caso é necessário realizar o deploy nos dois nós. O deploy pode pode ser realizado no diretório JBOSS_HOME/standalone/deployments/.

Uma ultima observação é de que poderíamos ter ter passado via parametro na inicialização os IPs das interfaces public e management, como abaixo:

JBossAS7-1 –> ./JBOSS_HOME/standalone.bat –server-config=standalone-ha.xml –b 192.168.0.10 -bmanagement 192.168.0.10 -Djboss.node.name=node1

JBossAS7-2 –> ./JBOSS_HOME/standalone.bat –server-config=standalone-ha.xml –b 192.168.0.20 -bmanagement 192.168.0.20 -Djboss.node.name=node2

Na próxima parte vamos abordar Cluster de nós executando em máquinas diferentes, que é muita similar ao que fizemos.

Abraços a todos!

:)

, , ,

2 Comentários

Implantando Sua Aplicação Web No Contexto Raiz no JBoss AS 7.1

Ps: Copei boa parte do post Implantando Sua Aplicação Web No Contexto Raiz no JBoss AS 6.1

Como implantar os aplicativos criados para que sejam acessados no contexto raiz ( localhost:8080 ) ?. Bom para fazer isso é bem simples \o/ , basta criar em sua aplicação web o arquivo jboss-web.xml , abaixo de WEB_INF, e inserir o conteúdo abaixo:

<!DOCTYPE jboss-web PUBLIC
"-//JBoss//DTD Web Application 5.0//EN"
"http://www.jboss.org/j2ee/dtd/jboss-web_5_0.dtd">

 <jboss-web>
    <context-root>/</context-root>
 </jboss-web>

No JBoss AS 7 não podemos mais remover  ROOT.war , a solução agora é desativá-lo.

No arquivo JBOSS_HOME/standalone/configuration/standalone.xml, e subsystem jboss:domain:web: atualize a propriedade enable-welcome-root para false .

<subsystem xmlns="urn:jboss:domain:web:1.1" default-virtual-server="default-host">
   <connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http"/>
   <virtual-server name="default-host" enable-welcome-root="false">
     <alias name="localhost"/>
     <alias name="example.com"/>
   </virtual-server>
 </subsystem>

Agora faça o deploy e acesse a url http://localhost:8080.  Sua aplicação deverá estar rodando no contexto raiz, como a imagem abaixo:

Abraços!
:)

, , ,

Deixe um comentário

Salvando o Log no Banco de Dados no JBoss AS 7.1

Obs: Pré Requisito Módulo JDBC MySQL
JBoss: jboss-as-7.1.0.CR1b

Algumas vezes necessitamos armazenar o log das nossas aplicações diretamente no banco de dados.  Podemos fazer isso através de Logs customizáveis. A comunidade JBoss.org, criou um excelente artigo sobre Custom Log Handlers, e o nosso post de hoje será baseado nesse artigo.

A comunidade deixou uma classe de exemplo, que extende java.util.logging.Handler, segue abaixo o código:

package com.JdbcLogger;

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Handler;
import java.util.logging.LogRecord;

import org.jboss.logmanager.MDC;

public class JdbcLogger extends Handler
  {
    private static final Object PARAM_TIMESTAMP = "$TIMESTAMP";
    private static final Object PARAM_LEVEL = "$LEVEL";
    private static final Object PARAM_MESSAGE = "$MESSAGE";
    private static final String PARAM_MDC = "$MDC[";
    private static final Object PARAM_PASSTROUGH = "?";

    private String driverClassName;
    private String jdbcUrl;
    private String username;
    private String password;
    private String insertStatement;

    private Connection connection;

    private List<String> parameters = new ArrayList<String>();

    @Override
    public void publish(LogRecord record)
    {
      if (!ensureReady())
     {
      return;
     }
    try
     {
       insertRecord(record);
     }
     catch (SQLException e)
     {
     e.printStackTrace();
    }
  }

   private synchronized boolean ensureReady()
   {
     if (connection != null)
     {
       return true;
     }
     try
     {
       parseStatementParameters();
       setupConnection();
     }
       catch (ClassNotFoundException e)
     {
       e.printStackTrace();
       return false;
     }
       catch (SQLException e)
     {
       e.printStackTrace();
      return false;
     }
      return true;
   }

   private void parseStatementParameters()
   {
      int paramsStart = insertStatement.indexOf("(");
      int paramsStop = insertStatement.lastIndexOf(")");
      String paramsString = insertStatement.substring(paramsStart + 1, paramsStop);
      for (String param : paramsString.split(","))
      {
         parameters.add(param.trim());
         paramsString = paramsString.replace(param, "?");
      }
       insertStatement = String.format("%s(%s)", insertStatement.substring(0, paramsStart), paramsString);
      }

   private void setupConnection() throws ClassNotFoundException, SQLException
   {
      Class.forName(driverClassName);
      connection = DriverManager.getConnection(jdbcUrl, username, password);
   }

   private void insertRecord(LogRecord logRecord) throws SQLException
   {
     PreparedStatement statement = null;
     try
     {
        statement = connection.prepareStatement(insertStatement);
        setStatementParameters(statement, logRecord);
        statement.executeUpdate();
     }
     finally
     {
      if (statement != null)
      {
        statement.close();
      }
    }
   }

  private void setStatementParameters(PreparedStatement statement, LogRecord logRecord) throws SQLException
  {
   for (int i = 0; i < parameters.size(); i++)
   {
    statement.setObject(i + 1, getParameterValue(i, logRecord));
   }
  }

  private Object getParameterValue(int i, LogRecord record)
  {
   String parameter = parameters.get(i);
   if (PARAM_PASSTROUGH.equals(parameter))
  {
   return null;
  }
   if (PARAM_TIMESTAMP.equals(parameter))
  {
   return new Date(record.getMillis());
  }
   else if (PARAM_LEVEL.equals(parameter))
  {
   return record.getLevel().toString();
  }
   else if (PARAM_MESSAGE.equals(parameter))
  {
   return getFormatter().format(record);
  }
   else if (parameter.startsWith(PARAM_MDC))
  {
   int startIndex = parameter.indexOf("[") + 1;
   int stopIndex = parameter.indexOf("]") - 1;
   String key = parameter.substring(startIndex, stopIndex + 1);
   return MDC.get(key);
  }
  else
  {
   return parameter;
  }
 }

  @Override
  public void flush()
  {
  }

  @Override
  public void close()
   {
     if (connection != null)
   {
    try
    {
     connection.close();
    }
     catch (SQLException e)
    {
     e.printStackTrace();
    }
   }
  }

  public void setDriverClassName(String driverClassName)
  {
   this.driverClassName = driverClassName;
  }

  public void setJdbcUrl(String jdbcUrl)
  {
   this.jdbcUrl = jdbcUrl;
  }

  public void setUsername(String username)
  {
   this.username = username;
  }

  public void setPassword(String password)
  {
   this.password = password;
  }

  public void setInsertStatement(String insertStatement)
  {
   this.insertStatement = insertStatement;
  }
 }

Agora devemos gerar um arquivo .jar para empacotar a classe acima, como por exemplo logger.jar
O próximo passo é criar um módulo, para disponibilizarmos o nosso log no JBoss AS 7.

Com o comando abaixo, criamos a estrutura de diretórios necessária para o funcionamento.

   mkdir -p JBOSS_HOME/modules/com/JdbcLogger/main

Copie o logger.jar gerado anteriormente para JBOSS_HOME/modules/com/JDBCLogger/main

Agora crie o arquivo module.xml

   vim JBOSS_HOME/modules/com/JdbcLogger/main/module.xml

E e adicione o conteúdo abaixo:

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.1" name="com.JdbcLogger">
<resources>
       <resource-root path="logger.jar"/>
</resources>
<dependencies>
<module name="javax.api"/>
    <module name="org.jboss.logging"/>
    <module name="org.jboss.logmanager"/>
    <module name="com.mysql"/>
   </dependencies>
</module>

Lembrando que o módulo com.mysql, já precisa estar disponível no JBoss AS 7. Caso não saiba como criar, veja o artigo http://jbossdivers.wordpress.com/2012/01/20/introducao-ao-jboss-as-7-parte-2/ .

No arquivo JBOSS_HOME/standalone/configuration/standalone.xml,  e  subsystem jboss:domain:logging:1.1, adicione o conteúdo abaixo:

<custom-handler name="DB" module="com.JdbcLogger">
  <level name="INFO"/>
  <formatter>
     <pattern-formatter pattern="%d{HH:mm:ss,SSS} %-5p [%c] (%t)%s%E%n"/>
  </formatter>
  <properties>
      <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
      <property name="jdbcUrl" value="jdbc:mysql://192.168.0.189:3306/security"/>
      <property name="username" value="root"/>
      <property name="password" value="123456"/>
      <property name="insertStatement" value="insert into log_table values (?, $TIMESTAMP, $LEVEL, $MDC[ip], $MDC[user], $MESSAGE, hardcoded)"/>
  </properties>
</custom-handler>

No root logger adicione o handler criado.

<root-logger>
   <level name="INFO"/>
   <handlers>
      <handler name="CONSOLE"/>
      <handler name="FILE"/>
      <handler name="DB"/>
   </handlers>
</root-logger>

A tabela abaixo, deve ser criada no banco de dados que armazenará os logs ( no nosso caso o security ).

   CREATE TABLE log_table(id INT(11) NOT NULL AUTO_INCREMENT, timestamp VARCHAR(255) DEFAULT NULL,level VARCHAR(255) DEFAULT NULL,mdc_ip VARCHAR(255) DEFAULT NULL,mdc_user VARCHAR(255) DEFAULT NULL,message VARCHAR(1500) DEFAULT NULL,hardcoded VARCHAR(255) DEFAULT NULL,PRIMARY KEY (id))ENGINE = INNODB AUTO_INCREMENT = 1;

Inicie o JBoss AS 7

./JBOSS_HOME/bin/standalone.sh

Agora realize o select na tabela log_table.

   select * from log_table

Alguns dados deverão ser retornados, como na imagem abaixo.

Podemos ainda utilizar um dominio de segurança encriptado para os dados de acesso ao banco de dados, para isso vejam o Post Introdução ao JBoss AS parte 2 .

Espero que seja útil :)
Abraços!

Fonte: https://community.jboss.org/wiki/CustomLogHandlersOn701

, , ,

Deixe um comentário

Comandos Úteis no CLI utilizando o JBoss AS 7.1

Vou listar abaixo, alguns comandos que são essenciais para administração do JBoss AS 7, utilizando o CLI.

Visualizar a árvore JNDI

/subsystem=naming:jndi-view

Visualizar a interface publica do JBoss

/interface=public:read-attribute(name=resolved-address)

Visualizar informações do Ambiente

version

Visualizar os serviços registrados no container e seus status

/core-service=service-container:dump-services

Visualizar todos os drivers instalados

/subsystem=datasources:installed-drivers-list

Existem muito mais comandos úteis,  estudem a documentação :)

Abraços!

Fonte: https://docs.jboss.org/author/display/AS71/CLI+Recipes

,

Deixe um comentário

Configurando o Histórico do CLI no JBoss AS 7.1

Todos os comando executados através da command-line interface (CLI), são guardados em arquivos de histórico, similar ao que acontece no sistemas Linux / Unix.  Se você já utilizou o CLI , deve ter percebido que os comandos são mantidos na mémória. Também são persistidos em um arquivo de histórico chamdo jboss-cli-history, que se localizar no home do usuário ( user.home ),  por exemplo:

-rw-rw-r–.  1 mmagnani mmagnani  5250 Jan 27 01:48 .jboss-cli-history

O CLI guarda os últimos 500 comandos,  para visualizá-los  execute: history.
Por padrão o o histórico do CLI, possui 3 opções: habilitar / desabilitar ou apagar o histórico.

Segue abaixo a descrição dos comportamentos:

Argumento Comportamento
disable Desabilita o histórico, mas não limpa os comandos que já estavam salvos
enable Habilita novamente o histórico e inicia do ponto em que havia sido desabilitado.
clear Limpa completamente o histórico, mas não deleta o arquivo .jboss-cli-history

Os comandos devem ser utilizados da seguinte forma:

history –enable
history –disable
history –clear

Espero que tenha ajudado, abraços!

:)

, , ,

Deixe um comentário

Caminhos Relativos ( Paths ) no JBoss AS 7.1

Por padrão o JBoss AS fornece um conjunto de caminhos do sistema, que estão disponíveis para utilização, como caminhos relativos.

Abaixo temos um quadro explicativo desses caminhos no JBoss AS 7.

Caminhos Descrição
jboss.home Diretório root do JBoss AS
user.home Diretório inicial do usuário
user.dir Diretório de trabalho do usuário atual
java.home Diretório da instalação Java / JDK
jboss.server.base.dir Diretório root para instâncias dos servidores
jboss.server.data.dir Diretório utilizado para persistir dados em disco / arquivos
jboss.server.log.dir Diretório utilizado para armazenar os logs das aplicações.
jboss.server.tmp.dir Diretório utilizado para aquivos temporários
jboss.domain.servers.dir Diretório utilizado pelo host controller para criar a área de trabalho das instâncias do servidores.

Espero que seja útil.
Abraços!

,

Deixe um comentário

Habilitando SSL no JBoss AS 7.1

Hoje vamos aprender como habilitar SSL no JBoss AS 7.

Vamos armazenar o .keystore no diretório configuration da nossa instância.

   cd JBOSS_HOME/standalone/configuration/

Agora execute:

   keytool -genkey -alias example -keystore example.keystore -keypass 123456 -keyalg RSA

Preencha as informações do certificado, conforme a sua necessidade.

Adicione o ao JBOSS_HOME/standalone/configuration/standalone.xml , as configurações abaixo no subsystem web.

<connector name="https" protocol="HTTP/1.1" scheme="https" socket-binding="https">
   <ssl name="ssl" key-alias="example" password="123456" certificate-key-file="../standalone/configuration/example.keystore"/>
</connector>

Abra o navegador de sua preferência e verifique a  url https://localhost:8443/ .

O  SSL está habilitado.

Espero que tenha ajudado.
Abraços!

JBoss: jboss-as-7.1.0.CR1b
Fonte: https://docs.jboss.org/author/display/AS7/HTTPS+Connectors

, ,

Deixe um comentário

Introdução ao JBoss AS 7.1 – Parte 2

Continuando o post anterior http://jbossdivers.wordpress.com/2012/01/20/introducao-ao-jboss-as-7-parte-1/, hoje o objetivo será criar um  novo data source e um domínio de segurança baseado em banco de dados com a senha escriptada.

Como o nosso foco aqui é o JBoss AS 7, utilize o post http://jbossdivers.wordpress.com/2011/08/29/instalando-mysql-5-5-on-centos-5-6/, para se ambientar com o MySQL. Crie um banco de dados chamado db_security. Vamos utiliza-lo para armazenar os nossos roles e passwords.

1 – Instalando um Driver JDBC / MySQL como Módulo

Devemos realizar o download do driver JDBC para o nosso banco de dados, que no caso é o MySQL  5.

O driver pode se baixado no seguinte endereço: http://dev.mysql.com/downloads/connector/j/

A estrutura de diretórios do nosso módulo deve ser criada conforme exemplificada abaixo:

    mkdir -p jboss-as-7.1.0.CR1/modules/com/mysql/main

O diretório “main”, conterá os arquivos mysql-connector-java-5.1.18-bin.jar e o module.xml.

Para copiar o driver execute:

    cp mysql-connector-java-5.1.18-bin.jar /jboss-as-7.1.0.CR1/modules/com/mysql/main/

O Próximo passo, é criar o arquivo module.xm

    vim jboss-as-7.1.0.CR1/modules/com/mysql/main/module.xml

Inserindo o conteúdo abaixo:

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="com.mysql">
   <resources>
      <resource-root path="mysql-connector-java-5.1.18-bin.jar"/>
   </resources>
   <dependencies>
      <module name="javax.api"/>
    </dependencies>
</module>

Agora vamos fazer com o que o JBoss AS 7,  reconheça o  novo módulo de Data Source. Para isso devemos editar o arquivo standalone.xml, para isso execute:

    vim jboss-as-7.1.0.CR1/standalone/configuration/standalone.xml

O “subsystem”  <subsystem xmlns=”urn:jboss:domain:datasources:1.0″>, deve ser editado, e o conteúdo abaixo deve ser inserido:

<!--<datasources> -->

<datasource jndi-name="java:/MySQLDS" pool-name="MyPool" enabled="true" jta="true" use-java-context="true" use-ccm="true">
   <connection-url>jdbc:mysql://localhost:3306/db_security</connection-url>
   <driver>mysql</driver>
   <security>
     <user-name>usuario_database</user-name>
     <password>senha_database</password>
   </security>
   <statement>
       <prepared-statement-cache-size>100</prepared-statement-cache-size>
       <share-prepared-statements/>
   </statement>
</datasource>

<!--<drivers>-->
   <driver name="mysql" module="com.mysql"/>
<!--</drivers>-->

<!--</datasources>-->

Reinicie o JBoss e o datasource para o MySQL estará disponível.

Você deverá ver algo pareçido com a mensagem abaixo:

 15:33:51,221 INFO  [org.jboss.as.connector.subsystems.datasources] (MSC service thread 1-3) JBAS010400: Bound data source [java:/MySQLDS]</em>

2 – Criando Domínio de Segurança Baseado em Banco de Dados com a Senha do Data Source Encriptada

A primeira coisa a ser feita é gerar a senha do banco de dados utilizando um algoritmo do Picketbox. Para isso execute os comandos abaixo:

  cd  $JBOSS_HOME$
  java -cp modules/org/jboss/logging/main/jboss-logging-3.1.0.CR2.jar:modules/org/picketbox/main/picketbox-4.0.6.Beta2.jar org.picketbox.datasource.security.SecureIdentityLoginModule senha

  Encoded password: -21fe4fcab9086fdc

Agora edite o arquivo:

  vim jboss-as-7.1.0.CR1/standalone/configuration/standalone.xml

Encontre o Subsystem  “<subsystem xmlns=”urn:jboss:domain:security:1.0″>” e entre as tags <security-domains>
Insira o conteúdo abaixo.

<security-domain name="security-encrypted-ds" cache-type="default">
  <authentication>
     <login-module code="org.picketbox.datasource.security.SecureIdentityLoginModule" flag="required">
      <module-option name="username" value="usuario_database"/>
      <module-option name="password" value="-21fe4fcab9086fdc"/>
      <module-option name="managedConnectionFactoryName" value="jboss.jca:service=LocalTxCM,name=MyPool"/>
      </login-module>
   </authentication>
</security-domain>

Edite novamente o “Subsystem” <subsystem xmlns=”urn:jboss:domain:datasources:1.0″>, dentro da tag  <security> :

Remova:

  <user-name>usuario_database</user-name>
  <password>senha_database</password>

E adicione o dominio de segurança que acabamos de configurar:

  <security-domain>security-encrypted-ds</security-domain>

Pronto :) , o nosso data source está funcionando com a senha encriptada, agora vamos criar um domínio de segurança, que utiliza o data source encriptado e armazena os roles e users em tabelas.

Vamos gerar a senha encriptada do usuário que irá acessar o nosso domínio de segurança, para isso crie uma classe Java, utilizando a estrutura abaixo:

As libs utilizadas são: modules/org/jboss/logging/main/jboss-logging-3.1.0.CR2.jar
                                             modules/org/picketbox/main/picketbox-4.0.6.Beta2.jar

import org.jboss.security.auth.spi.Util;

public class Main {

public static Util util;

public static void main(String[] args) {
    System.out.println(util.createPasswordHash("SHA-256", "BASE64", null, null, "senha"));
  }
}

Retorno: t+lL5RPpboxFzSPRYideWhLr3pEApCXE683X+k3NiXw=

Crie as tabelas abaixo no db_security:

create table users (username varchar(32) not null primary key,password varchar(100) 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 ("usuario", "t+lL5RPpboxFzSPRYideWhLr3pEApCXE683X+k3NiXw=");
insert into roles values ("usuario", "Admin");

Novamente no Subsystem  “<subsystem xmlns=”urn:jboss:domain:security:1.0″>” e entre as tags <security-domains>

Insira o conteúdo abaixo:

<security-domain name="security-database" cache-type="default">
 <authentication>
   <login-module code="Database" flag="required">
      <module-option name="dsJndiName" value="java:/MySQLDS"/>
      <module-option name="principalsQuery" value="select password from users where username=?"/>
      <module-option name="rolesQuery" value="select rolename, 'Roles' from roles where username=?"/>
      <module-option name="hashAlgorithm" value="SHA-256"/>
      <module-option name="hashEncoding" value="base64"/>
   </login-module>
 </authentication>
</security-domain>

Agora na aplicação Web, adicione o conteúdo abaixo no web.xml

<security-constraint>
 <web-resource-collection>
   <web-resource-name>HtmlAuth</web-resource-name>
   <description>Test Security Domains</description>
   <url-pattern>/*</url-pattern>
   <http-method>GET</http-method>
   <http-method>POST</http-method>
 </web-resource-collection>
 <auth-constraint>
   <role-name>Admin</role-name>
 </auth-constraint>
</security-constraint>
<login-config>
  <auth-method>BASIC</auth-method>
  <realm-name>My Test JBoss AS 7</realm-name>
</login-config>
<security-role>
  <role-name>Admin</role-name>
</security-role>

Crie o arquivo jboss-web.xml, e adicione o conteúdo abaixo:

<jboss-web>
<security-domain>java:/jaas/security-database</security-domain>
</jboss-web>

Realize o deploy e acesse pelo browser  de sua preferência, a aplicação deverá pedir o usuário e senha que estão armazenados no banco de dados.

Vou deixar os principais arquivos utilizado nesse post aqui para download.
Link:  Arquivos
Abraços a todos

:)

, ,

5 Comentários

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.