Sie sind auf Seite 1von 12

Mdulo 7

Segurana

Lio 3
Gerenciadores de Segurana

Verso 1.0 - Jan/2008


JEDITM

Autor Necessidades para os Exerccios


Aldwin Lee Sistemas Operacionais Suportados
NetBeans IDE 5.5 para os seguintes sistemas operacionais:
Cheryl Lorica
Microsoft Windows XP Profissional SP2 ou superior
Mac OS X 10.4.5 ou superior
Red Hat Fedora Core 3
Equipe Solaris 10 Operating System (SPARC e x86/x64 Platform Edition)
Rommel Feria NetBeans Enterprise Pack, poder ser executado nas seguintes plataformas:
Microsoft Windows 2000 Profissional SP4
John Paul Petines Solaris 8 OS (SPARC e x86/x64 Platform Edition) e Solaris 9 OS (SPARC e
x86/x64 Platform Edition)
Vrias outras distribuies Linux

Configurao Mnima de Hardware


Nota: IDE NetBeans com resoluo de tela em 1024x768 pixel
Sistema Operacional Processador Memria HD Livre
Microsoft Windows 500 MHz Intel Pentium III 512 MB 850 MB
workstation ou equivalente
Linux 500 MHz Intel Pentium III 512 MB 450 MB
workstation ou equivalente
Solaris OS (SPARC) UltraSPARC II 450 MHz 512 MB 450 MB
Solaris OS (x86/x64 AMD Opteron 100 Srie 1.8 GHz 512 MB 450 MB
Platform Edition)
Mac OS X PowerPC G4 512 MB 450 MB

Configurao Recomendada de Hardware

Sistema Operacional Processador Memria HD Livre


Microsoft Windows 1.4 GHz Intel Pentium III 1 GB 1 GB
workstation ou equivalente
Linux 1.4 GHz Intel Pentium III 1 GB 850 MB
workstation ou equivalente
Solaris OS (SPARC) UltraSPARC IIIi 1 GHz 1 GB 850 MB
Solaris OS (x86/x64 AMD Opteron 100 Series 1.8 GHz 1 GB 850 MB
Platform Edition)
Mac OS X PowerPC G5 1 GB 850 MB

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

Para mais informaes: http://www.netbeans.org/community/releases/55/relnotes.html

Segurana 2
JEDITM

Colaboradores que auxiliaram no processo de traduo e reviso


Acio Jnior Denis Mitsuo Nakasaki Luiz Fernandes de Oliveira Junior
Alexandre Mori Emanoel Tadeu da Silva Freitas Maria Carolina Ferreira da Silva
Alexis da Rocha Silva Guilherme da Silveira Elias Massimiliano Giroldi
Angelo de Oliveira Leandro Souza de Jesus Paulo Oliveira Sampaio Reis
Bruno da Silva Bonfim Lucas Vincius Bibiano Thom Ronie Dotzlaw

Auxiliadores especiais

Reviso Geral do texto para os seguintes Pases:


Brasil Tiago Flach e Vincius G. Ribeiro (Especialista em Segurana)
Guin Bissau Alfredo C, Bunene Sisse e Buon Olossato Quebi ONG Asas de Socorro

Coordenao do DFJUG

Daniel deOliveira JUGLeader responsvel pelos acordos de parcerias


Luci Campos - Idealizadora do DFJUG responsvel pelo apoio social
Fernando Anselmo - Coordenador responsvel pelo processo de traduo e reviso,
disponibilizao dos materiais e insero de novos mdulos
Rodrigo Nunes - Coordenador responsvel pela parte multimdia
Srgio Gomes Veloso - Coordenador responsvel pelo ambiente JEDITM (Moodle)

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

2. Gerenciadores de Segurana de Aplicativos


Applets Java possuem uma segurana muito restritiva por padro. Por outro lado, aplicativos Java
no possuem estas definies de segurana por padro. Ento, possvel notar que o gerenciador
de segurana utilizado somente se for explicitamente instalado.

Figura 1: Estrutura do Gerenciador de Segurana Java

Para instalar o gerenciador de segurana especifica-se o parmetro D java.security.manager na


execuo de um aplicativo Java. Este gerenciador ser automaticamente instalado pelo Applet
Viewer ou um plug-in Java.
possvel conferir se uma aplicao j se encontra com o gerenciador de segurana carregado
tambm possvel. Isto realizado por meio do mtodo getSecurityManager. Este mtodo
retorna uma referncia relativa ao gerenciador de segurana ou null, se nenhum gerenciador de
segurana foi carregado ou definido. Como exemplo:
SecurityManager secureApp = System.getSecurityManager();

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

3. Mtodos dos Gerenciadores de Segurana


Agora que conhecemos como o gerenciador de segurana funciona, mostraremos o que o
gerenciador de segurana capaz de fazer. As classes do gerenciador de segurana,
SecurityManager, oferecem mtodos para realizar a verificao de segurana. Estes mtodos
agem em conjunto com alguns aspectos do sistema Java, tais como: acesso arquivos, rede,
prpria JVM, servios, recursos do sistema e mesmo a aspectos de segurana.

3.1. Rastrear o Acesso

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)

Estes mtodos verificam se o programa tem permisso para escrever em um determinado


arquivo. O primeiro mtodo obtm sucesso quando a proteo de domnio permite, em tempo de
execuo, acesso ao arquivo por meio do FileDescriptor. E o segundo obtm sucesso se a proteo
de domnio possuir permisso de gravao em arquivo com o nome que coincida ao argumento
contendo o nome do arquivo informado.
public void checkDelete(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

Obtm sucesso se a proteo de domnio possuir uma permisso de se conectar e aceitar


conexes socket com um host que seja igual ao endereo dado, o alcance da porta de todas as
portas, e a ao.
public void checkSetFactory()

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.

3.2. Verificar a JVM

A verificao da JVM realizada empregando-se os seguintes mtodos:


public void checkCreateClassLoader()

A distino realizada sobre as classes confiveis e no confiveis baseada no local de onde a


classe carregada. Como resultado, o carregador de classe toma uma importante deciso, desde
que o gerenciador de segurana esteja configurado para questionar ao carregador onde a classe
se encontra. O carregador tambm responsvel por certificar de que determinadas classes so
assinadas. Tipicamente, uma classe no confivel no pode ser permitida para realizar uma
criao de um carregador de classes. Este mtodo chamado somente pelo construtor da classe
atravs do Class Loader: se for possvel realizar a criao de um objeto desta classe (ou obter
previamente a referncia de um objeto) para fazer uso deste. Para obter sucesso, a proteo de
domnio deve possuir permisso durante a execuo.
public void checkExec(String cmd)

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)

Classes Java, sem levar em considerao se so confiveis ou no confiveis, normalmente tem


permisso para criar janelas top-level no desktop do usurio. Entretanto, h uma preocupao
acerca de uma classe no confivel apresentar uma janela que se parea exatamente com outra
aplicao no desktop do usurio e, dessa forma, guiar o usurio a fazer algum procedimento que
no deveria ser realizado. Por exemplo, uma applet pode apresentar uma janela que se parea
exatamente com uma sesso telnet e ento capturar a senha do usurio quando este responder a
um pedido de informao da senha. Por essa razo, janelas top-level so criadas por classes no

Segurana 7
JEDITM

confiveis e possuem um banner de identificao. Esse mtodo diferente de outros no


gerenciamento de segurana, pois possui trs resultados:
Retornar verdadeiro, a janela ser criada normalmente;
Retornar falso, a janela ser criada com o banner de identificao.
Lanar uma exceo de segurana (assim como todos os outros mtodos da classe de
gerenciamento de segurana) para indicar que a janela no deve ser criada; a maioria dos
aplicativos criados realiza esta ao.
Para que este mtodo retorne verdadeiro, o domnio de proteo corrente deve carregar uma
permisso AWT denominada showWindowWithoutWarningBanner.

3.3. Aspectos Gerais de Segurana

Estes so os mtodos cuidam de alguns aspectos de segurana:


public void checkMemberAccess(Class clazz, int which)

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

4. Construir Gerenciadores Customizados


Para criar seu prprio gerenciador de segurana, necessrio estender a classe SecurityManager.
Como visto na sesso anterior, a classe SecurityManager possui uma srie de mtodos que podem
ser chamados pelas classes Java. Sobrescrevendo esses mtodos, pode-se criar polticas de
segurana definidas pelo usurio que, quando carregadas em uma aplicao, iro fornecer o nvel
de segurana desejado.
H algumas consideraes a serem observadas ao se construir um gerenciador de segurana. Aqui
esto algumas questes que podem ajudar neste processo:
Quais mtodos devem ser implementados?
Novos mtodos precisam ser adicionados?
Como os mtodos sero implementados?
Quo restritas as regras de segurana devero ser?
Um exemplo de um gerenciador de segurana customizado a classe PasswordSecurityManager,
detalhada em:
http://java.sun.com/developer/onlineTraining/Programming/JDCBook/signed2.html

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.*;

public class PasswordSecurityManager extends SecurityManager{


private String password;
private BufferedReader buffy;

public PasswordSecurityManager(String p, BufferedReader b){


super();
this.password = p;
this.buffy = b;
}
// Solicitar ao usurio final uma senha, verifica a senha e retorna
// verdadeiro se a senha estiver correta ou falso se no estiver.
private boolean accessOK() {
int c;
String response;

System.out.println("Senha, por favor:");


try {
response = buffy.readLine();
if (response.equals(password))
return true;
else
return false;
} catch (IOException e) {
return false;
}
}
public void checkRead(String filename) {
if((filename.equals(File.separatorChar + "home" +
File.separatorChar + "monicap" +
File.separatorChar + "text2.txt"))){

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);
}
}
}
}

Como visto, os mtodos checkRead e checkWrite foram sobrescritos. A implementao


customizada para SecurityManager.checkWrite testa o caminho /home/monicap/text.txt. Se o
caminho existir, solicita ao usurio a senha. Se estiver correta, o mtodo checkWrite executa a
checagem de acesso atravs da criao de uma instncia da permisso requerida e passando-a ao
mtodo SecurityManager.checkPermission. Essa checagem ter sucesso se o gerenciador de
segurana encontrar um sistema, usurio ou arquivo de poltica de segurana com a permisso
especificada.
Ao invs de adicionar a poltica de segurana no cdigo fonte, pode-se optar por coloc-la em um
arquivo separado, como um arquivo .properties ou .xml. Pode-se, ento, solicitar ao gerenciador
de segurana a leitura desse arquivo e estabelecer uma poltica de segurana dessa forma. Essa
tcnica faz com que a implementao das polticas de segurana sejam flexveis, j que novas
regras adicionadas ao cdigo fonte podem requerer a modificao do cdigo, recompilao e
redistribuio da aplicao a cada vez que fossem modificadas.
Por exemplo, em Enterprise Java Beans (EJB), polticas de segurana podem ser especificadas no
elemento security-permission do descritor weblogic-ejb-jar.xml. O exemplo seguinte concede
acesso de leitura e escrita a um diretrio temporrio no filesystem do servidor para os EJB:
<weblogic-enterprise-bean>
<!-- instrues webLogic enterprise bean vo aqui -->
</weblogic-enterprise-bean>
<security-role-assignment>
<!-- As tarefas opcionais de segurana vo aqui -->
</security-role-assignment>
<security-permission>
<description>
concede permisso de leitura e escrita para a pasta ext no drive d:
</description>
<security-permission-spec>
grant {
permission java.io.FilePermission "d:${/}ext${/}-", "read,write";
}
</security-permission-spec>
<security-permission>

4.1. Instalando os Gerenciadores de Segurana

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

Parceiros que tornaram JEDITM possvel

Instituto CTS
Patrocinador do DFJUG.

Sun Microsystems
Fornecimento de servidor de dados para o armazenamento dos vdeo-aulas.

Java Research and Development Center da Universidade das Filipinas


Criador da Iniciativa JEDITM.

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

Das könnte Ihnen auch gefallen