Universidade Federal do Rio de Janeiro Escola Politécnica Departamento de Eletrônica e de Computação Simulador de redes de computadores para treinamento em atividades cibernéticas Autor: Orientador: Oliver von Behr Kuster Examinador: Prof. Marcelo Luiz Drumond Lanza Examinador: Prof. Luís Henrique Maciel Kosmalski Costa Prof. Miguel Elias Mitre Campista DEL Março 2014
UNIVERSIDADE FEDERAL DO RIO DE JANEIRO Escola Politécnica - Departamento de Eletrônica e de Computação Centro de Tecnologia, bloco H, sala H-217, Cidade Universitária Rio de Janeiro - RJ CEP 21949-900 Este exemplar é de propriedade da Universidade Federal do Rio de Janeiro, que poderá incluí-lo em base de dados, armazenar em computador, microfilmar ou adotar qualquer forma de arquivamento. É permitida a menção, reprodução parcial ou integral e a transmissão entre bibliotecas deste trabalho, sem modificação de seu texto, em qualquer meio que esteja ou venha a ser fixado, para pesquisa acadêmica, comentários e citações, desde que sem finalidade comercial e que seja feita a referência bibliográfica completa. Os conceitos expressos neste trabalho são de responsabilidade do(s) autor(es) e do(s) orientador(es). ii
AGRADECIMENTO Dedico esse trabalho aos meus pais, pela oportunidade que me deram para chegar a esse ponto. Agradeço aos meus amigos e professores que me apoiaram e me auxiliaram no caminho. Também tenho em mente que, sem nenhuma das pessoas que participaram na história de nossa tecnologia, nada disso teria sido possível. iii
RESUMO Este projeto apresenta o desenvolvimento e a metodologia usada para criar um simulador de redes de computadores voltado para treinamentos cibernéticos, em especial os na área de segurança de redes. Através desses treinamentos serão fornecidas redes virtuais para alunos executarem suas tarefas. O objetivo do projeto é prover uma ferramenta para geração automática de redes virtualizadas, com acesso via Web. Nele, deve ser possível configurar redes virtuais com suas máquinas e serviços de forma flexível e modular, permitindo reúso de conteúdo. Toda criação de redes virtuais será feita exclusivamente através da interface Web do sistema, portanto não será necessária a intervenção manual na preparação de redes virtuais. Tendo especificada a rede no sistema, é então possível a criação repetida e automatizada dela, de acordo com a necessidade para a quantidade de alunos que estão sendo treinados. Estes podem ter suas redes individualmente, preparando uma rede por aluno, ou podem estar todos conectados na mesma rede. O projeto foi desenvolvido em Java para Web Server, utilizando o VMware como sistema virtualizador de máquinas e redes. A contribuição no projeto inclui a implementação do uso das APIs do VMware para gerenciamento das máquinas virtuais e a configuração das máquinas virtuais através dessas APIs. Palavras-Chave: simulador, redes, computadores, virtualização, treinamento. iv
ABSTRACT This project explains the development and methodology of creating a computer network simulator focused on cybernetic training. The main goal of the project is to provide a tool for automatic network creation, using a web interface. It will be possible to configure virtual networks and their machines and services flexibly and in a modular way, allowing for content reuse. All configuration of the virtual networks will be made through the web interface, so no manual intervention will be required in the creation of the networks. After having specified the desired network, the system will be able to automatically create it repeatedly, fulfilling the need for the number of students to be trained. The students can have their individual networks, creating one identical network for each student, or they can share the same network. The system was developed in Java for Web Server, using VMware as the machine and network virtualizer. The contribution of this project includes the use of the VMware APIs for virtual machine management and the configuration of these virtual machines. Key-words: simulator, networks, computers, virtualization, training. v
SIGLAS AD - Active Directory ADSL - Asymmetric Digital Subscriber Line AJP - Apache JServ Protocol API - Application Programming Interface ASCII - American Standard Code for Information Interchange BGP - Border Gateway Protocol DHCP - Dynamic Host Configuration Protocol DLL - Dynamic Link Library DNS - Domain Name System DWR - Direct Web Remoting HTTP - Hypertext Transfer Protocol HTTPS - Hypertext Transfer Protocol Secure IDE - Integrated Development Environment IP - Internet Protocol JIT - Just-in-time JSP - JavaServer Pages JVM - Java Virtual Machine vi
MAC - Medium Access Control NAT - Network Address Translation OSI - Open Systems Interconnection OSPF - Open Shortest Path First RIP - Routing Information Protocol SOAP - Simple Object Access Protocol SSH - Secure Shell SQL - Structured Query Language UFRJ - Universidade Federal do Rio de Janeiro VLAN - Virtual Local Area Network VM - Virtual Machine XSD - XML Schema Definition XML - extensible Markup Language WSDL - Web Services Description Language vii
Sumário Lista de Figuras xi 1 Introdução 1 1.1 Tema.................................... 1 1.2 Delimitação................................ 1 1.3 Justificativa................................ 2 1.4 Objetivos................................. 2 1.5 Metodologia................................ 4 1.6 Organização do texto........................... 4 2 Tecnologias Usadas 6 2.1 Java.................................... 6 2.1.1 Tipos de linguagens........................ 7 2.1.2 Bytecode.............................. 8 2.1.3 A linguagem............................ 9 2.1.4 Apache Tomcat.......................... 9 2.2 PostgreSQL................................ 10 2.3 VMware.................................. 12 2.3.1 VMware ESXi........................... 13 2.3.2 VMware vsphere......................... 14 2.3.3 VMWare vcenter......................... 14 2.3.4 Formatos de VMs......................... 15 2.3.5 VMware Tools........................... 16 2.3.6 VMware vmotion......................... 16 2.3.7 Conexões Virtuais......................... 16 viii
2.3.8 APIs de acesso ao VMware.................... 19 2.3.9 Escolha do VMware....................... 20 2.3.10 Hardware............................. 21 2.4 Outras ferramentas............................ 22 2.4.1 Eclipse............................... 22 2.4.2 Jira................................ 22 2.4.3 Bibliotecas............................. 22 3 O Sistema 23 3.1 Objetos de rede.............................. 23 3.2 Treinamento................................ 27 3.3 Interface do sistema............................ 28 3.3.1 Criar e editar redes........................ 28 3.3.2 Execução de eventos....................... 31 4 Instanciação e configuração das máquinas 32 4.1 Máquinas virtuais............................. 32 4.1.1 VMware vsphere Management API............... 32 4.2 Configuração de rede........................... 34 4.2.1 Protocolos usados......................... 35 4.2.2 Elementos clientes........................ 37 4.2.3 Elementos roteadores....................... 38 4.2.4 Outros elementos......................... 41 4.3 Execução de scripts............................ 42 5 Motor de execução 48 5.1 O funcionamento............................. 48 5.1.1 Threads.............................. 48 5.1.2 Agendamento........................... 49 5.1.3 Unidade de tempo........................ 50 5.2 Eventos.................................. 50 5.3 Métricas.................................. 52 ix
6 Análise do resultado do treinamento 53 6.1 Banco de dados.............................. 53 6.2 Análise................................... 54 7 Conclusão 56 7.1 Limitações e Dificuldades......................... 56 7.2 Resultados................................. 57 7.3 Trabalhos futuros............................. 58 7.4 Conclusão................................. 59 Bibliografia 60 A Interface Vix 63 x
Lista de Figuras 2.1 Java JIT[1]................................. 9 2.2 Arquitetura do Tomcat[2]......................... 11 2.3 Infraestrutura do VMWare vsphere[3].................. 13 2.4 VMWare vcenter[4]............................ 14 2.5 Infraestrutura de produção........................ 21 3.1 Lista e classificação dos elementos de rede................ 29 3.2 Interface de associação de elementos de rede.............. 30 3.3 Lista de eventos de configuração..................... 30 3.4 Lista de eventos.............................. 31 xi
Capítulo 1 Introdução 1.1 Tema O projeto apresentado neste documento visa solucionar a deficiência de treinamentos cibernéticos, notadamente na área de segurança de redes de computadores, quando realizados utilizando um ambiente físico. O sistema discutido faz uso de máquinas virtuais (computadores e dispositivos de rede) para o processo de treinamento. As máquinas virtuais desejadas para uma rede serão selecionadas e relacionadas na forma em que a rede deverá ser montada. Para a criação da rede é possível especificar configurações em forma de scripts, que serão executados nas máquinas virtuais. Todos os elementos usados na criação de rede são modulares, possibilitando a reutilização e facilitando a expansão do conteúdo disponível. Este trabalho se enquadra na área de computação. Mais especificamente, serão abordados conhecimentos de desenvolvimento de software, de redes de computadores e de virtualização. 1.2 Delimitação Tendo em vista os recentes acontecimentos globais relacionados a ameaças digitais, foi criada uma demanda pelo Exército Brasileiro para treinamentos em operações cibernéticas. Este projeto é parte da solução desenvolvida pela empresa Minds at Work contratada pela empresa Decatron, vencedora da licitação para o desenvolvimento e entrega do sistema. 1
O sistema foi elaborado com fim de operações cibernéticas, com foco em ataque e defesa. Contudo, por ser um simulador de redes, pode ser adaptado para treinamentos em diversas áreas que utilizam tecnologia da informação. Isso se dá, pois todas as configurações são modulares, que permite serem editadas pelo usuário e que resulta em uma flexibilidade maior na gama de redes possíveis a serem criadas. 1.3 Justificativa Por mais que existam muitas soluções para a criação de máquinas virtuais, não encontramos uma solução de gerenciamento integrado para redes de computadores. Quando existem, são gerenciamentos pontuais e não facilmente replicáveis. Um treinamento, para ser executado, necessita de máquinas ligadas em rede configuradas para acesso. Nisso é incluída a configuração de IP da rede e a configuração de serviços que serão acessados. Toda vez que for executado um treinamento, será necessária a manutenção manual ou até individual dos computadores no treinamento, como por exemplo a reversão das máquinas para o estado inicial ou a configuração de máquinas novas. Também seria dificultada a criação de novas funcionalidades, sem ter que modificar a configuração existente, perdendo a configuração utilizada. Assim o treinamento em redes de computadores se torna limitado e custoso, dependendo de configurações fixas para que alunos possam usá-las recorrentemente. Isso limita a diversidade de treinamentos que podem ser oferecidos. Para oferecer flexibilidade é necessário configurar individualmente os componentes do treinamento para cada aluno, aumentando o custo do treinamento. A quantidade de alunos que podem ser treinados ao mesmo tempo é limitada por essas características do sistema de gerenciamento integrado. 1.4 Objetivos A ideia do projeto é criar uma ferramenta de gerenciamento de redes para organizar e modularizar o conteúdo para criação de redes virtuais. As redes terão como foco treinamentos em atividades cibernéticas, sendo possível, porém, criar redes genéricas de usos diversos, que envolvam redes de computadores e serviços. 2
Não existe atualmente uma grande preocupação em poder criar redes préconfiguradas sem ter a necessidade de implementar as configurações manualmente ou sem estar limitado a máquinas préviamente configuradas. Mesmo que redes sejam parcialmente ou exclusivamente em ambientes virtualizados, suas configurações são feitas de maneira efêmera, descartando a possibilidade de serem reaproveitadas de outra forma ou em outro ambiente. O projeto almeja oferecer uma mecânica integrada para a criação e para a execução de treinamentos em redes. A criação deve ser o mais flexível possível, mantendo-se ao mesmo tempo simples, de forma que seja necessário pouco conhecimento específico sobre o sistema. Assim, é apenas necessária a configuração de modelos de máquinas virtuais existentes através de scripts. Através do uso de um virtualizador de máquinas, neste caso o VMware, será feita a preparação de máquinas virtuais a partir de Templates, que são máquinas virtuais modelo. Estas máquinas virtuais criadas serão configuradas pelo sistema de acordo com a definição da rede criada para o treinamento. Utilizando o sistema, um mesmo treinamento poderá ser reexecutado quantas vezes necessário, sem a necessidade de intervenção manual nas máquinas virtuais ou reconfiguração de conteúdo no sistema. Esses treinamentos fornecerão máquinas virtuais pré-configuradas para os alunos acessarem, através das quais deverão executar as tarefas especificadas. No treinamento será possível monitorar os alunos, bem como criar scripts que interajam com as máquinas virtuais e possam coletar informações. A execução dos treinamentos deve oferecer acesso a um número adequado de alunos, individualmente ou em grupo. Os instrutores deverão poder acompanhar os treinamentos de modo que possam monitorar os alunos e/ou o sistema como um todo através de regras configuráveis. O material para estudar e analisar o resultado do treinamento após a sua execução deverá ficar disponível, possibilitando discussões e avaliações do processo, bem como das soluções elaboradas pelos alunos. 3
1.5 Metodologia Como o sistema é complexo e necessita de várias soluções de terceiros para se tornar viável, foi conduzida uma pesquisa para a avaliação dos componentes a serem usados. Isso se torna importante para a adequação dos termos dados ao sistema pela sua licitação. Também será feita uma análise quantitativa da usabilidade do sistema em questão de criação de redes. O projeto será apresentado em quatro fases, permitindo que o seu andamento possa ser verificado e principalmente se as especificações iniciais estejam sendo atendidas. A validação oficial foi realizada através do uso do sistema em testes e através do primeiro uso após a sua entrega. A contribuição neste projeto está no gerenciamento de máquinas virtuais através do sistema desenvolvido. Isso é implementado através do uso das APIs do VMware, usando o controle de máquinas virtuais e a interação com o sistema operacional virtualizado. Nisso são incluídas as funcionalidades de clonar, iniciar e reconfigurar as máquinas virtuais, assim como a criação, modificação e execução de arquivos no sistema operacional virtualizado. Também são fornecidos os scripts e as configurações internas nas máquinas virtuais que são usados para adequar as máquinas à rede definida. Essencialmente desenvolveu-se a utilização do VMware, os scripts e as configurações das máquinas e a maneira que o sistema gerencia ambos. 1.6 Organização do texto No capítulo 2 serão apresentadas as tecnologias usadas e detalhes relevantes sobre cada uma delas. O capítulo 3 apresenta a geração de conteúdo, o próprio treinamento e como ele pode ser gerenciado através da interface. No capítulo 4 é discutido o uso e a configuração de máquinas virtualizadas. O capítulo 5 contém informações sobre o decorrer do treinamento, realizado pelas ações do motor de execução. No capítulo 6, serão apresentadas as funcionalidades de análise dos treinamentos executados. 4
O capítulo 7 encerra com os resultados e a conclusão do trabalho. 5
Capítulo 2 Tecnologias Usadas Neste capítulo serão descritas as tecnologias utilizadas no funcionamento do sistema. Essas tecnologias concentram-se em dois pontos, o primeiro sendo a linguagem Java e como ela pode ser usada para gerar um portal Web através do Webserver Tomcat. O segundo ponto é a integração entre o desenvolvimento e a ferramenta de virtualização escolhida, ou seja, o VMware. 2.1 Java Java é uma linguagem de programação orientada a objetos cuja grande vantagem é a portabilidade entre plataformas. Inicialmente criada para televisão interativa, não teve difusão por ser avançada demais em 1991 [5]. Seu nome inicial era Oak, depois foi trocado para Green até chegar em Java. A linguagem se tornou popular quando navegadores incorporaram a habilidade de executar Java Applets em páginas Web, tornando-as interativas. De acordo com sua criadora, a Sun Microsystems [6], Java é um código do tipo Write once, run anywhere (WORA). Isto é, o código fonte de uma aplicação Java pode ser executado em diversos hardwares e em sistemas operacionais diferentes sem maiores modificações. Com isso, projetos podem ser difundidos entre usuários de diversos dispositivos. Há também a consideração de que desenvolvedores não precisam aprender a usar uma ferramenta totalmente nova para cada plataforma, facilitando novos projetos. Atualmente, o Java tem usa principal implementação pertencente à Oracle, pela aquisição da Sun Microsystems em 2009. 6
Essa linguagem é usada em uma grande quantidade de dispositivos, desde aparelhos de som de carros a televisões, e têm tido grande uso no sistema operacional de smartphones, o Android, desenvolvido pela Google. A linguagem foi usada nesse projeto por que está de acordo com as técnicas de desenvolvimento atuais, sendo orientada a objetos e amplamente difundida. A sintaxe da linguagem Java é de fácil entendimento e usada por padrão em projetos da empresa na qual o projeto foi desenvolvido. 2.1.1 Tipos de linguagens As linguagens de programação são executadas normalmente de duas formas. Da primeira, é compilada do código fonte para a linguagem de máquina do hardware alvo e a segunda é interpretada direto do código fonte em tempo de execução. Compilar nada mais é que traduzir o código fonte para a linguagem de máquina. Com isso, podem ser feitas diversas otimizações para a arquitetura alvo, baseadas nas instruções implementadas no processador em questão. Essas instruções podem conter comandos específicos para diversas aplicações amplamente usadas, como encriptação, que seriam executadas de forma mais rápida. Implementações a nível de hardware tendem a ser mais rápidas pois reduzem o número de comandos necessários para implementar os mesmos cálculos. Ao compilar, o binário torna-se dependente do ambiente alvo onde será executado. Traduzir o binário para todos os sistemas operacionais e arquiteturas é custoso e dificulta a sua distribuição. Para superar esse problema existem linguagens interpretadas, onde o código fonte é lido em tempo de execução e implementado nativamente por um interpretador. O interpretador também teria que ser compilado para cada ambiente. Isso é feito apenas uma vez, enquanto que cada aplicativo teria que ser compilado para cada combinação sistema operacional e arquitetura. Existem desvantagens. Uma delas é a necessidade de analisar o código toda vez que for executado, verificando a sua léxica. Certamente os interpretadores são compilados com as otimizações, melhorando o desempenho dos comandos lidos do código fonte do aplicativo a ser executado. Porém é muito mais custoso ler um arquivo texto, onde cada instrução pode relacionar várias linhas e comandos diferentes. 7
As instruções nada mais são que comandos da linguagem que executarão uma atividade, como executar outros comandos, atribuir valores a variáveis, etc. Os comandos nas linguagens interpretadas devem ser analisados para confirmar se a sintaxe está correta. A seguir devem ser traduzidos pelo interpretador para as instruções equivalentes do ambiente de execução. É muito mais eficiente ler instruções já no formato correto, compostas por alguns bytes, que serão passados diretamente para o sistema operacional e para o processador. 2.1.2 Bytecode Java é um comprometimento entre os dois tipos de linguagens. Nela, o código fonte é compilado para uma linguagem de máquina chamada bytecode, que garante a compatibilidade entre diferentes sistemas operacionais. Para conciliar as duas formas, Java cria uma espécie de linguagem de máquina própria. O resultado ainda precisa ser interpretado, no entanto é menos custoso que uma linguagem puramente interpretada. Verificações léxicas não precisam ser feitas a cada execução e o gerador de bytecode pode otimizar o código. Esse código é então executado em uma Java Virtual Machine (JVM). A JVM executa código de arquivos com extensão.class ou.jar. O primeiro contém uma classe Java, enquanto que o segundo contém um conjunto comprimido de classes, o que facilita a sua distribuição. A cada vez que forem executados, será realizada uma análise para verificar se o binário está com os dados em posições válidas, sempre inicializados e com tipos compatíveis, e se as regras de acesso aos métodos são seguidas. Em tempo de execução, a máquina virtual pode usar um Just-in-time compiler (JIT), que converte pedaços do bytecode em linguagem de máquina corresponde à arquitetura em questão, otimizando aqueles trechos. Essa ferramenta é usada na maioria das implementações de máquinas virtuais de Java. Sendo que a mais difundida é a HotSpot, da Oracle Corporation [7]. O nome vem da procura por pontos quentes no código, que são partes executadas repetidamente, necessitando de otimização do desempenho. Na figura 2.1 é possível ter uma visão geral dessa funcionalidade. 8
Figura 2.1: Java JIT[1]. 2.1.3 A linguagem A sintaxe da linguagem é, em grande parte, derivada de C++. Todo o código é contido em classes e todas as variáveis são objetos, com exceção dos tipos básicos, como inteiros, números de ponto flutuante, booleanas e caracteres. Java não suporta sobrecarga de operadores, que pode ser usada em C++ para definir comportamentos alternativos para operações de soma, divisão, atribuição, etc. Essa decisão foi tomada, pois não é possível garantir a lógica da implementação desses operadores para objetos complexos. Por isso, devem ser chamadas sempre funções cujo nome identifique o seu comportamento. Também não são suportadas heranças de múltiplas classes e tipos sem sinal (unsigned) de variáveis numéricas, que restringem seus valores apenas para números positivos. Essas limitações são estabelecidas tendo em mente manter a simplicidade da linguagem [8]. O uso de comentários é parecido com C/C++: // para comentar apenas uma linha de conteúdo após as duas barras e / para comentar conteúdo até o próximo /. Difere porém na existência do comentário iniciado por / que indica ser um Javadoc, terminado por /. Esse comentário é necessário para gerar a documentação do código e deve ser usado para descrever classes, métodos e seus parâmetros. 2.1.4 Apache Tomcat O Tomcat é um Webserver de código aberto, desenvolvido pela Apache Software Foundation, e está na versão 7. Nesse projeto foi utilizada a versão 4.1.40, pois fornece maior estabilidade e compatibilidade com as ferramentas utilizadas. Esse 9
serviço é usado para gerar um portal Web gerenciado por binários em Java. Existem outros serviços que têm a mesma funcionalidade, como por exemplo o WebSphere da empresa IBM, que porém não é de código aberto. O Tomcat foi usado no projeto por ser livre e de código aberto, suportado em Linux, Windows e Mac OS. Também é usado como padrão da empresa. Um concorrente válido seria o IBM WebSphere, que é pago porém. Existem diversas outras maneiras de desenvolver sistemas Web, porém para uso da linguagem Java estas são as mais adequadas. Três partes constituem o Tomcat: Catalina, Coyote e Jasper. Coyote é o responsável por receber conexões Web e responder com conteúdo para os clientes. Jasper compila arquivos de código fonte Java, as JavaServer Pages (JSP), que são gerenciadas pelo Catalina, que também incorpora elementos de segurança e de permissões. As conexões que o serviço suporta são configuradas em um arquivo extensible Markup Language (XML), localizado no caminho da instalação. Neste arquivo podem ser definidos diversos conectores, como Hypertext Transfer Protocol (HTTP), Hypertext Transfer Protocol Secure (HTTPS) e Apache JServ Protocol (AJP). O HTTP e sua forma encriptada, o HTTPS, são os formatos padrões de conteúdo Web. O AJP é um protocolo para integração com outros servidores Apache, para que tarefas possam ser distribuídas internamente de maneira transparente. Isso é representado de maneira abstrata na figura 2.2, onde é mostrada a arquitetura do Tomcat. Também é suportada a execução em cluster, onde o processamento do serviço é dividido entre várias máquinas para atender melhor à grande quantidade de requisições. 2.2 PostgreSQL O Bancos de dados são uma coleção organizada de dados, contendo estruturas para armazenar informações de um ou de vários sistemas. Para essas coleções de dados serem acessadas e gerenciadas, são necessários sistemas gerenciadores de bancos de dados. As ações que um sistema gerenciador pode tomar em um banco de 10
Figura 2.2: Arquitetura do Tomcat[2]. dados se enquadram em quatro tipos. O primeiro é a definição de dados, que define a estrutura que será utilizada no banco para armazenar as informações. Em seguida é necessário popular o banco, inserindo, modificando ou apagando informações. Buscas poderão ser realizadas sobre essas informações. Por fim, o sistema gerenciador também pode administrar o banco, isto é, configurar usuários para limitar acessos indevidos e garantir a segurança das informações, monitorar o desempenho, garantir integridade do banco e recuperá-lo em caso de falha. Para armazenar as informações, os bancos usam normalmente o modelo relacional. Nele, os dados são armazenados em tabelas, que devem ter um índice único para aquela entrada de dados. Cada entrada de dados é uma linha na tabela, também chamado de tupla, podendo conter vários atributos, que são as colunas. Os índices são chamados de chaves primárias. Essas chaves primárias podem ser referenciadas por chaves estrangeiras de outras tabelas, relacionando tuplas diferentes. Existem três tipos de relacionamentos usando chaves estrangeiras. Os dois mais simples são Um para um e Um para muitos. Nesses dois tipos, uma tupla é referenciada apenas por uma ou mais tuplas de outra tabela. Em Um para um não é diferenciado qual contém a chave estrangeira. Na outra, entretanto, a chave primária da Um deve estar referenciada nas chaves estrangeiras dos muitos, para evitar complexidades desnecessárias no banco. Várias entradas de uma tabela podem referenciar uma única entrada da outra tabela, mas cada entrada 11
referencia apenas uma outra tupla. O terceiro tipo é Muitos para muitos, onde é necessária a criação de uma nova tabela para fazer a refêrencia cruzada entre as chaves primárias das tabelas relacionadas. Um exemplo simples para esse tipo seria uma tabela de publicações e autores. Um autor pode ter várias publicações, assim como uma publicação pode ter mais de um autor. Nesse caso seria criada uma tabela que relaciona cada índice de publicação com o índice do autor correspondente. O banco de dados objeto-relacional PostgreSQL, ou simplesmente Postgres, foi desenvolvido em 1990 na Universidade da Califórnia para avançar no campo de bancos de dados. A ideia era desenvolver um sistema com o mínimo de funcionalidades necessárias para conseguir implementar relacionamentos de objetos. Isso permitiria a exploração de conceitos novos, como a tecnologia objeto-relacional[9]. O Postgres suporta grande parte do padrão SQL e possibilita várias opções modernas, tal como consultas complexas, chaves estrangeiras, gatilhos entre outros[10]. Com consultas complexas é possível buscar por entradas usando mais de um filtro e múltiplas tabelas. O uso de chaves estrangeiras permite que sejam impostas regras entre tabelas para manter a integridade dos dados contidos em mais de uma tabela. A refêrencia de outra tabela não pode ser removida enquanto alguma outra entrada a estiver usando, ou que ao remover uma informação, todos os pontos que são referenciados somente por ela também sejam removidos. O Postgres foi usado no projeto pois estava nos requisitos do edital. Além disso é um banco de dados maduro e seguro, suportado em diversas plataformas, e uma solução gratuita. 2.3 VMware Por mais que o Java execute código em JVM, isso não é o suficiente para executar sistemas operacionais inteiros em ambientes simulados. Para conseguir gerenciar isto, foi usada a solução de virtualização da VMware. A solução se divide em três aspectos principais, que em sua totalidade são denominados VMware vsphere. sistema operacional VMware ESXi que é instalado nos servidores de virtua- 12
lização gerenciador dos servidores, chamado VMware vcenter software cliente que permite o acesso a essa infraestrutura Figura 2.3: Infraestrutura do VMWare vsphere[3]. 2.3.1 VMware ESXi O VMware ESXi é um sistema operacional criado a partir do Linux e não possui uma interface gráfica, apenas uma interface limitada para acesso emergencial. A vantagem de ser um sistema específico para virtualização é conseguir prover o maior desempenho para as máquinas virtuais que são executadas nele. Idealmente, essas máquinas virtuais conseguem ser executadas com velocidade próxima a que conseguiriam se estivessem em uma máquina física com hardware equivalente. Idealmente, pois é feita uma distribuição de recursos entre cada máquina quando é necessário, o que pode resultar em uma redução dos recursos necessários para as outras máquinas. 13
2.3.2 VMware vsphere A solução vsphere da VMware é a visão geral de todos os elementos da empresa, desde servidores, a serviços e gerenciamento de máquinas. A figura 2.3 engloba muitas das tecnologias disponíveis, a principal sendo o VMware vsphere, como centro das funcionalidades. A partir do vsphere é possível acessar e gerenciar diferentes funcionalidades e ferramentas disponíveis pela VMware. 2.3.3 VMWare vcenter O vcenter, figura 2.4, é uma ferramenta de gestão integrada de múltiplos servidores de virtualização. Nele são integrados diversos servidores ESXi sobre um único ponto de gerenciamento, fornecendo acesso ao VMware vsphere e integração de APIs de gerenciamento, que são usadas no projeto. Ele é um serviço com suporte apenas para Windows, com banco de dados próprio e pode ser instalado dentro de uma das máquinas virtuais gerenciadas por ele. Figura 2.4: VMWare vcenter[4]. 14