Beruflich Dokumente
Kultur Dokumente
Segurana
Lio 3
Gerenciadores de Segurana
Requerimentos de Software
NetBeans Enterprise Pack 5.5 executando sobre Java 2 Platform Standard Edition
Development Kit 5.0 ou superior (JDK 5.0, verso 1.5.0_01 ou superior), contemplando
a Java Runtime Environment, ferramentas de desenvolvimento para compilar, depurar,
e executar aplicaes escritas em linguagem Java. Sun Java System Application Server
Platform Edition 9.
Para Solaris, Windows, e Linux, os arquivos da JDK podem ser obtidos para
sua plataforma em http://java.sun.com/j2se/1.5.0/download.html
Para Mac OS X, Java 2 Plataform Standard Edition (J2SE) 5.0 Release 4, pode
ser obtida diretamente da Apple's Developer Connection, no endereo: http://
developer.apple.com/java ( necessrio registrar o download da JDK).
Segurana 2
JEDITM
Auxiliadores especiais
Coordenao do DFJUG
Agradecimento Especial
John Paul Petines Criador da Iniciativa JEDITM
Rommel Feria Criador da Iniciativa JEDITM
Segurana 3
JEDITM
1. Objetivos
De acordo com a perspectiva das APIs do Java, existe um gerenciador de segurana que se
encontra no controle do policiamento da segurana de uma aplicao. Existem tambm outras
facetas que so de importncia para a segurana em Java, mas a regra utilizada pelo gerenciador
vital na definio das rotinas de segurana que sero ativadas na execuo de um programa em
particular.
Numa viso simplificada, o gerenciador de segurana responsvel por determinar a maioria dos
argumentos da Java Sandbox. Isto significa que todas as regras estabelecidas pelo gerenciador
determinam quais operaes so permitidas ou no. Se um aplicativo Java tenta abrir um
arquivo, deseja se conectar com outra mquina em uma rede, ou se deseja alterar o estado de
um servio, o gerenciador de segurana decide se autoriza tais operaes ou as rejeita,
baseando-se nas regras definidas.
Ao final desta lio, o estudante ser capaz de:
Compreender a arquitetura dos Gerenciadores de Segurana
Conhecer os mtodos dos Gerenciadores de Segurana
Construir um Gerenciador de Segurana customizado
Segurana 4
JEDITM
Outro mtodo que pode ser utilizado o setSecurityManager. Permite que o usurio configure
manualmente o gerenciador de segurana para o sistema. Como por exemplo:
System.getSecurityManager(new SecurityManagerImpl());
Segurana 5
JEDITM
A seguir, temos os mtodos utilizados pelo gerenciador de segurana para rastrear o acesso a
arquivos.
public void checkRead(FileDescriptor fd)
public void checkRead(String file)
public void checkRead(String file, Object context)
Estes mtodos verificam se o programa tem permisso para ler um arquivo. O primeiro destes
mtodos obtm sucesso quando a proteo de domnio permite, em tempo de execuo, acesso
ao arquivo por meio do FileDescriptor. Os prximos mtodos obtm sucesso se a proteo de
domnio possui permisso de leitura em um arquivo com um nome que coincida ao argumento
contendo o nome do arquivo informado e a partir de um determinado contexto.
public void checkWrite(FileDescriptor fd)
public void checkWrite(String file)
Este mtodo verifica se o programa tem permisso para eliminar um determinado arquivo. Obtm
sucesso se a proteo de domnio possuir uma permisso de excluso de um arquivo com um
nome que coincida ao argumento contendo o nome do arquivo informado.
O gerenciador de segurana utiliza os seguintes mtodos para verificar o acesso rede:
public void checkConnect(String host, int port)
public void checkConnect(String host, int port, Object context)
Estes mtodos servem para verificar se o programa pode abrir uma conexo com outro
computador em uma porta no computador host. Obtm sucesso se a proteo de domnio possuir
uma conexo via socket com o mesmo nome do host, porta e em determinado contexto.
public void checkListen(int port)
Este mtodo verifica se o programa pode criar um novo servidor em determinada porta. A
proteo de domnio deve possuir uma permisso de monitoramento de socket onde o host seja
localhost, o alcance da porta inclua a porta especificada aberta com a ao de escutar.
public void checkAccept(String host, int port)
Este mtodo verifica se o programa pode aceitar (em um servidor existente) a conexo de um
cliente que possa ser originria de um dado host e porta. A proteo de domnio deve possuir
uma permisso de socket onde o host e a porta sejam iguais aos argumentos passados para o
mtodo.
public void checkMulticast(InetAddress addr)
public void checkMulticast(InetAddress addr, byte ttl)
Este mtodo verifica se o programa pode criar um multicast em um determinado endereo IP.
Segurana 6
JEDITM
Este mtodo verifica se o programa possui permisso para alterar a fbrica de sockets. Quando a
classe Socket utilizada para criar o socket, recebe um novo socket da fbrica, que fornece um
socket padro baseando-se no protocolo TCP. Entretanto, um programa poderia instalar uma
fbrica de sockets que fizesse com que todos os sockets fornecidos possuam semnticas
diferentes, tais como sockets que enviam informaes sobre o rastreamento de algum dado. A
proteo de domnio deve ter permisso durante a execuo de um programa atravs do mtodo
setFactory.
Este mtodo utilizado para prevenir a execuo arbitrria de comandos de sistema vindos de
classes no confiveis. Classes no confiveis no podem, por exemplo, executar um processo
distinto que remova todos os arquivos de seu disco rgido. Este processo necessitaria no ser
escrito em Java, claro, pois, caso contrrio, no existiria gerenciador de segurana que pudesse
restringir esta ao. Para obter sucesso, a proteo de domnio deve possuir uma permisso de
execuo com o mesmo nome do comando dado atravs do argumento passado.
public void checkPropertiesAccess( )
public void checkPropertyAccess(String key)
A JVM possui um conjunto de propriedades globais (de sistema) que contm informaes sobre o
usurio e a mquina: nome do usurio, diretrio raiz, entre outras informaes. Classes no
confiveis tm, geralmente, acesso negado a algumas dessas informaes em uma tentativa de
limitar a quantidade a informaes (espionagem) que uma applet pode fazer. Normalmente, estes
mtodos apenas previnem acesso s propriedades de sistema; uma classe no confivel livre
para enviar suas prprias propriedades e compartilh-las com outras classes se assim desejar.
Para ter sucesso, o domnio corrente de proteo deve carregar uma permisso de propriedade.
Se uma chave especificada, ento o nome da permisso de propriedade deve incluir
determinada chave e ter definida uma ao de leitura. De outra forma, o nome da permisso de
propriedade deve ser * e a ao deve ser de leitura e escrita.
public boolean checkTopLevelWindow(Object window)
Segurana 7
JEDITM
A API reflection poderosa o bastante a tal ponto que, por inspeo, um programa pode
determinar atributos de instncia e mtodos particulares de uma classe (embora no possa
realmente acessar esses atributos ou chamar esses mtodos). Todas as classes tem a permisso
de inspecionar qualquer outra classe e descobrir seus atributos e mtodos pblicos. Todas as
classes carregadas pelo mesmo Class Loader tem a permisso de inspecionar todos os atributos e
mtodos de outras. De outra forma, o domnio de proteo corrente deve carregar uma permisso
em tempo de execuo com o nome de accessDeclaredMembers. A implementao padro desse
mtodo bastante frgil. Diferente de todos os outros mtodos que foram vistos, um erro lgico
sobrescrever esse mtodo e depois chamar super.checkMemberAccess( ).
public void checkSecurityAccess(String action)
O pacote de segurana depende desse mtodo no gerenciador de segurana para decidir quais
classes podem executar certas operaes relacionadas a segurana. Como um exemplo, antes de
uma classe ter permisso de uma chave particular, esse mtodo chamado com um argumento
do tipo String indicando que uma chave particular est sendo lida. Como esperado, apenas
classes confiveis tm permisso de executar quaisquer operaes relacionadas a segurana.
public void checkPackageAccess(String pkg)
public void checkPackageDefinition(String pkg)
Esses mtodos so usados em conjunto com um Class Loader. Quando um Class Loader
requisitado a carregar uma determinada classe com um nome de pacote em particular, primeiro
perguntar ao gerenciador de segurana se permitido realizar esta ao atravs da chamada ao
mtodo checkPackageAccess(). Isso permite ao gerenciador de segurana ter certeza que uma
classe no autorizada no est tentando usar classes especficas da aplicao que ela no deveria
ter conhecimento. Similarmente, quando um Class Loader realmente cria uma classe em um
pacote em particular, pergunta ao gerenciador de segurana se permitido faz-lo, atravs da
chamada ao mtodo checkPackageDefinition(). Isso permite ao gerenciador de segurana prevenir
que uma classe no confivel carregue uma classe a partir da rede e armazene-a dentro, por
exemplo, do pacote java.lang.
Repare na distino entre esses dois mtodos: no caso do mtodo checkPackageAccess(), a
pergunta se o Class Loader pode referenciar a classe como um todo, isto , se podemos chamar
uma classe no pacote da Sun. No mtodo checkPackageDefinition(), os bytes da classe foram
carregados e o gerenciador de segurana est sendo questionado se eles podem pertencer a um
pacote em particular. Por padro, o mtodo checkPackageDefinition() nunca chamado e o
mtodo checkPackageAccess() chamado apenas para pacotes listados na propriedade
package.access dentro do arquivo java.security. Para ter sucesso, o domnio de proteo corrente
deve ter uma permisso em tempo de execuo com o nome de defineClassInPackage.+<pkg>
ou accessClassInPackage.+<pkg>.
Segurana 8
JEDITM
O gerenciador de segurana customizado para este programa solicita que o usurio entre com sua
senha antes de permitir um FileIO para escrever um texto em um arquivo ou ler um texto a partir
de um arquivo.
Import java.io.*;
if(!accessOK()){
super.checkRead(filename);
throw new SecurityException("Sem Chance!");
} else {
FilePermission perm = new FilePermission(
File.separatorChar + "home" +
Segurana 9
JEDITM
File.separatorChar + "monicap" +
File.separatorChar + "text2.txt", "read");
checkPermission(perm);
}
}
}
public void checkWrite(String filename) {
if((filename.equals(File.separatorChar + "home" +
File.separatorChar + "monicap" +
File.separatorChar + "text.txt"))){
if(!accessOK()){
super.checkWrite(filename);
throw new SecurityException("Sem chance!");
} else {
FilePermission perm = new FilePermission(
File.separatorChar + "home" +
File.separatorChar + "monicap" +
File.separatorChar + "text.txt" ,
"write");
checkPermission(perm);
}
}
}
}
Uma vez que as regras de segurana foram estabelecidas e a classe gerenciadora de segurana
que ir impor as regras feitas, deste modo, pode-se agora instalar o gerenciador de segurana em
Segurana 10
JEDITM
uma aplicao. Isso feito usando-se o mtodo esttico setSecurityManager da classe System,
como apresentado a seguir.
try {
System.setSecurityManager(new SecurityManagerImpl());
} catch (SecurityException se) {
System.err.println(Gerenciador de Segurana j est instalado!!!);
}
Deve-se notar que um gerenciador de segurana pode ser instalado, mas a permisso para
instalar um gerenciador diferente pode ser concedida. Assumindo que uma permisso no seja
concedida, ento uma SecurityException ser disparada. Depois que o gerenciador de segurana
foi instalado, o cdigo da aplicao no precisa referenciar a este diretamente. Isso porque a JVM
ir fazer todas as referncias ao gerenciador depois da instalao, a menos que uma chamada
explcita a um mtodo seja necessria.
Segurana 11
JEDITM
Instituto CTS
Patrocinador do DFJUG.
Sun Microsystems
Fornecimento de servidor de dados para o armazenamento dos vdeo-aulas.
DFJUG
Detentor dos direitos do JEDITM nos pases de lngua portuguesa.
Banco do Brasil
Disponibilizao de seus telecentros para abrigar e difundir a Iniciativa JEDITM.
Politec
Suporte e apoio financeiro e logstico a todo o processo.
Borland
Apoio internacional para que possamos alcanar os outros pases de lngua
portuguesa.
Instituto Gaudium/CNBB
Fornecimento da sua infra-estrutura de hardware de seus servidores para que os
milhares de alunos possam acessar o material do curso simultaneamente.
Segurana 12