Segurança em ambientes J2EE

Pessoal,

 Trabalho com servidores weblogic executando em ambiente unix e estou com o seguinte problema:

 Alguns desenvolvedores conseguiram, através do pacote java.io, criar diretórios e arquivos no file system e isto pode me gerar um grave problema de segurança.

O que quero é poder definir um diretório em que as aplicações tenham acesso de read/write, por exemplo para gravar um log, mas que não possam executar outros acessos fora deste diretório.

Outro problema que tenho é que alguns desenvolvedores utilizam o System.exit(), e acabam por encerrar o processo java do weblogic.

Li algumas documentações e verifiquei que pode-se configurar o arquivo java.policy e dar grants específicos, entre elas, acesso ao disco e funções de run-time (exit()).

Só que para variar, as documentações não são claras para explicar como tudo isto se junta no ambiente, então gostaria de saber se alguém já passou por esta necessidades de segurança, se configurar o java.policy é suficiente e se isto funciona em ambiente J2EE?

Desde já agradeço a atenção,
Cicero

Use o policytool da JRE para configurar o java.policy, e evitar esses problemas…

[]'s

Bom trabalho.

Mais informações sobre a PolicyTool aqui:

http://java.sun.com/j2se/1.4.1/docs/tooldocs/tools.html#security

eu costumo rodar os servidores j2ee no linux como um usuário sem direito nenhum, ai resolve quase todo o problema :slight_smile:

Acho que não resolve assim não… Pois apesar dele estar com um usuário “sem algumas permisões”, a aplicação dentro da JRE ainda vai conseguir:

1 - Gravar e ler arquivo no diretório WEB-INF/ ou no diretório de start do APPServer.

2 - Executar System.exit(0);

3 - Intrerferir no controle de Threads (stop, start, resume, suspend, etc);

4 - Enviar um documento para a fila de impressão via PrintJOB;

5 - Carregar remotamente classes de locais não permitos ou UnTrusted, que podem corromper a aplicação;

ex java.policy (J2EE RI)


// Standard extensions get all permissions by default

grant codeBase "file:${java.home}/lib/ext/-" {
    permission java.security.AllPermission;
};

grant codeBase "file:${java.home}/../lib/tools.jar" {
    permission java.security.AllPermission;
};

grant codeBase "file:${com.sun.enterprise.home}/lib/-" {
    permission java.security.AllPermission;
};

grant codeBase "file:${jms.home}/classes/" {
    permission java.security.AllPermission;
};

// Drivers and other system classes should be stored in this 
// code base.
grant codeBase "file:${com.sun.enterprise.home}/lib/system/-" {
    permission java.security.AllPermission;
};

// additional permissions for EJBs
grant codeBase "file:${com.sun.enterprise.home}/ejb_impls/-" {
    permission java.lang.RuntimePermission "queuePrintJob";
    permission java.io.FilePermission "${com.sun.enterprise.home}${/}repository${/}-", "read";
};

// additional permissions for servlets
grant codeBase "file:${com.sun.enterprise.home}/public_html/-" {
    permission java.lang.RuntimePermission "loadLibrary.*";
    permission java.lang.RuntimePermission "accessClassInPackage.*";
    permission java.lang.RuntimePermission "queuePrintJob";
    permission java.lang.RuntimePermission "modifyThreadGroup";
    permission java.io.FilePermission "<<ALL FILES>>", "read,write";
};

// additional permissions for standalone resource adapters
grant codeBase "file:${com.sun.enterprise.home}/connector/adapters/-" {
    permission javax.security.auth.PrivateCredentialPermission "* * "*"", "read";
    permission java.io.FilePermission "${com.sun.enterprise.home}${/}logs${/}-", "read,write";
};

// permissions for other classes
grant codeBase "file:${com.sun.enterprise.home}/repository/-" {
    permission java.lang.RuntimePermission "loadLibrary.*";
    permission java.lang.RuntimePermission "accessClassInPackage.*";
    permission java.lang.RuntimePermission "queuePrintJob";
    permission java.lang.RuntimePermission "modifyThreadGroup";
    permission java.io.FilePermission "<<ALL FILES>>", "read,write";
    permission javax.security.auth.PrivateCredentialPermission "* * "*"", "read";
};


// permissions for default domain
grant {
    permission java.net.SocketPermission "*", "connect";
    permission java.util.PropertyPermission "*", "read";

    // workaround missing doPrivileged blocks in javamail
    permission java.io.FilePermission "${com.sun.enterprise.home}${/}lib${/}j2ee.jar", "read";

    permission javax.security.auth.PrivateCredentialPermission "javax.resource.spi.security.PasswordCredential * "*"", "read";
    permission javax.security.auth.PrivateCredentialPermission "javax.resource.spi.security.GenericCredential * "*"", "read";

};

Por isso, a melhor solução é alterar o policy que a JRE do servidor vai usar.

Bom trabalho…

concordo, só disse que no meu caso resolve, pois só o pessoal da minha empresa publica alguma coisa nos meus servidores :slight_smile:

Concordo com o Oziel. O difícil é limitar o que uma web application pode fazer. Aqui trabalhamos com diversas fábricas de software e já passei por aplicações que emitiam System.exit() provocando a queda do servidor, indisponibilizando não somente o nosso site mas também algumas áreas administrativas e da fábrica!

Um dos testes que pretendo fazer é alterar o diretório default do weblogic e ver se isto limita o acesso ao disco, mas ainda me soa como um quebra-galho. Deve existir um meio de limitar o escopo da aplicação não permitindo acessos potencialmente perigosos.

Por exemplo no exemplo do Oziel, temos:

permission java.io.FilePermission "&lt;<ALL FILES>&gt;", "read,write";

e no weblogic temos

permission java.io.FilePermission "WEBLOGIC-APPLICATION-ROOT${/}-", "read,write";

o que é um pouco mais restritivo.

Abraços,
Cicero

Abaixo segue o weblogic.policy.

//
// To use this file you must turn on the java security manager by defining
// java.security.manager and setting the java.security.policy property to
// point to the security policy which should be in the lib directory.
// For example&#58; 
//   java -Djava.security.manager
//        -Djava.security.policy==$&#123;/&#125;weblogic7$&#123;/&#125;bea$&#123;/&#125;weblogic700/server/lib/weblogic.policy
//           weblogic.Server
//
// You can edit this file and change the permissions for your applications
// or update the codeBase line to point to where your server is installed 

// The codeBase location must be a URL, not a file path
// so Windows users beware of backslashes.
// 

grant codeBase &quot;file&#58;$&#123;/&#125;weblogic7$&#123;/&#125;bea$&#123;/&#125;weblogic700/server/lib/-&quot; &#123;
  permission java.security.AllPermission;
&#125;;

grant codeBase &quot;file&#58;$&#123;/&#125;weblogic7$&#123;/&#125;bea$&#123;/&#125;weblogic700/server/ext/-&quot; &#123;
  permission java.security.AllPermission;
&#125;;

grant codeBase &quot;file&#58;$&#123;/&#125;weblogic7$&#123;/&#125;bea$&#123;/&#125;weblogic700/samples/server/eval/pointbase/lib/-&quot; &#123;
  permission java.security.AllPermission;
&#125;;

//
// For the petstore demo
//
grant codeBase &quot;file&#58;$&#123;/&#125;weblogic7$&#123;/&#125;bea$&#123;/&#125;weblogic700/samples/server/config/petstore/-&quot; &#123;
&#125;;

//
// For the examples
//
grant codeBase &quot;file&#58;$&#123;/&#125;weblogic7$&#123;/&#125;bea$&#123;/&#125;weblogic700/samples/server/config/examples/-&quot; &#123;
&#125;;

//
// For the workshop
//
grant codeBase &quot;file&#58;$&#123;/&#125;weblogic7$&#123;/&#125;bea$&#123;/&#125;weblogic700/samples/workshop/-&quot; &#123;
  permission java.security.AllPermission;
&#125;;

//
// Default permissions that need to be granted to applications at this point
//
grant &#123;
	permission java.io.SerializablePermission &quot;enableSubstitution&quot;;
	permission java.io.FilePermission &quot;$&#123;/&#125;weblogic7$&#123;/&#125;bea$&#123;/&#125;weblogic700$&#123;/&#125;-&quot;, &quot;read,write&quot;;
	permission java.lang.RuntimePermission &quot;accessClassInPackage.sun.io&quot;;
	permission java.lang.RuntimePermission &quot;createClassLoader&quot;;
	permission java.lang.RuntimePermission &quot;getClassLoader&quot;;
	permission java.net.SocketPermission &quot;localhost&#58;1024-&quot;, &quot;connect,resolve&quot;;
	permission java.util.PropertyPermission &quot;*&quot;, &quot;read,write&quot;;
&#125;;

//
// These are for the three app types
//

// EJB default permissions
grant codebase &quot;file&#58;/weblogic/application/defaults/EJB&quot; &#123;
    permission java.lang.RuntimePermission &quot;queuePrintJob&quot;; 
    permission java.net.SocketPermission &quot;*&quot;, &quot;connect&quot;; 
    permission java.util.PropertyPermission &quot;*&quot;, &quot;read&quot;;
&#125;;

// Web App default permissions
grant codebase &quot;file&#58;/weblogic/application/defaults/Web&quot; &#123;
    permission java.lang.RuntimePermission &quot;loadLibrary&quot;; 
    permission java.lang.RuntimePermission &quot;queuePrintJob&quot;; 
    permission java.net.SocketPermission &quot;*&quot;, &quot;connect&quot;; 
    permission java.io.FilePermission &quot;WEBLOGIC-APPLICATION-ROOT$&#123;/&#125;-&quot;, &quot;read,write&quot;;
    permission java.util.PropertyPermission &quot;*&quot;, &quot;read&quot;;
&#125;;

// Connector default permissions
grant codebase &quot;file&#58;/weblogic/application/defaults/Connector&quot; &#123;
    permission java.net.SocketPermission &quot;*&quot;, &quot;connect&quot;; 
    permission java.io.FilePermission &quot;WEBLOGIC-APPLICATION-ROOT$&#123;/&#125;-&quot;, &quot;read,write&quot;;
    permission java.util.PropertyPermission &quot;*&quot;, &quot;read&quot;;
&#125;;


// Standard extensions get all permissions by default

grant codeBase &quot;file&#58;$&#123;java.home&#125;/lib/ext/-&quot; &#123;
	permission java.security.AllPermission;
&#125;;

// default permissions granted to all domains

grant &#123; 
	// &quot;standard&quot; properies that can be read by anyone

	permission java.util.PropertyPermission &quot;java.version&quot;, &quot;read&quot;;
	permission java.util.PropertyPermission &quot;java.vendor&quot;, &quot;read&quot;;
	permission java.util.PropertyPermission &quot;java.vendor.url&quot;, &quot;read&quot;;
	permission java.util.PropertyPermission &quot;java.class.version&quot;, &quot;read&quot;;
	permission java.util.PropertyPermission &quot;os.name&quot;, &quot;read&quot;;
	permission java.util.PropertyPermission &quot;os.version&quot;, &quot;read&quot;;
	permission java.util.PropertyPermission &quot;os.arch&quot;, &quot;read&quot;;
	permission java.util.PropertyPermission &quot;file.separator&quot;, &quot;read&quot;;
	permission java.util.PropertyPermission &quot;path.separator&quot;, &quot;read&quot;;
	permission java.util.PropertyPermission &quot;line.separator&quot;, &quot;read&quot;;

	permission java.util.PropertyPermission &quot;java.specification.version&quot;, &quot;read&quot;;
	permission java.util.PropertyPermission &quot;java.specification.vendor&quot;, &quot;read&quot;;
	permission java.util.PropertyPermission &quot;java.specification.name&quot;, &quot;read&quot;;

	permission java.util.PropertyPermission &quot;java.vm.specification.version&quot;, &quot;read&quot;;
	permission java.util.PropertyPermission &quot;java.vm.specification.vendor&quot;, &quot;read&quot;;
	permission java.util.PropertyPermission &quot;java.vm.specification.name&quot;, &quot;read&quot;;
	permission java.util.PropertyPermission &quot;java.vm.version&quot;, &quot;read&quot;;
	permission java.util.PropertyPermission &quot;java.vm.vendor&quot;, &quot;read&quot;;
	permission java.util.PropertyPermission &quot;java.vm.name&quot;, &quot;read&quot;;
&#125;;