Controle de Acessos na Plataforma.NET Notas para a disciplina de Segurança Informática Pedro...
Transcript of Controle de Acessos na Plataforma.NET Notas para a disciplina de Segurança Informática Pedro...
Controle de Acessos na Plataforma .NET
Notas para a disciplina de “Segurança Informática”
Pedro Félix ([email protected])
Instituto Superior de Engenharia de Lisboa
2P. Félix, 2006 Controlo de acessos na plataforma .NET
Terminologia
• Sujeito – quem realiza o acessoactivo que realiza o acesso• Objecto – entidade acedida
• Operação – tipo do acesso• O monitor de referências concede (“grant”) ou recusa (“deny”) o
acesso
Sujeito ObjectoPedido de
acessoMonitor de
Referências
3P. Félix, 2006 Controlo de acessos na plataforma .NET
Modelos baseados na identidade do utilizador
• Modelo de segurança clássico – as decisões de autorização são baseadas na identidade do utilizador (Windows NT e Unix)
• Os sistemas baseados em componentes tem requisitos de segurança diferentes– uma aplicação é constituída por componentes de diferentes origens e
diferentes graus de confiança
• Modelo antigo– Full trust (privilégios do utilizador) ou No trust– Decisão em tempo de carregamento (certificados ou confiança explícita)– Na prática, não é possível distinguir entre código local e código móvel -
todas as linhas de código tem os mesmos privilégios
• Os ambientes de execução virtuais possibilitam a criação de modelos de segurança diferentes dos do sistema operativo– O ambiente de execução funciona como Trusted Computing Base (TCB)
– entidade omnisciente e omnipresente responsável por implementar o modelo de segurança
4P. Félix, 2006 Controlo de acessos na plataforma .NET
Requisitos para a plataforma .NET
• Sistema de segurança para código móvel parcialmente confiável– autorizações fine-grained
– extensível
– configurável
– baseado em componentes e não em processos
• Modelo onde a autorização depende da identidade do código - Code Acess Security (CAS)
• Type safety– Definição das fronteiras dum assembly
– Verificação– reinterpret_cast é proibído – código C++ (managed) não é
verificável
5P. Félix, 2006 Controlo de acessos na plataforma .NET
Modelo
• Autenticação - Em tempo de carregamento, o CLR recolhe provas (evidence) sobre a proveniência do assembly: local de carregamento, autoria, ... Esta evidência fica associada ao Assembly
• Autorização - O CLR utiliza a evidência para determinar o conjunto de permissões do assembly– Permissão: possibilidade de realizar uma acção
– A relação entre evidências e conjuntos de permissões é estabelecida pela política de segurança
• Enforcement - As permissões são explicitamente exigidas pelos objectos (tipicamente em bibliotecas seguras)
Assembly Evidence PermissionSet
PolicyLevel
Código SecurityManager
PolicyLevelPolicyLevel
6P. Félix, 2006 Controlo de acessos na plataforma .NET
Diagrama
Assembly
Método
PermissionSet
IPermission
Método
Sujeito Objecto
EvidenceCLR CLR
Acesso
pertence a
contém
demands
CodeGroup
IMembershipCondition PermissionSet
Autenticação Autorização
Política
7P. Félix, 2006 Controlo de acessos na plataforma .NET
Questões
• O que é a identidade do código?• Como é implementada a relação entre identidades e permissões?• Como é implementado o controlo aos acessos?
8P. Félix, 2006 Controlo de acessos na plataforma .NET
Autenticação e autorização
• Em tempo de carregamento, o CLR recolhe informação sobre cada assembly. Esta informação é designada de evidence.
• Ainda em tempo de carregamento, o CLR usa informação de configuração (Policy Levels) para transformar a evidence dum assembly num conjunto de permissões. Este conjunto de permissões fica associado a todos os tipos do assembly
• Em tempo de execução, os métodos acedídos verificam se os chamadores possuem as permissões necessárias
9P. Félix, 2006 Controlo de acessos na plataforma .NET
Evidence
• Evidence é um conjunto de informação sobre um assembly ou AppDomain
• A evidence não depende do utilizador• A evidence é fornecida por
– CLR
– Hosts
– Assemblies
• Exemplos:– Nome (Strong Name)
– Localização
– Publisher
– Valor de hash
– Evidence contida dentro do assembly
10P. Félix, 2006 Controlo de acessos na plataforma .NET
Evidence
• O tipo Evidence é um contentor de evidence• Contém dois sub-conjntos
– Evidence fornecida pelo host
– Evidence fornecida pelo assembly
• Propriedade Evidence do tipo Assembly• Propriedade Evidence do tipo AppDomain
11P. Félix, 2006 Controlo de acessos na plataforma .NET
Evidence fornecida pelo host
• Um host é – Troço de código unmanaged que lança o CLR– Troço de código managed que lança outro troço de código managed
• Unmanaged Host– Fornece informação (evidence) ao CLR, tal como a directoria de
execução– Este informação fica associada ao AppDomain
• Managed Host– public static Assembly Load(AssemblyName, Evidence); – public static ObjectHandle CreateInstance(string, string, bool,
BindingFlags, Binder, object[], CultureInfo, object[], Evidence);– public static AppDomain CreateDomain(string, Evidence,
AppDomainSetup)– …
• Independentemente do tipo de host, o CLR fornece evidence por omissão
12P. Félix, 2006 Controlo de acessos na plataforma .NET
Classes pré-definidas
• ApplicationDirectory– Directoria de execução da aplicação
• Hash– Valor de hash do assembly
• Publisher– Informação sobre o criador do assembly, no caso deste conter um
certificado
• Site– Informação sobre a localização original do assembly
• StrongName– Nome do assembly
• Url– Localização original do assembly
• Zone– Classificação da localização original do assembly (Internet, Intranet,
MyComputer, Trusted, Untrusted, NoZone)
13P. Félix, 2006 Controlo de acessos na plataforma .NET
Evidence fornecida pelo Assembly
• Informação contida no próprio assembly
• Exemplo: certificação por uma entidade externa
• Processo de criação e associação:1. Criar um objecto para representar a evidence
2. Serializar o objecto usando o formatador binário
3. Compilar o código do assembly para módulos
4. Criar o assembly, usando a ferramenta al, incluindo o objecto evidence serializado (/evidence:<filename>)
14P. Félix, 2006 Controlo de acessos na plataforma .NET
Diagrama
Evidence
ICollection
Site
Publisher
IEvidenceFactory
AppDomain Assembly
ApplicationDirectory
Zone StrongName HashUrl
Certificate
15P. Félix, 2006 Controlo de acessos na plataforma .NET
Permissões
• Permissão – capacidade para realizar uma acção• As permissões são associadas a código (via assemblies)• As operações cujo acesso é controlado exigem (demand) que o
chamador possua as permissões adequadas• Existem três tipos de permissões
– Code Access Permissions
– Identity Permissions
– Outras
16P. Félix, 2006 Controlo de acessos na plataforma .NET
Interface IPermission
• Descreve um conjunto de operações associadas ao mesmo tipo de recurso
• Exemplos– FileIOPermission
– UIPermission
• Fornece interface com operações de conjuntos– IPermission Copy()
– IPermission Intersect(IPermission)
– IPermission Union(IPermission)
– Bool IsSubsetOf(IPermission)
• Método para o controlo de acesso– void Demand() – verifica se os chamadores tem permissão para realizar
a operação
17P. Félix, 2006 Controlo de acessos na plataforma .NET
IUnrestrictedPermission e PermissionState
• A interface IUnrestrictedPermission é implementada por todas as permissões que possuem um estado “não-restrito” (todas as operações sobre o tipo de recurso são possíveis)
• A interface possui a propriedade isUnrestriced, que retorna true se a permissão está no estado “não-restrito”
• Tipicamente, todas as permissões que implementam esta interface possum um construtor que recebe PermissionState (enumerado com os valores None e Unrestricted)
• Um PermissionSet construido com PermissionState.Unrestricted contém todas a permissões que implementam a interface IUnrestrictedPermission no estado PermissionState.Unrestricted
18P. Félix, 2006 Controlo de acessos na plataforma .NET
Exemplo
IPermission perm1 = new FileIOPermission(FileIOPermissionAccess.Read, @"c:\teste.txt");
IPermission perm2 = new FileIOPermission(FileIOPermissionAccess.Write, @"c:\teste.txt");
IPermission perm3 = new FileIOPermission(FileIOPermissionAccess.Write, @"c:\teste2.txt");
IPermission perm4 = new FileIOPermission(FileIOPermissionAccess.AllAccess, @"c:\teste.txt");
IPermission all = new FileIOPermission(PermissionState.Unrestricted);
IPermission none = new FileIOPermission(PermissionState.None);
Console.WriteLine(perm1.Union(perm2));
Console.WriteLine(perm2.Union(perm3));
Console.WriteLine(perm1.Intersect(perm4));
Console.WriteLine(perm1.Union(all));
Console.WriteLine(perm1.Intersect(all));
Console.WriteLine(perm1.Union(none));
<IPermission class=“…" version="1" Read="c:\teste.txt" Write="c:\teste.txt"/>
<IPermission class=“…" version="1" Write="c:\teste.txt;c:\teste2.txt"/>
<IPermission class=“…" version="1" Read="c:\teste.txt"/>
<IPermission class=“…" version="1“ Unrestricted="true"/>
<IPermission class=“…" version="1" Read="c:\teste.txt"/>
<IPermission class=“…" version="1" Read="c:\teste.txt"/>
19P. Félix, 2006 Controlo de acessos na plataforma .NET
Interface IStackWalk
• A exigência de algumas permissões implica verificar se todos os chamadores no call stack possuem a permissão – stack walk
• A interface IStackWalk define um conjunto de métodos associados a esta operação
• Exigência da permissão– void Demand()
• Modificadores do percurso – quando presentes numa stack frame, alteram o comportamento do percurso
– void Assert() – Garante a existência da permissão, terminando o percurso no stack
– void Deny() - Recusa a permissão, terminando o percurso no stack– void PermitOnly() – Apenas permite esta permissão
• Para a utilização do método Assert sobre uma permissão é necessário:– Possuir a permissão essa permissão– Possuir a permissão SecurityPermission com SecurityPermissionFlag.Assert
20P. Félix, 2006 Controlo de acessos na plataforma .NET
Percurso no stack
método
métodométodo
método
método
método
assembly
assembly
assembly
assembly
assembly
método
PermissionSet
PermissionSet
PermissionSet
PermissionSet
PermissionSet
Recurso
Raíz PermissionSetThread
IStackWalkDemand
Stack Walk
21P. Félix, 2006 Controlo de acessos na plataforma .NET
Modificadores do percurso no stack
método
métodométodo
método
método
método
método
Recurso
Raíz
Demand
Assert
Deny
22P. Félix, 2006 Controlo de acessos na plataforma .NET
Classe CodeAccessPermission
• A classe abstracta CodeAccessPermission implementa as interfaces IPermission e IStackWalk
• Fornece implementações para os métodos de IStackWalk• Não fornece implementações para os métodos de IPermission (à
excepção de Demand). Estes devem ser implementados pela classes derivadas
• Serve de base para todas as classes de permissões cuja exigência implica um percurso no stack
• Existem permissões que não derivam de CodeAccessPermission (ex. PrincipalPermission)
23P. Félix, 2006 Controlo de acessos na plataforma .NET
CodeAccessPermission: classes derivadas
• Associadas a recursos– System.Data.Common.DBDataPermission– System.Data.OracleClient.OraclePermission– System.Drawing.Printing.PrintingPermission– System.Messaging.MessageQueuePermission– System.Net.DnsPermission– System.Net.SocketPermission– System.Net.WebPermission– System.Security.Permissions.EnvironmentPermission– System.Security.Permissions.FileDialogPermission– System.Security.Permissions.FileIOPermission– System.Security.Permissions.IsolatedStoragePermission– System.Security.Permissions.ReflectionPermission– System.Security.Permissions.RegistryPermission– System.Security.Permissions.ResourcePermissionBase– System.Security.Permissions.SecurityPermission– System.Security.Permissions.UIPermission– System.Web.AspNetHostingPermission
• Associadas a componentes da identidade do código– System.Security.Permissions.PublisherIdentityPermission– System.Security.Permissions.SiteIdentityPermission– System.Security.Permissions.StrongNameIdentityPermission– System.Security.Permissions.UrlIdentityPermission– System.Security.Permissions.ZoneIdentityPermission
24P. Félix, 2006 Controlo de acessos na plataforma .NET
Classe PermissionSet
• A classe PermissionSet representa um conjunto de permissões• Implementa a interface IStackWalk – utilizada para exigir
permissões e/ou alterar os percursos no stack• Implementa semântica de conjunto – Intersect, Union, IsSubsetOf
25P. Félix, 2006 Controlo de acessos na plataforma .NET
Outras permissões
• Nem todas as permissões implicam percurso no stack – não derivam de CodeAccessPermission
• Exemplo: permissão PrincipalPermission– Verifica a identidade do utilizador currente
– Verifica os roles do utilizador currente
26P. Félix, 2006 Controlo de acessos na plataforma .NET
Diagrama
PermissionSet CodeAcessPermission
XxxxPermission
IPermission
DemandIntersectIsSubsetOfUnion
IStackWalk
DemandAssertDenyPermitOnly
addPermissiongetPermissionIntersectIsSubsetOfUnion
IUnrestrictedPermission
YyyyPermission
implementa
estende
implementa
implementa
implementa
implementaimplementa
27P. Félix, 2006 Controlo de acessos na plataforma .NET
Exigência declarativa
• Utilização de atributos
[FileIOPermission(SecurityAction.Demand, Read = “c:\\MyPath”]
void AMethod(){
// se chegou aqui, então existem as permissões necessárias
// realizar o trabalho
}
• Vantagens– Existem exigência que só podem ser expressas na forma declarativa
– Facilita a análise estática
– Podem ser aplicadas a todo um tipo
– São realizadas no início do método
28P. Félix, 2006 Controlo de acessos na plataforma .NET
Exigência Imperativa
• Exigência da permissão no código do método
void AMethod(){
FileIOPermission perm = new FileIOPermission(FileIOPermissionAcess.Read, “c:\\MyPath”);
perm.Demand();
// se chegou aqui, então existem as permissões necessárias
// realizar o trabalho
}
• Vantagens– Possibilita lógica mais complexa na determinação da permissão a
exigir. Ex.: exigência dependente do valor dos parâmetros
29P. Félix, 2006 Controlo de acessos na plataforma .NET
Outras acções de segurança
• Demand, Assert, Deny, PermitOnly• LinkDemand
– Exige que o chamador tenha a permissão– Controlo realizado em tempo de geração de código JIT
• InheritanceDemand– Exige que classes derivadas tenham a permissão– Controlo realizado em tempo de carregamento
• RequestMinumum– Conjunto mínimo de permissões para o assembly se poder executar– Resolvido em tempo de determinação de permissões dum assembly
• RequestOpcional– Conjunto opcional de permissões que o assembly pode ter– Resolvido em tempo de determinação de permissões dum assembly
• RequestRefuse– Conjunto permissões que o assembly não pode ter– Resolvido em tempo de determinação de permissões dum assembly
30P. Félix, 2006 Controlo de acessos na plataforma .NET
Acções de segurança: resumo
• Enumerado SecurityAction
Acção Fase Alvos Imperativa
LinkDemand Compilação JIT Classe, método Não
InheritanceDemand Carregamento Classe, método Não
Demand Execução Classe, método Sim
Assert Execução Classe, método Sim
Deny Execução Classe, método Sim
PermitOnly Execução Classe, método Sim
RequestMinimum Grant Assembly Não
RequestOptional Grant Assembly Não
RequestRefuse Grant Assembly Não
31P. Félix, 2006 Controlo de acessos na plataforma .NET
Permissões dos assemblies
• Processo de determinação das permissões dum assembly (permission grant)– Entrada: Evidence
– Saída: PermissionSet
– Parametrização: PolicyLevel
PermissionSetEvidence CLR
CodeGroup
IMembershipCondition PermissionSet
PolicyLevel
32P. Félix, 2006 Controlo de acessos na plataforma .NET
Policy Level
• Um nível da política (policy level) é constituído por– Conjunto de assemblies de confiança (“full trust”)
– Conjunto de conjuntos de permissões (“named permission sets”)
– Grupo de código raíz (“root code group”)
• Assemblies de confiança (“full trust”)– Conjunto de assemblies, referenciados pelos strong names, de
assemblies em quem o nível da política deposita toda a confiança.
– Tipicamente são assemblies que contém tipos relacionados com a arquitectura de controlo de acessos
• Conjuntos de permissões– Conjuntos de permissões (classes que implementam IPermission) aos
quais é atribuído um nome
33P. Félix, 2006 Controlo de acessos na plataforma .NET
Grupos de código
• Um grupo de código (“code group”) define– Um conjunto de assemblies que pertençem ao grupo
– Um conjunto de permissões a atribuir aos assemblies do grupo
– Um conjunto de grupos de código filhos
• A definição dos assemblies que pertençem ao grupo é realizada através de implementação de IMembershipConditions
public interface IMembershipCondition {
bool Check( Evidence evidence );
…
}
• A atribuição das permissões aos assemblies do grupo é realizada através do nome do named permission set
34P. Félix, 2006 Controlo de acessos na plataforma .NET
Diagrama
CodeGroup
PolicyLevel
AssemblyPermissionSet
Named Permission Sets
Root CodeGroup
Trusted Assemblies
Childs
IMembershipConditionIPermission
Condição de pertença
Checks
Contém
Permissões dos elementos do grupo
Evidence
35P. Félix, 2006 Controlo de acessos na plataforma .NET
Policy Manager
• PolicyManager - Fornece métodos estáticos para acesso e manipulação da security policy
• bool IsGranted(IEvidence)
• PolicyLevel LoadPolicyLevelFromFile(string path, PolicyLevelType type)
• PolicyLevel LoadPolicyLevelFromString(string str, PolicyLevelType type)
• IEnumerator PolicyHierarchy()
• PermissionSet ResolvePolicy(Evidence)
• IEnumerator ResolvePolicyGroups(Evidence)
• void SavePolicy()
• void SavePolicyLevel(PolicyLevel)
36P. Félix, 2006 Controlo de acessos na plataforma .NET
Esquema
PolicyLevel
SecurityClasses SecurityClass
name
description
NamedPermissionSets PermissionSetclass
name
IPermissionclass
propertiesCodeGroup
IMemberShipCondition
class
PermissionSet
name
Class
properties
FullTrustAssemblies
IMemberShipCondition
1
1
1
1
n
n
n
n
1
n
37P. Félix, 2006 Controlo de acessos na plataforma .NET
Permissões User-Identity
IPrincipal
IdentityIsInRole
Thread IIdentity
AuthenticationTypeIsAuthenticatedName
GenericPrincipal
WindowsPrincipal
GenericIdentity
WindowsIdentity
38P. Félix, 2006 Controlo de acessos na plataforma .NET
Permissões proprietárias
• Code Access Permissions– Derivar de CodeAccessPermission
– Implementar os métodos de IPermission, excepto o Demand: Copy, Intersect, Union e IsSubsetOf
– Implementar os métodos de ISecurityEncodable: ToXml e FromXml
– Nota: a implementação do método Demand e dos métodos associados a IStackWalk é herdada de CodeAccessPermission
– Implementar construtores públicos • .ctor()• .ctor(PermissionState)
– Marcar a classe como Serializable
39P. Félix, 2006 Controlo de acessos na plataforma .NET
Exigência declarativa
• Definir um Custom Attribute derivado de CodeAccessSecurityAttribute– Implementar construtor público .ctor(SecurityAction action)
– Implementar método IPermission CreatePermission()
• Nota: a definição deste Custom Attribute não pode ser realizada na mesma classe onde é utilizado, dado que o atributo é instanciado em tempo de compilação