Política de segurança Java

A máquina virtual Java opera com o carregamento dinâmico de classes, ou seja, bytecodes são carregados pela máquina virtual Java à medida que são solicitados pela aplicação. Em uma aplicação operando localmente, o carregador de classes da máquina virtual procura por essas classes nos (sub-)diretórios especificados a partir da variável do sistema CLASSPATH. Se encontrada, a classe é carregada para a máquina virtual e a operação continua. Caso contrário, a exceção ClassNotFoundException é gerada.

É possível realizar o carregamento de uma classe mesmo que ela não esteja localizada no sistema de arquivos da máquina de execução da máquina virtual Java. Isto acontece, por exemplo, com applets, que são carregados a partir de um servidor HTTP para execução no cliente navegador. Caso o applet faça referências a outras classes, se essas não forem localizadas na máquina local serão buscadas na mesma base de origem do applet.

No modelo de segurança estabelecido a partir do Java 2 (JDK versão 1.2 e superiores), todo código sendo carregado para uma máquina virtual Java requer o estabelecimento de uma política de segurança, visando evitar que algum objeto realize operações não-autorizadas na máquina local. Com a inclusão do conceito de política de segurança, é possível estabelecer permissões diferenciadas para as aplicações:

Arquitetura de segurança JDK 1.2

A política de segurança padrão é estabelecida em um arquivo do sistema, java.policy, localizado no diretório <java_home>/lib/security/. Cada usuário pode estabelecer adições a essa política através da criação de um arquivo particular de estabelecimento de política, .java.policy, em seu diretório home. Por exemplo, para permitir conexões TCP de qualquer máquina com origem no domínio dca.fee.unicamp.br a portas não-notáveis, o seguinte arquivo .java.policy seria criado com conteúdo:

grant {
  permission java.net.SocketPermission "*.dca.fee.unicamp.br:1024-", "accept,connect";
};
    

Alternativamente, um arquivo de política alternativo pode ser especificado na linha de comando que invoca a máquina virtual Java através da propriedade java.security.policy:

      > java -Djava.security.policy=minhapolitica.txt CountClient
    

A sintaxe para o arquivo de políticas permite estabelecer domínios de permissão com base na origem do código ou na sua assinatura. A ferramenta policytool permite criar um arquivo de políticas através de uma interface gráfica.

Para enforçar essas políticas alternativas de segurança, um SecurityManager deve ser criado. Applets, por default, utilizam um SecurityManager estabelecido pelo navegador em cujo contexto estão executando. Outras aplicações devem criar explicitamente esse objeto. Se o cliente RMI estiver em um applet, então não é necessário criar um SecurityManager, uma vez que o próprio navegador estabelece a política de segurança para que applets carreguem classes dinamicamente.