Restringindo acesso no Tomcat 

Filed under: segurança on Monday, June 16th, 2008 by admin | No Comments

Pessoal em desenvolvimento é legal agente limitar as maquinas que podem ver seu servidor local.
uma ideia para limitar este acesso é utilizando um arquivo context.xml na pasta WEB-INF de sua aplicação com o sequinte conteudo.

<Context>
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127.0.0.1, 10.10.8.*" deny="*.*.*.*"/>
</Context>

Copiando objetos (Deep vs. Shallow) 

Filed under: Clonable, Java on Wednesday, June 4th, 2008 by admin | 1 Comment

Pessoal hoje em uma conversa com um amigo fui questionado sobre qual a implementação de clonagem usar (Deep vs. Shallow) na copia de objetos, como não tinha a resposta na ponta da lingua fui pesquisar abaixo estão minhas considerações a respeito.

Deep (profundo)

Este processo é definido como a cópia completa do objeto onde seus tipos primitivos são copiados e suas referencias a tipos complexos são clonadas também.

Shallow (superficial)

Podemos definir este modo como a cópia simples de objetos java onde são clonados somentes seus valores, onde no caso de alguma referencia a objetos complexos é copiada a sua referencia.

Então escolha a que melhor te atende!!!

Copy

Exemplo de implementação:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package br.com.dipeloco;
 
public class Departamento implements Cloneable {
	private String nome;
 
	public String getNome() {
		return nome;
	}
 
	public void setNome(String nome) {
		this.nome = nome;
	}
 
	protected Object clone(){
		try {
			return super.clone();
		} catch (CloneNotSupportedException e) {
			/*Deve ser tratado em um projeto real*/
			e.printStackTrace();
			return null;
		}
	}
}
 
package br.com.dipeloco;
 
 
public class Funcionario implements Cloneable {
 
	private String nome;
	private String telefone;
	private String email;
	private Departamento departamento;
 
	/*OMITINDO GETTERS E SETTERS*/	
 
	/*
	 * SHALLOW COPY
	 * */
	protected Object clone(){
		try {
			return super.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
			return null;
		}
	}
 
	protected Object deepClone() {
		Funcionario funcionario = null;
		try {
			funcionario = (Funcionario) super.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
			return null;
		}
		funcionario.departamento = (Departamento) this.departamento.clone();
		return funcionario;
	}
}

Configurando Segurança na web (TOMCAT) 

Filed under: Java, segurança on Tuesday, June 3rd, 2008 by admin | No Comments

Bom pessoal neste “How to”, vou demostrar como configurar o acesso no servidor via (HTTPS) e como configurar o JAAS no Tomcat.

Caso necessário posso disponibilizar o projeto de exemplo.

1º - Download

Apache Tomcat
Xenos Certified Generator

2º - Configurar o web.xml do seu aplicativo para utilizar a comunicação “CONFIDENCIAL”, adicionando o seguinte bloco de XML.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
	<security-constraint>
		<display-name>HTTPS</display-name>
		<web-resource-collection>
			<description>Solicita HTTPS</description>
			<web-resource-name>HTTPS</web-resource-name>
			<url-pattern>/certificado/teste</url-pattern> (Aqui  deve conter a URL que precisa de https)
			<http-method>GET</http-method>
			<http-method>POST</http-method>
		</web-resource-collection>
		<auth-constraint>
			<role-name>GERENTE</role-name>
		</auth-constraint>
	<user-data-constraint>
		<description>
			Tipo de Troca de informação entre client-server
		</description>
		<transport-guarantee>CONFIDENTIAL</transport-guarantee>
	</user-data-constraint>
</security-constraint>

3º - Configurar seu metodo de autenticação (Estou usando basic por simplicidade).

Adicionar também no seu web.xml

1
2
3
<login-config>
	<auth-method>BASIC</auth-method>
</login-config>

4º - Criar a role de acesso

1
2
3
4
<security-role>
	<description>Role do Gerente</description>
	<role-name>GERENTE</role-name>
</security-role>

5º - Configurar o https no tomcat

Para gerar o certificado que você irá configurar abaixo utilize o xenos (para testes em produção você deverá usar um certificado válido)

Ative está chave no tomcat no arquivo server.xml em %CATALINA_HOME%/conf

1
2
3
4
5
6
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="f:\certificate\certificate.pfx"
keystorePass="prime123"
keystoreType="PKCS12"/>

Adicionando os parametros em negrito.

keystoreFile=” : Este parametro deve apontar para o arquivo gerado no xenos
keystorePass=” :Este é a senha informada no Xenos
keystoreType=” : Este é a tipo de certificado que vamos utilizar

6º - Vamos criar agora a implementação do JAAS

Em um projeto aparte crie as seguintes classes:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import java.security.Principal;
import java.util.Set;
 
public class User implements Principal {
 
	private String name;
	private Set<String> roles;
	/*OMITINDO GETTERS E SETTERS*/
}
 
/***********************************/
 
import java.security.Principal;
 
public class Role implements Principal {
	private String name;
	public Role(String name){
		this.name = name;
	}
	/*OMITINDO GETTERS E SETTERS*/
}
 
/*********************************/
 
import java.io.IOException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
 
import javax.security.auth.Subject;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.NameCallback;
import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.callback.UnsupportedCallbackException;
import javax.security.auth.login.LoginException;
import javax.security.auth.spi.LoginModule;
 
public class LoginModuleImpl implements LoginModule,WebServiceKeys {
 
	private Subject subject;
	private CallbackHandler callbackHandler;
	private Map sharedState;
	private Set<String> roles = new HashSet<String>();
	private User user;
 
	public boolean abort() throws LoginException {
		logout();
		subject = null;
		callbackHandler  = null;
		sharedState = null;;
		roles = null;
		user = null;
		return false;
	}
 
	public boolean commit() throws LoginException {
		if (user != null && !subject.getPrincipals().contains(user)) {
			subject.getPrincipals().add(user);
		}
		if (roles != null) {
			Iterator<String> it = roles.iterator();
			while (it.hasNext()) {
				Role role = new Role((String)it.next());
				if (!subject.getPrincipals().contains(role)) {
					subject.getPrincipals().add(role);
				}
			}
		}
		return true;
	}
 
	public void initialize(Subject subject, CallbackHandler callbackHandler,Map sharedState, Map options) {
		this.subject = subject;
		this.callbackHandler = callbackHandler;
		this.sharedState = sharedState;
	}
 
	public boolean login() throws LoginException {
		Callback[] callbacks = new Callback[2];
		callbacks[0] = new NameCallback("Login");
		callbacks[1] = new PasswordCallback("Senha", true);
		System.out.println("inicio do processo de autenticação");
		try {
			callbackHandler.handle(callbacks);
		} catch (IOException e) {
			e.printStackTrace();
		} catch (UnsupportedCallbackException e) {
			e.printStackTrace();
		}
 
		String login = ((NameCallback) callbacks[0]).getName();
		String senhaInformada = new String(((PasswordCallback) callbacks[1]).getPassword());
		/*FAÇA AVALIDACAO DO LOGIN INFORMADO*/
		if(login.equalsIgnoreCase("marcelo") &amp;&amp; senhaInformada.equals("teste123")){
			user = new User();
			user.setName("Marcelo Bueno de Campos");
			roles.add("GERENTE");
			user.setRoles(roles);
			sharedState.put("javax.security.auth.principal", user);
			sharedState.put("javax.security.auth.roles", roles);
		}else{
			return false;
		}
		return true;
	}
	public boolean logout() throws LoginException {
		subject.getPrincipals().removeAll(roles);
		subject.getPrincipals().remove(user);
		return true;
	}
}

7º - Criando o arquivo de configuração de login do Tomcat
Crie um arquivo texto com o nome de login.config com a seguinte estrutura

1
2
3
login{
br.com.prime.webservice.LoginModuleImpl required;
};

8º - Configure no tomcat para utilizar JAAS alterando as seguintes informações no arquivo server.xml

1
2
3
4
5
<Realm className="org.apache.catalina.realm.JAASRealm"
appName="login"
userClassNames="Nome completo da classe <strong>User</strong> criada no projeto separado"
roleClassNames="Nome completo da classe <strong>Role</strong> criada no projeto separado"
debug="0"/>

9º - Crie uma variável de ambiente chamada de “CATALINA_OPTS” com o seguinte conteúdo

1
-Xms256M -Xmx512M -XX:PermSize=32M -XX:MaxPermSize=128M -Dcom.sun.management.jmxremote.port=3333 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.security.auth.login.config==<strong>c:\login.config</strong> (configure aqui o caminho onde você gerou o seu arquivo de login.config)

10º - Gere um jar do projeto do JAAS e coloque ele no classPath do seu servidor tomcat.

11º - Gere um war do projeto onde foi implementada as alterações do web.xml e coloque no seu tomcat

Assim que “startar” o servidor tente acessar a URL configurada para ser segura.

Finalmente meu site online !!! 

Filed under: Uncategorized on Tuesday, June 3rd, 2008 by admin | No Comments

Pessoal estou feliz que finalmente meu site está online, meu primeiro artigo já está sendo desenvolvido, irá falar sobre segurança e no JEE. Então assim que possivel espero postar ele para vocês. Obrigado inté mais pessoal.