Academia.eduAcademia.edu

ADCA - Arquitetura Dinâmica de Controlo de Acesso

É com muito gosto que aproveito esta oportunidade para agradecer às pessoas que me apoiaram, tornando possível o desenvolvimento deste trabalho. Ao professor Óscar Mortágua Pereira, meu orientador, pelo seu incansável apoio e pelo esclarecimento das dúvidas que me foram surgindo ao longo do projeto. Ao professor Rui Luís Aguiar, meu co-orientador, pela forma como me apoiou nalgumas fases do projeto. Agradeço também aos meus pais e avós que nunca deixaram de acreditar em mim e cujo incentivo me permitiu a realização deste curso. A todos um "muito obrigado". keywords relational databases, policies, access control, adaptive systems, business tiers.

Universidade de Aveiro Departamento de Eletrónica, Telecomunicações e Informática. 2012 Diogo Jorge Rolo Figueiral Arquitetura Dinâmica de Controlo de Acesso Universidade de Aveiro Departamento de Eletrónica, Telecomunicações e Informática. 2012 Diogo Jorge Rolo Figueiral Arquitetura Dinâmica de Controlo de Acesso Dissertação apresentada à Universidade de Aveiro para cumprimento dos requisitos necessários à obtenção do grau de Mestre em Engenharia de Computadores e Telemática, realizada sob a orientação científica do Mestre Óscar Narciso Mortágua Pereira, Assistente Convidado do Departamento de Eletrónica, Telecomunicações e Informática da Universidade de Aveiro, e do Professor Doutor Rui Luís Andrade Aguiar, Professor Associado com Agregação do Departamento de Eletrónica, Telecomunicações e Informática da Universidade de Aveiro. Dedico este trabalho aos meus pais, irmão e avós pelo seu incansável apoio. o júri presidente Professor Doutor José Luís Guimarães Oliveira Professor Associado da Universidade de Aveiro Professora Doutora Maribel Yasmina Campos Alves Santos Professora Auxiliar com Agregação do Departamento de Sistemas de Informação da Escola de Engenharia da Universidade do Minho (Arguente Principal) Mestre Óscar Narciso Mortágua Pereira Assistente Convidado da Universidade de Aveiro (Orientador) Professor Doutor Rui Luís Andrade Aguiar Professor Associado com Agregação da Universidade de Aveiro (Co-Orientador) agradecimentos É com muito gosto que aproveito esta oportunidade para agradecer às pessoas que me apoiaram, tornando possível o desenvolvimento deste trabalho. Ao professor Óscar Mortágua Pereira, meu orientador, pelo seu incansável apoio e pelo esclarecimento das dúvidas que me foram surgindo ao longo do projeto. Ao professor Rui Luís Aguiar, meu co-orientador, pela forma como me apoiou nalgumas fases do projeto. Agradeço também aos meus pais e avós que nunca deixaram de acreditar em mim e cujo incentivo me permitiu a realização deste curso. A todos um “muito obrigado”. palavras-chave base de dados relacionais, políticas, controlo de acesso, sistemas adaptáveis, camadas de negócio. resumo Os programadores de aplicações de base de dados relacionais utilizam soluções de software, tais como, Hibernate, Java Database Connectivity e ADO.net, para facilitar o seu desenvolvimento. Estas soluções foram desenvolvidas com o objetivo de integrar o paradigma das bases de dados relacionais com o paradigma das linguagens de programação orientadas aos objetos. O controlo de acesso não foi contemplado por estas soluções o que conduz à necessidade de se desenvolver para cada aplicação os mecanismos de segurança considerados como necessários. Adicionalmente, em situações onde as políticas de controlo de acesso evoluem dinamicamente ao longo do tempo, não há qualquer possibilidade de ajustar automaticamente os respetivos mecanismos de controlo de acesso. Para a resolução deste problema propõe-se o desenvolvimento de uma arquitetura dinâmica de controlo de acesso para sistemas de bases de dados relacionais. Nesta arquitetura o componente principal é a própria lógica de negócio, esta contém objetos derivados de política de controlo de acesso e que são necessários para interação dos utilizadores do sistema com a base de dados. Este componente adapta-se dinamicamente em tempo de execução às alterações realizadas nas políticas de controlo de acesso que estão armazenadas num servidor de base de dados. Neste contexto, apesar de o princípio de sistemas dinamicamente adaptáveis a políticas de controlo de acesso não ser novo, as soluções de software existentes são algo limitadas neste aspeto. Assim, neste trabalho vamos apresentar e implementar uma arquitetura dinâmica de controlo de acesso (ADCA) que permite uma adaptação automática, em tempo de execução, dos mecanismos de controlo de acesso implementados ao nível das lógicas de negócio. keywords relational databases, policies, access control, adaptive systems, business tiers. abstract Developers of database applications use software solutions like Hibernate, Java Database Connectivity and ADO.net to ease its development. These solutions were developed with the aim of integrating the paradigm of relational databases with the paradigm of object-oriented programming languages. Access control was not contemplated by these solutions, leading to the need of developing for each application, the necessary security mechanisms. Additionally, in situations where access control policies dynamically evolve, there is no way to automatically adjust the respective access control mechanisms. To solve this problem we propose the development of a Dynamic Access Control architecture for relational databases systems. In this architecture, the main component is its own business logic that contains objects derived from access control policies that are required for user interaction with databases. This component adapts dynamically at runtime to changes made in the access control policies stored in a database. In this context, although the principle of dynamically adaptable systems to access control policies is not new, existing software solutions are somewhat limited in this aspect. So in this work, we present and implement a dynamic access control architecture (DACA) which allows the automatic adaptation at runtime of the access control mechanisms implemented at the business logic level. Índice 1 2 Introdução ...................................................................................................................................................................................... 1 1.1 Motivação .............................................................................................................................................................................. 1 1.2 Objetivos................................................................................................................................................................................ 4 1.3 Organização da Dissertação ........................................................................................................................................ 6 Estado de Arte e Conhecimento Prévio ........................................................................................................................... 7 2.1 Políticas de Controlo de Acesso................................................................................................................................. 7 2.1.1 Controlo de Acesso Discricionário .................................................................................................................... 9 2.1.2 Controlo de Acesso Obrigatório .......................................................................................................................12 2.1.2.1 Políticas Obrigatórias Baseadas em Sigilo .........................................................................................13 2.1.2.2 Políticas Obrigatórias Baseadas em Integridade ............................................................................14 2.1.2.3 Limitações de Políticas Obrigatórias ....................................................................................................15 2.1.3 Políticas de Controlo de Acesso Baseadas em Papéis (Roles) ..........................................................16 2.1.4 Políticas de Controlo de Acesso Baseadas em Credenciais ................................................................22 2.2 Abordagens Correntes para Aplicação de Controlo de Acesso ...............................................................22 2.2.1 Sistemas de Gestão de Base de Dados Relacionais .................................................................................22 2.2.2 Mecanismos Correntes para Aplicação de Políticas de Controlo de Acesso a SGBD-R ........25 2.2.3 Trabalhos Relacionados com a Aplicação de Controlo de Acesso ..................................................27 2.2.3.1 ACADA...................................................................................................................................................................27 2.2.3.2 SELINKS ...............................................................................................................................................................28 2.2.3.3 JIF ............................................................................................................................................................................29 2.2.3.4 Aplicação de Controlo de Acesso Usando Vistas .............................................................................30 2.2.3.5 Modelo de Segurança Baseado na Adaptação Dinâmica.............................................................30 2.3 Abordagem Tecnológica ..............................................................................................................................................31 2.3.1 Java ..................................................................................................................................................................................31 2.3.1.1 NetBeans ..............................................................................................................................................................32 2.3.1.2 JDBC........................................................................................................................................................................32 2.3.1.3 Reflection ............................................................................................................................................................35 2.3.2 C# .....................................................................................................................................................................................36 2.3.2.1 VisualStudio .......................................................................................................................................................37 2.3.2.2 ADO.Net ................................................................................................................................................................37 2.3.3 3 Transações...................................................................................................................................................................39 Arquitetura Dinâmica de Controlo de Acesso ............................................................................................................43 3.1 Arquitetura Geral ............................................................................................................................................................43 3.2 Comunicação entre os Componentes da ADCA ...............................................................................................46 3.2.1 Comunicação Gestor de Negócios – Gestor de Políticas.......................................................................46 3.2.1.1 Login no Gestor de Políticas ......................................................................................................................47 3.2.1.2 Comunicação das Informações sobre Políticas................................................................................48 3.2.1.3 Comunicação das Alterações Efetuadas nas Políticas ..................................................................49 3.2.2 3.3 Comunicação Monitor de Políticas – Gestor de Políticas ....................................................................50 Desenvolvimento da ADCA ........................................................................................................................................51 3.3.1 Lógica de Negócio ....................................................................................................................................................51 3.3.1.1 Definição da Estrutura Lógica de Memória (ELM) ........................................................................56 3.3.1.1.1 Movimentação dentro da ELM ........................................................................................................58 3.3.1.1.2 Leitura de Campos da ELM ...............................................................................................................59 3.3.1.1.3 Inserção de Campos na ELM ............................................................................................................60 3.3.1.1.4 Atualização de Campos da ELM ......................................................................................................62 3.3.1.1.5 Remoção de Linhas da ELM ..............................................................................................................62 3.3.1.2 Desenvolvimento dos Métodos Referentes aos Esquemas de Negócio ..............................63 3.3.1.2.1 Implementação dos Métodos Construtores .............................................................................63 3.3.1.2.2 Implementação dos Métodos de Execução de Expressões CRUD .................................65 3.3.1.2.3 Implementação dos Métodos para Movimentação dentro da ELM..............................68 3.3.1.2.4 Implementação dos Métodos para Leitura de Campos da ELM .....................................68 3.3.1.2.5 Implementação dos Métodos de Atualização de Campos da ELM ................................69 3.3.1.2.6 Implementação dos Métodos Obrigatórios da Interface IUpdate .................................69 3.3.1.2.7 Implementação dos Métodos Obrigatórios da Interface IInsert ...................................70 3.3.1.3 Exemplos de Utilização dos Esquemas de Negócio .......................................................................72 3.3.2 Gestor de Negócios ..................................................................................................................................................78 3.3.2.1 Sessões e Transações ....................................................................................................................................81 3.3.2.2 Gestão da Lógica de Negócio .....................................................................................................................84 3.3.2.2.1 Criação da Lógica de Negócio ..........................................................................................................87 3.3.2.2.1.1 Criação de Ficheiros JAR................................................................................... 88 3.3.2.2.1.2 Escrita de Entradas em Ficheiros JAR ............................................................... 89 3.3.2.2.2 Construção da Implementação dos Esquemas de Negócio ..............................................90 3.3.2.2.3 Carregamento Dinâmico dos Serviços de Negócio ...............................................................91 3.3.2.3 Exemplo de Utilização do Gestor de Negócios .................................................................................93 3.3.3 Servidor de Políticas...............................................................................................................................................95 3.3.3.1 Políticas de Segurança ..................................................................................................................................95 3.3.3.2 Modelos de Segurança ..................................................................................................................................95 3.3.3.2.1 Definição do Modelo Conceptual ...................................................................................................95 3.3.3.2.2 Definição do Modelo Lógico .............................................................................................................98 3.3.3.3 Mecanismos de Segurança ...................................................................................................................... 101 3.3.3.3.1 Obtenção da Informação Inicial ................................................................................................... 101 3.3.3.4 Alteração das Políticas .............................................................................................................................. 102 4 3.3.3.4.2 Remoção de Autorizações e Delegações ................................................................................. 105 Gestor de Políticas ................................................................................................................................................ 107 3.3.5 Monitor de Políticas ............................................................................................................................................. 109 Prova de Conceito .................................................................................................................................................................. 112 Esquema Geral e Preparação do Ambiente .................................................................................................... 112 4.1.1 Criação do Servidor de Políticas.................................................................................................................... 115 4.1.2 Extrator de Políticas ............................................................................................................................................ 118 4.1.3 Gestor de Segurança ............................................................................................................................................ 119 4.2 6 Adição de Autorizações e Delegações ....................................................................................... 103 3.3.4 4.1 5 3.3.3.4.1 Utilização da Aplicação de Teste .......................................................................................................................... 120 Conclusão ................................................................................................................................................................................... 125 5.1 Escalabilidade, Disponibilidade e Adaptabilidade ..................................................................................... 125 5.2 Problemas Comuns ..................................................................................................................................................... 125 5.3 Trabalho Futuro ........................................................................................................................................................... 126 Bibliografia e Referências .................................................................................................................................................. 129 Índice de Figuras Figura 1 – Tabela Exemplo .............................................................................................................................................................................. 2 Figura 2 – Exemplo de listagem de entradas de tabela em JDBC ................................................................................................. 2 Figura 3 – Exemplo de alteração de campo em JDBC ........................................................................................................................ 4 Figura 4 – Esquema geral de funcionamento da ADCA .................................................................................................................... 5 Figura 5 – Exemplo de lista de controlo de acesso............................................................................................................................11 Figura 6 – Exemplo de lista de capacidades .........................................................................................................................................11 Figura 7 - Caso prático de política obrigatória baseada em sigilo (baseada na figura 6 de [Vimercati, '08]) ....14 Figura 8 - Caso prático de política obrigatória baseada em integridade (baseada na figura 7 de [Samarati, '01]) ...........................................................................................................................................................................................................................15 Figura 9 - Exemplo de modelo RBAC baseado no RBAC96 ...........................................................................................................16 Figura 10 - Exemplo de permissões atribuídas num modelo RBAC ........................................................................................17 Figura 11 - Exemplo de Hierarquia de Papéis .....................................................................................................................................19 Figura 12 - Esquema de tabela de base de dados relacional........................................................................................................23 Figura 13 - Exemplo de arquitetura PEP-PDP .....................................................................................................................................27 Figura 14 - Exemplo de função de aplicação de políticas retirada de [Corcoran, '09] ...................................................29 Figura 15 - Esquema de funcionamento da linguagem de programação JAVA ..................................................................32 Figura 16 - Esquema de funcionamento da API JDBC .....................................................................................................................33 Figura 17 - Principais componentes do Ado.Net ................................................................................................................................38 Figura 18 - Exemplo de utilização de Ado.Net.....................................................................................................................................38 Figura 19 - Exemplo de Phantom Read ...................................................................................................................................................40 Figura 20 - Exemplo de dirty-read ............................................................................................................................................................41 Figura 21 - Exemplo de Non-Repeatable Read ...................................................................................................................................41 Figura 22 - Arquitetura Geral Desenvolvida ........................................................................................................................................44 Figura 23 - Estrutura da mensagem de login .......................................................................................................................................47 Figura 24 - Conjunto de mensagens trocadas, para obtenção de esquemas de negócio e CRUDS com acesso .48 Figura 25 - Conjunto de mensagens trocadas, para informação sobre alterações efetuadas às políticas de controlo de acesso..............................................................................................................................................................................................50 Figura 26 - Conjunto de campos referentes às mensagens enviadas do monitor de políticas ao gestor de políticas....................................................................................................................................................................................................................51 Figura 27 - Conjunto de instruções necessárias para a alteração de um campo de uma tabela em ADO.net e JDBC ...........................................................................................................................................................................................................................52 Figura 28 - Modelo principal dos esquemas de negócio ................................................................................................................53 Figura 29 - Esquema representativo da Estrutura Lógica de Memória (ELM) ..................................................................57 Figura 30 - Tabela exemplo Aluno .............................................................................................................................................................60 Figura 31 - Implementação do método construtor em JDBC .......................................................................................................63 Figura 32 - Implementação do método construtor em JDBC para expressões IUD .........................................................64 Figura 33 - Implementação do Construtor em ADO.net .................................................................................................................65 Figura 34 - Implementação do método execute para instruções IUD em JDBC .................................................................65 Figura 35 - Implementação do método execute para instruções Select em JDBC ............................................................65 Figura 36 - Implementação do método execute para expressões com parâmetros dinâmicos em JDBC .............66 Figura 37 - Implementação do método execute para expressões Insert em ADO.net ..............................66 Figura 38 - Implementação do método execute para expressões Select em ADO.net ....................................................67 Figura 39 - Implementação do método execute com parâmetros em ADO.net .................................................................67 Figura 40 - Implementação do método de leitura do valor de um campo em JDBC ........................................................68 Figura 41 - Implementação do método de leitura do valor de um campo em ADO.net .................................................68 Figura 42 - Implementação dos métodos de escrita em JDBC ....................................................................................................69 Figura 43 - Implementação dos métodos de escrita em ADO.net .............................................................................................69 Figura 44 - Implementação do método updateRow em JDBC .....................................................................................................70 Figura 45 - Implementação do método updateRow em ADO.net ..............................................................................................70 Figura 46 - Implementação do método beginInsert em JDBC .....................................................................................................70 Figura 47 - Implementação do método beginInsert em ADO.net ..............................................................................................71 Figura 48 - Implementação do método endInsert em JDBC .........................................................................................................71 Figura 49 - Implementação do método endInsert em ADO.net ..................................................................................................71 Figura 50 - Implementação do método cancelInsert em ADO.net ............................................................................................72 Figura 51 – Tabela de exemplo de caso prático Notas ....................................................................................................................72 Figura 52 - Interface ELM relativa ao administrador ......................................................................................................................74 Figura 53 - Interface ELM relativa ao professor.................................................................................................................................74 Figura 54 - Interface ELM relativa ao aluno .........................................................................................................................................75 Figura 55- Métodos acessíveis ao administrador ..............................................................................................................................75 Figura 56 - Métodos acessíveis ao aluno ................................................................................................................................................76 Figura 57 - Exemplo de impressão de listagem com utilização dos serviços de negócio .............................................76 Figura 58 - Exemplo de inserção de nova linha com utilização dos serviços de negócio .............................................77 Figura 59 - Exemplo de atualização de campo com utilização dos serviços de negócio ...............................................77 Figura 60 - Exemplo de remoção de linha com utilização dos serviços de negócio ........................................................78 Figura 61 - Esquema geral do Gestor de Negócios ............................................................................................................................80 Figura 62 - Modelo do conceito de Sessão Implementado............................................................................................................82 Figura 63 - Exemplo de utilização de transações...............................................................................................................................84 Figura 64 - Adição de elementos a HashMap e HashTable em Java e C# ..............................................................................85 Figura 65 - Remoção de elementos do HashMap e da HashTable em Java e C# ................................................................85 Figura 66 - Verificação de existência de chave no HashMap e HashTable em Java e C# ...............................................85 Figura 67 - Esquema principal da solução para armazenamento de informações sobre lógica de negócio .......85 Figura 68 - Esquema da interface IAdaptation ...................................................................................................................................87 Figura 69 - Armazenamento de Esquemas de Negócio em Java ................................................................................................87 Figura 70 - Criação de arquivo JAR ...........................................................................................................................................................88 Figura 71 - Exemplo de escrita de um ficheiro num arquivo JAR .............................................................................................89 Figura 72 - Esquema de Funcionamento de proxy dinâmica ......................................................................................................92 Figura 73 - Exemplo de Carregamento Dinâmico de classe dentro arquivo JAR ..............................................................92 Figura 74 - Carregamento de um construtor em tempo de execução de uma classe genérica ..................................93 Figura 75 - Instanciação de uma classe genérica em tempo de execução ............................................................................93 Figura 76 - Exemplo prático de propagação de papéis ...................................................................................................................96 Figura 77 - Modelo Conceptual do Servidor de Políticas ...............................................................................................................97 Figura 78 - Modelo Lógico do Servidor de Políticas .........................................................................................................................99 Figura 79 - Tabela com informação sobre o gestor de políticas ............................................................................................. 101 Figura 80 - Esquema de Papéis Exemplo ............................................................................................................................................ 101 Figura 81 - Exemplo de caso prático para obtenção de informações sobre papéis ...................................................... 102 Figura 82 - Exemplo Prático de adição de Permissões......................................................................................................... 103 Figura 84 - Exemplo Prático de adição de permissões......................................................................................................... 104 Figura 86 - Exemplo Prático de remoção de permissões .................................................................................................... 106 Figura 83 - Evolução do algoritmo para exemplo Prático com adição de permissões ........................................ 104 Figura 85 - Exemplo do algoritmo para exemplo Prático com adição de permissões ......................................... 105 Figura 87 - Evolução do algoritmo para exemplo Prático no caso de remoção de permissão ........................ 106 Figura 88 - Evolução do algoritmo para exemplo Prático , com remoção de permissões .................................. 107 Figura 89 - Exemplo de comunicação entre clientes e servidor multi-thread................................................................. 108 Figura 90 - Implementação do Monitor de Políticas ..................................................................................................................... 110 Figura 91 - Comandos para criação de uma biblioteca dll no sql server ............................................................................ 110 Figura 92 - Comandos para criação da stored procedure que utiliza o método da biblioteca dll ......................... 111 Figura 93 - Esquema de papéis geral utilizado na aplicação de teste .................................................................................. 112 Figura 94 - Tabela Products com os respetivos campos ............................................................................................................. 113 Figura 95 - Tabela Suppliers com os respetivos campos ............................................................................................................ 113 Figura 96 - Tabela Categories com os respetivos campos ......................................................................................................... 114 Figura 97 - Interface com a declaração dos CRUDs ....................................................................................................................... 115 Figura 98 - Declaração da interface para o papel A ....................................................................................................................... 116 Figura 99 - Exemplo de interface para o papel B1 ......................................................................................................................... 116 Figura 100 - Interface principal da aplicação ................................................................................................................................... 117 Figura 101 - Configuração do Configurador de Segurança ........................................................................................................ 117 Figura 102 - Esquema interno do ficheiro jar resultante do extrator de políticas ........................................................ 118 Figura 103 - Exemplo de interface utilizada na especificação dos papéis ......................................................................... 119 Figura 104 - Interface de interação com o utilizador do extrator de políticas ................................................................ 119 Figura 105 - Interface gráfica da aplicação Gestor de Segurança .......................................................................................... 120 Figura 106 - Interface gráfica, de utilização da aplicação de teste ........................................................................................ 121 Figura 107 - Esquema principal de execução ................................................................................................................................... 121 Figura 108 - Interface gráfica com a visualização do diagrama de permissões .............................................................. 122 Figura 109 - Interface gráfica com a visualização dos resultados ......................................................................................... 122 Figura 110 - Interface gráfica com campos para inserção de parâmetros do CRUD .................................................... 123 Figura 111 - Interface gráfica apresentado os botões adicionais para o esquema de negócio ICat_s ................. 123 Figura 112 - Interface gráfica apresentado a mensagem de Autorização Negada ........................................................ 124 Figura 113 - Secção exemplo para introdução de expressões CRUD ................................................................................... 127 Figura 114 - Secção exemplo para seleção de permissões em expressões do tipo Select ......................................... 127 Índice de Tabelas Tabela 1 – Dados introduzidos na Tabela Exemplo............................................................................................................................ 2 Tabela 2 - Exemplo de matriz de acesso ................................................................................................................................................... 9 Tabela 3 - Exemplo de tabela de autorização ......................................................................................................................................10 Tabela 4 - Tabela Cliente com inserção de atributo Id ....................................................................................................................24 Tabela 5 - Objetos JDBC para interação com a base de dados.....................................................................................................34 Tabela 6 - Métodos de movimentação existentes em objetos ResultSet ...............................................................................34 Tabela 7 - Métodos de atualização e inserção de campos de objetos ResultSet ................................................................35 Tabela 8 - Descrição dos níveis de isolamento em Transações ..................................................................................................39 Tabela 9 - Tabela com a ocorrência de incorreções nos vários níveis de isolamento ....................................................42 Tabela 10 - Descrição dos métodos da interface IScrollable .......................................................................................................59 Tabela 11 - Descrição dos métodos da interface IInsert ................................................................................................................61 Tabela 12 - Descrição dos métodos da interface IUpdate .............................................................................................................62 Tabela 13 - Tabela de permissões para Administrador .................................................................................................................73 Tabela 14 - Tabela de permissões para Professor ............................................................................................................................73 Tabela 15 - Tabela de permissões para Aluno ....................................................................................................................................73 Tabela 16 - Descrição dos métodos utilizados nas operações de transações .....................................................................83 Tabela 17 - Descrição dos métodos da interface IAdaptation.....................................................................................................86 Tabela 18 - Descrição dos métodos da classe Method ....................................................................................................................91 Tabela 19 - Tabela com os papéis e os respetivos esquemas de negócio e expressões CRUD utilizadas no desenvolvimento da aplicação .................................................................................................................................................................. 114 Lista de Acrónimos ACLS Access Control Lists ADCA Arquitetura Dinâmica de Controlo de Acesso API Application Programming Interface CCAD Componente de Controlo de Acesso Dinâmico CRUD Create, Read, Update, Delete DAC Discretionary Access Control ELM Estrutura Lógica de Memória GUI Graphical User Interface IP Internet Protocol IUD Insert, Update, Delete JAR Java Archive JDBC Java Database Connectivity JVM Java Virtual Machine MAC Mandatory Access Control PCA Políticas de Controlo de Acesso PDP Policy Decision Points PEP Policy Enforcement Points RBAC Role Based Access Control SGBD Sistemas de Gestão de Base de Dados SGBD-R Sistemas de Gestão de Base de Dados Relacionais SQL Structured Query Language URL Uniform Resource Locator XML Extensible Markup Language Mestrado Integrado em Engenharia de Computadores e Telemática 1 Introdução Todas as áreas de desenvolvimento humano (ciência, cultura, desporto, economia, etc… dependem cada vez mais de sistemas de informação [Sumathi, '07]. Com a evolução da tecnologia, foi possível o armazenamento de informação em sistemas computacionais, sendo a forma corrente mais utilizada para armazenamento dos mesmos, as bases de dados. Nestas são armazenados conjuntos de informações de uma forma estruturada, sendo a sua gestão realizada através de SGBD (sistemas de gestão de base de dados). Este armazenamento informatizado dos dados levou naturalmente à existência de preocupações de segurança. Entre estas preocupações, um dos aspetos críticos é formado pelas políticas de controlo de acesso (PCA), que primam pela prevenção de acesso não autorizado a informação sensível [Pereira, '12a]. Os mecanismos existentes para aplicação de políticas a dados armazenados em SGBDs, consistem na concepção de uma camada de segurança separada dos dados. Esta separação é problemática aquando da utilização de soluções de software (Hibernate[JBOSS, '12], JDBC (Java Database Connectivity)[Oracle, '12i], LINQ (Language-Integrated Query)[Meijer, '06], ADO.net[Microsoft, '12l]) que permitem obter conectividade entre linguagens de programação e uma ampla variedade de base de dados. Como estas soluções de software foram desenvolvidas com o foco na compatibilidade com os diferentes sistemas de gestão de dados em detrimento da aplicação de PCA[Pereira, '12a; Samarati, '01], não existe maneira de traduzir automaticamente as PCA nos mecanismos de controlo de acesso destas aplicações. Deste modo, os utilizadores podem utilizar qualquer expressão sql e executar qualquer método destas soluções de software. Este facto leva à ocorrência de erros nas tentativas de acesso a informação sensível para a qual não existe permissão. Com base neste problema, propõese uma nova arquitetura, ADCA (Arquitetura Dinâmica de Controlo de Acesso) que deve permitir uma fácil interação com dados existentes numa base de dados, ao mesmo tempo que se aplicam políticas de controlo de acesso. Os mecanismos de controlo de acesso definidos pela ADCA são implementados ao nível da lógica de negócio e apenas disponibilizam os acessos previamente autorizados. 1.1 Motivação O meu interesse no desenvolvimento de aplicações de base de dados relacionais, levou à utilização de APIs como JDBC ou ADO.net. Durante a minha aprendizagem de utilização deste software foi possível verificar a existência de inconsistências nas políticas que são aplicadas na base de dados e nos comandos que posso executar nas APIs. Vamos 1 ADCA – Arquitetura Dinâmica de Controlo de Acesso agora apresentar um caso exemplo para demonstrar que as soluções atuais não suportam controlo de acesso. Considere a existência de uma tabela na base de dados designada por Tabela_Exemplo , que se encontra na Figura 1 e que se procedeu à criação de um utilizador na base de dados designado por testuser . Figura 1 – Tabela Exemplo Nesta tabela podemos verificar a existência de três campos Id, Nome e Idade. Considere que foram introduzidas as seguintes entradas representadas na Id Nome Idade 1 DIOGO 25 2 JOÃO 20 Tabela 1. Tabela 1 – Dados introduzidos na Tabela Exemplo Para este caso exemplo utilizamos a API JDBC, para a qual foi desenvolvido o seguinte código que se encontra na Figura 2. Figura 2 – Exemplo de listagem de entradas de tabela em JDBC Neste exemplo utilizamos a seguinte expressão SQL: Select * From Tabela_Exemplo 2 Mestrado Integrado em Engenharia de Computadores e Telemática Esta expressão sql permite selecionar todas as entradas da Tabela_Exemplo . Depois da expressão sql ter sido executada através do comando executeQuery, é executado um ciclo while no qual são impressos no ecrã os valores dos campos Nome getString Nome e Idade (getInt( Idade )). Depois de executado o código JDBC por parte do utilizador testuser , temos como resultado de saída: Neste caso, como o utilizador tem acesso à tabela e a todos os campos, é apresentada no ecrã a listagem completa tal como especificada na Tabela 1. Considere agora que negamos o acesso a esta tabela através do seguinte comando sql: Como resultado da execução do código JDBC, obtemos uma exceção com a seguinte mensagem de erro: The SELECT permission was denied on the object Tabela_Exemplo . Esta mensagem indica que o utilizador não possui acesso para a Tabela_Exemplo , sendo que o programador só se apercebe desta situação depois de executar o código correspondente, nomeadamente o método executeQuery. Esta situação de erro ocorre também ao nível de acesso a campos para os quais não existe permissão. Para demonstrar este problema considere que se repôs o acesso à tabela Tabela_Exemplo e que se negou o acesso para escrita no campo Nome através do seguinte comando sql: Se tentarmos executar o código da Figura 3, em que tentamos alterar o valor do campo Nome para Rui , é apresentada a seguinte mensagem de erro: The UPDATE permission was denied on the column Nome of the object Tabela_Exemplo . 3 ADCA – Arquitetura Dinâmica de Controlo de Acesso Figura 3 – Exemplo de alteração de campo em JDBC Neste caso, a exceção ocorreu na execução do método updateRow, o qual envia as alterações para a base de dados correspondente. Estas situações de ocorrência de erros aplicam-se também às restantes soluções desenvolvidas (ADO.net, Hibernate, LINQ e JPA). Estes problemas levaram à necessidade do desenvolvimento de uma solução que permita uma fácil interação com os dados existentes ao mesmo tempo que são aplicadas políticas de controlo de acesso. Deste modo controla-se as expressões sql que podem ser executadas por parte de um utilizador e apresentam-se apenas os métodos para os quais existe acesso. A solução passou pela construção de uma arquitetura (ADCA) que comporta diversas vertentes associadas com questões tecnológicas, sendo por isso um desafio aliciante. No desenvolvimento da ADCA são utilizados os conhecimentos adquiridos ao longo do curso e para os quais necessito de algum conhecimento extra de modo a atingir os objetivos propostos. Este trabalho apresenta situações novas para mim tais como:   Alteração do comportamento de uma aplicação em tempo de execução; Construção de classes java em tempo de execução e respetivo armazenamento em ficheiros jar. No caso da aplicação de políticas de controlo de acesso, embora já possua algumas bases, a realização deste trabalho permitiu-me adquirir um conhecimento mais aprofundado desta matéria que se encontra descrita em detalhe no ponto 2.1. 1.2 Objetivos A ADCA tem como objetivo principal, a criação de um sistema fácil de usar e que utiliza as mais recentes tecnologias desenvolvidas (JDBC, ADO.net) para interação com SGBD s, ao mesmo tempo que são aplicadas políticas de controlo de acesso. Um esquema geral do funcionamento que queremos da nossa arquitetura encontra-se na Figura 4. Nesta figura podemos verificar o funcionamento geral da ADCA. Considere que existe uma tabela na base de dados representada a azul a qual possui informação sobre nome e idade de uma pessoa, e que pretendemos controlar o acesso a esta informação. Os utilizadores possuem um componente o qual comporta e gere a lógica de negócio. Este componente 4 Mestrado Integrado em Engenharia de Computadores e Telemática obtém as políticas de acesso armazenadas no servidor de base de dados representado a vermelho. A lógica de negócio é construída a partir das políticas de controlo de acesso obtidas e esta aplica internamente os mecanismos de controlo de acesso, apresentado apenas os métodos que permitem aceder a informações, às quais é permitido o acesso. Neste caso podemos verificar que o utilizador 2 não possui acesso para o campo idade. Com a execução de um método da lógica de negócio, esta comunica com a base de dados onde se encontra a informação requerida (representada a azul) e obtém as informações necessárias. Utilizador 1 Lógica de Negócio rNome() rIdade() Utilizador 2 Base de dados onde se encontram as políticas de controlo de acesso. Lógica de Negócio Base de dados onde se encontra a informação a aceder. rNome() Figura 4 – Esquema geral de funcionamento da ADCA Para a construção de uma arquitetura que permita este funcionamento é necessário:   Definir o tipo de controlo de acesso que gere a aplicação das políticas de acesso e o local onde as políticas são armazenadas; Encontrar uma solução que permita a criação da lógica de negócio dinamicamente e em tempo de execução e que possua mecanismos de controlo de acesso para aplicar as políticas estabelecidas. Esta lógica de negócio deve permitir ao utilizador da ADCA aceder apenas a informação a que tenha acesso e que está armazenada numa base de dados relacional. A lógica de negócio deverá ser desenvolvida utilizando a linguagem de programação Java, utilizando a API JDBC para a interação com a base de dados relacional. 5 ADCA – Arquitetura Dinâmica de Controlo de Acesso Com a definição dos pontos necessários à criação da ADCA, é agora necessário especificar que utilizadores podem utilizar este sistema e quais as suas respetivas funções. Deste modo foram definidos três tipos de utilizadores:  Os administradores que constroem o conjunto interfaces que compõem a lógica de negócio (esquemas de negócio) e definem as políticas de  controlo; Os programadores de software, que com a disponibilização dos métodos por parte da lógica de negócio, desenvolvem aplicações relacionadas com  bases de dados de uma forma facilitada; Os utilizadores que interagem com as aplicações desenvolvidas no ponto anterior e que são reguladas por políticas de controlo de acesso. 1.3 Organização da Dissertação A dissertação encontra-se organizada em 5 grandes blocos: 1. Introdução: correspondente ao bloco corrente; 2. Estado de Arte e Conhecimento Prévio: neste bloco apresentam-se as várias políticas de controlo de acesso existentes e alguns trabalhos relacionados com a aplicação de controlo de acesso. Faz-se ainda uma analogia à vertente tecnológica utilizada para o desenvolvimento dos componentes que compõem a nossa arquitetura; 3. Aplicação ADCA: neste bloco apresenta-se a nossa arquitetura e também as estratégias utilizadas para o desenvolvimento dos vários componentes que a compõem; 4. Prova de Conceito: neste bloco apresentam-se as aplicações desenvolvidas que permitem a verificação do correto funcionamento da arquitetura desenvolvida; 5. Bibliografia e Referências. 6 Mestrado Integrado em Engenharia de Computadores e Telemática 2 Estado de Arte e Conhecimento Prévio Neste capítulo, apresentamos inicialmente o que são políticas de controlo de acesso e que tipos de políticas são correntemente utilizados para controlar o acesso a dados sensíveis. De seguida descrevemos o que é um sistema de gestão de base de dados e que soluções existem atualmente para aplicação de controlo de acesso. Por fim, realizamos uma descrição detalhada das tecnologias utilizadas para o desenvolvimento da ADCA. 2.1 Políticas de Controlo de Acesso As políticas de controlo de acesso são um passo crítico na obtenção de segurança em sistemas de tecnologia de informação. Os mais importantes requisitos de um sistema de gestão de informação são [Samarati, '01]:    Sigilo: proteger dados e recursos contra divulgação não autorizada; Integridade: proteger dados e recursos de modificações não autorizadas ou impróprias; Disponibilidade: permitir sempre o acesso a recursos por parte de utilizadores legítimos. A prevenção de acesso não autorizado é realizada por uma camada de segurança que nega ou permite pedidos a recursos e dados de um sistema, a este processo atribui-se o nome de controlo de acesso. Um sistema pode implementar um controlo de acesso em diferentes locais e a diferentes níveis. Por exemplo, os sistemas operativos utilizam controlo de acesso para proteção de ficheiros e diretórios, enquanto nos sistemas de gestão de base de dados (SGBD) é aplicado controlo de acesso a tabelas e vistas. O desenvolvimento de um sistema de controlo de acesso é normalmente realizado em três etapas [Samarati, '01]:  Definição das políticas de controlo de acesso: Nesta etapa são definidas as regras (políticas) de alto nível pelo qual o controlo de acesso é regulado. Em geral as políticas de controlo de acesso são dinâmicas e evoluem de acordo com os fatores de negócio envolvidos, especificando como o acesso é gerido (a quem e em quais  situações, pode aceder à informação); Construção dos modelos de controlo de acesso: Estes modelos permitem uma representação formal das políticas de controlo de acesso. São normalmente 7 ADCA – Arquitetura Dinâmica de Controlo de Acesso desenvolvidos para mostrar as propriedades de segurança de um sistema de  controlo de acesso e para mostrar as limitações teóricas desse sistema; Definição dos mecanismos de controlo de acesso: Neste passo realiza-se a definição das funções de baixo nível (software e hardware) que permitem que as políticas sejam impostas como descritas no modelo de controlo de acesso desenvolvido. Este componente funciona como um monitor de referência que interceta todo e qualquer acesso ao sistema e deve impor as seguintes propriedades:     Imune a alterações: não deve ser possível alterá-lo; Intransponível: deve mediar todo e qualquer acesso ao sistema e aos seus recursos; Núcleo de segurança: deve estar confinado a uma parte limitada do sistema; Pequeno: deve ter um tamanho limitado para ser suscetível a métodos rigorosos de verificação. Estas três etapas correspondem a uma separação entre as políticas e os mecanismos que as aplicam, de onde provém um grande número de vantagens. Em particular, a separação entre as políticas e os mecanismos permite uma independência entre as políticas a aplicar num lado e os mecanismos que as aplicam noutro lado. Deste modo, podemos discutir as políticas e qual o modelo a desenvolver sem nos preocuparmos com a implementação dos mecanismos para aplicação das mesmas. Um sistema diz-se seguro , se o modelo que o compõe é seguro e se os mecanismos implementam corretamente esse modelo. As políticas de controlo de acesso podem ser agrupadas em quatro classes principais:  Discricionárias (DAC): políticas de controlo de acesso baseadas na identidade do solicitador e nas regras que definem o que o solicitador pode ou não realizar no   sistema; Obrigatórias (MAC): políticas de controlo de acesso baseadas em regulações obrigatórias determinadas por uma autoridade central; Baseadas em papéis (RBAC): políticas de controlo de acesso que dependem dos papéis (roles) que os utilizadores têm dentro de um sistema e a cujos papéis são atribuídas regras sobre o que pode ou não ser realizado; 8 Mestrado Integrado em Engenharia de Computadores e Telemática  Controlo de acesso baseado em credenciais: políticas de controlo de acesso utilizadas quando num ambiente aberto as entidades são anónimas entre elas. Seguidamente apresentam-se estes tipos de políticas de controlo de acesso com mais detalhe. 2.1.1 Controlo de Acesso Discricionário O controlo de acesso discricionário trata-se de uma política de controlo de acesso baseada na definição de um conjunto de regras de acesso (autorizações), explicitando que utilizador pode realizar uma determinada ação e em qual recurso [Capitani di Vimercati, '07]. Esta política de controlo de acesso é designada de discricionária visto que os utilizadores podem delegar os seus privilégios a outros utilizadores, enquanto a atribuição e a revogação de privilégios é regulada por uma política administrativa [Samarati, '01]. A primeira proposta por Lampson [Lampson, '74] para a proteção de recursos no contexto de sistemas operativos, foi a representação das políticas numa matriz de acesso na qual se indicam quais os utilizadores e as ações que estes podem realizar num determinado objeto. Consideremos a seguinte matriz de controlo de acesso de utilizadores a diferentes objetos do sistema operativo na Tabela 2. Utilizador Ficheiro 1 Ficheiro 2 Ficheiro 3 Programa1 Rui Ler Ler Executar Escrever João Ana Ler Ler Ler Executar Escrever Tabela 2 - Exemplo de matriz de acesso Nesta matriz podemos então observar que existem três utilizadores: Rui, João e Ana, aos quais são atribuídos um conjunto de ações que podem executar nos vários recursos do sistema. Mudanças ao estado do sistema são realizadas segundo a invocação de comandos que executam operações primitivas. Estes comandos permitem adicionar ou remover utilizadores e objetos, e também modificar o conjunto de ações que um utilizador pode realizar. Embora esta matriz de acesso seja facilmente implementada, esta solução é custosa visto que, em geral, a matriz é dispersa e portanto dará origem a um grande 9 ADCA – Arquitetura Dinâmica de Controlo de Acesso número de células vazias. Para evitar o desperdício de recursos, a matriz de acesso pode ser implementada segundo os seguintes três mecanismos [Capitani di Vimercati, '07]:  Tabela de Autorização: Tabela com três entradas: utilizador, ação e objeto. Cada entrada na tabela corresponde a uma autorização. Utilizador Acão Objeto Rui Ler Ficheiro1 Rui Escrever Ficheiro1 Rui Ler Ficheiro2 Rui Executar Programa1 João Ler Ficheiro 1 João Ler Ficheiro 3 Ana Ler Ficheiro 1 Ana Escrever Ficheiro 1 Ana Executar Programa1 Tabela 3 - Exemplo de tabela de autorização Podemos verificar um exemplo desta na Tabela 3, criada de acordo com os dados especificados na Tabela 2. Neste caso, a tabela não possui células em branco em oposição à Tabela 2, pois apenas são armazenadas as entradas não vazias da Tabela 2. Esta solução é utilizada no contexto de base de dados, onde as  autorizações são armazenadas em Catálogos [Capitani di Vimercati, '07]; Listas de controlo de acesso (ACLS): Cada objeto é associado a uma lista, indicando para cada utilizador as ações que esse utilizador pode exercer no objeto. Um exemplo de ACLS encontra-se na Figura 5, onde foram utilizados os dados  descritos na Tabela 2 para a sua construção; Lista de Capacidade: Cada utilizador possui uma lista associada, designada de lista de capacidade, indicando para cada objeto, os tipos de acesso que o utilizador tem para esse objeto. Um exemplo de Lista de Capacidade encontra-se na Figura 6, na qual foram utilizados os dados descritos na Tabela 2 para a sua construção. 10 Mestrado Integrado em Engenharia de Computadores e Telemática Rui João Ler Escrever Ler Ler Escrever Ficheiro 1 Rui Ler Escrever Ficheiro 2 Rui Ler Escrever Ficheiro 3 Rui João Executar Executar Programa 1 Figura 5 – Exemplo de lista de controlo de acesso Rui joão Ana Ficheiro 1 Ficheiro 2 Programa 1 Ler Escrever Ler Executar Ficheiro 1 Ficheiro 3 Ler Ler Ficheiro 1 Programa 1 Ler Escrever Executar Figura 6 – Exemplo de lista de capacidades 11 ADCA – Arquitetura Dinâmica de Controlo de Acesso As ACLS e as listas de capacidades apresentam as suas vantagens e desvantagens. Com a utilização de ACLS é possível verificar para cada recurso, quais as autorizações que os utilizadores têm, enquanto que para verificar todas as autorizações de um utilizador, é necessário fazer uma pesquisa a todos os objetos que a compõem. No caso da lista de capacidades é fácil verificar para cada utilizador todas as suas autorizações, mas é necessário percorrer todas as listas criadas para encontrar todas as autorizações para cada recurso. Desde que foi proposta da matriz de acesso as políticas discricionárias evoluíram bastante, permitindo também [Vimercati, '08]:   Condições: fazem com que a validação de uma autorização dependa da satisfação de restrições específicas; Abstrações: para simplificação do processo de definição da autorização, utilizamse grupos de utilizadores e classes de objetos que poderão ser organizadas  hierarquicamente; Exceções: a definição de abstrações leva naturalmente à necessidade de suporte de exceções na definição de autorizações. Consideremos o exemplo em que todos os utilizadores, exceto o utilizador u, pertencentes a um grupo podem aceder a um recurso r. Se as exceções não fossem suportadas era necessário atribuir autorizações a todos os utilizadores, exceto u. Vulnerabilidades e inconvenientes: Os utilizadores deste tipo de controlo de acesso são entidades passivas, aos quais se especificam as autorizações e os quais se ligam ao sistema. Depois de ligados ao sistema, os utilizadores originam processos (sujeitos) que executam determinados pedidos ao sistema de acordo com as autorizações do utilizador. Este aspeto torna as políticas discricionárias vulneráveis a processos maliciosos, como os cavalos Tróia (Trojan Horse), os quais parecendo ser processos legítimos, contêm código escondido do utilizador que tira partido das autorizações atribuídas legitimamente. 2.1.2 Controlo de Acesso Obrigatório As políticas de controlo de acesso obrigatório aplicam o controlo de acesso com base nas regulações de uma entidade central [Samarati, '01]. Ao contrário das políticas discricionárias, as políticas de controlo de acesso obrigatório fazem distinção entre utilizadores (utilizadores do sistema) e sujeitos (processos executados pelo utilizador). Esta distinção permite o controlo de acesso indireto (fugas ou modificações de informações), causados pela execução de processos. Estas políticas são usualmente 12 Mestrado Integrado em Engenharia de Computadores e Telemática baseadas em classificações associadas entre os sujeitos e os objetos, a que se dá o nome de classe de acesso. Uma classe de acesso é um elemento de um conjunto parcialmente ordenado de classes. A ordem parcial é definida por uma relação dominante, a qual denotaremos por ≥. A forma mais usual de uma classe de acesso é um par de dois elementos [Samarati, '01]:   Nível de segurança: Elemento de um conjunto hierarquicamente ordenado (Ex: Secreto, Confidencial, Não Classificado); Conjunto de categorias: Subconjunto de um conjunto desordenado, cujos elementos refletem áreas funcionais ou de competência (Ex: Nuclear e Exército para sistemas militares; Administração e Pesquisa para sistemas comerciais). As políticas obrigatórias podem ser classificadas com base em sigilo ou integridade. Em seguida descreve-se em detalhe estes tipos de políticas obrigatórias. 2.1.2.1 Políticas Obrigatórias Baseadas em Sigilo Os princípios de controlos baseados em sigilo são baseados nos modelos de segurança propostos por David Bell e Leonard La-Padula [Bell, '73] . O principal objetivo da política de controlo de acesso obrigatória baseada em sigilo é a proteção da confidencialidade da informação. O nível de segurança da classe de acesso associada com o sujeito é chamada de clearance e reflete o nível de confiança colocado no sujeito para não permitir acesso a informação por utilizadores que não tenham autorização. Um utilizador só deverá ter acesso à informação para a qual tem autorização. Para tal, deve ligar-se ao sistema usando a sua classe clearance , gerando-se um processo com a mesma classe de acesso que o utilizador. O acesso é avaliado segundo estes dois princípios [Vimercati, '08]:   Sem-Leitura-para-Cima: Um sujeito s pode ler um objeto o, só e só apenas se a classe de acesso do sujeito dominar a classe de acesso do objeto; Sem-Escrita-para-Baixo: Um sujeito s pode escrever um objeto o, apenas se a classe do objeto dominar a classe do sujeito. Estes princípios previnem o fluxo de informação de sujeitos/objetos de alto nível para sujeitos/objetos de baixo nível, assegurando a proteção da informação, como se pode ver pela Figura 7. 13 ADCA – Arquitetura Dinâmica de Controlo de Acesso Sujeitos A E E Objetos E A E B C L L L D L > B > C > D Fluxo de informação Legenda: E-Escrita L-Leitura > Dominio Figura 7 - Caso prático de política obrigatória baseada em sigilo (baseada na figura 6 de [Vimercati, '08]) Nesta figura podemos encontrar quatro classes de acesso (A, B, C e D), atribuídas a sujeitos e objetos. De acordo com estes princípios estabelecidos, para um sujeito s realizar a leitura de alguma informação de nível D (Objetos de nível de acesso D), terá que se ligar ao sistema com classe de acesso tipo D. Uma classe mais baixa na hierarquia não se traduz em menos privilégios de uma forma absoluta, mas apenas em menos privilégios de leitura. Embora estes princípios previnam um perigoso fluxo de informação, podem ser muito restritivos. Numa situação real os dados podem ter que ser rebaixados. 2.1.2.2 Políticas Obrigatórias Baseadas em Integridade Para proteger a integridade dos dados, Biba [Biba, '77] introduziu um modelo de integridade que controla o fluxo de informação e previne sujeitos de indiretamente modificarem informação na qual não podem escrever. Tal como o modelo baseado em sigilo, neste caso, cada sujeito e objeto são associados a uma classe de integridade composta por um nível de integridade e um conjunto de categorias. O nível de integridade, neste caso, reflete a confiança colocada no sujeito para modificar ou inserir informação sensível. O acesso é avaliado segundo estes dois princípios:   Sem-Leitura-para-Baixo: Um sujeito s pode ler um objeto o, só e apenas se a classe de acesso do objeto dominar a classe de acesso do sujeito; Sem-Escrita-para-Cima: Um sujeito s pode escrever um objeto o, se e apenas se a classe do sujeito dominar a classe do objeto. 14 Mestrado Integrado em Engenharia de Computadores e Telemática Este modelo de integridade previne o fluxo de informação de objetos de baixo nível para objetos de alto nível como se pode ver pela Figura 8. Sujeitos A L L Objetos L A L B C E E E D E > B > C > D Fluxo de informação Legenda: E-Escrita L-Leitura > Dominio Figura 8 - Caso prático de política obrigatória baseada em integridade (baseada na figura 7 de [Samarati, '01]) Nesta figura podemos encontrar quatro classes de acesso (A, B, C e D), atribuídas a sujeitos e objetos. Neste caso, um sujeito s só pode realizar a escrita de informação de nível D, se a sua classe de acesso utilizada para ligação ao sistema possuir nível de integridade de tipo D. A maior limitação deste modelo é que apenas captura compromissos de integridade devido a fluxos de informação impróprios, prevenindo fluxo de informação de objetos de baixo nível para objetos de alto nível. Se pretendermos usar tanto o modelo sigilo como o modelo de integridade, é necessário utilizar duas classes de acesso, uma para controlo de sigilo e outra para controlo de integridade. 2.1.2.3 Limitações de Políticas Obrigatórias Apesar das políticas obrigatórias protegerem melhor os dados que as políticas discricionárias, estas também possuem os seus problemas. O maior problema reside no facto de esta política de acesso controlar apenas fluxos de informação a operar de uma forma legítima, sendo então vulnerável a canais que funcionam de forma ilegítima, canais dissimulados. Estes canais não são destinados à comunicação normal mas podem ser utilizados para dedução de informações. Por exemplo, se um processo de baixo nível requerer acesso um recurso que está em uso pelo sistema por um processo de nível superior, o processo de baixo nível receberá uma reposta negativa inferindo então que 15 ADCA – Arquitetura Dinâmica de Controlo de Acesso outro processo de alto nível está a utilizar o recurso. Deste modo, há troca de informação secreta e fuga de informação. 2.1.3 Políticas de Controlo de Acesso Baseadas em Papéis (Roles) As políticas de controlo de acesso baseadas em papéis (RBAC) são uma alternativa às tradicionais discricionárias e de controlo de acesso obrigatório. O conceito de RBAC começou com a introdução de sistemas online multi-utilizador e multi-aplicação na década de 1970 [Sandhu, '96]. As políticas baseadas em papéis regulam o acesso de utilizadores conforme as suas responsabilidades organizacionais e as suas responsabilidades no sistema. Cada papel representa um conjunto de ações e atividades associados com uma entidade trabalhadora. Um papel pode designar o que um utilizador é num sistema (professor) ou pode ser mais específico e refletir uma tarefa que pode ser realizada (Inserir_Notas). HP AP AU Utilizadores Papéis SU Permissões SP Sessões Restrições Legenda: AU-Atribuição de Utilizadores AP-Atribuição de Papéis HP-Hierarquia de Papéis SU-Mapeamento de Sessões a Utilizadores SP-Mapeamento de Sessões a Papéis Figura 9 - Exemplo de modelo RBAC baseado no RBAC96 As autorizações de acesso são definidas nos papéis e aos utilizadores é dada autorização para os usarem. Esta representação explícita através de papéis permite simplificar os modelos de segurança em sistemas de grandes dimensões, como se ilustrará mais à frente. 16 Mestrado Integrado em Engenharia de Computadores e Telemática Sandhu no paper [Sandhu, '96] introduziu o bem conhecido modelo RBAC96, que fornece um ponto de trabalho no qual podem ser acomodadas várias variantes do RBAC. Na Figura 9 apresenta-se um esquema básico do modelo introduzido por Sandhu. Neste caso podemos encontrar um conjunto de papéis que se agrupam de uma forma hierárquica e aos quais são atribuídas permissões. Aos utilizadores são consequentemente atribuídos papéis, enquanto as sessões guardam informações sobre utilizadores e papéis. Em seguida descrevem-se os elementos deste modelo em detalhe [Sandhu, '96]:  Utilizadores e papéis: O utilizador é um ser humano. Papel é o nome de uma função de trabalho que descreve a autoridade e as responsabilidades conferidas a um  utilizador desse papel; Permissões: Uma permissão é a aprovação de um modo particular de acesso a um ou mais objetos do sistema. Permissões são sempre positivas e conferem a quem as possui a habilidade de realizar ações no sistema. Este modelo conceptual acomoda muitas interpretações para permissões onde o acesso pode ir desde uma sub-rede inteira até um campo particular numa tabela particular. Utilizadores Papéis Recursos Papel 1 Papel 2 Papel 3 Figura 10 - Exemplo de permissões atribuídas num modelo RBAC A Figura 10 mostra as relações de atribuição de utilizadores (AU) e atribuição de permissões (AP). Ambas são relações muitos para muitos e ambas são chaves para o controlo de acesso baseado em papéis. Um utilizador pode pertencer a vários papéis e um papel pode ter muitos utilizadores. O papel é uma posição intermédia que permite ao utilizador exercer a permissão e aumentar assim a facilidade de gestão de utilizadores e permissões, como se verá mais à frente; 17 ADCA – Arquitetura Dinâmica de Controlo de Acesso  Sessões: Uma Sessão é um sistema de troca de informações semi-permanente também conhecido como diálogo, conversação ou reunião, entre dois ou mais dispositivos de comunicação. Quando os utilizadores estabelecem sessões, são lhes atribuídos um conjunto de papéis aos quais pertencem. Quando um utilizador cria uma sessão, pode selecionar quais os papéis que pretende ativos, podendo estes serem futuramente alterados consoante o critério do utilizador. Estes papéis podem ser utilizados por mais que um utilizador ao mesmo tempo (multirole) como se pode verificar pelo esquema da Figura 10, onde o Papel 2 se encontra  atribuído a três utilizadores; Restrições: As restrições têm um aspeto fundamental no RBAC, sendo um importante mecanismo para estabelecer políticas organizacionais de alto nível. É um mecanismo pelo qual os administradores podem restringir a habilidade dos utilizadores de ter determinados privilégios. Podem ser aplicados nas relações Utilizadores-Papéis, Papéis-Permissões e no mapeamento de utilizadores e papéis a sessões. Existem os seguintes tipos de restrições:   Papéis mutuamente exclusivos: A um mesmo utilizador só pode ser atribuído no máximo, um dos papéis; Cardinalidade: Neste tipo de restrição podemos definir o número de membros de um mesmo papel e similarmente o número de papéis a que  um utilizador individual pode aceder; Papéis Pré-Requeridos: O conceito de pré-requisito consiste na competência e na adequação, podemos definir que a um utilizador só pode  ser atribuído o papel A se a este já tiver atribuído o papel B; Outras restrições podem ser temporárias. Como por exemplo: a)Restringir o número de sessões por utilizador; b)Atribuir a restrição à própria hierarquia de papéis, em que se restringe por exemplo, a possibilidade de uma papel pai possuir as permissões de um determinado papel filho.  Hierarquia de Papéis: Em muitas aplicações existe uma hierarquia normal de papéis em que a atribuição de uma autorização a um papel num nível hierárquico superior permite uma propagação das autorizações aos papéis de um nível inferior, como se pode ver pela Figura 11. Neste caso, se fosse atribuída a autorização de Gestor, e como as autorizações se propagam hierarquicamente, 18 Mestrado Integrado em Engenharia de Computadores e Telemática havia uma herança das autorizações subjacentes (Gestor De Loja, Gestor De Escritório e Gestor de Vendas). Empregado Gestor Gestor de Loja Gestor de Vendas Gestor de Escritório Figura 11 - Exemplo de Hierarquia de Papéis A conjunção destes elementos permite chegarmos a uma base sólida para aplicação de RBAC. Um modelo RBAC pode nem sempre descrever todos estes elementos. Deste modo, foram estabelecidos os seguintes modelos baseados no modelo RBAC da Figura 9 [Sandhu, '96]:     Rbac0: Modelo base, consiste em todos os elementos presentes na Figura 9 exceto, hierarquia de papéis (HP) e restrições; Rbac1: Neste modelo são introduzidos os elementos do rbac0 mais a inclusão de hierarquia de papéis; Rbac2: Neste modelo são introduzidos os elementos do rbac0 mais a inclusão de restrições; Rbac3: Modelo consolidado, combina os elementos dos modelos Rbac1 e Rbac2, oferecendo ao mesmo tempo hierarquia de papéis e restrições. Vantagens da utilização de RBAC A utilização deste tipo de controlo de acesso traz as seguintes vantagens[Samarati, '01]:  Gestão de autorizações: Simplificação na gestão de políticas de segurança, visto que existe atribuição de papéis a utilizadores e atribuição de autorizações a papéis. Quando um utilizador entra no sistema são-lhe atribuídas permissões a papéis, podendo estas serem alteradas pelo administrador do sistema; 19 ADCA – Arquitetura Dinâmica de Controlo de Acesso   Utilização de Hierarquia de Papéis; Menor Privilégio: Aos utilizadores só são atribuídas as permissões necessárias. Utilizadores com papéis de alto nível hierárquico não precisam de os usar até serem necessários. Isto aumenta a segurança contra erros inadvertidos ou  intrusões ilegítimas; Separação de deveres: A separação de deveres é o conceito de ser necessário mais que uma pessoa para completar uma tarefa. Por exemplo, a pessoa que gere o escritório, não deve ser a mesma pessoa que realiza as vendas na loja. A separação de deveres pode ser aplicada quer estaticamente (definindo papéis conflituosos, isto é, papéis que não podem ser executados pelo mesmo utilizador) ou  dinamicamente (ao aplicar o controlo em tempo de execução); Aplicação de restrições: Utilizando restrições podemos restringir a habilidade dos utilizadores de ter determinados privilégios. Por exemplo, podemos restringir a cardinalidade de um papel, ou seja restringir o número de utilizadores que o podem utilizar. Estas também podem ser dinâmicas pois pode-se restringir a utilização de um papel em determinadas circunstâncias. Por exemplo, restrições temporais em que só se pode utilizar um papel num tempo bem definido. Delegações Delegação de papéis em RBAC é a habilidade de um utilizador (designado de delegando), que é membro de um papel, autorizar outro utilizador a tornar-se membro desse papel [Barka, '00]. Por exemplo, considere que o gestor de escritório da Figura 11 necessita de aceder às vendas para calcular os lucros da loja. Neste caso um utilizador designado para a role Gestor De Vendas podia delegar esse papel ao utilizador Gestor de Escritório, ficando este segundo utilizador com acesso aos dois papéis. Deste modo o Gestor de Escritório pode aceder aos dados sobre as vendas realizadas. Cada papel delegado possui dois tipos de membros:   Membros originais: Membros que são originalmente atribuídos àquele papel pelo administrador do sistema; Membros delegados: Membros aos quais são atribuídos os papéis delegados pelos membros originais. 20 Mestrado Integrado em Engenharia de Computadores e Telemática Este tipo de delegações devem ter uma duração associada. Deste modo devem ser revogados os direitos anteriormente atribuídos ao fim de algum tempo. Para tal foram definidos dois tipos de revogações[Barka, '00] :   Revogação usando time-outs: Neste caso são atribuídos tempos a cada delegação atribuída, de modo a que quando este tempo expirar, a delegação também expira; Revogação Humana: Neste caso apenas o membro delegante (membro original que atribuiu a delegação) pode revogar a delegação. Esta aproximação possui algumas vantagens e desvantagens. As vantagens são as seguintes [Barka, '04]:   O membro original pode acompanhar e controlar o comportamento do membro delegado temporário; Minimiza a possibilidade de conflitos entre os membros originais que podia resultar em outro membro sem ser o membro delegante original a revogar a delegação atribuída. Esta aproximação traz uma desvantagem, que consiste na existência de comportamento errático por parte do membro delegante, o que pode levar à existência de um acesso aos recursos atribuídos pelo papel delegado por demasiado tempo, até a ocorrência de um time-out. Delegações em hierarquia de papéis Em [Barka, '00] é também definida a forma como são realizadas as delegações em RBAC com utilização de uma estrutura hierárquica de papéis. Numa hierarquia de papéis, os papéis pai herdam as permissões de papéis que são filhos. Temos então vários tipos de delegações que se podem utilizar no modelo rbac, umas acarretando mais riscos que outras:  Delegações ascendentes: Neste caso, existe atribuição de delegação de um papel a um papel pai deste. Como numa estrutura hierárquica, os papéis pai herdam as  permissões dos papéis filhos, esta delegação, é neste caso inútil; Delegações descendentes: Delegação onde existe atribuição de um papel a um papel mais baixo no nível hierárquico. A delegação descendente funciona parcialmente, visto que, não podemos delegar o todo do papel pois levaria a um  encolhimento da hierarquia; Delegações em corte-transversal: Este tipo de delegação é muito útil pois como podemos verificar pela Figura 11, o gestor de vendas pode delegar o seu papel ao gestor de escritório, por exemplo, para este fazer uma verificação das contas. 21 ADCA – Arquitetura Dinâmica de Controlo de Acesso 2.1.4 Políticas de Controlo de Acesso Baseadas em Credenciais Em ambientes abertos e dinâmicos, tais como a Internet, a decisão de conceder acesso a um recurso é geralmente baseada nas características do solicitante em vez de na sua identidade[Damiani, '05]. As partes são então desconhecidas entre si e podem desempenhar tanto o papel de cliente (que recebe os recursos) como o papel de servidor (que fornece os recursos). Soluções avançadas de controlo de acesso devem então decidir, a que cliente deve ser dado acesso e que servidor está qualificado para fornecer o mesmo recurso. As soluções iniciais utilizavam o conceito de Trust Management onde eram vinculadas chaves públicas a autorizações. Este método tinha uma grande desvantagem [Vimercati, '08]: A especificação das autorizações era difícil e a identidade do utilizador era descartada. Este problema foi resolvido com a introdução de certificados digitais que permitem identificar as autorizações e a identidade dos utilizadores. O acesso de controlo é então realizado pela troca de mensagens entre as entidades. Esta troca é realizada da seguinte maneira [Vimercati, '08]:   O cliente realiza um pedido para um recurso; O servidor analisa se o cliente forneceu as credenciais necessárias. Se o cliente forneceu todas as credenciais, o servidor concede acesso, caso contrário, envia a  informação sobre as credenciais que ainda são necessárias; O cliente seleciona as credenciais requeridas pelo servidor, se possível, e envia-as. Se as credenciais satisfazem o pedido o servidor, este concede acesso ao recurso. Desta maneira realiza-se o controlo de acesso em ambientes abertos, onde os elementos são desconhecidos entre eles. 2.2 Abordagens Correntes para Aplicação de Controlo de Acesso Neste capítulo expomos inicialmente as principais características das bases de dados relacionais e que modelos já existem para aplicação de políticas de controlo de acesso. De seguida são apresentados trabalhos realizados no âmbito da aplicação de controlo de acesso. 2.2.1 Sistemas de Gestão de Base de Dados Relacionais Um sistema de gestão de base de dados (SGBD) consiste numa coleção interrelacionada de dados e um conjunto de programas para acesso aos mesmos [Sumathi, '07]. Os principais objetivos de um sistema de gestão de base de dados são:  Disponibilidade dos dados; 22 Mestrado Integrado em Engenharia de Computadores e Telemática   Integridade dos dados; Segurança dos dados. Neste trabalho focamo-nos num tipo específico de SGBD, o sistema de gestão de base de dados relacional (SGBD-R). Os SGBDR são baseados no modelo relacional introduzido por E.F. Codd em [Codd, '83]. O termo relacional refere-se ao modo como o SGBDR espera que estejam organizados os dados que está a gerir. Uma relação é uma tabela de informação que está organizada em linhas e colunas. Por exemplo considere o caso, onde se pretende a criação de uma tabela para armazenamento de informação de uma Pessoa. A tabela criada pode ser a representada pela Figura 12. Figura 12 - Esquema de tabela de base de dados relacional Nesta figura, podemos verificar a existência de um conjunto de linhas que contêm um conjunto de atributos (Nome, Idade e Telefone). Cada atributo possui o mesmo tipo de dados, podendo ter valores diferentes. No caso do atributo Idade, este pode ser representado pelo tipo int na base de dados relacional, representado um número inteiro. Para possibilitar a criação de relações entre tabelas foi utilizado o conceito de chave.   Os dois tipos principais de chaves são: Chave Primária: Atributo ou conjunto de atributos que possuem a propriedade de identificar de forma única uma linha da tabela; Chave Estrangeira: campo numa tabela que coincide com a chave primária de outra tabela. Considere a tabela da Figura 12 e considere a existência de uma tabela Vendas , onde se armazenam os dados relativos às vendas, que inclui uma referência para o Cliente. Neste caso temos que utilizar ou criar um atributo na tabela Cliente para funcionar como 23 ADCA – Arquitetura Dinâmica de Controlo de Acesso chave primária. O atributo Nome não deve ser utilizado como chave primária por duas razões:   Chave Primária tem que ser única: neste caso pode haver repetição de nomes (primeiro e ultimo nome); A utilização de dados textuais como chave primária reduz a performance obtida, sendo muito melhor utilizar números inteiros, pois permitem uma comparação mais rápida e um consequente aumento de performance. Os atributos Idade e Telefone podem conter valores repetidos. Deste modo foi criada uma nova coluna (coluna Id) com números inteiros únicos para identificar as chaves primárias. Id Nome Idade Telefone 1 João Rodrigues 30 222232232 2 Rui Sousa 35 222232234 Tabela 4 - Tabela Cliente com inserção de atributo Id A nova tabela Cliente está representada na Tabela 4 onde são utilizados os campos da coluna Id para representação da chave primária. Para a tabela Vendas referenciar a tabela Cliente é criada uma coluna com a respetiva chave estrangeira referente à chave primária da tabela Cliente. A verificação da consistência dos dados existentes numa base de dados relacional é realizada através de restrições de integridade, sendo garantida pelo próprio SGBD. Existem entre outras, os seguintes tipos de restrições de integridade definidos por E.F.Codd[Codd, '83]:  Integridade de Domínio: O SGDB verifica se os dados são do tipo permitido e se estes podem ter valores nulo ou não. Por exemplo, na nossa tabela Cliente, o atributo idade é do tipo inteiro e por isso qualquer introdução de   um valor com tipo diferente de inteiro é negado pelo SGBD; Restrição de Entidade: Na declaração de um atributo como chave primária, o SGBD não permite que este tenha valores duplicados ou nulos; Integridade Referencial: Uma chave estrangeira de uma tabela tem que coincidir com uma chave primária da tabela a que a chave estrangeira se refere. Considere que a tabela Vendas contém uma entrada com a chave 24 Mestrado Integrado em Engenharia de Computadores e Telemática estrangeira a referenciar a primeira entrada da tabela Cliente. Neste caso, quando se tenta apagar a primeira entrada da tabela Cliente, o SGBD não o  permite, visto que está referenciada na tabela Vendas; Integridade definida pelo Utilizador: Restrições de integridade mais complexas definidas pelos utilizadores. Exemplo:   O número de telefone ter necessariamente 9 dígitos; Idade não ter valores impossíveis, Idade<0 ou Idade>200. A criação de uma base de dados relacional é precedida pela construção de modelos com as tabelas e as relações. Estes modelos permitem uma melhor organização e redução da redundância, fazendo com que construção das relações entre tabelas seja melhor estruturada. Foram definidos os seguintes modelos:  Modelo Conceptual: Descreve de uma forma simples e de fácil compreensão, as informações de um contexto de negócio. Neste modelo  devem estar identificadas as entidades e o relacionamento entre elas; Modelo Lógico: O modelo lógico possui mais detalhe que o modelo conceptual. Neste modelo define-se os atributos das entidades, as chaves  primárias e as chaves estrangeiras; Modelo Físico: É construído a parir do modelo lógico e descreve as estruturas físicas do armazenamento dos dados, tendo em conta as limitações impostas pelo SGBD escolhido. A maioria das implementações do modelo relacional utilizam a Linguagem de Consulta Estruturada (SQL) para definição dos dados e consulta dos mesmos. Embora as bases de dados baseadas em SQL desviem-se do modelo relacional em muitos detalhes, esta tornou-se numa das linguagens de base de dados mais utilizadas. 2.2.2 Mecanismos Correntes para Aplicação de Políticas de Controlo de Acesso a SGBD-R Os mecanismos correntes para aplicação de políticas de controlo de acesso a SGBD-R consistem em criar uma camada de segurança separada, seguindo uma de duas aproximações [Pereira, '12a] tradicional e PEP-PDP: 25 ADCA – Arquitetura Dinâmica de Controlo de Acesso  A aproximação tradicional [Sandhu, '94] foi implementada nas bases de dados relacionais desde os primeiros produtos. Neste caso existem três tipos de controlo de acessos aplicados:  Acesso de controlo discricionário: neste caso utiliza-se os privilégios atribuídos pelos standards da linguagem sql. O criador de uma relação numa base de dados torna-se o seu dono e tem a habilidade de atribuir a outros utilizadores o acesso a essa relação, através de comandos como GRANT ou REVOKE. Uma das desvantagens deste tipo de utilização e uma das principais fraquezas é que, mesmo que o acesso a uma relação seja estritamente controlado, é possível a um utilizador com um comando SELECT criar uma cópia da relação, contornando assim o   controlo de acesso aplicado; Acessos de controlo obrigatórios: são aplicados a base de dados, introduzindo classificações de segurança e segurança; clearance de Controlos de acesso baseados em papéis: neste caso são utilizados papéis para atribuição de permissões, permitindo uma maior facilidade na gestão dos controlos de acesso, em relação ao controlo discricionário encontrado na linguagem sql standard. Estes tipos de controlo são geridos automaticamente pelo SGBDR e transparentes aos utilizadores, notando-se a sua presença apenas aquando da execução de uma instrução que vá de encontro às  políticas de acesso de controlo definidas. A Aproximação PDP-PEP (cujo esquema encontra-se na Figura 13) e na qual existem dois componentes principais:  PDP (Policy Decision Point-Ponto de Decisão de Políticas): é o ponto no qual as decisões de políticas são realizadas. Aqui encontram-se as políticas de acesso e também o mecanismo que recebe os pedidos vindos da lógica de negócio (PEP) e que retorna  respostas normalmente a permitir ou a negar o acesso; PEP (Policy Enforcement Point-Ponto de Aplicação de Políticas): mecanismos inseridos na lógica de negócio e responsáveis pela aplicação das políticas. Antes de algum serviço ser executado, o PEP 26 Mestrado Integrado em Engenharia de Computadores e Telemática envia um pedido ao PDP para verificar se o pode executar. Se o acesso é permitido o serviço é executado se não o PEP nega a execução do serviço. Esta arquitetura permite assim a separação entre a localização onde se encontram as políticas de acesso e onde estas políticas são aplicadas. Se as ações são permitidas pelo PDP, o PEP executa-as na base de dados. PDP Políticas de Controlo de Acesso Aplicação PEP Lógica de Negócio Legenda: PDP-Ponto de Decisão de Políticas PEP-Ponto de Aplicação de Políticas Figura 13 - Exemplo de arquitetura PEP-PDP 2.2.3 Trabalhos Relacionados com a Aplicação de Controlo de Acesso Nesta secção apresentam-se alguns trabalhos desenvolvidos no âmbito da aplicação de controlo de acesso. 2.2.3.1 ACADA Em [Pereira, '12a] é proposta a ACADA (Access Control-driven Arquiteture with Dynamic Adaptation), uma arquitetura que permite incorporar objetos adaptáveis derivados de políticas de controlo de acesso. Neste paper são também referidos os problemas que ocorrem com a separação entre as políticas de controlo de acesso e os mecanismos que as aplicam:  Uma utilização direta de AP) s JDBC,ADO.net… de um modo consistente com as políticas de controlo de acesso definidas, leva a que o utilizador tenha que ter um 27 ADCA – Arquitetura Dinâmica de Controlo de Acesso domínio completo das políticas estabelecidas. Isto pode ser difícil à medida que a   complexidade das políticas de controlo de acesso aumenta; Os programadores podem utilizar qualquer expressão sql nas AP) s, o que pode levar à violação das políticas de acesso estabelecidas na base de dados; A atualização das políticas de controlo de acesso leva a uma atualização dos mecanismos que as implementam. Não existindo maneira automática de traduzir  as alterações nas AP) s correntes; Nalgumas partes do código é necessária a escrita de código Hard-Coded para gestão das restrições em tempo de execução. Não existindo maneira de atualizar este código de controlo de acesso escondido. 2.2.3.2 SELINKS SELINKS [Corcoran, '09] é uma linguagem de programação baseada na construção de aplicações Web multi-camadas seguras. Esta fornece um modelo de programação uniforme, ao estilo de LINQ [Meijer, '06] e Ruby on Rails [Hansson, '04], com sintaxe de linguagem para acesso a objetos armazenados em servidores comuns ou em base de dados. Nesta linguagem, os programadores definem meta dados relevantes para a segurança (designados por rótulos) usando tipos algébricos e estruturados e definem também as funções de aplicação de políticas, que a aplicação chama explicitamente para mediar o acesso aos dados. Para garantir que a chamada às funções de aplicação de políticas não é deixada de fora ou não é feita incorretamente, o SELINKS implementa um sistema de tipos designado por FABLE. Este sistema assegura que os dados sensíveis nunca são acedidos diretamente sem consultar a função de aplicação de políticas apropriada. Estas funções correm num servidor remoto e verificam em tempo de execução as ações que um utilizador pode realizar, permitindo um controlo mais eficiente do que os SGBD-R são atualmente capazes de realizar. Na Figura 14 temos um exemplo de uma função que realiza pesquisa por texto em entradas na base de dados. Esta função recebe como parâmetros de entrada a credencial do utilizador cred e a frase de pesquisa keyword. A verificação da permissão do utilizador é realizada através da função de controlo de políticas acess_str. A função acess_str recebe como parâmetros: as credenciais do utilizador, o rótulo de segurança e o texto representando os dados protegidos. No caso de permissão aceite, é enviado o texto com os dados se não, nada é enviado. 28 Mestrado Integrado em Engenharia de Computadores e Telemática Figura 14 - Exemplo de função de aplicação de políticas retirada de [Corcoran, '09] Este sistema permite um controlo mais eficiente do que os SGBD-R são atualmente capazes de realizar, mas os componentes no lado cliente não se adaptam automaticamente às alterações realizadas nas políticas no lado servidor, fazendo com que o utilizador tenha que dominar as políticas de controlo de acesso estabelecidas e os esquemas da base de dados. O que pode ser difícil com o aumento da complexidade das políticas. 2.2.3.3 JIF Jif [Napes, '12] é uma linguagem de programação que estende o Java, para permitir o suporte para controlo de fluxo de informação e controlo de acesso. A aplicação das políticas é efetuada tanto em tempo de compilação como em tempo de execução. As políticas de controlo de acesso são aplicadas através da utilização de rótulos que expressam restrições em como a informação deve ser usada. Por exemplo considere a seguinte declaração da variável x: int (Alice->Bob) x; Neste caso, a política de segurança indica que x é controlada por Alice e que Alice permite que esta informação seja vista por Bob. Com anotações de rótulos como este, o compilador do JIF analisa o fluxo de informação entre programas para determinar se existe a aplicação tanto da confidencialidade como da integridade da informação. Embora o JIF aborde alguns aspetos importantes tais como, aplicação de políticas em tempo de compilação e de execução, uma das desvantagens da utilização do JIF reside no facto de os utilizadores apenas terem conhecimento de inconsistências após a execução do 29 ADCA – Arquitetura Dinâmica de Controlo de Acesso compilador do JIF. Deste modo, as políticas de acesso não são conhecidas durante a fase de desenvolvimento, o que pode levar à criação de código que vá de encontro às permissões. 2.2.3.4 Aplicação de Controlo de Acesso Usando Vistas Rizvi em [Rizvi, '04] apresenta um sistema de controlo de acesso que verifica se as consultas à base de dados contêm uma autorização apropriada. Esta abordagem requer que o administrador especifique vistas de segurança na base de dados para filtrar o conteúdo das tabelas. O sistema só executa a consulta na base de dados depois de verificar que esta pode ser executada contra uma vista filtrada da tabela. Este mecanismo de segurança é transparente, pois os utilizadores não autorizados não sabem que as suas consultas estão a ser testadas contra tabelas filtradas. Esta transparência nem sempre é desejada, pois quando existe um conjunto complexo de políticas em vigor, é importante explicar aos utilizadores porque é que as validações de autorização falharam. Isto permite que os utilizadores possam rever os seus pedidos em função das políticas estabelecidas, de modo a reescrever o pedido de acesso. 2.2.3.5 Modelo de Segurança Baseado na Adaptação Dinâmica Em [Morin, '10] é proposta uma aproximação baseada em Modelos de segurança dinamicamente adaptáveis. O objetivo deste trabalho é a aplicação de mecanismos de controlo de acesso flexíveis que se adaptam dinamicamente às alterações realizadas nas políticas de controlo de acesso.   Foram descritos dois tipos de modelos independentes: O modelo arquitetural de negócios O modelo de segurança A composição dinâmica do modelo de segurança a partir do modelo arquitetural permite que as políticas de segurança se adaptem de acordo com regras pré-definidas e também que lidem com as mudanças não planeadas. Isto é realizado da seguinte maneira: O modelo de segurança possui um conjunto de regras de acesso e o contexto nas quais estas regras se aplicam. Em tempo de execução, um conjunto destas regras são selecionadas. Estas regras são depois compostas no modelo arquitetural de negócios, obtendo como resultado um modelo arquitetural que aplica políticas de segurança nas aplicações. Para processar as alterações às políticas de segurança, existe um sistema de monitorização. Aquando de uma alteração, o sistema de monitorização é despoletado e o modelo de segurança adaptado. A definição das políticas de segurança é realizada através do estabelecimento de ligações entre os componentes das diferentes camadas. Não foi 30 Mestrado Integrado em Engenharia de Computadores e Telemática contemplada a forma como se aplicam as políticas de segurança a nível de software, um dos pontos essenciais da nossa arquitetura. 2.3 Abordagem Tecnológica Neste capítulo são expostas as tecnologias usadas para o desenvolvimento da ADCA. As aplicações de base de dados desenvolvidas na arquitetura ADCA foram implementadas em Java [Oracle, '12f] e Sql Server 2008[Microsoft, '12m], tendo sido desenvolvida uma versão estática em C# [Microsoft, '12a]. Para facilitar o desenvolvimento das aplicações foram utilizadas as ferramentas de desenvolvimento NetBeans [Netbeans, '12] e Visual Studio [Microsoft, '12q]. O armazenamento das políticas de acesso é realizado com recurso à ferramenta Sql-Server [Microsoft, '12m] da Microsoft e a base de dados exemplo utilizada é a NorthWind [Microsoft, '12i]. São também apresentadas as principais características das transações, um elemento utilizado no desenvolvimento da ADCA. 2.3.1 Java Java[Oracle, '12f] é uma linguagem de programação desenvolvida na Sun Microsystems (recentemente comprada pela Oracle). Esta é uma linguagem orientada a objetos com sintaxe muito parecida com as linguagens C e C++ mas oferecendo mais facilidades, tais como:  Portabilidade: um programa java pode ser executado em qualquer sistema operativo, enquanto que em C e C++, é necessário a compilação diferente  para cada SO; Criação de interfaces gráfica: em java o desenvolvimento de interfaces gráficas é mais facilitado que em C ou C++. Na Figura 15 descreve-se a forma como é realizada a compilação e execução de programas Java. O código fonte dos programas é guardado em ficheiros de formato .java que depois são compilados em ficheiros .class. JVM Ficheiro .java Compilador Programa em Execução Ficheiro .class 31 ADCA – Arquitetura Dinâmica de Controlo de Acesso Figura 15 - Esquema de funcionamento da linguagem de programação JAVA Estes ficheiros .class podem ser executados em muitos sistemas operativos, visto que a tecnologia utilizada para execução é uma máquina virtual, designada de JVM(Java Virtual Machine). Esta permite a execução em Microsoft Windows, Solaris OS, Linux e Mac OS, sendo assim uma linguagem que permite a execução num amplo conjunto de sistemas operativos. No contexto da linguagem de programação java destacamos a ferramenta de desenvolvimento NetBeans[Netbeans, '12] e as seguintes AP) s, entre outras:   API JDBC: utilizada para interação com base de dados; API Reflection: permite a uma classe a sua própria inspeção em tempo de execução. O NetBeans e estas AP) s são descritas com mais detalhe nos próximos parágrafos. 2.3.1.1 NetBeans Netbeans[Netbeans, '12] é um IDE Java desenvolvido pela empresa Sun Microsystems, que auxilia os programadores de software a escrever, compilar, realizar debug e instalação de aplicações. O seu foco é a linguagem de programação java mas suporta outras linguagens tais como: C, C++, Ruby, PHP, XML e HTMl. O Netbeans fornece também uma base sólida para desenvolvimento de projetos e módulos, pois possui um grande conjunto de bibliotecas e AP) s, deste modo facilitando muito o desenvolvimento de aplicações em Java. 2.3.1.2 JDBC A JDBC (Java Database Connectivity) [Oracle, '12i] é uma API para a linguagem de programação java que permite o acesso e interação com um amplo conjunto de SGBDs. Esta fornece métodos para consulta e atualização de dados numa base de dados. Podemos criar expressões SQL e utilizá-las em código java, onde o resultado da sua execução é transformado em objetos fáceis de manipular.    A API JDBC permite: Estabelecer conexões com uma qualquer base de dados; Envio de instruções Sql para a base de dados; Obter e processar os resultados recebidos da base de dados em resposta das instruções enviadas. 32 Mestrado Integrado em Engenharia de Computadores e Telemática Para utilização desta tecnologia é necessária a utilização de um driver JDBC, que é um adaptador no lado do cliente, que converte os pedidos de programas java para um protocolo que o SGBD consiga perceber. Na Figura 16 podemos encontrar uma arquitetura típica do JDBC, onde os comandos JDBC são transformados em operações no SGBD através da utilização de um driver compatível com o SGBD utilizado.  Os drivers JDBC são divididos em quatro categorias: JDBC-ODBC: É um driver de implementação de base de dados que implica o uso do driver ODBC [Microsoft, '12k] para ligação à base de dados. Este driver converte  invocações JDBC em invocações a funções em ODBC; Drives com acesso para API nativa: Drivers que mapeiam as invocações JDBC para as invocações na API do cliente fazendo o carregamento do código binário em cada  máquina cliente; Protocolos de rede: Drivers de implementação de base de dados que fazem uso de uma camada de middleware entre a execução do programa e a base de dados. Esta camada intermédia converte as chamadas JDBC direta ou indiretamente no  protocolo específico usado pela base de dados; Protocolos nativos: Drivers de implementação de base de dados que convertem as invocações JDBC diretamente para o protocolo usado na base de dados. Enquanto neste caso a conversão é feita diretamente no cliente, no caso anterior, a conversão é feita na camada intermédia de software. Aplicação Java JDBC API Driver Servidor de Base de Dados SGBD Figura 16 - Esquema de funcionamento da API JDBC 33 ADCA – Arquitetura Dinâmica de Controlo de Acesso Após conseguir uma correta ligação à base de dados é necessário a utilização de objetos para comunicação com a base de dados (envio de expressões sql e receção de resultados), para tal fim, existem três tipos de objetos, os quais se encontram representados na Tabela 5. Objeto Descrição Statement Objeto usado para acesso geral à base de dados. Útil quando são usadas expressões sql estáticas em tempo de execução. A interface deste objeto não aceita parâmetros. PreparedStatement Objeto usado quando pretendemos utilizar uma expressão sql várias vezes, alterando apenas os parâmetros de entrada. CallableStatement Usado quando queremos aceder a stored procedures armazenadas na base de dados. A interface deste objeto aceita parâmetros de entrada em tempo de execução. Tabela 5 - Objetos JDBC para interação com a base de dados Ao executarmos objetos do tipo Statement e PreparedStatement com instruções sql do tipo Select é retornado um objeto com os dados resultantes. O objeto resultante desta execução tem o nome de ResultSet [Oracle, '12m]. A iteração pelos dados armazenados no ResultSet é realizada através dos métodos que se apresentam na Tabela 6. Método Descrição absolute(n) Move para a linha com o índice n. afterLast() Move o cursor para a próxima linha em relação à última linha do ResultSet. first() Move o cursor para a primeira linha do ResultSet. last() Move o cursor para a última linha do ResultSet. next() Move o cursor para a próxima linha do ResultSet. previous() Move o cursor para a linha anterior. relative(n) Move o cursor n linhas em relação à linha atual. beforeFirst Move o cursor para a linha anterior em relação à primeira linha do ResultSet. Tabela 6 - Métodos de movimentação existentes em objetos ResultSet 34 Mestrado Integrado em Engenharia de Computadores e Telemática Após estarmos na linha requerida podemos utilizar os métodos de leitura do JDBC para obter os valores guardados no ResultSet, nos quais indicamos o tipo de valor no nome do método e como parâmetro o nome da coluna. No caso da leitura de um inteiro que se encontra na coluna )d , utilizamos o método getInt() e como parâmetro de entrada, a string )d , identificando a coluna a ser lida. Para modificar os valores do ResultSet existem os seguintes métodos, descritos na Tabela 7. Método Update____(n,X) UpdateRow() Descrição Atualiza a coluna n para o objeto de valor X. Atualiza a base de dados subjacente com as alterações da linha corrente do ResultSet. moveToInsertRow Move o cursor para uma linha temporária, que permite a inserção de elementos. insertRow Insere o conteúdo da linha temporária no ResultSet e na base de dados. DeleteRow Apaga a linha da tabela que se encontra selecionada, do ResultSet e da base de dados subjacente. moveToCurrentRow Move o cursor para a linha anteriormente conhecida. Tabela 7 - Métodos de atualização e inserção de campos de objetos ResultSet Temos assim a descrição dos métodos necessários para manipulação de campos e objetos em base de dados utilizando a linguagem de programação java e a API JDBC. 2.3.1.3 Reflection A Reflection API [Oracle, '12r] [Oracle, '12q]é geralmente usada por programas que requerem a habilidade de analisar e modificar o seu comportamento em tempo de execução. Reflection é uma técnica poderosa que permite a aplicações realizar operações, que de outra maneira seria impossível. Com a Reflection podemos [Green, '12]:     Determinar a classe de um objeto; Obter informação sobre uma classe, como: campos, métodos, construtores e super classes; Encontrar que constantes e métodos pertencem a uma interface; Criar uma instância de uma classe, cujo nome era desconhecido, até à execução da aplicação; 35 ADCA – Arquitetura Dinâmica de Controlo de Acesso   Obter e modificar o valor de um campo de um objeto, mesmo que o nome deste campo seja desconhecido pela aplicação até a sua execução; Invocar um método de um objeto desconhecido até execução da aplicação. Esta técnica não deve ser usada discriminadamente pois apresenta um conjunto de desvantagens [Oracle, '12q]:  Overhead de Performance: Esta técnica envolve tipos que são resolvidos dinamicamente e por consequente, algumas operações de otimização por parte da Java Virtual Machine não poderão ser realizadas, devendo então ser evitado o seu  uso em secções do código que são chamadas frequentemente; Restrições de Segurança: A Reflection requer permissões em tempo de execução que poderão não estar presentes se estiver a ser executada ao abrigo de um gestor de segurança. Esta é uma importante consideração para código que necessita de  ser executado num contexto restrito de segurança, como por exemplo um Applet; Exposição de entidades privadas: A Reflection permite a execução de operações que seriam ilegais em código não refletivo, como aceder a campos privados. Esta possibilidade pode resultar em código disfuncional, podendo mesmo destruir a portabilidade deste. 2.3.2 C# C# [Microsoft, '12a] é uma linguagem de programação desenvolvida no ano 2000 para construção de uma vasta gama de aplicações que correm na plataforma .NET [Microsoft, '12h]. Pertence à família das linguagens derivadas do c, como c++ e java, mas ao contrário do c++, esta é uma linguagem inteiramente orientada a objetos. Sendo esta mais recente que java, apresenta diversas melhorias, tornando esta uma linguagem, mais robusta e fácil de utilizar para desenvolvimento de aplicações. Algumas das vantagens de C# em relação a Java são[Microsoft, '12b]:    Integração profunda no sistema operativo Windows, facilitando por exemplo a interação com ferramentas como o Sql Server; Utilização da instrução foreach, que permite uma iteração facilitada em arrays de elementos, garantido que todos os elementos são analisados; C# incorpora arrays multidimensionais ao contrário de java. No contexto da linguagem de programação C# utilizamos a ferramenta de desenvolvimento VisualStudio e a API ADO.Net que é utilizada para interação com base de 36 Mestrado Integrado em Engenharia de Computadores e Telemática dados. Esta API, tal como a ferramenta de desenvolvimento VisualStudio, são descritas com mais detalhe nos próximos parágrafos. 2.3.2.1 VisualStudio Visual Studio.NET[Microsoft, '12q] é um IDE da Microsoft que oferece um conjunto poderoso de ferramentas para desenvolvimento e debug de aplicações. Permite-nos ainda trabalhar dados com o SQLServer de uma maneira simples, sem necessidade de abrir qualquer interface de base de dados, contemplando assim os nossos requisitos. 2.3.2.2 ADO.Net O ADO.NET [Microsoft, '12l] consiste num conjunto de classes definidas pela framework .NET que podem ser utilizadas para acesso a base de dados remotas. O ADO.NET oferece tecnologia para conectar a base de dados, executar comandos e obter resultados. Estes resultados são processados diretamente e colocados em objetos DataSet [Microsoft, '12d]. Este objeto possui um conjunto de tabelas e as relações entre elas. Na Figura 17 podemos ver a principal arquitetura do ADO.net e os principais componentes que a compõem. Nesta arquitetura existem dois componentes principais:  O fornecedor de dados da plataforma .NET (DataProviders): Constituído por objetos de manipulação e leitura de dados:     Connection: fornece conectividade a qualquer SGBD; Command: permite a execução de expressões sql; execução de Stored-Procedures e envio ou receção de informação; DataReader: fornece uma stream de dados de alta-performance com origem na base de dados; DataAdapter: fornece uma ponte entre o objeto DataSet e a base de dados. O DataAdapter utiliza objetos do tipo Command para executar comandos na base de dados, tanto para preencher o DataSet com dados como para reconciliar as alterações realizadas  no DataSet de volta à base de dados. O DataSet contém uma coleção de um ou mais objetos DataTable preenchidos com os resultados da execução de uma instrução Select. 37 ADCA – Arquitetura Dinâmica de Controlo de Acesso DataProviders Connection Data Adapter Command DataSet DataTable DataReader XML Base de Dados Figura 17 - Principais componentes do Ado.Net No exemplo da Figura 18 evidencia-se a criação de um comando sql do tipo Select utilizando o ADO.net. Considere a existência de uma variável do tipo String com o nome crud , onde está armazenada uma expressão sql do tipo Select. Neste exemplo, primeiro é executado o método SelectCommand do objeto DataAdapter (variável da), com a respetiva instrução sql (objeto String designado por crud). Em seguida, preenche-se o DataSet (variável ds) com os elementos resultantes do comando sql. E por fim a primeira tabela obtida é passada para um objeto DataTable (variável dt) que pode ser manipulada como uma tabela normal em C#. Figura 18 - Exemplo de utilização de Ado.Net 38 Mestrado Integrado em Engenharia de Computadores e Telemática 2.3.3 Transações Uma transação [Java2s, '12] [Microsoft, '12o] é uma sequência de operações realizadas como uma unidade singular de trabalho. que deve possui quatro propriedades:     Atómica: todas as modificações são realizadas ou nenhuma é realizada; Consistente: quando concluída, uma transação deve deixar todos os dados num estado consistente; Isolada: modificações realizadas por transações concorrentes devem deixar todos os dados num estado consistente; Durável: depois de completa, os seus efeitos ficam permanentemente no sistema, mesmo depois de uma falha no sistema. Para controlo das transações, existem quatro níveis de isolamento, os quais se descrevem na Tabela 8 [Oracle, '12o]. Tipo de Descrição Isolamento ReadUncommited Este é o menor nível de isolamento. Permite a uma transação aceder a alterações que ainda não foram confirmadas por outras transações. Deste modo as transações não são isoladas umas das outras. ReadCommited Neste caso, é criado um lock para as operações write, até ao fim da transação, ou seja a transação só pode ler os dados de tabelas que já foram comited (enviados). Se uma transação quiser atualizar uma tabela, tem que obter um lock, e outras transações terão que esperar pela libertação do lock para realizar as suas alterações. RepeatableRead Neste modo o lock é aplicado a todos os dados usados pela transação, tanto a leitura como a escrita. Serializable Os locks são colocados em tabelas, fazendo-se lock de tabelas completas. Este é o nível de maior isolamento. Tabela 8 - Descrição dos níveis de isolamento em Transações Em bases de dados onde coexistem várias transações concorrentes é originado um conjunto de ocorrências que permitem a leitura de dados inconsistentes. Essas ocorrências são as seguintes: 39 ADCA – Arquitetura Dinâmica de Controlo de Acesso  Phantom Read: Ocorre quando dentro de uma mesma transação, a expressão sql é executada duas vezes e o segundo resultado inclui linhas que não eram visíveis na primeira. Como se pode ver pelo exemplo da Figura 19, com o nível de isolamento ReadCommited, a transação 1 executa a mesma expressão duas vezes. Mas na segunda execução, uma linha adicional que não existia na primeira execução aparece, visto que uma segunda transação executa uma inserção entre as duas leituras; Transação 2 Transação 1 Select * From Notas Insert Into Notas(...) Values(...) Select * From Notas Figura 19 - Exemplo de Phantom Read  Dirty Read: Ocorre quando uma transação está a ler dados e outra transação está concorrentemente a atualizá-los. Se o tipo de isolamento for ReadUncommited, a primeira transação lê os dados que ainda não foram commited (enviados). Pelo exemplo da Figura 20, podemos verificar que quando a primeira transação altera o atributo nota para 10 e como o isolamento é do tipo ReadUncommited, a transação 2 faz leitura dos dados uncommited, neste caso nota 10, tendo de seguida a transação 1 ter sido rejeitada, o que faz com que haja uma  leitura de um valor incorreto; Non-Repeatable Read: Ocorre quando numa mesma transação, a mesma expressão possui resultados diferentes. Isto ocorre quando uma segunda transação atualiza os dados usados por outra transação. Como podemos ver pela Figura 21, com o isolamento ReadCommited, a transação 1 executa duas leituras, mas a segunda resulta em resultados diferentes, visto que a transação 2 atualiza os valores da tabela entre as duas leituras da primeira transação. 40 Mestrado Integrado em Engenharia de Computadores e Telemática Transação 1 Transação 2 Alterar nota para 10 Ler nota=10 Transação rejeitada Figura 20 - Exemplo de dirty-read Transação 1 Transação 2 Select * From Notas Update Notas... Select * From Notas Figura 21 - Exemplo de Non-Repeatable Read 41 ADCA – Arquitetura Dinâmica de Controlo de Acesso Na Tabela 9 descrevem-se para que níveis de isolamento ocorrem estes problemas. Nível Isolamento Dirty-Read Non-Repeatable Read Phantom-Read ReadUncommited Sim Sim Sim ReadCommit Não Sim Sim RepeatableRead Não Não Sim Serializable Não Não Não Tabela 9 - Tabela com a ocorrência de incorreções nos vários níveis de isolamento 42 Mestrado Integrado em Engenharia de Computadores e Telemática 3 Arquitetura Dinâmica de Controlo de Acesso Neste capítulo apresentamos a ADCA e fazemos a descrição dos vários componentes que a compõem. 3.1 Arquitetura Geral A ADCA é formada por um conjunto de componentes criados com o propósito de facilitar a interação com base de dados (como as oferecidas por exemplo por AP) s, como JDBC [Oracle, '12i], ADO.Net [Microsoft, '12l], JPA [Oracle, '12j],LINQ [Microsoft, '12g] e Hibernate [JBOSS, '12]) oferecendo ao mesmo tempo controlo de acesso a informação sensível. Este controlo de acesso é realizado através de mecanismos de controlo de acesso incorporados na camada de negócio do cliente, sendo que estes devem estar de acordo com as políticas de controlo de acesso definidas num servidor de políticas. O modelo arquitetural da aplicação ADCA está dividido em duas partes:   Lado Cliente: local onde o acesso dos utilizadores à informação é controlada por mecanismos de controlo de acesso; Lado Servidor: local onde são armazenadas as políticas de controlo de acesso que regulam os mecanismos de controlo acesso evidenciados no ponto anterior. Ao contrário do modelo PDP-PEP, onde por cada tentativa de acesso de um comando no lado PEP é enviado um pedido ao PDP para verificação da permissão de execução, na ADCA, a decisão sobre o acesso é tomada ao nível do lado cliente. Neste existem mecanismos de controlo de acesso, construídos com base nas políticas de controlo de acesso estabelecidas num servidor de base de dados, designado por servidor de políticas. Deste modo, quando existem alterações nas políticas armazenadas neste servidor, os mecanismos de controlo de acesso adaptam-se dinamicamente, permitindo que estejam sempre de acordo com as políticas estabelecidas. O lado cliente disponibiliza um conjunto de serviços regulados por controlo de acesso que permitem uma fácil interação com base de dados. O lado Cliente foi desenvolvido usando Java. Para demonstrar que os métodos disponibilizados pelos serviços de negócio podem ser implementados usando várias tecnologias, foi desenvolvida uma versão estática em C# do lado do Cliente. Por outro lado, o lado Servidor contém um conjunto de políticas de acesso armazenadas num Servidor Sql Server, que descriminam quais os serviços que podem ser utilizados pelos utilizadores em tempo de execução. A adaptação dinâmica às alterações 43 ADCA – Arquitetura Dinâmica de Controlo de Acesso efetuadas nas políticas de acesso é possível devido à implementação de um monitor que monitoriza as políticas. Quando ocorre uma alteração é despoletado um trigger que permite que o monitor de políticas comunique as alterações efetuadas. Permitindo assim uma correta adaptação da lógica de negócio de modo a refletir as políticas de acesso estabelecidas. A Figura 22 apresenta a arquitetura geral desenvolvida para a resolução do problema. Lado Cliente Lado Servidor CCAD 8 Lógica de Negócio 1 6 3 5 7 Aplicação Servidor de Políticas Gestor de Negócio G 2 4 Gestor de Políticas 9 Monitor de Políticas Legenda: -Socket de Comunicação -Sentido de Comunicação SGBDR-Sistema de Gestão de Base de Dados Relacional Figura 22 - Arquitetura Geral Desenvolvida No lado do cliente existe o CCAD (Componente de Controlo de Acesso Dinâmico), este componente é constituído por dois sub-componentes principais:  Lógica de Negócio: neste componente são armazenados um conjunto de esquemas de negócio e a sua respetiva implementação. Os esquemas de negócio referem-se a um conjunto de interfaces que disponibilizam os métodos que permitem ao  utilizador interagir com a base de dados relacional; Gestor de Negócio: este componente permite gerir a lógica de negócio de acordo com as políticas definidas e possibilitar a instanciação das implementações dos esquemas de negócio aos quais se dá o nome de serviços de negócio. A identificação do utilizador e a gestão de sessões são também geridos pelo gestor de negócio. 44 Mestrado Integrado em Engenharia de Computadores e Telemática O CCAD adapta-se às alterações efetuadas nas políticas em tempo de execução, permitindo assim um sistema robusto e seguro. No lado do Servidor existe uma base de dados implementada em Sql Server, onde as políticas de controlo de acesso estão armazenadas. Visto que o lado cliente é independente do controlo de acesso utilizado no armazenamento das políticas, poderíamos utilizar um qualquer controlo de acesso. A nossa escolha recaiu sobre o controlo de acesso baseado em papéis (RBAC). Esta escolha deveu-se essencialmente à facilidade concedida por este modelo na gestão de controlo de acesso, facilitando a atribuição de permissões por parte dos administradores do sistema. O modelo RBAC selecionado para construção do servidor de políticas foi o modelo RBAC1 (descrito em 2.1.3) que permite a existência de, sessões, autorizações, utilizadores e um conjunto de papéis numa estrutura do tipo hierárquica. O modelo desenvolvido é detalhado no ponto 3.3.3.2.2. Este modelo permite associar a papéis, esquemas de negócio e as respetivas expressões CRUD (expressões Sql do tipo Create Read Update Delete, baseadas em [Pereira, '10; Pereira, '11b]). Toda a informação de e para o CCDA passa pelo gestor de políticas, sendo assim, o intermediário entre o CCAD e o servidor de políticas. Nos serviços de negócio instanciados pelo gestor de negócios são utilizadas expressões Sql do tipo CRUD.  O modo de operação deste sistema é o seguinte: A camada de aplicação cria instâncias do CCAD (Figura 22-1) onde se atribui a autenticação do utilizador e da aplicação, tanto para identificação na base de dados        relacional como para identificação com o servidor de políticas; O CCAD estabelece a conexão com o gestor de políticas (Figura 22-2) e tenta fazer o login do utilizador no sistema; O gestor de políticas liga-se ao servidor (Figura 22-3) e autentica-se a si próprio se ainda não estiver autenticado, autenticando também o CCAD; O gestor de políticas recolhe as políticas Figura 22-3) do servidor de políticas de acordo com o utilizador e a aplicação; O gestor de políticas liga-se ao gestor de negócios e envia as políticas de controlo de acesso (Figura 22-4); O CCAD cria automaticamente a lógica de negócio; A camada de aplicação faz então pedidos ao CCAD (Figura 22-6) para gerir a execução de expressões CRUD; O gestor de negócios contacta a lógica de negócios (Figura 22-7) para execução dos pedidos da camada de aplicação. Em seguida, a lógica de negócio contacta o 45 ADCA – Arquitetura Dinâmica de Controlo de Acesso servidor relacional (Figura 22-8) e executa a instrução CRUD, sendo os resultados  da sua execução retornados à aplicação; Sempre que existam alterações nas políticas armazenadas no servidor de políticas, o monitor de políticas envia a informação sobre as alterações para o gestor de políticas (Figura 22-9). Este comunica-as ao gestor de negócios (Figura 22-4) que se adapta dinamicamente de modo a estar consistente com as políticas de acesso estabelecidas. Em[Pereira, '12a] apresentam-se os problemas relativos à utilização corrente de AP) s JDBC e ADO.net com o estabelecimento de políticas de controlo de acesso. Nestas AP) s a aplicação de políticas de acesso impõe uma separação nítida entre as políticas de controlo de acesso e os mecanismos responsáveis pela sua aplicação. Isto leva a ocorrência de várias desvantagens, tais como:  Uma utilização direta destas AP) s consistentemente com as políticas de acesso definidas levaria a que o utilizador tivesse que ter um domínio completo das políticas estabelecidas. Isto poderia ser difícil à medida que a complexidade das políticas de controlo de acesso aumentava. Este problema é resolvido na ADCA com a utilização da lógica de negócio que se adapta dinamicamente em tempo de  execução às políticas estabelecidas e apresenta apenas os serviços permitidos; Utilização de expressões CRUD que podem ir de encontro às políticas de acesso definidas. Para resolução deste caso foram definidas no servidor de políticas as expressões CRUD a que o utilizador tem acesso consoante os esquemas de negócio, levando a um maior controlo destas. 3.2 Comunicação entre os Componentes da ADCA Neste capítulo apresentam-se as estruturas das mensagens que são trocadas entre os componentes que compõem a nossa Arquitetura. 3.2.1 Comunicação Gestor de Negócios – Gestor de Políticas Nos próximos parágrafos, são descritas as soluções encontradas para a troca de informações entre gestor de negócio e o gestor de políticas, permitindo uma correta construção e adaptação da lógica de negócio. 46 Mestrado Integrado em Engenharia de Computadores e Telemática 3.2.1.1 Login no Gestor de Políticas A primeira ação de um utilizador antes de qualquer pedido ao servidor, é a realização do login no sistema, de modo a este ser identificado no sistema e receber as permissões a que tem direito. Com a instanciação do gestor de negócios, este autentica-se no sistema. A autenticação é realizada através da troca de duas mensagens. A primeira mensagem sinaliza o gestor de políticas que o cliente pretende efetuar o login. Esta mensagem tem a estrutura representada na Figura 23. Auth Referência da Applicação Username Password Ip do Cliente Porta do Cliente Figura 23 - Estrutura da mensagem de login     Esta estrutura possui os seguintes campos: O primeiro campo corresponde à string AUT( e identifica a mensagem como sendo uma mensagem de autenticação; A referência da aplicação permite ao gestor de políticas identificar qual a aplicação que o utilizador pretende utilizar e verificar se possui permissão para a utilizar; Os campos Username e Password permitem a identificação do utilizador no sistema, e são usados para verificar a sua correta identidade; Os campos Ip e Porta do cliente servem para permitir localizar na rede o gestor de negócios correspondente ao utilizador. Esta informação é guardada no servidor de políticas permitindo a comunicação das alterações realizadas às políticas de controlo de acesso estabelecidas. Depois de verificada a correta identidade do utilizador e do seu acesso à aplicação, é necessário criar uma sessão para este novo cliente. Para tal existe uma tabela sessão, cuja criação é referida no ponto 3.3.3.2.2 e na qual se cria uma nova entrada com o ip e porta do cliente respetivo. Com a identidade verificada e a correspondente sessão criada, o gestor de políticas sinaliza o gestor de negócios através de uma mensagem. Esta corresponde a uma de duas Strings:  OK , )dentidade verificada; 47 ADCA – Arquitetura Dinâmica de Controlo de Acesso  NOK , dados de autenticação errados, ou acesso negado à aplicação. No caso de receção da uma mensagem a negar o acesso, a comunicação é terminada entre o gestor de negócios e o gestor de políticas. 3.2.1.2 Comunicação das Informações sobre Políticas No caso de receção de mensagem afirmativa por parte do gestor de negócios, aquando do login, é agora necessário obter as informações sobre quais os esquemas de negócio a que o utilizador tem acesso para a correta construção da lógica de negócio. Para tal, o gestor de negócios envia a mensagem getBus a requerer o envio de informação sobre os esquemas de negócio a que tem direito. O Gestor de Políticas adquire a informação sobre os esquemas de negócio através do servidor de políticas seguindo os passos especificados mais à frente no ponto 3.3.3.3.1 e transmite-a seguindo a troca de mensagens representada na Figura 24. Figura 24 - Conjunto de mensagens trocadas, para obtenção de esquemas de negócio e CRUDS com acesso 48 Mestrado Integrado em Engenharia de Computadores e Telemática  Este processo decorre de acordo com os seguintes passos: O gestor de negócios, envia a mensagem getBus para informar o gestor de políticas que pretende obter informação sobre quais os esquemas de negócio e   expressões CRUD a que tem acesso; O gestor de políticas adquire todas as informações sobre as permissões do cliente e envia o número de esquemas de negócio, ao qual tem direito; Por cada esquema de negócio é enviado por parte do gestor de políticas, o Url, para identificação da interface principal referente ao esquema de negócio e o número  de expressões CRUD correspondentes a este; Por cada expressão CRUD correspondente, é enviado o id identificando a expressão CRUD e a respetiva String. Com este conjunto de passos, são enviadas as informações sobre as permissões a que o utilizador do ADCA tem direito. O gestor de negócios pode então criar a respetiva lógica de negócio. 3.2.1.3 Comunicação das Alterações Efetuadas nas Políticas A comunicação entre o monitor de políticas e o gestor de políticas é despoletada por triggers existentes na base de dados, aquando da alteração de políticas no sistema, este monitor é especificado em mais detalhe no ponto 3.3.5. Quando ocorrem alterações nas políticas do sistema, o monitor de políticas envia para o gestor de política a informação sobre as alterações que ocorreram. Depois de sinalizado pelo monitor de políticas, o gestor de negócios obtém as informações necessárias aos gestores de negócios afetados pela alteração, através de algoritmos especificados mais à frente nos pontos 3.3.3.4.1 e 3.3.3.4.2. Esta informação é enviada para o gestor de negócios que possui uma thread à escuta de alterações realizadas nas políticas. A mensagem enviada do gestor de políticas ao gestor de negócios tem o seguinte formato, apresentado na Figura 25. 49 ADCA – Arquitetura Dinâmica de Controlo de Acesso Figura 25 - Conjunto de mensagens trocadas, para informação sobre alterações efetuadas às políticas de controlo de acesso Este esquema tem como base o esquema referido no ponto 3.2.1.2. Apenas com a alteração que o gestor de negócios não envia nenhuma mensagem, este recebe a mensagem referida como Tipo de Operação, evidenciado na Figura 25, que contém uma String a designar o tipo de operação.   Esta String pode conter dois valores: Add : para identificar operação de adição de esquemas de negócio; Remove : para identificar operação de remoção de esquemas de negócio. Desta maneira sinaliza-se o gestor de negócio das alterações efetuadas, sendo depois a lógica de negócio adaptada dinamicamente às respetivas alterações. 3.2.2 Comunicação Monitor de Políticas – Gestor de Políticas Quando são alteradas as políticas de acesso, é enviada a respetiva informação para o gestor de políticas, através do monitor de políticas. Esta informação tem que identificar que tipo de alteração ocorreu (Remoção ou Inserção de novas políticas), o tipo de 50 Mestrado Integrado em Engenharia de Computadores e Telemática permissão (Autorização ou Delegação) e ainda informação sobre o utilizador e papéis associados. A mensagem enviada para o gestor de políticas contém os seguintes campos: Tipo de Permissão Tipo de Operação Id de identificação do utilizador e da aplicação Id de identificação de Papel Figura 26 - Conjunto de campos referentes às mensagens enviadas do monitor de políticas ao gestor de políticas O primeiro campo identifica o tipo de permissão atribuída ao papel (autorização ou delegação); No segundo campo existe o tipo de operação (se operação de adicionar, ou de remoção); Os restantes campos servem para identificar o utilizador, a aplicação e também o papel associado com esta operação. Chegamos assim, neste capítulo a um conjunto de estruturas de mensagens que permitem a comunicação entre os vários componentes. 3.3 Desenvolvimento da ADCA Neste capítulo apresenta-se os vários componentes que compõem a arquitetura apresentada no ponto 3.1 e as estratégias utilizadas para o seu desenvolvimento. 3.3.1 Lógica de Negócio A lógica de negócio é constituída por um conjunto de esquemas de negócio. Estes são constituídos por interfaces que disponibilizam os métodos necessários para o utilizador interagir com a base de dados relacional. A gestão da lógica de negócio é realizada pelo gestor de negócios, que permite que a lógica de negócio se adapte dinamicamente em tempo de execução, consoante as políticas de acesso que se encontrem definidas no nosso servidor de políticas Esquemas de Negócio A maioria das AP) s existentes para envio de instruções sql para a base de dados (JDBC, ADO.Net, JPA) fornecem comandos em que a sintaxe não é validada e não têm em conta as políticas de controlo de acesso e sua constante alteração [Pereira, '12a]. O nosso 51 ADCA – Arquitetura Dinâmica de Controlo de Acesso objetivo com a construção dos esquemas de negócio é desenvolver um conjunto de interfaces que depois, com a sua implementação (Serviços de Negócio), possamos obter um objeto que forneça apenas os métodos que estão de acordo com as políticas. Para tal, foram construídos um conjunto de interfaces baseadas nos papers [Pereira, '11a; Pereira, '12a; Pereira, '12b], que permitem a execução de expressões CRUD (Create, Read, Update, Delete) em base de dados relacionais. A este conjunto de interfaces dá-se o nome de esquemas de negócio. Podemos então afirmar que os esquemas de negócio em conjunto com as expressões CRUD são os elementos chaves para utilização de AP) s JDBC e Ado.net) para interação com base de dados relacionais. Na Figura 27 encontramos um caso de alteração de um campo de uma tabela utilizando ADO.net e JDBC, que são as AP) s utilizadas neste trabalho para interação com a base de dados. Verifica-se que a forma como se desenvolve é relativamente diferente, o que levaria um programador de software a ter que aprender diferentes AP) s, logo implicando uma curva substancial de aprendizagem. Com vista à redução da curva de aprendizagem do programador de software, os esquemas de negócio contêm os nomes dos métodos iguais quer para a sua implementação em estática C# quer para a sua implementação dinâmica em Java. No caso da utilização dos esquemas de negócio desenvolvidos neste trabalho, este conjunto de instruções expresso na Figura 27 seria executado por apenas dois comandos principais: um para execução da instrução CRUD e outro para alteração do campo correspondente. Figura 27 - Conjunto de instruções necessárias para a alteração de um campo de uma tabela em ADO.net e JDBC 52 Mestrado Integrado em Engenharia de Computadores e Telemática Com base nestes aspetos, foi desenvolvido o seguinte esquema principal representativo dos esquemas de negócios presente na Figura 28. +execute(in param_1,...param_n):void +execute(in params[ ]:object):void Apenas se instrução de Update, Insert ou Delete IExecute IResult +set(in param_1,...param_n):void +set(in params[ ]:object):void ISet «interface» Business Schema ELM Apenas se Instrução de Select BusinessService +BusinessService(in conn : DbConn, in crud : string) : void Figura 28 - Modelo principal dos esquemas de negócio Podemos verificar que todos os esquemas de negócio são constituídos por um método construtor, designado por BusinessService. Este método permite a instanciação de um serviço de negócio, que é um objeto que fornece métodos para o utilizador interagir com a base de dados relacional. Este método recebe uma conexão para a base de dados (SGBD-R, onde os métodos são executados) designada por conn, do tipo Connection e também por uma String que representa a expressão CRUD que vai ser executada. Este método é transparente ao utilizador e apenas é chamado pelo gestor de negócios para a instanciação dos serviços de negócio, sendo a expressão CRUD utilizada, uma das expressões a que o utilizador tem acesso. As expressões CRUD são definidas no servidor de políticas pelo administrador, sendo atribuídas aos respetivos esquemas de negócio. Aquando da instanciação de um serviço de negócio o utilizador seleciona qual a expressão CRUD a utilizar com base no id respetivo desta expressão que se encontra armazenada no servidor de políticas. No modelo exposto, a interface IResult já se encontra criada por defeito, sendo adicionada ao conjunto de esquemas de negócio dependendo do tipo da 53 ADCA – Arquitetura Dinâmica de Controlo de Acesso instrução CRUD. As outras interfaces são criadas manualmente pelo Administrador ou pelo programador de software para possibilitar uma correta utilização dos esquemas. Interface IExecute Uma interface obrigatória em todos os esquemas de negócio é a interface IExecute. Esta interface é constituída por métodos execute que permitem a execução da expressão CRUD na base de dados relacional (SGBD-R) aquando da sua chamada. Muitas vezes é conveniente a utilização de parâmetros nas expressões Sql. A vantagem de utilização de expressões Sql que recebem parâmetros é que esta pode ser fornecida com valores diferentes de cada vez que queiramos executá-la. Para exemplo, considere o caso em que queremos obter os elementos da tabela Pessoa que tenham as idades 10 e 30. Neste caso podemos executar duas expressões sql: Select * From Pessoa Where )dade= Select * From Pessoa Where )dade= Este tipo de utilização pode ser simplificado com a utilização de parâmetros em expressões Sql. Por exemplo, as expressões sql passadas a um objeto no JDBC podem ter a seguinte estrutura: Select * From Pessoa Where Age=? Onde o sinal de pontuação ? indica a posição do parâmetro ao qual vai ser atribuído um valor. Deste modo evita-se a criação de expressões Sql repetidas, onde apenas alguns valores são alterados. Para tal definimos métodos execute que possuem parâmetros de entrada, os quais correspondem a parâmetros estabelecidos nas instruções CRUD. Para esta situação foram estabelecidas duas aproximações:  Aproximação fechada: temos que explicitar os vários parâmetros que são atribuídos ao CRUD na chamada ao execute: Neste método de exemplo tínhamos que explicitar o valor do id, que depois seria atribuído ao parâmetro definido na instrução CRUD. 54 Mestrado Integrado em Engenharia de Computadores e Telemática  Aproximação aberta: definimos um objeto que contém os valores dos vários parâmetros: Neste caso, criámos um array de objetos antes da execução com os vários elementos instanciados. Apresentamos agora um caso de exemplo de utilização de métodos do tipo execute. Considere a seguinte expressão CRUD que seleciona as entradas da tabela Pessoa com base na cidade e idade: select * from Pessoa Where Cidade=? and )dade=? Neste caso o administrador ou o programador de software podem criar o seguinte método: Este método permite a atribuição de valor ao campo cidade e ao campo referente à idade. Interface ISet A interface ISet foi desenvolvida para estabelecer os parâmetros de instruções CRUD antes da sua execução na base de dados relacional. Esta interface tal como a interface IExecute possui duas aproximações:   Aproximação fechada: Neste caso definíamos o valor do id, antes da execução. Aproximação aberta: 55 ADCA – Arquitetura Dinâmica de Controlo de Acesso Neste caso podemos criar um array de objetos antes da execução. Como caso de exemplo de utilização, considere a seguinte expressão CRUD para inserção de uma nova entrada na tabela Pessoa: insert into Pessoa Nome,Cidade,)dade VALUES ?,?,? Para a resolução deste caso podemos definir na interface ISet o seguinte método: Este método permite a atribuição de valores aos parâmetros especificados na expressão Crud antes da sua execução. Interface IResult A interface IResult é obrigatória nas instruções CRUD do tipo Insert, Update e Delete. Esta possui um único método designado por getNAffectedRows que retorna o número de linhas que foram alteradas pela execução deste tipo de instruções. No caso de expressões CRUD do tipo Select, foi criada uma estrutura designada por ELM (Estrutura Lógica de Memória) que contém um conjunto de interfaces que permitem manipular facilmente os resultados da execução da expressão na base de dados relacional. A descrição das interfaces que compõem esta estrutura é realizada nos próximos parágrafos. 3.3.1.1 Definição da Estrutura Lógica de Memória (ELM) No caso de execução de uma expressão CRUD do tipo Select é retornada uma tabela de dados com as linhas e colunas resultantes da execução dessa instrução na base de dados relacional. Esta tabela é transformada em objetos, que podem ser manipulados na linguagem de programação utilizada. No caso do java a transformação ocorre para um objeto do tipo ResultSet (JDBC) e em ADO.net para um objeto do tipo DataSet. Os tipos presentes nas tabelas resultantes da execução das instruções CRUD são automaticamente transformados pela camada de software intermédia utilizada (JDBC e ADO.Net) em tipos existentes na linguagem de programação (Por exemplo: o tipo nvarchar em SQL Server é convertido no tipo String em java e c#, mapeamento pode ser analisado em [Oracle, '12k]). Para possibilitar a interação do utilizador com esta tabela foram criados métodos por 56 Mestrado Integrado em Engenharia de Computadores e Telemática defeito para movimentação na tabela, leitura, inserção, atualização de elementos e também para possibilitar a remoção de linhas. Estes métodos compõem a estrutura designada por estrutura lógica de memória (ELM), que foi criada com o objetivo de ser robusta e fácil de utilizar, sendo o nome dos próprios métodos intuitiva o suficiente, para dar ao utilizador a entender a sua funcionalidade. As políticas de controlo de acesso do tipo obrigatório estão presentes nesta estrutura lógica, visto que na construção das interfaces que a compõe, podemos definir para cada campo a permissão de leitura, atualização, inserção e a permissão de remoção de linha. Inicialmente utilizamos uma interface designada por IWrite que nos permitia definir para que objetos da base de dados tínhamos permissão de escrita. Estas permissões eram usadas tanto para operações de update como para operações de insert, mas esta aproximação era demasiado extensa e possibilitava um menor controlo sobre a autorização dos campos. Para obter um maior controlo sobre as estas operações, alterámos o esquema de modo a que estes campos fossem declarados nas interfaces IUpdate se tivesse permissão de atualização de campos ou na interface IInsert, se tivesse permissão de inserção do elemento. Chegámos assim ao esquema representado pela Figura 29 que fornece métodos úteis para manipulações de instruções Select e se aplica ao mesmo tempo políticas de controlo de acesso úteis para proteger dados confidenciais. Inserir novas linhas. Apagar linhas. IDelete IInsert Permite movimentação livre sobre o cursor. IScrollable «interface» ELM IForwardOnly Permite movimentação do cursor apenas para a frente. IRead Ler atributos da ELM. IUpdate Actualizar linhas. Figura 29 - Esquema representativo da Estrutura Lógica de Memória (ELM) 57 ADCA – Arquitetura Dinâmica de Controlo de Acesso      Esta estrutura é constituída pelas seguintes interfaces: IRead: define os atributos que podem ser lidos; IUpdate: define os atributos que podem atualizados; IInsert: define os atributos que podem ser inseridos; Foram ainda definidas as interfaces para movimentação da tabela; IScrollable : define se a movimentação pelos dados é realizada livremente; IForwardOnly: define se a movimentação pelos dados é realizada apenas para a próxima linha da tabela. Nos próximos parágrafos apresentam-se os métodos que compõem estas interfaces e exemplos de utilização das mesmas. 3.3.1.1.1 Movimentação dentro da ELM Para movimentação dentro da tabela resultante da execução da expressão Crud do tipo Select, existem duas aproximações:   Livre: o cursor pode ser movido para qualquer posição dentro da tabela; Restrita: o cursor pode apenas ser movido para a próxima linha da tabela. Deste modo, na definição do esquema de negócio podíamos estender uma interface com uma destas aproximações para movimentação do cursor, oferecendo mais controlo das operações. Para tal, foram criadas duas interfaces:   Interface IScrollable: segue a aproximação livre e fornece métodos (Descritos na Tabela 10) para um controlo livre do cursor; Interface IForwardOnly: segue a aproximação restrita e fornece apenas um método, para movimentação do cursor para a linha seguinte, designado de . Com a utilização dos métodos fornecidos por estas interfaces, podemos colocar o cursor de seleção na posição requerida de modo a podermos executar de seguida métodos que manipulam os campos da linha selecionada. 58 Mestrado Integrado em Engenharia de Computadores e Telemática Método Descrição Permite o movimento do cursor, para a próxima linha da tabela, retorna verdadeiro, se foi possível mover, ou falso se não. Permite o movimento do cursor para uma posição absoluta, estabelecida, pelo utilizador, retorna verdadeiro, se foi possível mover ou falso, se não. Permite o movimento do cursor para uma posição relativa em relação à posição atual, estabelecida, por um offset definido, pelo utilizador, retorna verdadeiro, se foi possível mover ou falso, se não. Move o cursor para a posição anterior à primeira linha da tabela. Move o cursor para a primeira linha da coluna, retorna verdadeiro, se foi possível mover ou falso, se não. Move o cursor para a linha a seguir à última linha da tabela. Move o cursor para a última linha da coluna, retorna verdadeiro, se foi possível mover ou falso, se não. Tabela 10 - Descrição dos métodos da interface IScrollable 3.3.1.1.2 Leitura de Campos da ELM A leitura dos valores dos campos que compõem a ELM é realizada pela interface IRead, na qual são definidos o nome dos elementos e o respetivo tipo. Como exemplo prático, considere a existência de uma tabela Aluno com o esquema da Figura 30. Considere também a seguinte expressão CRUD : Select * FROM Aluno Esta expressão permite obter todos os campos da tabela Aluno. A execução desta expressão CRUD permite obter uma tabela com o valor dos campos Id, Nome, Idade e Morada, sendo que os tipos são automaticamente convertidos para a linguagem de 59 ADCA – Arquitetura Dinâmica de Controlo de Acesso programação utilizada pelas AP) s de interação com a base de dados JDBC e ADO.net . Podemos verificar que os campos Id e idade são do tipo int em java e c# e os campos nome e morada têm o tipo String (Para conversão de tipos ver [Oracle, '12k]). Figura 30 - Tabela exemplo Aluno A permissão para leitura dos campos da ELM é realizada a partir da Interface IRead. Neste caso, o administrador ou o programador de software procediam à criação dos seguintes campos na interface IRead para permitir a sua leitura: Estes métodos possuem como retorno o tipo de dados do campo, e como designação a junção da vogal r (para distinguir operações, representa métodos que permitem a leitura de campos) com o nome do campo a ser lido. Quando os esquemas de negócio fossem adicionados à lógica de negócio pelo gestor de negócio, seria automaticamente criada a implementação destes métodos, que permitem a leitura do valor do campo da linha da tabela onde o cursor se encontra. Assim, com a interface IRead podemos discriminar quais os campos que podem ser lidos. No caso anterior teríamos permissão para leitura de todos os campos da tabela Aluno. 3.3.1.1.3 Inserção de Campos na ELM A interface IInsert é constituída por métodos de apoio à inserção de elementos na ELM e também pelos campos que podem ser inseridos. Os métodos de gestão do protocolo de inserção de campos (Ver Tabela 11) são sempre obrigatórios nesta interface. No início da inserção é chamado o método beginInsert que move o cursor para uma entrada onde existe uma linha temporária com os campos correspondentes da tabela. Estes campos podem ser alterados com a execução dos métodos de inserção de elementos. 60 Mestrado Integrado em Engenharia de Computadores e Telemática Os métodos utilizados para inserção de elementos recebem como parâmetro um objeto com um tipo correspondente ao tipo do campo corretamente convertido para a linguagem de programação utilizada, enquanto a designação do método começa pela vogal i (designando a inserção de elemento) em junção com o nome do campo. Método Descrição Permite o início da inserção, move o cursor para a linha temporária de inserção. Permite a finalização da inserção dos elementos e as alterações são repercutidas na base de dados, o utilizador pode ainda definir se o cursor volta à posição antes da inserção ou se mantém a posição atual. Permite cancelar a inserção de elementos, não havendo alterações à tabela. Tabela 11 - Descrição dos métodos da interface IInsert Tomando como exemplo a tabela da Figura 30 e a seguinte expressão CRUD: Select * FROM Aluno, Para inserção de uma nova linha com os campos Id e Nome, criávamos os seguintes métodos na interface IInsert: Estes métodos permitem inserir o valor dos campos na nova linha temporária, sendo as alterações (criação de uma nova linha) repercutidas para a base de dados, com a execução do método endInsert. Um exemplo de utilização dos métodos de inserção encontra-se mais à frente no ponto 3.3.1.3. 61 ADCA – Arquitetura Dinâmica de Controlo de Acesso 3.3.1.1.4 Atualização de Campos da ELM A interface IUpdate é constituída por métodos (também obrigatórios) de apoio a atualização de elementos da tabela (ver Tabela 12). Neste caso, a definição dos métodos de atualização é semelhante à da interface IInsert. A única mudança é a alteração da vogal inicial i para u, designando uma operação de update: O início da atualização dos campos é realizado com a execução do método beginUpdate. Os métodos criados pelo utilizador (uId e uNome), permitem a alteração do valor do campo da linha selecionada. As alterações são apenas realizadas com a execução do método updateRow, podendo estas ser canceladas com execução do método cancelUpdate. Um exemplo de utilização dos métodos de atualização da ELM encontra-se mais à frente no ponto 3.3.1.3. Método Descrição Inicializa o início da atualização da linha selecionada da tabela. Permite a atualização da tabela e a repercussão das alterações para a base de dados. Permite cancelar a atualização de elementos da linha selecionada. Tabela 12 - Descrição dos métodos da interface IUpdate 3.3.1.1.5 Remoção de Linhas da ELM A remoção de linhas é permitida, se for realizada a extensão à interface IDelete (Interface já criada por defeito). Esta é constituída pelo método deleteRow() que permite apagar uma linha da tabela. Quando executada, a linha da tabela selecionada pelo cursor é eliminada e as alterações repercutidas na base de dados relacional. 62 Mestrado Integrado em Engenharia de Computadores e Telemática 3.3.1.2 Desenvolvimento dos Métodos Referentes aos Esquemas de Negócio Os métodos desenvolvidos para os esquemas de negócio utilizam software intermédio para interação com a base de dados, nomeadamente, JDBC e ADO.net. Enquanto no Java a implementação destes é realizada de uma forma dinâmica em tempo de execução, no C# foi criada uma implementação estática para demonstrar que estes métodos podem ser implementados utilizando várias tecnologias. Nos próximos parágrafos descrevem-se as estratégias utilizadas para a implementação destes métodos, utilizando as AP) s JDBC e ADO.net. 3.3.1.2.1 Implementação dos Métodos Construtores Em java, no qual se utiliza a API JDBC, o método construtor permite a criação de um objeto PreparedStatement através da execução do método prepareStatement do objeto Connection. A utilização do objeto PreparedStatement deve-se a duas vantagens em relação a objetos Statement [Oracle, '12l]:  Na maioria dos casos a expressão CRUD é imediatamente enviada para o SGBD, onde é compilada. Isto permite que com a sua chamada a instrução seja apenas  executada e não compilada novamente, poupando tempo de execução; Este objeto permite a execução de expressões CRUD com ou sem parâmetros, abrangendo assim todas as expressões CRUD que possam ser utilizadas. O construtor em JDBC é criado de forma diferente para expressões do tipo Select ou para expressões IUD (Insert, Update e Delete). Na Figura 31 temos a implementação do método de construção de um serviço de negócio em JDBC para expressões do tipo Select. Figura 31 - Implementação do método construtor em JDBC Nesta figura podemos verificar que guardamos tanto a conexão, como a expressão CRUD na nossa ELM. Em seguida criámos um objeto do tipo PreparedStatement que 63 ADCA – Arquitetura Dinâmica de Controlo de Acesso permite a execução de instruções CRUD na base de dados. O método utilizado para a construção deste objeto designa-se de prepareStatement e tem como parâmetros de entrada:   A variável crud contendo a expressão CRUD; O tipo de movimentação possível dentro do ResultSet: neste caso especificamos para todas as expressões Select o tipo TYPE_SCROLL_SENSITIVE , que permite uma movimentação livre dentro do ResultSet. Este tipo de movimentação é restringida se estendermos a interface IForwardOnly, pois apenas permite o  movimento para a próxima linha; O modo do ResultSet: permite indicar se apenas se pode efetuar a leitura de campos ou se estes podem ser atualizados. Neste caso utilizamos o modo CONCUR_UPDATABLE , permitindo tanto a leitura como a atualização. Na Figura 32 encontramos a implementação do construtor para expressões IUD. Neste caso, a única diferença encontra-se na forma como o objeto PreparedStatement é criado. Em expressões IUD não é necessário um ResultSet, pois não existe retorno de dados do SGBD. Como tal, omitimos os parâmetros para definir o modo de funcionamento do ResultSet e passamos apenas como parâmetro a variável crud referente à expressão CRUD a ser executada na base de dados. Figura 32 - Implementação do método construtor em JDBC para expressões IUD Na API ADO.net o método construtor é criado através da utilização de um objeto SqlDataAdapter, que permite a execução de comandos e de um objeto DataSet para armazenamento dos resultados obtidos da base de dados. Na Figura 33 encontramos a implementação do método construtor para ADO.net. Tal como no caso do JDBC, guardamos a conexão para a base de dados (variável cnctn) e a expressão Crud (variável crud). Em seguida criámos dois objetos, o objeto ds do tipo DataSet e o objeto da do tipo SqlDataAdapter. Estes objetos permitem a interação com a base de dados, sendo a implementação do construtor neste caso, igual quer para expressões CRUD do tipo Select quer para expressões CRUD do tipo IUD (Insert, Update, Delete). 64 Mestrado Integrado em Engenharia de Computadores e Telemática Figura 33 - Implementação do Construtor em ADO.net 3.3.1.2.2 Implementação dos Métodos de Execução de Expressões CRUD A execução das expressões CRUD na base de dados é realizada pela chamada ao método execute presente na interface IExecute. A implementação deste método é relativamente simples em JDBC. Para a execução de instruções CRUD do tipo IUD (Insert, Update, Delete), utiliza-se o método executeUpdate, o qual permite a execução da instrução CRUD na base de dados relacional e a obtenção do número de linhas alteradas (Figura 34). Figura 34 - Implementação do método execute para instruções IUD em JDBC No caso de instruções do tipo Select é realizada a execução do método executeQuery. Este método permite a execução da expressão Select na base de dados e a obtenção dos resultados através de um objeto ResultSet. Figura 35 - Implementação do método execute para instruções Select em JDBC Como podemos verificar pela Figura 35, o objeto ResultSet obtido através da execução do método executeQuery é guardado na ELM através da variável rs. No caso de um método execute com parâmetros de entrada e para estabelecer valores na expressão CRUD, utilizamos o método set do objeto PreparedStatement (Figura 36). 65 ADCA – Arquitetura Dinâmica de Controlo de Acesso Figura 36 - Implementação do método execute para expressões com parâmetros dinâmicos em JDBC Como podemos verificar pela Figura 36, colocamos o valor dos parâmetros na expressão CRUD através da utilização dos métodos set do JDBC, antes da execução da expressão na base de dados. No caso do ADO.net, utiliza-se a Classe SqlDataAdapter(da) para execução da expressão CRUD. Para instruções CRUD do tipo IUD a utilização do objeto SqlDataAdapter é diferente:    Para inserção utiliza-se a propriedade InsertCommand. Para atualização utiliza-se a propriedade UpdateCommand. Para apagar linhas utiliza-se a propriedade DeleteCommand. A utilização destas propriedades em conjunção com o método ExecuteNonQuery, permite a execução da expressão IUD na base de dados e a obtenção do número de entradas afetadas. Na Figura 37 encontramos um exemplo de implementação para uma expressão do tipo Insert. Neste caso utiliza-se a propriedade InsertCommand, à qual atribuímos o nosso comando que contém a expressão CRUD (da.InsertCommand=Command). Em seguida executamos a expressão na base de dados com o método ExecuteNonQuery. Figura 37 - Implementação do método execute para expressões Insert em ADO.net No caso de expressões Select utilizamos a propriedade SelectCommand do objeto SqlDataAdapter e preenchemos o DataSet com os dados obtidos, sendo depois utilizado um objeto DataTable para permitir uma melhor manipulação dos dados (Figura 38). 66 Mestrado Integrado em Engenharia de Computadores e Telemática Figura 38 - Implementação do método execute para expressões Select em ADO.net Em ADO.net, a definição de expressões CRUD com parâmetros é diferente. Neste caso substitui-se o ? por @nome, sendo nome o nome do atributo. Exemplo: JDBC: Select * from Products where ProductId=? ADO.net: Select * from Products where ProductId=@id No caso de um método execute com parâmetros de entrada e para estabelecer valores na expressão CRUD, utilizamos uma expressão Regex [Zytrax, '12] para obter o nome dos atributos, de modo a podermos efetuar a atribuição de valores. Figura 39 - Implementação do método execute com parâmetros em ADO.net 67 ADCA – Arquitetura Dinâmica de Controlo de Acesso Na Figura 39 encontramos uma implementação exemplo de um método execute com parâmetros em ADO.net. Inicialmente criamos o objeto SqlCommand com a expressão CRUD, seguindo-se da atribuição do valor aos vários parâmetros através do método AddWithValue da propriedade Parameters. O resto da implementação é igual à implementação dos métodos execute sem parâmetros. 3.3.1.2.3 Implementação dos Métodos para Movimentação dentro da ELM A implementação dos métodos para movimentação em ambas as AP) s é direta. Em JDBC utilizamos diretamente os métodos existentes nesta API para movimentação no ResultSet Next,Last,etc… . No caso do ADO.net utilizamos uma variável inteira, designada de cursor, que contém o índice da linha selecionada. Este índice é alterado consoante o método chamado. 3.3.1.2.4 Implementação dos Métodos para Leitura de Campos da ELM Os métodos para leitura de valores do campo são facilmente implementados, tanto para ResultSet(JDBC), como no DataSet(ADO.net). No caso do JDBC utilizamos um dos métodos get do ResultSet para obtenção do valor (Figura 40), enquanto no ADO.net obtemos o valor de uma linha relativa (dr) da DataTable (onde os dados estão armazenados), especificando o nome da coluna que contém o valor a que queremos aceder (Figura 41). Figura 40 - Implementação do método de leitura do valor de um campo em JDBC Figura 41 - Implementação do método de leitura do valor de um campo em ADO.net 68 Mestrado Integrado em Engenharia de Computadores e Telemática 3.3.1.2.5 Implementação dos Métodos de Atualização de Campos da ELM Os métodos para escrita de valores em campos tanto para operações de atualização como para operações de inserção são implementados através da utilização do comando Update em JDBC (Figura 42) e da simples atribuição de valores a uma linha (DataRow) da DataTable em ADO.Net (Figura 43). Figura 42 - Implementação dos métodos de escrita em JDBC Figura 43 - Implementação dos métodos de escrita em ADO.net 3.3.1.2.6 Implementação dos Métodos Obrigatórios da Interface IUpdate A atualização de elementos é realizada através da utilização da interface IUpdate da ELM, que contém métodos especializados para este tipo de operações. O método beginUpdate permite sinalizar o início de uma operação de atualização e apenas contém instruções para sinalização de estado. O método updateRow realiza a atualização dos dados alterados e a repercussão dos mesmos para a base de dados relacional. No JDBC utiliza-se o método updateRow do objeto ResultSet (Ver Figura 44). No ado.net é utilizado o método Update do objeto DataAdapter (Ver Figura 45). 69 ADCA – Arquitetura Dinâmica de Controlo de Acesso Figura 44 - Implementação do método updateRow em JDBC Figura 45 - Implementação do método updateRow em ADO.net O método cancelUpdate permite cancelar as alterações entretanto realizadas. No JDBC é utilizado o método cancelRowUpdates e no ADO.net é utilizado o método RejectChanges. Estes métodos permitem rejeitar as alterações realizadas ao ResultSet e DataSet respetivamente. 3.3.1.2.7 Implementação dos Métodos Obrigatórios da Interface IInsert A inserção de elementos é realizada através da utilização da interface IInsert da ELM, que contém métodos especializados para este tipo de operações. O método beginInsert permite a movimentação do cursor para uma linha temporária da tabela. No caso do JDBC, utilizamos o método moveToInsertRow do objeto ResultSet, que trata da criação e movimentação do cursor para essa linha No caso do ADO.net, temos que adicionar uma nova linha à DataTable. Estes dois casos encontram-se expostos na Figura 46 e Figura 47 respetivamente. Figura 46 - Implementação do método beginInsert em JDBC 70 Mestrado Integrado em Engenharia de Computadores e Telemática Figura 47 - Implementação do método beginInsert em ADO.net O método endInsert permite a inserção de elementos no ResultSet e DataSet e a repercussão das alterações para a base de dados. Este método tem ainda um parâmetro de entrada (um booleano) que permite indicar se é necessário voltar à posição original do ELM, antes do início da inserção. Figura 48 - Implementação do método endInsert em JDBC Figura 49 - Implementação do método endInsert em ADO.net Na Figura 48 temos a implementação do método endInsert, no caso de utilização da API JDBC. O método insertRow é utilizado para inserção de nova linha no ResultSet e na base de dados, enquanto o método moveToCurrentRow é utilizado para voltar à última posição conhecida antes da movimentação para a linha temporária. No caso do ADO.net (Ver Figura 49), utilizamos o comando update do Objeto DataAdapter, que recebe como 71 ADCA – Arquitetura Dinâmica de Controlo de Acesso parâmetro a nova linha para inserção. No caso de ser necessária movimentação para a última linha conhecida, utilizamos a variável cursor que guarda o último índice de linha conhecido. O cancelamento das alterações realizadas pela inserção é realizado de maneira diferente para JDBC e ADO.net. No caso do JDBC, basta a movimentação para a última linha conhecida (utilizando o método moveToCurrentRow), visto que a linha de inserção é uma linha temporária que não afeta o ResultSet. No caso do ADO.net, temos que eliminar a última linha adicionada e voltar à última linha selecionada que se encontra na variável cusor (Figura 50). Figura 50 - Implementação do método cancelInsert em ADO.net 3.3.1.3 Exemplos de Utilização dos Esquemas de Negócio Neste capítulo apresentamos exemplos práticos para melhor demonstrar os modelos desenvolvidos nos pontos anteriores. Considere a existência de uma tabela Notas conforme o esquema da Figura 51, que contém o nome e a nota de um aluno, e considere também a existência de três entidades: administrador, professor e aluno. Figura 51 – Tabela de exemplo de caso prático Notas As permissões para o Administrador, Professor e Aluno estão representadas na Tabela 13, Tabela 14 e Tabela 15 respetivamente. 72 Mestrado Integrado em Engenharia de Computadores e Telemática Campo Inserção Atualização Leitura Apagar Nome Sim Sim Sim Sim Nota Sim Sim Sim Tabela 13 - Tabela de permissões para Administrador Campo Inserção Atualização Leitura Nome Não Não Sim Nota Não Sim Sim Apagar Não Tabela 14 - Tabela de permissões para Professor Campo Inserção Atualização Leitura Nome Não Não Sim Nota Não Não Sim Apagar Não Tabela 15 - Tabela de permissões para Aluno    Neste caso é necessária a construção de três esquemas de negócio: Nota_admin para o caso do administrador; Nota_professor para o caso do professor; Nota_aluno para o caso do aluno; Construção dos esquemas de negócio Vamos apresentar nos próximos parágrafos os esquemas da ELM utilizados para resolução do problema proposto. O esquema da ELM para a entidade Nota_admin está representado na Figura 52. Como podemos verificar esta é a única entidade que possui autorização para apagar uma linha da tabela. Como tal é estendida a interface IDelete, permitindo ao administrador ter acesso ao método deleteRow. As interfaces IInsert e IUpdate são também criadas com os métodos necessários para o administrador inserir e atualizar os campos a que tem acesso. 73 ADCA – Arquitetura Dinâmica de Controlo de Acesso … INome INota IDelete IScrollable IInsert «interface» INota_admin IForwardOnly IRead IUpdate rNome rNota … uNome uNota Figura 52 - Interface ELM relativa ao administrador No caso do Professor o esquema ELM desenvolvido encontra-se na Figura 53. IScrollable «interface» INota_professor IForwardOnly … uNota rNome rNota IRead IUpdate Figura 53 - Interface ELM relativa ao professor Nesta figura podemos verificar a não existência da interface IDelete e IInsert, visto que o Professor não tem nem permissão para apagar linhas, nem permissão para inserção de novas linhas. Na interface IUpdate apenas se atribui permissão para atualização do campo Nota, sendo retirado o método uNome. No caso do Aluno o esquema ELM desenvolvido encontra-se na Figura 54. 74 Mestrado Integrado em Engenharia de Computadores e Telemática IScrollable «interface» INota_aluno IForwardOnly rNome rNota IRead Figura 54 - Interface ELM relativa ao aluno Neste caso apenas se atribuiu permissão de leitura para os dados da tabela conforme as especificações. A construção deste conjunto de Esquemas de Negócio possibilita a especificação de políticas internas para permitir ou negar o acesso a campos de tabelas da base de dados. A lógica de negócio é um conjunto destes esquemas de negócio. O desenvolvimento de aplicações é facilitado, com a utilização de ferramentas de desenvolvimento como netbeans ou visualstudio, devido à visualização dos métodos a que temos acesso durante a fase de desenvolvimento. Na Figura 55 e Figura 56 encontramos a informação sobre os métodos acessíveis ao administrador e aluno respetivamente. Figura 55- Métodos acessíveis ao administrador 75 ADCA – Arquitetura Dinâmica de Controlo de Acesso Figura 56 - Métodos acessíveis ao aluno Exemplos de utilização dos Esquemas de Negócio Para exemplo de utilização destes Esquemas de Negócio, considere que temos permissão no servidor de políticas para o Esquema de Negócio desenvolvido nota_admin e que foi corretamente instanciado pelo gestor de negócios com a seguinte expressão CRUD: Select * From Notas Esta expressão permite visualizar todos os campos da tabela notas. Na Figura 57 encontramos o código utilizado para o caso do administrador querer imprimir uma listagem com as notas de todos os alunos e os respetivos nomes. Figura 57 - Exemplo de impressão de listagem com utilização dos serviços de negócio Neste caso, executamos o comando execute para execução da expressão CRUD na base de dados relacional correspondente, sendo a ELM preenchida com os dados. Em seguida é utilizado um ciclo while que executa o método moveNext. Este método retorna 76 Mestrado Integrado em Engenharia de Computadores e Telemática um booleano, inferindo se existe uma entrada na próxima linha da tabela. Deste modo percorremos todos os resultados, movendo o cursor para a próxima linha. Para acesso ao valor dos campos utilizamos os métodos existentes na interface IRead, rNome e rNota, para obtenção de nome e da nota respetiva. Considere agora, o caso em que administrador quer inserir uma nova entrada com o nome e nota. Neste caso é utilizada a interface IInsert, como pode ser visto pelo código da Figura 58. Figura 58 - Exemplo de inserção de nova linha com utilização dos serviços de negócio Neste caso, sinalizamos o início de inserção com o método beginInsert e de seguida usamos os métodos iNome e iNota para inserir o nome e a nota nesta nova linha temporária. Com a execução do método endInsert é terminada a inserção da nova entrada e as alterações são repercutidas para a base de dados. Considere que o administrador se enganou na inserção da nota e quer alterara-la. O código exemplo para este caso encontra-se na Figura 59. Figura 59 - Exemplo de atualização de campo com utilização dos serviços de negócio Inicialmente procedemos à execução do CRUD através do método execute. Em seguida é utilizado um ciclo while para encontrar a entrada inserida, comparando o nome 77 ADCA – Arquitetura Dinâmica de Controlo de Acesso da linha atual da tabela com o nome inserido anteriormente Rui ; Quando for encontrada a entrada com o nome correspondente, começamos a atualização da linha com o comando beginUpdate e de seguida atualizamos o campo com a utilização do comando uNota. Por fim executamos o comando updateRow para repercutir as alterações realizadas na base de dados correspondente. Para eliminar esta linha recentemente inserida podemos utilizar o comando deleteRow, como se pode ver pela Figura 60. Figura 60 - Exemplo de remoção de linha com utilização dos serviços de negócio Conseguimos assim desenvolver um sistema fácil de trabalhar e eficaz, onde se aplicam políticas de acesso obrigatórias internas, através da extensão de interfaces e da criação de métodos especializados nestas. 3.3.2 Gestor de Negócios     O gestor de negócios é o componente que permite: Obtenção de conexão à base de dados para os serviços de negócio operarem e a utilização de transações para um maior controlo das operações na base de dados; Construção em tempo real da lógica de negócio; Carregamento dinâmico em tempo de execução dos serviços de negócio; Aplicação das políticas de acesso aos utilizadores. Uma introdução à criação de serviços de negócio é apresentada no paper [Brant, '00]. Este apresenta a criação dinâmica de relatórios, que mapeiam as tabelas da base de dados relacionais em objetos funcionais que podem ser utilizados pelos utilizadores. Inicialmente no nosso caso, tal como no paper, os esquemas de negócio eram predefinidos antes da execução da aplicação. Isto permite a existência de menos bugs e erros. Este tipo de solução não é dinâmica o suficiente e por conseguinte, teríamos que criar um sistema 78 Mestrado Integrado em Engenharia de Computadores e Telemática flexível e configurável pelo utilizador. Neste paper são também introduzidos os objetos query, cujo principal objetivo é a exibição da informação resultante do query executado, mas existia um problema nesta perspetiva. Consideremos o caso em que tínhamos uma tabela com as vendas realizadas para vários países e queríamos a seleção separada de informações sobre vendas, para Portugal ou Espanha.   Neste caso tínhamos duas soluções: Construção de dois Esquemas de Negócio para cada venda realizada; Criação de um Esquema de Negócio, adaptável às duas vendas realizadas. A primeira solução não era fazível para o caso de existência de numerosas vendas. Dai a nossa solução foi o carregamento dinâmico de diferentes expressões CRUD. Neste caso, definiríamos no servidor de políticas duas expressões CRUD, correspondentes a vendas para Portugal e Espanha e na instanciação do serviço de negócio era escolhido qual a expressão CRUD a utilizar. Assim o utilizador cria um esquema de negócio com os campos a que pretendia aceder como se pode verificar no ponto 3.3.1.1, colocando os campos referentes às duas tabelas. Com a criação deste tipo de interfaces, o utilizador pode de seguida, realizar o carregamento deste esquema de negócio através do gestor de negócio, escolhendo qual a expressão CRUD que quer executar. Com a criação dinâmica em tempo de execução da lógica de negócio de acordo das políticas e o carregamento dinâmico da expressão CRUD, temos um sistema flexível e capaz de se adaptar dinamicamente às políticas de controlo de acesso. Após definição das necessidades para responder ao problema proposto, chegamos ao seguinte esquema geral, que se encontra na Figura 61. Neste esquema geral, podemos verificar a existência de uma classe principal, designada de Manager, que permite o acesso a todas as outras interfaces. Esta contém o método getInstance, para instanciação do gestor de negócios. Este método recebe cinco parâmetros, sendo os primeiros três referentes aos dados para login do utilizador na base de dados relacional, constituídos por:    un: Correspondente ao username do utilizador para login na base de dados relacional onde serão executadas as expressões CRUD; password: Correspondente à password do utilizador para login na base de dados relacional; urlDB: Corresponde ao url para ligação à base de dados onde são executadas as expressões CRUD. 79 ADCA – Arquitetura Dinâmica de Controlo de Acesso Gestor de Negócios «interface» IAdaptation +addCRUD(in crudId : int, in crud : string) +removeCRUD(in crudId : int) +addBusinessSchema(in bs : IBusinessSchema_i) +removeBusinessSchema(in bs : IBusinessSchema_i) «interface» IManager «interface» IUser +getBusinessSession() : ISession Manager -Manager() +getInstance(in un : string, in pw : string, in urlDB : string, in urlPolicyManager : string) : IManager * Session -conn : DbConn +Session(in un : string, in pwd : string, in url : string) 1 «interface» ISession +businessService(in bs : IBusinessSchema_i, in crudId : int) : IBusinessSchema_i +releaseBusinessSession() ITransaction BusinessEngine * Lógica de Negócio Figura 61 - Esquema geral do Gestor de Negócios 80 1 Mestrado Integrado em Engenharia de Computadores e Telemática O próximo parâmetro corresponde ao url de configuração para ligação ao servidor de políticas e este é internamente composto pela seguinte sintaxe: )P: )p do servidor : Porta do servidor ;usr: username ;pwd: password ;app: App ; Onde configuramos os vários campos separando-os por ponto e vírgula. Exemplo: )p:localhost:9 ;usr:usr ;pwd:usr ;app:App No campo ip é colocado o ip do gestor de políticas e a porta separados por :. No campo usr e pwd, são colocados o username e a password respetivamente. Por último, no campo App é colocada uma referência para a aplicação a ser utilizada. Depois da correta instanciação do gestor de negócios, este constrói a lógica de negócio partindo das políticas de controlo de acesso definidas no servidor de políticas. Esta construção é realizada através da interface IAdaptation a qual é escondida do utilizador. Com a correta criação da lógica de negócio, o utilizador procede à obtenção de uma sessão (classe Session ) através do método getBusinessSession da interface IUser. Esta sessão fornece uma ligação à base de dados (onde se encontram os dados a serem acedidos pelos serviços de negócio) e permite o carregamento dos serviços de negócio que compõem a lógica de negócio. Nos próximos parágrafos são apresentados em detalhe, a forma como as sessões e transações são geridas, e o modo como o gestor de negócios constrói e gere a lógica de negócio. 3.3.2.1 Sessões e Transações Para obter conexão à base de dados relacional utilizamos um conjunto de sessões. Uma sessão representa uma forma interativa de troca de informação, conhecida também como diálogo, conversação ou reunião. Por cada sessão, um utilizador possui uma ligação à base de dados relacional na qual são executados os métodos fornecidos pela lógica de negócio. 81 ADCA – Arquitetura Dinâmica de Controlo de Acesso Session -conn : DbConn +Session(in un : string, in pwd : string, in url : string) «interface» ISession +businessService(in bs : IBusinessSchema_i, in crudId : int) : IBusinessSchema_i +releaseBusinessSession() ITransaction Figura 62 - Modelo do conceito de Sessão Implementado Para obter uma conexão diferente por cada sessão foi criado o construtor Session (Ver Figura 62). Este recebe como parâmetros: o nome de utilizador, a password e o url referente à localização da base de dados. Com a sua chamada é criada uma conexão para a base de dados relacional, que é armazenada na variável privada Conn. O método businessService (da inteface ISession) permite retornar instâncias dos serviços de negócio. Este método é descrito em detalhe no exemplo mais à frente. Por último, o método releaseBusinessSession, quando executado, liberta todos os recursos (Serviços de negócio) associados à sessão. A manipulação de transações é realizada a partir da interface ITransaction. Esta interface fornece métodos para alterar o nível de isolamento, reverter alterações efetuadas a base de dados e possibilitar a utilização de savepoints. Um utilizador pode estabelecer um savepoint ou um marcador dentro de uma transação. Este marcador define a localização à qual uma transação pode voltar, se parte da transação for cancelada condicionalmente. Os métodos da interface ITransactions estão descritos na Tabela 16. Por defeito, por cada sessão iniciada, o valor de AutoCommit é verdadeiro. Isto indica que por cada execução de um método dos serviços de negócio, as alterações são imediatamente enviadas para a base de dados relacional. Para utilização das transações temos que executar o método setAutoCommit com parâmetro de entrada, um booleano com valor falso. Deste modo, o envio das alterações é realizado apenas quando necessário. 82 Mestrado Integrado em Engenharia de Computadores e Telemática Métodos Descrição Envia as alterações efetuadas para a base de dados. Obtém o nível de isolamento das transações. Liberta o SavePoint. Cancela uma transação inteira. A transação retorna ao SavePoint especificado e cancela todas as alterações efetuadas na base de dados. Se autoCommit a verdadeiro, existe sempre um commit (envio da informação) a seguir à execução de cada CRUD. Por defeito, todos os CRUD são imediatamente enviados para a base de dados, aquando da sua execução. Cria um SavePoint e retorna o objeto que o representa. Cria um SavePoint com um nome específico e retorna o objeto que o representa. Especifica o nível de isolamento das transações. Tabela 16 - Descrição dos métodos utilizados nas operações de transações Como podemos ver pelo exemplo da Figura 63, colocamos o envio automático de alterações a falso e realizamos commit (envio) das alterações apenas no fim da chamada de todos os comandos necessários, sendo estes enviados juntos como uma unidade singular de trabalho. Caso ocorra um erro no envio das alterações, a exceção é tratada no catch, com uma operação de rollback, que reverte as alterações realizadas durante a transação. Deste modo, possuímos um maior controlo sobre o conjunto de alterações que 83 ADCA – Arquitetura Dinâmica de Controlo de Acesso são efetuadas na base de dados e podemos reverter alterações que poderiam deixar a base de dados num estado inconsistente. Figura 63 - Exemplo de utilização de transações Nos próximos parágrafos apresentam-se as estratégias utilizadas para a realização da gestão da lógica de negócio. 3.3.2.2 Gestão da Lógica de Negócio O gestor de negócios precisa de armazenar informações sobre quais os esquemas de negócio e expressões CRUD existentes. Isto permite ao gestor de negócio realizar a correta gestão da lógica de negócio. Para armazenar as informações sobre os esquemas de negócio e respetivos CRUDs no gestor de negócios foi utilizada a classe HashMap [Oracle, '12b] em Java e a classe HashTable [Microsoft, '12e] em C#. Ambas as classes fornecem conjuntos chave-valor. A diferença chave entre elas é que o acesso numa HashTable é sincronizado mas no nosso caso é irrelevante visto que apenas uma entidade adiciona os elementos ao gestor de negócio. Estas classes permitem a criação de uma estrutura de dados, que utilizam uma função hash para mapeamento dos valores de identificação conhecidos como chaves e os seus valores associados. Para adição de elementos (chavevalor) é utilizado o método put do objeto hashmap em java, ou o método Add da hashtable em C#, como podemos verificar pela Figura 64. 84 Mestrado Integrado em Engenharia de Computadores e Telemática Figura 64 - Adição de elementos a HashMap e HashTable em Java e C# Para remoção de chaves e respetivos valores é utilizado o método remove tanto no hashmap em java, como na hashtable em C#, como podemos verificar pela Figura 65. Figura 65 - Remoção de elementos do HashMap e da HashTable em Java e C# A verificação de existência de uma chave é realizada, executando o método containsKey em Java e o método contains em C#, como podemos verificar pela Figura 66. Figura 66 - Verificação de existência de chave no HashMap e HashTable em Java e C# O armazenamento dos esquemas de negócio e expressões CRUD é realizado, utilizando uma conjunção de dois HashMaps/HashTables (Ver Figura 67). Figura 67 - Esquema principal da solução para armazenamento de informações sobre lógica de negócio 85 ADCA – Arquitetura Dinâmica de Controlo de Acesso Podemos verificar que a HashMap1 abrange a HashMap2, e nesta são armazenados como chave a classe correspondente à interface principal dos esquemas de negócio e como valor a hashmap2. Na hashmap2 são armazenados como chave o id da expressão CRUD, tal como na base de dados do servidor de políticas, e como valor a string contendo a expressão CRUD. Temos assim uma estrutura que permite um fácil armazenamento da informação necessária ao gestor de políticas. Para a gestão dos esquemas de negócio e dos respetivos cruds, precisamos de um conjunto de métodos que nos permitam realizar operações de adição e remoção de serviços de negócio, tanto da nossa lógica de negócio, como dos hashmaps/hashtables. Estes métodos estão definidos na interface IAdaptation, cuja descrição dos métodos se mostra na Tabela 17 e o respetivo esquema na Figura 68. Estes métodos estão escondidos do utilizador e são apenas utilizados pelo gestor de negócios para gestão dos esquemas de negócio e CRUDS. A construção dinâmica da lógica de negócio é realizada apenas no Java, como foi referido anteriormente. A versão C# é constituída por uma criação estática da lógica de negócio de modo a demonstrar que a implementação dos métodos dos esquemas de negócio pode ser realizada em várias tecnologias. Método Descrição addCrud Permite a adição ao hashmap/hashtable de uma expressão CRUD. A expressão CRUD é representada pelo seu id (crudid) e pela String contendo a expressão CRUD. A classe bs permite identificar o esquema de negócio e corresponde à interface principal deste. removeCrud Permite a remoção do hashmap/hashtable de uma expressão CRUD com id crudId, a um esquema de negócios representado pela classe bs. addBusinessChema Permite a adição de um esquema de negócio, a criação da classe que o implementa na lógica de negócio, e a sua entrada ao hashmap/hashtable removeBusinessSchema Permite a remoção de um esquema de negócio, tanto do hashmap/hashtable, como da lógica de negócio Tabela 17 - Descrição dos métodos da interface IAdaptation 86 Mestrado Integrado em Engenharia de Computadores e Telemática «interface» IAdaptation +addCRUD(in crudId : int, in crud : string) +removeCRUD(in crudId : int) +addBusinessSchema(in bs : IBusinessSchema_i) +removeBusinessSchema(in bs : IBusinessSchema_i) Figura 68 - Esquema da interface IAdaptation Nos próximos parágrafos vão ser descriminadas as estratégias utilizadas em java para permitir a adição e remoção de esquemas de negócio nos métodos referidos pela interface IAdaptation e a forma como são criadas e carregadas dinamicamente as respetivas implementações em tempo de execução. 3.3.2.2.1 Criação da Lógica de Negócio Em java, os esquemas de negócio são adicionados e armazenados em conjunto num ficheiro contendo todos os esquemas de negócio, constituindo a lógica de negócio. Para armazenamento em java, foi escolhido o formato de compressão jar (JAVA archive) [Oracle, '12g]. Neste tipo de ficheiros podemos armazenar as interfaces correspondentes aos esquemas de negócio e a sua respetiva implementação. Na Figura 69 estão explicitados os passos para o armazenamento em arquivos java. IRead.java IUpdate.java Esquemas de Negócio IRead.class IUpdate.class IRead.class IUpdate.class Esquemas de Negócio Esquemas de Negócio Lógica de Negócio Java Compiler Directorio Figura 69 - Armazenamento de Esquemas de Negócio em Java 87 ADCA – Arquitetura Dinâmica de Controlo de Acesso Os ficheiros .java que contêm as interfaces e a classe de implementação dos esquemas de negócio, são compilados através da ferramenta javaCompiler [Oracle, '12h], sendo depois armazenados em ficheiros .jar.     A utilização do tipo de formato JAR oferece as seguintes vantagens [Oracle, '12g]: Segurança: Podemos assinar digitalmente os conteúdos de um ficheiro jar; Compressão: O formato JAR permite a compressão dos ficheiros para um armazenamento eficiente; Possibilidade de inserção de informações no pacote JAR, tais como fornecedor e versão; Portabilidade: O mecanismo para manipulação de ficheiros jar é uma parte standard da plataforma Java. A leitura e a escrita em ficheiros jar são realizadas com a utilização de duas bibliotecas presentes no java:   java.util.jar.JarInputStream [Oracle, '12d]: permite a leitura de ficheiros jar; java.util.jar.JarOutputStream [Oracle, '12e]: permite a escrita de ficheiros jar. Com a utilização destas streams em conjunto com os objetos JarEntry (fornecido pela biblioteca java.util.jar.JarEntry [Oracle, '12c], que representam uma entrada num ficheiro jar), conseguimos gerir os ficheiros jar de uma maneira eficiente e fácil. Nos próximos parágrafos expõe-se a forma como são armazenados os ficheiros neste tipo de arquivos. 3.3.2.2.1.1 Criação de Ficheiros JAR Para criação de ficheiros jar utilizamos a classe JarOutputStream em conjunto com a classe FileOutputStream, como podemos verificar pela Figura 70. Figura 70 - Criação de arquivo JAR Inicialmente criamos um ficheiro manifesto, que contém informação sobre os ficheiros armazenados (meta-informação). Para a alteração das definições do manifesto, 88 Mestrado Integrado em Engenharia de Computadores e Telemática utiliza-se o comando getMainAtributes().put. No nosso caso, queremos criar apenas um ficheiro manifesto padrão que contenha apenas a versão do manifesto (neste caso 1.0) de modo a tornar o ficheiro jar válido. Em seguida, é obtida uma stream para o ficheiro a ser criado, utilizando o método FileOutPutStream. Este método recebe como parâmetro um objeto String representando o caminho para o ficheiro, que no nosso caso é armazenado na variável tempjar. Por último, é criada uma stream relativa a arquivos jar, através do método construtor JarOutputStream. Este método recebe como parâmetros a nossa stream para o ficheiro (variável stream) e o nosso Objeto Manifesto recentemente criado (manifest). Isto permite a criação de um objeto que possibilita a escrita de conteúdos em ficheiros jar (variável outjar). 3.3.2.2.1.2 Escrita de Entradas em Ficheiros JAR Para escrita em ficheiros jar utilizamos a class JarEntry, como podemos verificar na Figura 71. O construtor desta classe recebe como parâmetro, uma String contendo a localização de uma entrada dentro de um arquivo jar. Neste caso encontramos um exemplo para a criação de um ficheiro dentro de um diretório. Figura 71 - Exemplo de escrita de um ficheiro num arquivo JAR O nome do diretório Business)nterfaces e o nome do ficheiro file são especificados como localização da nova entrada. Esta nova entrada é adicionada ao arquivo jar com utilização do método putNextEntry do objeto JarOutputStream. O objeto JarEntry contém apenas informação acerca de entradas e não o conteúdo das mesmas. Deste modo para a escrita do conteúdo do ficheiro utilizamos o método write do objeto JarOutPutStream. Com a utilização destas bibliotecas conseguimos um armazenamento eficaz das interfaces dos esquemas de negócio e da sua respetiva implementação. 89 ADCA – Arquitetura Dinâmica de Controlo de Acesso 3.3.2.2.2 Construção da Implementação dos Esquemas de Negócio As estratégias utilizadas para a construção dos métodos dos esquemas de negócio foram evidenciadas no ponto 3.3.1.1.2. Para obtenção de informações sobre as várias interfaces que compõem os esquemas de negócio, foi criada uma classe que guarda as várias interfaces e retorna as informações necessárias sobre os métodos para a construção da classe de implementação. Esta classe tem como nome contexto de entidades de negócio e utiliza a AP) Reflection do java para obtenção de informações. Obtenção e separação das interfaces Para obter e separar as várias interfaces que compõem os esquemas de negócio foi desenvolvido um método, o qual recebe como parâmetro a interface principal dos esquemas de negócio. Este armazena as interfaces secundárias que a interface principal estende, através da utilização do método getInterfaces() da API Reflection. Estas interfaces são depois armazenadas num array de objetos do tipo class: A separação das interfaces é realizada com o recurso ao método getName, o qual nos permite obter o nome das interfaces. Com o correto armazenamento e separação das interfaces, procedemos à criação da classe de implementação. Criação da classe de implementação A implementação dos métodos que compõem a classe de implementação dos esquemas de negócio (tal como especificado no ponto 3.3.1) é realizada a partir da informação sobre os métodos que constituem os esquemas de negócio. Os métodos são obtidos para um array de objetos do tipo Method com a utilização do comando getMethods: O array tmp é de seguida analisado utilizando para tal, os métodos descritos na Tabela 18. 90 Mestrado Integrado em Engenharia de Computadores e Telemática Método Descrição getName() Retorna uma String correspondente ao nome do método getParameterTypes() Retorna um array com os tipos dos parâmetros do método getReturnType() Retorna o tipo de retorno do método Tabela 18 - Descrição dos métodos da classe Method Com a utilização destes métodos é facilmente obtida a informação para construção da classe de implementação. Compilação Depois da construção da classe de implementação é necessário realizar a sua compilação. Para tal utiliza-se a interface JavaCompiler[Oracle, '12h] da biblioteca javax.tools.JavaCompiler. Esta interface permite a invocação dos compiladores da linguagem de programação Java em tempo de execução. Deste modo podemos compilar os esquemas de negócio em tempo de execução, procedendo-se em seguida ao seu armazenamento num ficheiro jar, criando-se assim a respetiva lógica de negócio. 3.3.2.2.3 Carregamento Dinâmico dos Serviços de Negócio Com os esquemas de negócio e a respetiva Implementação compilados e armazenados num arquivo jar, podemos realizar o carregamento destes de modo a obter os serviços de negócio. Tal como vimos no Esquema geral do gestor de negócios (ponto 3.3.2), o carregamento dos serviços de negócio é realizado numa Sessão através do método BusinessService. Este método carrega em memória a classe da implementação dos esquemas de negócio, e os seus recursos. Como retorno, este método retorna um objeto genérico <T>, para ir de encontro aos diferentes tipos de interfaces que podem compor os Esquemas de Negócio. Em java foi utilizada a Dynamic proxy API [Blosser, '00] para execução dos métodos da classe de implementação. Uma proxy é uma classe que funciona como uma interface para outro objeto, sendo esta designada por dinâmica, pois implementa uma interface em tempo de execução. A utilização de uma proxy obriga a que chamadas a métodos ocorram indiretamente, através do objeto proxy. 91 ADCA – Arquitetura Dinâmica de Controlo de Acesso Utilizador Proxy +Metodo1() «interface» EsquemaNegocio_1 +Metodo1() ClassePrincipal Class Principal +Metodo1() Figura 72 - Esquema de Funcionamento de proxy dinâmica Na Figura 72, podemos verificar que o utilizador tem acesso a um esquema de negócio e que cada chamada a um método desta interface (método1) é realizada na proxy. A proxy por sua vez, delega a chamada deste método à classe principal que implementa aquele esquema de negócio. Deste modo conseguimos executar os métodos da classe principal de implementação que se encontra na lógica de negócio (ficheiro jar). Nos próximos parágrafos explicamos em detalhe, como se realiza o carregamento da classe de implementação e a sua atribuição a uma proxy dinâmica. O carregamento dinâmico das classes que se encontram no jar é realizado utilizando a classe URLClassLoader [Oracle, '12p] em conjunto com o método loadclass da classe ClassLoader [Oracle, '12a]. Figura 73 - Exemplo de Carregamento Dinâmico de classe dentro arquivo JAR Na Figura 73 encontra-se um exemplo de como efetuar o carregamento de uma classe que se encontra dentro de um arquivo jar (Variável jarIn). Inicialmente, obtém-se os urls (localização) de todas as classes e recursos no ficheiro a partir da classe URLClassLoader. Em seguida é efetuado o carregamento da classe através do método loadClass da classe ClassLoader, sendo a classe requerida (identificada através da localização na variável Classpath) carregada, para a classe genérica BTE (Class<T> BTE). Já obtivemos o carregamento dinâmico da nossa classe, agora pretendemos a instanciação dinâmica em tempo de execução desta classe. Na Figura 74 efetuamos o 92 Mestrado Integrado em Engenharia de Computadores e Telemática carregamento do construtor da classe de implementação. Inicialmente é criado uma array de classes (Variável types), onde são definidos os tipos de objetos pela ordem exata. De modo a encontrar automaticamente o construtor pretendido, utilizamos o método getConstructor da classe genérica BTE, ao qual passamos o array de classes criado anteriormente. . Figura 74 - Carregamento de um construtor em tempo de execução de uma classe genérica Na Figura 75 encontramos a forma como a classe é carregada para a proxy dinâmica. A instanciação da classe genérica é efetuada com o método newInstance. Este método pertence ao construtor obtido no passo anterior e recebe como parâmetros de entrada, um array de objetos (correspondentes aos parâmetros a serem atribuídos ao construtor). Figura 75 - Instanciação de uma classe genérica em tempo de execução 3.3.2.3 Exemplo de Utilização do Gestor de Negócios Neste capítulo mostramos um exemplo de como utilizar o gestor de negócios para aceder aos serviços que temos acesso. Para utilização do gesto de negócios, é necessário realizar os seguintes passos:    Obtenção de uma instância do gestor de negócios; Obtenção de uma sessão; Instanciação dos serviços de negócio a que se tem acesso. 93 ADCA – Arquitetura Dinâmica de Controlo de Acesso Obtenção de uma instância do gestor de negócios Para obtenção de uma instância do gestor de negócios utilizamos o método getInstance da class principal Manager, descrita em detalhe no ponto 3.3.2. Exemplo: Deste modo podemos obter uma instância do gestor de negócios. Obtenção de uma sessão A sessão é obtida através do método getBusinessSession, presente na interface IUser. Exemplo: Neste caso, a nossa sessão é obtida através do objeto gestor instanciado no passo anterior. Com a correta criação da sessão podemos de seguida realizar a instanciação dos serviços de negócio aos quais temos direito. Instanciação dos serviços de negócio A instanciação dos serviços de negócio é realizada através da chamada ao método businessService, presente na interface ISession. Este método recebe como parâmetros a interface principal do esquema do negócio e o id correspondente ao CRUD a ser executado. Para exemplo considere que tínhamos acesso ao esquema de negócios ICat_s: Neste caso, carregamos o nosso serviço de negócio, dinamicamente em tempo de execução para o esquema de negócio ICat_s e com o id respetivo da expressão CRUD requerida, crudid. 94 Mestrado Integrado em Engenharia de Computadores e Telemática 3.3.3 Servidor de Políticas Neste capítulo são mostrados os passos necessários para a criação do nosso servidor de políticas, que armazena as políticas de controlo de acesso estabelecidas. Vamos estabelecer o desenvolvimento do servidor de políticas em três passos:    Definição das políticas de segurança pelas quais o nosso sistema é regulado; Definição dos modelos conceptual e lógico, que nos permitam armazenar as várias políticas de acesso em base de dados relacionais; Definição dos algoritmos que permitam estabelecer os mecanismos de segurança para estabelecimento das políticas de acesso. 3.3.3.1 Políticas de Segurança      O servidor de políticas desenvolvido deve permitir: Armazenar informação sobre utilizadores e sessões; Armazenar informações sobre as Aplicações; Armazenar Esquemas de negócio e os CRUDS respetivos; Utilização do controlo de acesso RBAC (Descrito no ponto 2.1.3); Permitir que cada cliente seja associado a uma aplicação e que consoante a aplicação, tenha acesso a um conjunto de papéis. A estes papéis são associados um conjunto de Esquemas de Negocio, que por sua vez, permitem acesso a um conjunto de expressões CRUD. Nos próximos parágrafos descrevem-se os modelos desenvolvidos para permitir atingir os objetivos descritos neste ponto. 3.3.3.2 Modelos de Segurança Neste capítulo são apresentadas as soluções encontradas para resolução do problema proposto, onde iremos apresentar os vários modelos desenvolvidos (Modelo Conceptual e Lógico), que permitem o armazenamento das nossas políticas de controlo de acesso. 3.3.3.2.1 Definição do Modelo Conceptual Para armazenamento das políticas de acesso foi utilizado o controlo de acesso baseado em papéis, pois permite um maior controlo sobre as políticas e é facilmente implementado numa base de dados relacional. Neste modelo conceptual pretende-se obter já um modelo que permita atingir os objetivos especificados no ponto 3.3.3.1. Utilizamos 95 ADCA – Arquitetura Dinâmica de Controlo de Acesso para tal o modelo RBAC1 (descrito em 2.1.3) que permite a existência de, sessões, autorizações, utilizadores e um conjunto de papéis numa estrutura do tipo hierárquica. A obtenção de uma estrutura de papéis hierárquica é realizada através da adição de informação a um papel, sobre o próximo papel na hierarquia. No nosso caso, é guardada a referência para o papel hierarquicamente superior, designado de papel pai. A utilização de uma estrutura hierárquica de papéis é importante, visto que simplifica a gestão de papéis. Admin UA Admin UB UA UB Figura 76 - Exemplo prático de propagação de papéis Tomemos como exemplo a Figura 76, onde existem três papéis: UA, Admin e UB. Considere que queremos atribuir a autorização ao papel Admin. Além das suas autorizações inerentes também são necessárias as autorizações do papel UA e papel UB. No caso de a estrutura de papéis ser uma estrutura livre, sem qualquer tipo de hierarquia, era necessário atribuir a este utilizador a autorização para aceder aos papéis Admin, UA e UB, sendo necessárias três autorizações para atingir o objetivo proposto. No caso de uma estrutura de papéis organizada numa hierarquia, define-se os papéis UA e UB, como sendo papéis filhos do papel Admin, permitindo assim a construção de uma hierarquia, como se pode verificar pelo esquema na parte direita da figura. Neste caso, é apenas atribuída a autorização ao papel Admin, existindo uma propagação das permissões, representada pela seta a vermelho. O modelo RBAC desenvolvido permite a atribuição de autorizações e de delegações, sendo que as delegações são atribuídas com fins temporários e as autorizações de uma forma persistente. Chegamos assim ao seguinte modelo conceptual, presente na Figura 77 e no qual se indica o nome das entidades e a relação entre estas. 96 Mestrado Integrado em Engenharia de Computadores e Telemática 1 * Sessao Sujeito * 1 1 * * 1 Aplicação * 1 * * Delegação 1 Crud * Autorização * * Papel * * * EsquemaNegocio 1 * * * * Figura 77 - Modelo Conceptual do Servidor de Políticas Neste modelo podemos encontrar já a nossa definição de políticas de acesso, através da existência de utilizadores (Tabela Sujeito) e Aplicações (Tabela Aplicação), e da atribuição de autorizações (Tabela Autorização) e delegações (Tabela Delegação) a papéis. Podemos verificar que para cada Aplicação existe um conjunto de sujeitos associados e um conjunto de papéis associados. A nossa entidade papel inclui uma ligação para si mesma. Esta ligação traduz-se numa composição hierárquica, em que a atribuição de permissões a papéis de nível superior propaga-se para os papéis filhos destas. Aos papéis são associados um conjunto de esquemas de negócio, que por sua vez possuem um conjunto 97 ADCA – Arquitetura Dinâmica de Controlo de Acesso de expressões CRUD associadas. Assim ao atribuirmos permissão a papéis, estamos a permitir o acesso a determinados esquemas de negócio e aos seus respetivos CRUDS. A tabela de gestão de sessões (Tabela Sessao) é utilizada para guardar a informação relativa a Aplicações e Sujeitos ativos no sistema de modo a serem reportadas as alterações efetuadas às políticas. 3.3.3.2.2 Definição do Modelo Lógico Para construção do modelo lógico procedemos à introdução dos atributos nas tabelas e à criação das tabelas intermédias. O nome das tabelas foi normalizado, seguindo a utilização de três letras para criar referências a tabelas e nas tabelas intermédias a utilização da conjunção das três letras de cada tabela utilizada. Chegamos assim ao esquema lógico relativo ao servidor de políticas representado na Figura 78. Podemos verificar a existência de um campo designado por ref nas tabelas Aplicação, Papel, EsquemaNegócio e Crud. Este campo foi criado para possibilitar a identificação destas entidades ao nível de programação. A tabela autorização contém um campo (Codigo) para identificação de um código de autorização. Este código permite a criação de uma relação com outra tabela, onde definimos mensagens com informações adicionais sobre esta autorização. A estrutura hierárquica de papéis é obtida com a introdução de um campo RolRol_id que permite armazenar o id referente a outro elemento da tabela Papeis. No nosso caso, este id é referente ao papel pai do papel onde este se encontra. Os papéis raiz, que são os papéis que se encontram no topo da rede hierárquica não possuem um papel pai. Deste modo a solução encontrada passou pela possibilidade de inserir valores do tipo Null neste campo. A disponibilização das interfaces correspondentes aos esquemas de negócio é necessária para a utilização dos serviços de negócio. Deste modo foi criado o campo App_Esquemas_Negócio que possibilita o armazenamento de um ficheiro do tipo .jar com as interfaces dos esquemas de negócio daquela Aplicação. Isto possibilita por exemplo, o carregamento na ferramenta NetBeans do ficheiro jar de modo a ser possível utilizar os métodos das interfaces para facilitar o desenvolvimento de aplicações. 98 Mestrado Integrado em Engenharia de Computadores e Telemática SubApp Sub_Sujeito PK SubApp_id PK Sub_id FK1,U1 FK2,U1 SubAppSub_id SubAppApp_id U1 U1 nome_utilizador palavra_passe U1 Ses_id FK1 SesSubApp_id Ses_IpCliente Ses_PortaCliente Crd_Crud App_id PK Del_id App_ref App_descrição App_Esquemas_Negócio FK1 FK2 DelSubApp_id DelAppRol_id PK Crd_id U1 U2 Crd_Crud Crd_ref BudCrd Aut_Autorização AppRol PK AppRol_id FK1,U1 FK2,U1 AppRolApp_id AppRolRol_id PK Aut_id PK BusCrd_id FK1 FK2 Aut_codigo AutRol_id AutSubApp_id FK1,U1 FK2,U1 BusCrdBus_id BusCrdCrd_id Rol_Papel RolBus PK Rol_id U1 Rol_reference Rol_descrição RolRol_id FK1 PK Del_Delegação App_Aplicação PK Ses_Sessão Bus_EsquemaNegócio PK RolBus_id PK Bus_id FK1,U1 FK2,U1 RolBusRol_id RolBusBus_id U1 U2 Bus_url Bus_ref Figura 78 - Modelo Lógico do Servidor de Políticas Em seguida, descrevem-se as tabelas mais importantes deste esquema:  Sub_Sujeito: Nesta tabela são armazenadas informações de acesso dos utilizadores. É armazenado o nome do utilizador e a respetiva palavra passe. Esta tabela é necessária para identificação do utilizador no sistema de modo a poderem ser  atribuídos os esquemas de negócio e as expressões CRUD a que tem direito; App_Aplicação: Nesta tabela são armazenadas informações relativas a aplicações:  App_ref: Atributo onde é guardada uma String para identificação da aplicação a nível de programação; 99 ADCA – Arquitetura Dinâmica de Controlo de Acesso  App_Descrição: Atributo onde é armazenado um texto com a descrição da aplicação, de modo a ajudar os utilizadores a entender  a que tipo de negócio esta aplicação se aplica; App_EsquemasNegócio: Neste Atributo é armazenado o ficheiro .jar que armazena as interfaces dos vários esquemas de negócio de modo a possibilitar o desenvolvimento de aplicações e a utilização dos serviços de negócio.  Rol_Papeis: Nesta tabela são armazenadas informações sobre os papéis, como a referência a nível de programação e a sua descrição. Como foi utilizada hierarquia de papéis, foi criado outro campo (RolRol_id) com a referência para o papel pai;  Ses_Sessão: São guardadas informações sobre os utilizadores que estão a utilizar o sistema. Esta informação é recebida no gestor de negócios após login no gestor de políticas. São também guardadas informações sobre o ip do gestor de negócios e a respetiva porta, para permitir ao gestor de políticas transmitir as alterações realizadas para a máquina correta;  Bus_EsquemasNegocio: Nesta tabela são guardadas as informações sobre os esquemas de negócio, tais como:   Bus_ref: Atributo onde é guardada uma String para identificação do esquema de negócio a nível de programação; Bus_url: Atributo onde é armazenada a localização da interface principal do esquema de negócio. Este url é utilizado para efetuar o carregamento dos esquemas de negócio pelo gestor de negócios de modo a possibilitar a construção da lógica de negócio.  Crd_Crud: Nesta tabela são guardadas as expressões CRUD e os respetivos ids, que as permite identificar no carregamento dos serviços de negócio pelo gestor de negócios. Foi criada também a tabela (Ver Figura 79) para armazenamento de informações sobre os vários gestores de políticas (Ip e Porta). Esta informação permite ao monitor de 100 Mestrado Integrado em Engenharia de Computadores e Telemática políticas identificar onde se encontra o gestor de políticas para reportar as alterações que ocorrem nas políticas de acesso. Info_Servidor IpServidor PortaServidor Figura 79 - Tabela com informação sobre o gestor de políticas 3.3.3.3 Mecanismos de Segurança Neste capítulo são apresentados os algoritmos desenvolvidas para a construção dos mecanismos de segurança que permitem estabelecer a que recursos um utilizador tem acesso. 3.3.3.3.1 Obtenção da Informação Inicial Inicialmente, aquando do login do utilizador no sistema é necessário adquirir todos os papéis a que o utilizador tem acesso. Esta informação é obtida da seguinte maneira:   Obtenção de todos os papéis autorizados ou delegados; Obtenção de todos os papéis filhos dos papéis obtidos anteriormente. Consideremos como caso prático, o caso representado na Figura 80. Assumindo a existência dos papéis A, B1, B2, C21, C22, D21 e D22. A verde encontram-se os papéis a que o utilizador tem autorização (B2 e C22). A B1 UA B2 C21 C22 UA D21 D22 Figura 80 - Esquema de Papéis Exemplo 101 ADCA – Arquitetura Dinâmica de Controlo de Acesso Para obtenção de todos os papéis a que o utilizador tem direito, foi usado o seguinte algoritmo: 1. Obtenção de todos os papéis autorizados ou delegados, neste caso teríamos os papéis B2 e C22; 2. Pesquisa recursiva pelos papéis filhos destas e que ainda não tenham permissões. Neste caso os papéis pai são B2 e C22, e os papéis filhos destes são C21, D21 e D22. Como estes não possuem papéis filho, a pesquisa recursiva termina. No fim da pesquisa temos todos os papéis a que os utilizadores têm acesso. Na Figura 81 apresentamos a evolução do algoritmo. A A B1 B1 UA B2 C21 C21 C22 UA D21 UA B2 C22 UA D21 D22 Passo 1 D22 Passo 2 Figura 81 - Exemplo de caso prático para obtenção de informações sobre papéis Nesta figura os papéis com a cor verde são os papéis para os quais existem permissões (autorizações ou delegações). No passo 1 são obtidos os papéis B2 e C22 através da análise das tabelas de permissões. Em seguida no passo 2, verifica-se os papéis filhos destes recursivamente para os quais não existem permissões. No caso do papel B2, encontramos os papéis filhos C21 e C22, sendo apenas adicionado o papel C21 ao conjunto de papéis a serem enviados, visto que para o papel C22 já existe permissão. Para o caso da pesquisa recursiva do papel C22, são obtidos os papéis D21 e D22. 3.3.3.4 Alteração das Políticas Nos próximos parágrafos apresentamos os algoritmos desenvolvidos para obter as informações necessárias que o gestor de políticas envia ao gestor de negócios quando 102 Mestrado Integrado em Engenharia de Computadores e Telemática ocorrem alterações nas políticas. Numa primeira parte, apresentamos o algoritmo para a adição de autorizações e delegações e numa segunda parte, o algoritmo para remoção destas. 3.3.3.4.1 Adição de Autorizações e Delegações No caso de adição de autorizações ou delegações, o algoritmo é o seguinte (Considere que os papéis a adicionar são guardados numa lista de papéis): 1. Verificação recursiva até à raiz a partir dos papéis pai se existe já alguma autorização ou delegação atribuída. Se algum papel pai tiver permissão, nenhuma informação é enviada para o cliente. Isto porque, já existe algum tipo de permissão atribuída a este papel a partir de um papel pai e o algoritmo termina. Se não prossegue para passo 2; 2. Realiza a pesquisa recursiva pelos papéis filho que ainda não possuem permissão e adiciona-os à lista de papéis. Quando existir algum papel com permissão, a pesquisa recursiva nesse ramo termina. No fim teremos todos os novos papéis para os quais existe permissão devido à adição de uma nova autorização ou delegação. Apresentam-se os seguintes casos para exemplo: Caso1: A B1 UA B2 C21 C22 UA D21 D22 Figura 82 - Exemplo “Prático 1” de adição de Permissões 103 ADCA – Arquitetura Dinâmica de Controlo de Acesso Considere para este caso a Figura 82, onde existe inicialmente permissão associada ao papel A. Na Figura 83 podemos verificar a evolução do algoritmo no caso onde se atribui permissão ao papel C22. No passo 1 a vermelho, é realizada a pesquisa recursiva pelos papéis pai para verificação de existência de algum papel com permissão. Este passo termina ao encontrar o papel raiz A que já possui permissão, induzindo que o papel C22 também possui permissão, terminando o algoritmo. Deste modo, nenhuma informação é enviada ao utilizador, visto que já está atribuída permissão ao papel C22 através do papel A. A A B1 B1 UA B2 C21 C21 C22 UA D21 UA B2 C22 UA D21 D22 Passo 1 Figura 83 - Evolução do algoritmo para exemplo “Prático 1” com adição de permissões Caso 2: A B1 UA B2 C21 C22 UA D21 D22 Figura 84 - Exemplo “Prático 2” de adição de permissões 104 D22 Mestrado Integrado em Engenharia de Computadores e Telemática No caso 2 representado na Figura 84 estão atribuídas inicialmente as permissões aos papéis C21 e C22. Como as permissões são atribuídas recursivamente aos papéis filhos destas, então são também atribuídas permissões para os papéis D21 e D22. A evolução do algoritmo depois da adição de permissão ao papel B2 encontra-se na Figura 85. O passo 1 difere do caso 1, pois neste caso não existe nenhuma permissão atribuída até à raiz a partir dos papéis pai. Prosseguimos então para o passo 2, onde se pesquisa recursivamente os papéis filhos deste. Como os papéis C21 e C22 já se encontram com permissões e não existe mais nenhum ramo da hierarquia para efetuar a pesquisa, apenas o papel B2 é adicionado à lista de papéis a adicionar. B1 A A A B1 UA B2 C21 C21 C22 UA D21 D22 B1 UA B2 C21 C22 UA D21 UA B2 D22 Passo 1 C22 UA D21 D22 Passo 2 Figura 85 - Exemplo do algoritmo para exemplo “Prático 2” com adição de permissões 3.3.3.4.2 Remoção de Autorizações e Delegações No caso de remoção de autorizações ou delegações a um papel, o algoritmo é o seguinte (Considere a existência de uma lista com os papéis a serem removidos): 1. Verifica recursivamente até à raiz a partir dos papéis pai se existe já alguma permissão atribuída. Se algum papel tiver permissão, nenhuma informação é enviada para o utilizador. Isto porque ainda existe permissão atribuída a este papel através de um papel pai e algoritmo termina, se não prossegue para passo 2; 2. Adiciona o papel inicial para remover à lista para remoção e verifica recursivamente os papéis filhos que ainda não contenham permissões, sendo estes também adicionadas à lista para remoção. 105 ADCA – Arquitetura Dinâmica de Controlo de Acesso Apresenta-se o seguinte caso para exemplo que se encontra na Figura 86. Nesta figura podemos verificar que existem duas permissões atribuídas na base de dados: A e C22. A B1 UA B2 C21 C22 UA D21 D22 Figura 86 - Exemplo “Prático 1” de remoção de permissões Considere o caso em que se efetua a remoção da permissão ao papel C22, o algoritmo evolui da maneira exemplificada na Figura 87. Neste caso no passo 1 verifica-se através de uma pesquisa recursiva se existe alguma permissão originada nos papéis pai (a vermelho). Como existe permissão para o papel A, isto implica que também existe permissão para o papel C22, devido à propagação de permissões, terminando o algoritmo. A B1 A UA B2 C21 B1 C22 UA D21 UA B2 C21 D22 C22 UA D21 D22 Passo 1 Figura 87 - Evolução do algoritmo para exemplo “Prático 1” no caso de remoção de permissão 106 Mestrado Integrado em Engenharia de Computadores e Telemática Consideremos novamente o caso inicial da Figura 86 com permissões para os papéis A e C22 mas agora, em vez da remoção do papel C22, a remoção do papel A. A remoção deste papel despoleta a evolução do algoritmo exemplificado pela Figura 88. A A B1 B1 UA B2 C21 UA B2 C21 C22 UA D21 A B1 C22 UA D21 D22 Passo 1 UA B2 C21 D22 C22 UA D21 D22 Passo 2 Figura 88 - Evolução do algoritmo para exemplo “Prático 2”, com remoção de permissões Neste caso, no passo 1 verifica-se através de uma pesquisa recursiva se existe alguma permissão originada nos papéis pai, mas como este papel representa a raiz da hierarquia, não possui papel pai fazendo o algoritmo convergir para o passo 2. Neste passo realiza-se uma pesquisa recursiva pelos papéis filho que não têm permissão, sendo apenas adicionados à lista de papéis a remover, os papéis A, B1, B2 e C21. A pesquisa recursiva pelo ramo na direita termina após a verificação que existe permissão para o papel C22. Deste modo são obtidas as informações sobre as políticas, necessárias ao gestor de políticas para informar o gestor de negócios. 3.3.4 Gestor de Políticas    O gestor de políticas realiza a gestão: Do login dos utilizadores no sistema; Das políticas de controlo de acesso; Das alterações efetuadas às políticas. Todo o fluxo de informação entre o gestor de negócios e o servidor de políticas passa pelo gestor de políticas. Este decide quais as políticas a que os utilizadores do sistema têm acesso e reporta ao gestor de negócios as alterações que ocorrem nas 107 ADCA – Arquitetura Dinâmica de Controlo de Acesso políticas de controlo de acesso. Pretendemos criar um servidor que permita responder a um número elevado de clientes. Deste modo foi construído um servidor mult-threaded, que cria uma thread (Worker) por cada pedido de comunicação, como ser visto pela Figura 89. Thread Principal Z Pedido Cliente 1 Pedido Cliente 2 Z Thread Worker Z Thread Worker Figura 89 - Exemplo de comunicação entre clientes e servidor multi-thread Um servidor multi-thread pode aceitar uma conexão de um cliente, começar uma thread para tratar aquela comunicação e continuar à escuta de novos pedidos de outros clientes [Oracle, '12n]. Esta vantagem deriva das threads serem uma sequência de instruções que correm independentemente de outro programa ou de outras threads. As vantagens de um servidor multi-thread em relação a um servidor singlethread são as seguintes [Jenkov, '12]:   Menos tempo é gasto fora da chamada ao método accept (método que permite aceitar uma conexão de um socket); Clientes que pretendam uma longa utilização do servidor não bloqueiam os outros clientes; 108 Mestrado Integrado em Engenharia de Computadores e Telemática  Com a utilização de processadores multi-core, obtém-se uma maior performance. Os pedidos realizados ao gestor de políticas são originados:  No gestor de negócios por parte dos utilizadores que utilizam o ADCA, para efetuar o login no sistema e obter as informações necessárias para  construir a lógica de negócio; No monitor de políticas, que é despoletado aquando de alterações nas políticas. Para a criação desta arquitetura várias mensagens foram definidas para a comunicação. entre os vários elementos que a compõem. Estas mensagens são descritas no capítulo 3.2. 3.3.5 Monitor de Políticas O monitor de políticas envia a informação sobre as alterações realizadas às políticas através de uma aplicação dll em C#. Uma Dll (biblioteca de vinculo dinâmico) [Microsoft, '12f; Microsoft, '12j] é uma biblioteca que contém código e dados, que podem ser executados por mais que um programa ao mesmo tempo. A utilização de dll s permite a um programa ser modularizado em componentes separados. O uso do dll traz outras vantagens tais como [Microsoft, '12j]:   Utilização de menos recursos: como são feitas várias chamadas ao monitor de políticas e como este se encontra em memória, evita-se a duplicação do código; Facilita a alteração e instalação: como o dll vai ser instalado no servidor, neste caso servidor Sql Server, existe um único local onde será armazenado, permitindo assim a sua fácil atualização. O DLL criado possui um método para envio de informação, a sua implementação em C# encontra-se na Figura 90. 109 ADCA – Arquitetura Dinâmica de Controlo de Acesso Figura 90 - Implementação do Monitor de Políticas Podemos verificar que no método SendMessage é realizada uma ligação ao gestor de políticas, através do parâmetro ServerIp (ip do gestor de políticas) e do parâmetro ServerPort (porta do gestor de políticas). A mensagem que possui a informação sobre a alteração ocorrida é também passada através do parâmetro Message. Depois da construção do dll que permite comunicar com o servidor de políticas, necessitamos de o instalar na base de dados. Para tal são realizados os seguintes passos:  Criação de um objeto ASSEMBLY na base de dados através do comando [Microsoft, '12c]. Este comando permite adicionar esta aplicação como um objeto numa instância do sql server. Na Figura 91 podemos verificar o conjunto de comandos necessários para criação de um objeto assembly designado por PolicyWatcher. Figura 91 - Comandos para criação de uma biblioteca dll no sql server 110 Mestrado Integrado em Engenharia de Computadores e Telemática  Criação de uma stored procedure que permita a execução do dll. As StoredProcedures são funcionam como procedimentos em linguagens de programação, pois [Microsoft, '12n]:    Aceitam vários parâmetros de entrada e retornam vários valores na forma de parâmetros de saída; Permitem operações de base de dados, incluindo a chamada a outros procedimentos; Retornam um valor de estado, indicando sucesso ou falha. A stored procedure é criada usando o comando . Figura 92 - Comandos para criação da stored procedure que utiliza o método da biblioteca dll Na Figura 92 pode-se verificar a criação de uma stored procedure relativa ao método SendMessage, que pertence ao objeto assembly PolicyWatcher. Seguindo estes passos, o dll é instalado no servidor de políticas. Necessitamos agora de realizar a monitorização das políticas e chamar a stored-procedure no caso de ocorrência de alterações. A solução passou pela utilização de triggers [Microsoft, '12p]. Estes são stored procedures especiais que podem ser executados automaticamente quando um utilizador tenta modificar dados específicos em tabelas específicas. Deste modo podemos saber em que tabela e que dados que foram alterados, realizando uma correta monitorização das permissões. Esta monitorização é realizada por quatro triggers:   Dois triggers que verificam a inserção de autorizações ou de delegações; Dois triggers para verificar a remoção de autorizações ou de delegações. Quando um destes triggers é despoletado, uma mensagem é enviada ao gestor de negócios a sinalizar a ocorrência de alterações nas políticas, apresentada no ponto 3.2.2. 111 ADCA – Arquitetura Dinâmica de Controlo de Acesso 4 Prova de Conceito Neste capítulo apresenta-se uma aplicação com interface gráfico, que permite a execução de serviços de negócio e a visualização em tempo de execução dos esquemas que compõem a lógica de negócio através de um diagrama incorporado na própria interface. De modo a facilitar a correta configuração do servidor de políticas foram também desenvolvidas aplicações de apoio. Nos próximos parágrafos descreve-se a forma como o servidor de políticas é configurado através das aplicações de apoio e o funcionamento da aplicação principal onde os serviços de negócio são executados. 4.1 Esquema Geral e Preparação do Ambiente Para o desenvolvimento desta aplicação foi utilizada a base de dados pública NorthWind [Microsoft, '12i], que apresenta tabelas referentes a venda de produtos, tais como, clientes, empregados, categoria de produtos e fornecedores. Nesta aplicação foram utilizadas as seguintes tabelas:    Categories: que corresponde às diferentes categorias dos produtos; Products: que corresponde às informações relativas aos variados produtos; Suppliers: que corresponde às informações relativas aos fornecedores. Utilizando esta base de dados pública, criámos um conjunto de papéis que contêm um conjunto de esquemas de negócio, permitindo a realização de diferentes ações por parte dos utilizadores do sistema. Para esta aplicação foi desenvolvido o seguinte esquema de papéis: A B1 UA B2 C21 C22 UA Figura 93 - Esquema de papéis geral utilizado na aplicação de teste Com a construção desta estrutura hierárquica de três níveis, podemos verificar a propagação das várias permissões atribuídas aos utilizadores no nosso diagrama. Os esquemas de negócio desenvolvidos são os seguintes: 112 Mestrado Integrado em Engenharia de Computadores e Telemática  IPrd_s- Este esquema de negócios utiliza a tabela Products, e permite a leitura de todos os campos desta tabela para acesso a informação sobre produtos (Ver Figura 94). Permite também a seleção por id do produto ou por id do fornecedor (supplier); Figura 94 - Tabela Products com os respetivos campos  ISup_s- Este esquema de negócio utiliza a tabela suppliers e permite a leitura de todos os campos desta tabela para acesso a informação sobre os fornecedores (Ver Figura 95); Figura 95 - Tabela Suppliers com os respetivos campos 113 ADCA – Arquitetura Dinâmica de Controlo de Acesso  ICat_s- Este esquema de negócio utiliza a tabela categories e permite a leitura de todos os campos desta tabela (Ver Figura 96). Disponibiliza métodos para a inserção, atualização de campos e remoção de linhas da tabela. Podemos selecionar para visualização todas as entradas da tabela ou apenas as entradas com id s específicos; Figura 96 - Tabela Categories com os respetivos campos  ICat_i- Este esquema de negócio é utilizado para introdução de uma nova categoria através da utilização de uma expressão CRUD do tipo Insert. Ao conjunto de papéis definidos anteriormente (Ver Figura 93) são atribuídos os esquemas de negócio especificados, de acordo com a Tabela 19. Papel BS Crud Ref Expressão Role_B1 ICat_i all Insert into Categories Values(?,?,?) Role_B2 IPrd_s all Select * From Products byId Select * From Products where productId=? bySupplierId Select * From Products where supplierId=? Role_C21 ICat_s all byId Role_C22 ISup_s all Select * From Categories Select * From Categories where categoryId=? Select * From Suppliers Tabela 19 - Tabela com os papéis e os respetivos esquemas de negócio e expressões CRUD utilizadas no desenvolvimento da aplicação Legenda: BS - Esquema de Negócio; Ref- Referência da expressão CRUD; ExpressãoExpressão CRUD 114 Mestrado Integrado em Engenharia de Computadores e Telemática Foram criados três utilizadores que podem utilizar os diferentes papéis de acordo com as permissões atribuídas. Para utilização dos serviços de negócio procedeu-se à configuração do ambiente (esquemas de negócios, papéis, expressões CRUD) no servidor de políticas. Para esta finalidade criou-se um conjunto de aplicações de apoio à configuração, as quais são descritas nos próximos parágrafos. 4.1.1 Criação do Servidor de Políticas Para criação do servidor de políticas foi criado um script SQL que permite inserir as tabelas designadas no ponto 3.3.3.2.2. Este script, para além da criação destas tabelas, cria também os triggers que permitem chamar o monitor de políticas para envio de informações sobre as alterações de políticas. Configuração do Servidor de Políticas A configuração do servidor de políticas é realizada através de uma aplicação em java, designada por Configurador de Segurança. Esta aplicação facilita a introdução de informações no servidor de políticas através da criação de um conjunto de interfaces. Estas interfaces contêm informação, sobre aplicações, papéis, esquemas de negócio e expressões CRUD. Com estas interfaces, o configurador de segurança cria entradas nas tabelas correspondentes, conseguindo de uma maneira fácil e eficiente, introduzir as informações requeridas para a utilização da aplicação de teste. A configuração do servidor de políticas é realizada através dos seguintes passos:  Inicialmente é construída uma interface que contém as expressões Crud que queremos utilizar. Para o nosso caso e de acordo com as especificações do ponto 4.1 foi criada a interface que se encontra na Figura 97. Figura 97 - Interface com a declaração dos CRUDs 115 ADCA – Arquitetura Dinâmica de Controlo de Acesso  O próximo passo é a construção dos interfaces que armazenam a informação sobre os papéis. Estes interfaces devem indicar qual o próximo papel na hierarquia. Para tal, utilizamos uma composição hierárquica das interfaces através do comando extends do java. Um exemplo desta interface encontra-se na Figura 98. Figura 98 - Declaração da interface para o papel A Podemos verificar que a interface do papel A possui referências para os respetivos papéis filhos (B1 e B2) através da utilização do comando extends. As informações associadas ao papéis tais como esquemas de negócio e expressões Crud são também inseridas nestas interfaces. Para tal é criado inicialmente um objeto do tipo Class que referência o esquema de negócio e de seguida são colocadas as expressões Crud respetivas através de um array de objetos do tipo String. Este caso pode ser verificado na Figura 99, na qual se representa a interface referente ao papel B1. Este papel, como especificado em 4.1, recebe o esquema de negócio ICat_i que por sua vez possui acesso à expressão Crud, cuja referência é iCat_all; Figura 99 - Exemplo de interface para o papel B1  Em seguida necessitamos de uma interface principal para representar a aplicação e o conjunto de interface que a compõem. Isto é realizado com a construção de uma interface que possui a referência para a aplicação e o conjunto de papéis raiz que compõem a hierarquias de papéis. Um exemplo desta interface encontra-se na Figura 100. 116 Mestrado Integrado em Engenharia de Computadores e Telemática Figura 100 - Interface principal da aplicação Podemos verificar que é criada uma referência para a aplicação designada por app e também é armazenada a interface referente ao papel raiz A. O configurador de segurança consegue obter todos os outros papéis através do papel raiz com a utilização da API Reflection, sendo por isso criada apenas a referência para o papel raiz. Deste modo constroem-se as interfaces necessárias ao Configurador de Segurança para a configuração do servidor de políticas. Podemos então chamar o   Configurador de Segurança. Este contém dois métodos para configuração: O método ConfigureServer: onde definimos o nome de utilizador, a password e o url para ligação ao servidor de políticas; O método Configure: permite a configuração do servidor de políticas através das interfaces desenvolvidas. Figura 101 - Configuração do Configurador de Segurança Na Figura 101 encontrámos um exemplo de utilização destes dois métodos. Podemos verificar que no método Configure são passadas a interface da aplicação e a interface onde as expressões CRUD são especificadas. Com a utilização desta aplicação de 117 ADCA – Arquitetura Dinâmica de Controlo de Acesso apoio conseguimos inserir a informação necessária no servidor de políticas de uma forma fácil e eficiente. 4.1.2 Extrator de Políticas O extrator de políticas é a aplicação de apoio que permite obter um ficheiro jar, com toda a informação sobre uma aplicação para permitir o desenvolvimento facilitado de uma aplicação que utilize a ADCA. Figura 102 - Esquema interno do ficheiro jar resultante do extrator de políticas Na Figura 102 apresenta-se o esquema interno do ficheiro jar gerado. Podemos verificar a existência dos vários esquemas de negócio desenvolvidos e o conjunto de interfaces contendo a informação sobre os vários papéis, nomeadamente, os esquemas de negócio utilizados e um inteiro representativo do id da expressão CRUD. Na Figura 103 podemos encontrar um exemplo de uma interface obtida. Neste caso o papel representado é o papel B1 cuja especificação se encontra no ponto 4.1. Nesta interface existem objetos Class que representam os esquemas de negócio e variáveis numéricas nas quais são armazenados os ids(tal como no servidor de políticas) das expressões CRUD associadas. Com este arquivo jar o desenvolvimento torna-se mais facilitado pois:   Podemos verificar para cada papel qual o tipo de esquemas de negócio associados; Escolher a expressão CRUD correta através do id que é especificado nas interfaces dos papéis. 118 Mestrado Integrado em Engenharia de Computadores e Telemática Figura 103 - Exemplo de interface utilizada na especificação dos papéis A interface gráfica do extrator de políticas encontra-se na Figura 104, nesta podemos configurar a conexão para ligação à base de dados no painel Conexão. Nos campos à esquerda define-se a referência da aplicação que queremos obter e a localização onde o ficheiro jar será criado. Figura 104 - Interface de interação com o utilizador do extrator de políticas 4.1.3 Gestor de Segurança O Gestor de Segurança é uma aplicação de apoio que permite a alteração das políticas em tempo de execução. Permite atribuir ou remover autorizações e delegações referentes ao conjunto de papéis especificados. 119 ADCA – Arquitetura Dinâmica de Controlo de Acesso Figura 105 - Interface gráfica da aplicação Gestor de Segurança Na Figura 105 encontramos a interface gráfica do gestor de segurança. Nesta podemos verificar a existência de quatro painéis. No painel Conexão é configurada a conexão à base de dados, enquanto nos restantes painéis utilizamos objetos do tipo checkbox que permitem atribuir ou retirar autorizações ou delegações referentes aos papéis dos três utilizadores. 4.2 Utilização da Aplicação de Teste Neste capítulo apresenta-se a aplicação desenvolvida que permite realizar o teste da ADCA. Esta aplicação foi desenvolvida em java e c# e permite a interação com as políticas de acesso armazenadas no servidor de políticas. A interface principal da nossa aplicação é apresentada na Figura 106.       Nesta interface encontramos as seis secções principais: Na secção 1 são escolhidos os esquemas de negócio e expressões CRUD a executar. Na secção 2 efetua-se a configuração dos campos para ligação à base de dados relacional. Na secção 3 apresenta-se um diagrama com o estado de permissão de acesso a papéis (a vermelho, a sua negação, a verde a sua autorização). Na secção 4 são atribuídos em tempo de execução, diferentes valores aos parâmetros dinâmicos que podem compor a expressão CRUD selecionada. Na secção 5 são apresentados os resultados da tabela resultante da execução da expressão CRUD (apenas se esta for do tipo Select). Na secção 6 apresentam-se os comandos adicionais no caso da interface selecionada ser a interface ICat_s, visto que esta interface permite a atualização, inserção e remoção de linhas resultantes da execução de um CRUD do tipo Select. 120 Mestrado Integrado em Engenharia de Computadores e Telemática Figura 106 - Interface gráfica, de utilização da aplicação de teste O esquema de utilização desta aplicação é o seguinte, representado, pela Figura 107. Figura 107 - Esquema principal de execução 121 ADCA – Arquitetura Dinâmica de Controlo de Acesso Considere-se o caso em que o utilizador tem acesso a todos os papéis exceto o papel A1. Ao clicar no botão Atualizar da secção 3 é apresentado o seguinte diagrama da Figura 108. No caso da execução do serviço de negócio correspondente ao esquema de negócio IPrd_s e da expressão CRUD relativa a todos os elementos, a secção 5 é preenchida com o resultado da execução da expressão na base de dados ( Figura 109). Figura 108 - Interface gráfica com a visualização do diagrama de permissões Figura 109 - Interface gráfica com a visualização dos resultados 122 Mestrado Integrado em Engenharia de Computadores e Telemática A utilização de uma expressão CRUD à qual é necessária a atribuição de valores origina a criação de campos de texto em tempo de execução, onde o utilizador pode inserir os valores (Figura 110). No caso de utilização do esquema de negócio ICat_s, podemos verificar a existência de comandos que possibilitam a alteração das várias linhas que representam a tabela como se pode ver no fundo da Figura 111. Figura 110 - Interface gráfica com campos para inserção de parâmetros do CRUD Figura 111 - Interface gráfica apresentado os botões adicionais para o esquema de negócio ICat_s 123 ADCA – Arquitetura Dinâmica de Controlo de Acesso A execução de um esquema de negócio ao qual não se tem direito de acesso despoleta a apresentação de uma mensagem de autorização negada, como ser visto pela Figura 112. Podemos verificar pelo diagrama da figura que não existe permissão para acesso ao papel B2 e como tal está negado o acesso aos esquemas de negócio IPrd_s e ISup_s. Figura 112 - Interface gráfica apresentado a mensagem de Autorização Negada Criamos assim um conjunto de aplicações que apoiam o administrador na implementação do servidor de políticas e que permitem verificar o correto funcionamento da ADCA. 124 Mestrado Integrado em Engenharia de Computadores e Telemática 5 Conclusão O trabalho apresentado nesta dissertação abordou o aspeto da construção de uma lógica de negócio que utiliza o software existente para interação com base de dados (JDBC e ADO.net) ao mesmo tempo que é aplicado controlo de acesso a informação sensível. Utilizando as bibliotecas disponibilizadas pela linguagem de programação Java, como Reflection e bibliotecas para carregamento de classes em tempo de execução, foi possível atingir os objetivos propostos. A utilização de ficheiros do tipo jar para armazenamento das interfaces referentes aos esquemas de negócio foi essencial para uma gestão mais eficaz da lógica de negócio. Embora as aplicações desenvolvidas em java permitam a sua execução num amplo conjunto de sistemas operativos, desenvolveu-se uma versão estática em C# da parte cliente da arquitetura. Isto permitiu demonstrar que os métodos propostos podem ser implementados utilizando várias tecnologias, neste caso o ADO.net. Através da prova de conceito apresentada foi possível verificar o correto funcionamento da arquitetura desenvolvida. Embora existam muitas vantagens na utilização desta arquitetura esta também apresenta as suas desvantagens. Nos próximos parágrafos efetuamos uma discussão destas. 5.1 Escalabilidade, Disponibilidade e Adaptabilidade A ADCA foi desenvolvida com o intuito de possibilitar a utilização a um grande número de utilizadores. Isto é possível com a utilização de uma entidade central, designada por gestor de políticas que recebe os pedidos dos clientes. Esta entidade central foi construída com recurso a threads de modo a responder a vários pedidos ao mesmo tempo. Podemos ter assim um grande número de utilizadores ligados ao sistema e cujos pedidos são tratados de imediato. Este sistema não foi concebido para ser utilizado por outras tecnologias, como por exemplo os Web Services. Visto que o gestor de negócios apenas implementa métodos que utilizam software intermédio para interação com base de dados, este teria que ser reescrito para possibilitar tais operações. 5.2 Problemas Comuns Embora a ADCA ofereça diversas vantagens em relação às soluções correntes de sofware para interação com base de dados relacionais esta tem os seguintes problemas:  É necessária a utilização de uma versão superior à Versão 1.6 do JAVA. Na versão JAVA 1.6 não existe forma de fechar a ligação ao arquivo jar, fazendo com que 125 ADCA – Arquitetura Dinâmica de Controlo de Acesso depois do carregamento dos serviços de negócio este arquivo fique bloqueado não sendo possível a adaptação às alterações das políticas. Este problema é resolvido na versão 1.7 onde é disponibilizado um método que permite o fecho da ligação,  possibilitando a adaptação dinâmica; Depois do carregamento de um serviço de negócio, este contínua em memória na JVM mesmo depois da adaptação dinâmica da lógica de negócio. Isto poderia levar à execução de serviços para os quais não existe autorização. Este problema é resolvido na nossa aplicação de teste através de um método que verifica a existência do serviço na lógica de negócio criada. No caso da não existência do  serviço é retornada uma exceção impedindo a sua utilização; O tempo que demora a construção da lógica de negócio para os utilizadores aumenta consoante o número de esquemas de negócio e a complexidade inerente destes. Uma forma de resolver este problema seria a modularização de aplicações possibilitando assim, a diminuição do conjunto de esquemas de negócio que seriam criados pelo gestor de negócios. 5.3 Trabalho Futuro A ADCA na atual versão, apresenta uma primeira abordagem em resposta aos problemas apresentados no ponto 1. O modelo construído para armazenamento das políticas de acesso é baseado no modelo rbac1, o qual permite a utilização de uma hierarquia de papéis e de delegações. Num desenvolvimento futuro poderia ser utilizado o modelo rbac3 com possibilidade de utilização de restrições. As restrições permitem por exemplo, impedir a utilização de um papel em certos períodos temporais, importante em certas situações. A criação de esquemas de negócio a nível programático pode ser demorada e requer alguma experiência em linguagens de programação por parte do administrador. Esta dificuldade pode ser suavizada pela introdução de uma aplicação com interface gráfico que permite ao administrador definir qual a expressão CRUD que quer utilizar e quais os campos que pretende ler, actualizar, inserir ou apagar em caso de expressão do tipo Select. A interface gráfica que se propõe é baseada no gestor de expressões CRUD dos papers [Pereira, '10; Pereira, '11b]. Enquanto esta é baseada apenas na construção de esquemas de negócio com todos os campos, propomos a criação de um gestor de CRUDS que permita a criação de esquemas de negócio com controlo de acesso, onde o administrador específica quais os campos que pretende a que se tenha acesso. Esta interface gráfica poderia ter as seguintes secções: 126 Mestrado Integrado em Engenharia de Computadores e Telemática  Secção para inserção de expressão CRUD e preparação dos parâmetros da mesma para realizar a sua execução na base de dados relacional. Na Figura 113 temos um exemplo de como esta secção seria;  Figura 113 - Secção exemplo para introdução de expressões CRUD Secção para seleção de atributos e do tipo de acesso atribuído. Um exemplo desta secção encontra-se na Figura 114. Neste caso utilizamos um conjunto de caixas de verificação em que se atribuem e retiram permissões de acesso a campos em tabelas. Figura 114 - Secção exemplo para seleção de permissões em expressões do tipo Select Com esta aplicação o administrador teria um trabalho mais facilitado e menos demorado na construção dos esquemas de negócio. 127 ADCA – Arquitetura Dinâmica de Controlo de Acesso A nível de segurança este trabalho pode ser melhorado de modo a existir encriptação de mensagens que são transmitidas entre os vários componentes que compõem a nossa arquitetura e a criação de proteção do sistema contra situações de erro. Por exemplo a realização da sincronização de clientes com as políticas definidas, no caso de o cliente se desconectar momentaneamente do sistema e durante esse período serem realizadas alterações nas políticas. A resolução deste caso podia passar, pela criação de uma tabela adicional no sistema, na qual se expressa o estado em que o cliente se encontra, e a criação de uma thread no gestor de negócios que comunica periodicamente com o gestor de políticas para este verificar o seu correto estado. No caso de estado incorreto por parte de um cliente, o gestor de políticas enviava todas as alterações que foram efetuadas durante o tempo em baixa do cliente. 128 Mestrado Integrado em Engenharia de Computadores e Telemática 6 Bibliografia e Referências [Barka, '04] Barka, Ezedin and Sandhu, Ravi: "Role-Based Delegation Model/Hierarchical Roles (RBDM1)." Proceedings of the 20th Annual Computer Security Applications Conference, IEEE Computer Society(2004), 396-404. [Barka, '00] Barka, Ezedin, Sandhu, Ravi and S, Ravi: "A Role-Based Delegation Model and Some Extensions." Information Systems Security, (2000). [Bell, '73] Bell, D. and La Padula, L.: "Secure computer systems: A mathematical model"; MITRE Corp, (1973). [Biba, '77] Biba, K.J. (1977). Integrity considerations for secure computer systems. M. Corp.: 76-372. [Blosser, '00] Blosser, Jeremy. (2000). "Explore the Dynamic Proxy API." from http://www.javaworld.com/jw-11-2000/jw-1110-proxy.html. [Brant, '00] Brant, John and Yoder, Joseph: "Creating Reports with Query Objects." Pattern Languages of Programs, University of Illinois at Urbana, Champaign (2000). [Capitani di Vimercati, '07] Capitani di Vimercati, Sabrina, Foresti, Sara and Samarati, Pierangela (2007). Authorization and Access Control. Security, Privacy, and Trust in Modern Data Management. M. Petković and W. Jonker, Springer Berlin Heidelberg: 39-53. [Codd, '83] Codd, E. F.: "A relational model of data for large shared data banks." Commun. ACM, 26, 1 (1983), 64-69. [Corcoran, '09] Corcoran, Brian J., Swamy, Nikhil and Hicks, Michael: "Cross-tier, label-based security enforcement for web applications." Proceedings of the 2009 ACM SIGMOD International Conference on Management of data, ACM, Providence, Rhode Island, USA (2009), 269-282. [Damiani, '05] Damiani, Ernesto, Vimercati, Sabrina De Capitani di and Samarati, Pierangela: "New Paradigms for Access Control in Open Environments." Dipartimento di Tecnologie dell’Informazione(2005). [Green, '12] Green, Date. (2012). "The Reflection API what can we do." from http://rangiroa.essi.fr/cours/turorial%20java/reflect/index.html. [Hansson, '04] Hansson and Heinemeier, David. (2004). "Ruby on Rails." from http://rubyonrails.org/. [Java2s, '12] Java2s. (2012). "Transaction Isoltation Levels.", from http://www.java2s.com/Tutorial/Java/0340__Database/JDBCTransactionIsolationLevel s.htm. 129 ADCA – Arquitetura Dinâmica de Controlo de Acesso [JBOSS, '12] JBOSS. (2012). "HIBERNATE." from http://docs.jboss.org/hibernate/orm/4.1/quickstart/en-US/html/. [Jenkov, '12] Jenkov, Jakob. (2012). "Multithreaded Server in Java." from http://tutorials.jenkov.com/java-multithreaded-servers/multithreaded-server.html. [Lampson, '74] Lampson, Butler W.: "Protection." SIGOPS Oper. Syst. Rev., 8, 1 (1974), 1824. [Meijer, '06] Meijer, Erik, Beckman, Brian and Bierman, Gavin: "LINQ: reconciling object, relations and XML in the .NET framework." Proceedings of the 2006 ACM SIGMOD international conference on Management of data, ACM, Chicago, IL, USA (2006), 706706. [Microsoft, '12a] Microsoft. (2012a). "C Sharp." from http://msdn.microsoft.com/library/z1zx9t92. [Microsoft, '12b] Microsoft. (2012b). "C# and Java: Comparing Programming Languages." from http://msdn.microsoft.com/en-us/library/ms836794.aspx. [Microsoft, '12c] Microsoft. (2012c). "CREATE ASSEMBLY." from http://msdn.microsoft.com/en-us/library/ms189524.aspx. [Microsoft, '12d] Microsoft. (2012d). "DataSet." from http://msdn.microsoft.com/en- us/library/system.data.dataset.aspx. [Microsoft, '12e] Microsoft. (2012e). "HashTable." from http://msdn.microsoft.com/enus/library/system.collections.hashtable.aspx. [Microsoft, '12f] Microsoft. (2012f). "How to: Create and Use C# DLLs." from http://msdn.microsoft.com/en-us/library/3707x96z(v=vs.80).aspx. [Microsoft, '12g] Microsoft. (2012g). "Linq." from http://msdn.microsoft.com/en- us/library/bb397926.aspx. [Microsoft, '12h] Microsoft. (2012h). ".NET Platform." from http://msdn.microsoft.com/enus/library/zw4w595w.aspx. [Microsoft, '12i] Microsoft. (2012i). "NorthWind." from http://www.microsoft.com/enus/download/details.aspx?id=23654. [Microsoft, '12j] Microsoft. (2012j). "O que é uma DLL?", from http://support.microsoft.com/kb/815065/pt-br. [Microsoft, '12k] Microsoft. (2012k). "ODBC." from http://support.microsoft.com/kb/110093. [Microsoft, '12l] Microsoft. (2012l). "Overview of ADO.net." from http://msdn.microsoft.com/en-us/library/h43ks021(v=vs.71).aspx. [Microsoft, '12m] Microsoft. (2012m). "Sql Server." from http://msdn.microsoft.com/enus/library/ms166352(v=sql.90).aspx. 130 Mestrado Integrado em Engenharia de Computadores e Telemática [Microsoft, '12n] Microsoft. (2012n). "Stored Procedure." from http://msdn.microsoft.com/enus/library/ms187926.aspx. [Microsoft, '12o] Microsoft. (2012o). "Transactions." from http://msdn.microsoft.com/enus/library/ms190612(v=sql.105).aspx. [Microsoft, '12p] Microsoft. (2012p). "Triggers." from http://msdn.microsoft.com/en- us/library/aa258254(v=sql.80).aspx. [Microsoft, '12q] Microsoft. (2012q). "Visual Studio." from http://www.microsoft.com/visualstudio/en-us. [Morin, '10] Morin, Brice, Mouelhi, Tejeddine, Fleurey, Franck, Traon, Yves Le, Barais, Olivier and J, Jean-Marc: "Security-driven model-based dynamic adaptation." Proceedings of the IEEE/ACM international conference on Automated software engineering, ACM, Antwerp, Belgium (2010), 205-214. [Napes, '12] Napes. (2012). "Java + information flow." from http://www.napes.co.uk/blog/information-flow-java-jif/. [Netbeans, '12] Netbeans. (2012). "Netbeans." from http://netbeans.org/. [Oracle, '12a] Oracle. (2012a). "ClassLoader." from http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/ClassLoader.html. [Oracle, '12b] Oracle. (2012b). "HashMap." from http://docs.oracle.com/javase/1.4.2/docs/api/java/util/HashMap.html. [Oracle, '12c] Oracle. (2012c). "JarEntry." from http://docs.oracle.com/javase/6/docs/api/java/util/jar/JarEntry.html. [Oracle, '12d] Oracle: "JarInputStream." (2012d). [Oracle, '12e] Oracle. (2012e). "JarOutputStream." from http://docs.oracle.com/javase/1.4.2/docs/api/java/util/jar/JarOutputStream.html. [Oracle, '12f] Oracle. (2012f). "Java." from http://en.wikipedia.org/wiki/Java_(programming_language). [Oracle, '12g] Oracle. (2012g). "Java Archive." from http://docs.oracle.com/javase/tutorial/deployment/jar/. [Oracle, '12h] Oracle. (2012h). "JavaCompiler." from http://docs.oracle.com/javase/6/docs/api/javax/tools/JavaCompiler.html. [Oracle, '12i] Oracle. (2012i). "JDBC." from http://docs.oracle.com/javase/tutorial/jdbc/overview/index.html. [Oracle, '12j] Oracle. (2012j). "JPA." from http://www.oracle.com/technetwork/articles/javaee/jpa-137156.html. 131 ADCA – Arquitetura Dinâmica de Controlo de Acesso [Oracle, '12k] Oracle. (2012k). "Mapping Sql Types to Java." from http://docs.oracle.com/javase/1.5.0/docs/guide/jdbc/getstart/mapping.html. [Oracle, '12l] Oracle. (2012l). "PreparedStatement." from http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html. [Oracle, '12m] Oracle. (2012m). "ResultSet." from http://docs.oracle.com/javase/1.4.2/docs/api/java/sql/ResultSet.html. [Oracle, '12n] Oracle. (2012n). "Socket Communications." from http://www.oracle.com/technetwork/java/socket-140484.html. [Oracle, '12o] Oracle. (2012o). "Transactions." from http://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html. [Oracle, '12p] Oracle. (2012p). "UrlClassLoader." from http://docs.oracle.com/javase/1.4.2/docs/api/java/net/URLClassLoader.html. [Oracle, '12q] Oracle. (2012q). "Uses of Reflection." from http://docs.oracle.com/javase/tutorial/reflect/index.html. [Oracle, '12r] Oracle. (2012r). "Using Reflection." from http://java.sun.com/developer/technicalArticles/ALT/Reflection/. [Pereira, '10] Pereira, Óscar Mortágua, Aguiar, Rui L. and Santos, Maribel Yasmina: "CRUDDOM: A Model for Bridging the Gap Between the Object-Oriented and the Relational Paradigms."; ICSEA 2010 - Int. Conf. on Software Engineering and Applications, Nice, France (2010), 114-122. [Pereira, '11a] Pereira, Óscar Mortágua, Aguiar, Rui L. and Santos, Maribel Yasmina: "An Adaptable Business Component Based on Pre-defined Business Interfaces."; 6th ENASE: Evaluation of Novel Approaches to Software Engineering, Beijing, China (2011a), 92-103. [Pereira, '11b] Pereira, Óscar Mortágua, Aguiar, Rui L. and Santos, Maribel Yasmina: "CRUDDOM: A Model for Bridging the Gap Between the Object-Oriented and the Relational Paradigms - an Enhanced Performance Assessment Based on a case Study." International Journal On Advances in Software, 4, (2011b), 158-180. [Pereira, '12a] Pereira, Óscar Mortágua, Aguiar, Rui L. and Santos, Maribel Yasmina: "ACADA: Access Control-driven Architecture with Dynamic Adaptation." International Conference on Software Engineering and Knowledge Engineering, S. Francisco, CA, USA (2012a). [Pereira, '12b] Pereira, Óscar Mortágua, Aguiar, Rui L. and Santos, Maribel Yasmina: "ORCA: Architecture for Business Tier Components Driven by Dynamic Adaptation and Based 132 Mestrado Integrado em Engenharia de Computadores e Telemática on Call Level Interfaces."; 38th Euromicro Conf. on Software Engineering and Advanced Applications, Cesme, Izmir, Turkey (2012b), 183-191. [Rizvi, '04] Rizvi, Shariq, Mendelzon, Alberto, Sudarshan, S. and Roy, Prasan: "Extending query rewriting techniques for fine-grained access control." Proceedings of the 2004 ACM SIGMOD international conference on Management of data, ACM, Paris, France (2004), 551-562. [Samarati, '01] Samarati, Pierangela and Vimercati, Sabrina De Capitani di: "Access Control: Policies, Models, and Mechanisms." Revised versions of lectures given during the IFIP WG 1.7 International School on Foundations of Security Analysis and Design on Foundations of Security Analysis and Design: Tutorial Lectures, SpringerVerlag(2001), 137-196. [Sandhu, '94] Sandhu, Ravi: "Database Access Controls." Auerbach Publishers, George Mason University, Fairfax : Center for Secure Information Systems and Department of Information and Software Systems Engineering (1994). [Sandhu, '96] Sandhu, Ravi S., Coyne, Edward J., Feinstein, Hal L. and Youman, Charles E.: "Role-Based Access Control Models." Computer, 29, 2 (1996), 38-47. [Sumathi, '07] Sumathi, S. and Esakkirajan, S.: "Fundamentals of Relational Database Management Systems"; Editora Springer, (2007). [Vimercati, '08] Vimercati, S. DeCapitanidi, Foresti, S. and Samarati, P. (2008). Recent Advances in Access Control. Handbook of Database Security. M. Gertz and S. Jajodia, Springer US: 1-26. [Zytrax, '12] Zytrax. (2012). "Regex." from http://www.zytrax.com/tech/web/regex.htm. 133