Notas sobre Controlo de Acessos nas Plataformas .NET e Java Notas para a UC de “Segurança Informática” Inverno de 12/13 Pedro Félix (pedrofelix em cc.isel.ipl.pt) José Simão (jsimao em cc.isel.ipl.pt) Instituto Superior de Engenharia de Lisboa Agenda • Problemas dos modelos de controlo de acesso clássicos • Modelo CAS nas plataformas .NET <= 3.5 e >= 4.0 • Permissões • Exigência declarativa e imperativa • Controlo de acessos na plataforma Java Pedro Félix, 2008 José Simão, 2012 Controlo de acessos na plataforma .NET 2 Terminologia • • • • Sujeito – quem faz o acesso activo 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 Pedro Félix, 2008 José Simão, 2012 Pedido de acesso Monitor de Referências Controlo de acessos na plataforma .NET Objecto 3 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 reference monitor – entidade omnipresente responsável por implementar o modelo de segurança Pedro Félix, 2008 José Simão, 2012 Controlo de acessos na plataforma .NET 4 Diagrama (.Net ≤ 3.5) Sujeito Objecto Acesso Método Método demands pertence a Autenticação Autorização IPermission contém Assembly CLR CLR Evidence PermissionSet Política CodeGroup IMembershipCondition Pedro Félix, 2008 José Simão, 2012 Controlo de acessos na plataforma .NET PermissionSet 5 Diagrama ( >= .Net 4.0) Sujeito Método Objecto Acesso Método demands pertence a IPermission Autorização Assembly CLR contém PermissionSet Sandbox PermissionSet Pedro Félix, 2008 José Simão, 2012 Controlo de acessos na plataforma .NET 6 Criação de “sandboxes” • A forma correcta de criação de sandboxes é através da criação de novos AppDomain • Desde a versão 2.0 da plataforma .NET possui métodos que facilitam esta tarefa public static AppDomain CreateDomain ( string friendlyName, // nome do AppDomain Evidence securityInfo, // evidence associado ao AppDomain AppDomainSetup info, // parametrização do AppDomain PermissionSet grantSet, // permissões dos assemblies carregados no AppDomain criado params StrongName[] fullTrustAssemblies // assemblies “full-trust” ) Pedro Félix, 2008 José Simão, 2012 Controlo de acessos na plataforma .NET 7 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 Pedro Félix, 2008 José Simão, 2012 Controlo de acessos na plataforma .NET 8 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) Pedro Félix, 2008 José Simão, 2012 Controlo de acessos na plataforma .NET 9 Permissões • Permissão – capacidade para realizar uma acção (sobre um recurso) • 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 Pedro Félix, 2008 José Simão, 2012 Controlo de acessos na plataforma .NET 10 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 Pedro Félix, 2008 José Simão, 2012 Controlo de acessos na plataforma .NET 11 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)); Pedro Félix, 2008 José Simão, 2012 Controlo de acessos na plataforma .NET 12 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 • 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 Pedro Félix, 2008 José Simão, 2012 Controlo de acessos na plataforma .NET 13 Percurso no stack Raíz Thread PermissionSet método assembly PermissionSet método assembly PermissionSet método assembly PermissionSet método assembly PermissionSet método assembly PermissionSet Stack Walk método Demand IStackWalk Recurso Pedro Félix, 2008 José Simão, 2012 Controlo de acessos na plataforma .NET 14 Modificadores do percurso no stack Raíz método método Assert método método método Demand método Recurso Pedro Félix, 2008 José Simão, 2012 Controlo de acessos na plataforma .NET 15 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) Pedro Félix, 2008 José Simão, 2012 Controlo de acessos na plataforma .NET 16 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 Pedro Félix, 2008 José Simão, 2012 Controlo de acessos na plataforma .NET 17 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 Pedro Félix, 2008 José Simão, 2012 Controlo de acessos na plataforma .NET 18 Diagrama IStackWalk Demand Assert Deny PermitOnly implementa PermissionSet addPermission getPermission Intersect IsSubsetOf Union Pedro Félix, 2008 José Simão, 2012 IPermission Demand Intersect IsSubsetOf Union implementa IUnrestrictedPermission implementa CodeAcessPermission estende implementa XxxxPermission Controlo de acessos na plataforma .NET implementa implementa YyyyPermission 19 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ências 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 Pedro Félix, 2008 José Simão, 2012 Controlo de acessos na plataforma .NET 20 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 Pedro Félix, 2008 José Simão, 2012 Controlo de acessos na plataforma .NET 21 Permissões User-Identity Thread IPrincipal Identity IsInRole GenericPrincipal IIdentity AuthenticationType IsAuthenticated Name GenericIdentity WindowsPrincipal Pedro Félix, 2008 José Simão, 2012 Controlo de acessos na plataforma .NET WindowsIdentity 22 Exigência declarativa • Definir um Custom Attribute derivado de CodeAccessSecurityAttribute – Implementar construtor público .ctor(SecurityAction action) – Implementar método IPermission CreatePermission() Pedro Félix, 2008 José Simão, 2012 Controlo de acessos na plataforma .NET 23 Controlo de acessos na plataforma Java • Permissões – As permissões são tipicadas e estendem da classe abstracta java.security.Permission – Alguns exemplos • java.security.SecurityPermission • Java.net.SocketPermission • java.lang.reflect.ReflectPermission – Cada permissão é composta por um alvo (target) e, opcionalmente, uma lista de acções • Permission perm = new java.io.FilePermission("/tmp/abc", "read"); Pedro Félix, 2008 José Simão, 2012 Controlo de acessos na plataforma .NET 24 Controlo de acessos na plataforma Java • Políticas – Existem duas evidências sobre a class que contribuem para o conjunto de permissões: signer e codebase – Cada JVM pode usar múltiplos ficheiros de políticas • ${java.home}/lib/security/java.policy • java -Djava.security.manager -Djava.security.policy=mypolicy.txt MyClass grant signedBy “New Company”, codeBase “file:/C:/somepath/api/” { permission java.net.SocketPermission "www.amazon.com:80", "connect, resolve"; } Pedro Félix, 2008 José Simão, 2012 Controlo de acessos na plataforma .NET 25 Controlo de acessos na plataforma Java • Verificação das políticas (enforcement) – Permissões exigidas para executar alguns serviços da plataforma – Exemplo: a class java.net.Socket verifica a permissão connect chamando o método checkConnect({host}, {port}) do SecurityManager instalado – O percurso no stack é interrompido se for encontrado um chamador que tenha a permissão e use o método AccessController.doPrivileged para realizar a chamada Pedro Félix, 2008 José Simão, 2012 Controlo de acessos na plataforma .NET 26