U NIVERSIDADE DE L ISBOA Faculdade de Ciências Departamento de Informática DEPSKY: SISTEMA DE ARMAZENAMENTO EM CLOUDS TOLERANTE A INTRUSÕES Bruno Miguel Maia Rovisco Quaresma MESTRADO EM ENGENHARIA INFORMÁTICA Especialização em Arquitectura, Sistemas e Redes de Computadores 2010 U NIVERSIDADE DE L ISBOA Faculdade de Ciências Departamento de Informática DEPSKY: SISTEMA DE ARMAZENAMENTO EM CLOUDS TOLERANTE A INTRUSÕES Bruno Miguel Maia Rovisco Quaresma DISSERTAÇÃO Projecto orientado pelo Prof. Doutor Alysson Neves Bessani e co-orientado pelo Prof. Doutor Paulo Jorge Paiva de Sousa MESTRADO EM ENGENHARIA INFORMÁTICA Especialização em Arquitectura, Sistemas e Redes de Computadores 2010 Agradecimentos Em primeiro lugar, quero agradecer aos meus orientadores do PEI, os Professores Doutores Alysson Bessani e Paulo Sousa, pela orientação dada neste último ano do MEI. Também quero agradecer aos meus colegas, tanto de investigação como de curso, pelos bons momentos passados e troca de impressões sobre temas de interesse. Agradeço à minha família, especialmente aos meus pais e irmã por me aturarem e facilitarem a conclusão dos meus estudos. Finalmente agradeço, a todos os meus amigos e amigas, a força e motivação para atingir os meus objectivos. iii Resumo A manutenção da disponibilidade e da integridade da informação é um requisito fundamental em sistemas de armazenamento. Estes sistemas lidam com a perda de dados através de replicação, na qual os dados são armazenados em múltiplas unidades básicas de armazenamento. A ideia base do trabalho aqui apresentado surgiu da constatação que as clouds de armazenamento podem ser vistas como unidades desse tipo. Com a crescente popularidade das clouds de armazenamento, empresas que lidam com dados críticos começam a pensar em usar estes serviços para armazenar bases de dados de registos médicos, históricos de infra-estruturas críticas, dados financeiros, entre outros. No entanto, muitas pessoas acreditam que informação armazenada num sistema deste tipo é vulnerável, apesar de todas as garantias dadas pelos fornecedores, o que faz da fiabilidade e da segurança as maiores preocupações sobre o armazenamento em clouds. Este trabalho apresenta o D EP S KY, um sistema que melhora a disponibilidade, integridade e confidencialidade de informação armazenada em clouds. Para garantir estas propriedades, o sistema D EP S KY disponibiliza dois protocolos, o ADS (Available D EP S KY), focado em melhorar a disponibilidade e integridade da informação, e o CADS (Confidential & Available D EP S KY), que adicionalmente melhora a confidencialidade da informação. Ambos os protocolos fornecem algoritmos para leitura e escrita, à semelhança do que acontece com todos os sistemas de armazenamento. Palavras-chave: Clouds de armazenamento, replicação, disponibilidade, confidencialidade, integridade v Abstract Maintaining availability and integrity of information is a fundamental requirement in storage systems. These systems deal with the loss of data through replication, where data is stored in multiple basic units of storage. The initial idea of the work presented here resulted from the realization that storage clouds can be viewed as such units. With the increasing popularity of cloud storaging services, companies that deal with critical data start thinking of using these services to store medical records databases, historical data of critical infrastructures, financial data, among others. However, many people believe that information stored that way is vulnerable, despite the guarantees given by providers, which makes reliability and security the major concerns about cloud storaging. This work presents D EP S KY, a system that improves the availability, integrity and confidentiality of information stored in the cloud. To ensure these properties D EP S KY provides two protocols, ADS (Available D EP S KY), focused on improving the availability and integrity of information, and CADS (Confidential & Available D EP S KY), which additionally enhances the confidentiality of information. Both provide algorithms for reading and writing data, as is any storage systems. Keywords: Storage clouds, replication, availability, confidentiality, integrity vii Conteúdo Lista de Figuras xiii Lista de Tabelas xv 1 2 3 Introdução 1.1 Motivação . . . . . . . . 1.2 Objectivos . . . . . . . . 1.3 Contribuições . . . . . . 1.4 Publicações . . . . . . . 1.5 Planeamento . . . . . . . 1.6 Estrutura do Documento . . . . . . . . . . . . Trabalho Relacionado 2.1 Tolerância a Intrusões . . . . 2.1.1 Introdução ao Tema . 2.1.2 Replicação . . . . . 2.1.3 Confidencialidade . 2.2 Clouds de Armazenamento . 2.2.1 Considerações Gerais 2.2.2 Detalhes Adicionais 2.3 Considerações Finais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . D EP S KY 3.1 Apresentação . . . . . . . . . . . . . . . . 3.2 Modelo de Sistema . . . . . . . . . . . . . 3.3 Modelo de Dados . . . . . . . . . . . . . . 3.4 ADS - Available D EP S KY . . . . . . . . . 3.4.1 Algoritmo de Escrita . . . . . . . . 3.4.2 Algoritmo de Leitura . . . . . . . . 3.5 CADS - Confidential & Available D EP S KY 3.6 Trabalhos Similares . . . . . . . . . . . . . 3.7 Considerações Finais . . . . . . . . . . . . ix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 3 3 4 4 5 . . . . . . . . 7 7 7 8 11 13 13 15 17 . . . . . . . . . 19 19 20 21 22 22 23 23 27 28 4 5 6 Concretização do D EP S KY 4.1 Considerações Gerais . 4.2 Arquitectura . . . . . . 4.3 Diagramas UML . . . 4.4 Controladores . . . . . 4.5 Considerações Finais . . . . . . 29 29 31 32 36 37 . . . . . . 39 39 41 41 42 44 45 Conclusões e Trabalho Futuro 6.1 Conclusões . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2 Trabalho Futuro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 47 48 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Avaliação Experimental do D EP S KY 5.1 Custo do Armazenamento Replicado 5.2 Desempenho e Disponibilidade . . . 5.2.1 Metodologia . . . . . . . . 5.2.2 Latência de Leitura . . . . . 5.2.3 Latência de Escrita . . . . . 5.3 Considerações Finais . . . . . . . . Referências . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 x xii Lista de Figuras 3.1 3.2 Visão sobre a distribuição de informação pelas clouds. . . . . . . . . . . . . . 4.1 4.2 4.3 4.4 Visão minimalista sobre a estrutura do DepSky. . . . . . . . . . . . . . . . . 5.1 FDC para as latências de leitura de dados com 100K bytes observadas em quatro Decomposição do Data Unit X do D EP S KY, do conceito à concretização. . . . . Diagrama de classes do sistema. . . . . . . . . . . . . . . . . . . . . . . . . Diagrama de sequência simplificado de uma operação de escrita. . . . . . . . . Diagrama de sequência simplificado de uma operação de leitura. . . . . . . . . 20 22 31 33 34 36 diferentes clouds (Amazon S3, Windows Azure, Nirvanix e DivShare) e nas três versões do D EP S KY replicando dados por essas clouds. 5.2 . . . . . . . . . . . . 42 FDC para as latências de leitura de dados com 1M bytes observadas em quatro diferentes clouds (Amazon S3, Windows Azure, Nirvanix e DivShare) e nas três versões do D EP S KY replicando dados por essas clouds. 5.3 . . . . . . . . . . . . 43 FDC para as latências de leitura de dados com 10M bytes observadas em quatro diferentes clouds (Amazon S3, Windows Azure, Nirvanix e DivShare) e nas três versões do D EP S KY replicando dados por essas clouds. xiii . . . . . . . . . . . . 43 Lista de Tabelas 1.1 Planeamento inicial do PEI. . . . . . . . . . . . . . . . . . . . . . . . . . 2.1 2.3 Custo, em USD, do armazenamento, entrada e saída de 1 Gb de dados em serviços de armazenamento pay-per-use estudados. . . . . . . . . . . . . Custo, em USD, de efectuar 10000 pedidos a serviços de armazenamento pay-per-use estudados. . . . . . . . . . . . . . . . . . . . . . . . . . . . Alguns limites conhecidos de serviços livres de encargos estudados. . . . 4.1 Número de linhas de código necessárias para cada componente do sistema. 30 5.1 Custo estimado, em USD, de 10.000 operações de leitura e escrita de dados com 100KB, 1MB e 10MB nas clouds. . . . . . . . . . . . . . . . 40 Custo estimado, em USD, de 10.000 operações de leitura e escrita de dados com 100KB, 1MB e 10MB usando os protocolos do D EP S KY. . . . 40 Número de falhas observadas durante as experiências de leitura. O “10+10hs” para a Azure na experiência de 10M significa que para além das 10 falhas reportadas houve um período de 10 horas onde mais de 95% dos acessos individuais a este sistema falharam. . . . . . . . . . . . . . . . . . . . . 44 Latência média (ms) de escrita para diferentes tamanhos de unidades de dados, configurações do D EP S KY e clouds de armazenamento. . . . . . . 44 2.2 5.2 5.3 5.4 xv 5 16 17 17 Capítulo 1 Introdução Este relatório descreve o trabalho realizado no âmbito da disciplina de Projecto de Engenharia Informática (PEI) do Mestrado em Engenharia Informática da Faculdade de Ciências da Universidade de Lisboa. Este projecto foi desenvolvido na unidade de investigação LaSIGE (Laboratório de Sistemas Informáticos de Grande Escala) sito no Departamento de Informática da Faculdade de Ciências da Universidade de Lisboa. Fui inserido no grupo de investigação Navigators no qual o meu orientador, Prof. Doutor Alysson Neves Bessani, e co-orientador, Prof. Doutor Paulo Jorge Paiva de Sousa, estão também inseridos. Por este motivo de proximidade, ao longo do projecto foi possível a existência de uma boa comunicação de forma a que certas ideias ou dúvidas, que tenham surgido, fossem rapidamente discutidas. Neste capítulo introdutório são apresentadas a motivação, os objectivos, as contribuições e o planeamento do trabalho descrito neste relatório. A secção final deste capítulo descreve de forma resumida a oraganização dos restantes capítulos. 1.1 Motivação A manutenção da disponibilidade e da integridade da informação é um requisito fundamental em sistemas de armazenamento. Os sistemas de armazenamento distribuído estão a tornar-se cada vez mais populares com o advento das tecnologias SAN (Storage Area Network) e NAS (Network Attached Storage), assim como a crescente disponibilidade de discos de baixo custo. Estes sistemas lidam com a perda de dados através da replicação, na qual os dados são armazenados em múltiplas unidades básicas de armazenamento (discos ou servidores), doravante denominados objectos base. Um desafio importante deste tipo de sistemas é fornecer uma elevada disponibilidade, tal como já tinha sido referido. Isto significa que o sistema deve permanecer disponível ainda que um objecto base falhe; por vezes mais falhas são toleradas dependendo da resiliência do sistema. A resiliência de um sistema de armazenamento distribuído está definida 1 Capítulo 1. Introdução 2 como o número f de um total de n objectos base que podem falhar sem este sistema deixar de oferecer disponibilidade e consistência. O nível de resiliência dita a disponibilidade do serviço pois ao replicar-se a informação em vários objectos base (discos, servidores), a disponibilidade da informação aumenta. Um sistema de armazenamento distribuído emula um objecto partilhado robusto através da manutenção de cópias deste em locais diferentes, para que a informação sobreviva. Isto pode ser conseguido sem muito esforço financeiro usando vários discos de baixo custo ou PC’s de capacidade moderada, em vez de servidores poderosos, para armazenar a informação. É típico focar na abstracção de objecto de armazenamento, que apenas suporta as operações básicas de leitura e escrita pelos clientes. O estudo destes objectos é fundamental, pois estes são os alicerces para a construção de sistemas de armazenamento mais complexos. Os algoritmos de armazenamento distribuído enfrentam o desafio de superar a assincronia e uma variedade de faltas, sem se desviar significativamente das garantias de consistência e desempenho do armazenamento tradicional (centralizado). Tais algoritmos variam em função de várias dimensões: na semântica de consistência que fornecem; na sua resiliência (número e tipos de faltas toleradas); na sua arquitectura (se os objectos base são simples discos ou servidores mais complexos); e na sua complexidade (e.g., latência). Claramente, existem muitos tradeoffs: por exemplo, oferecer maior consistência ou resiliência adicional tem impacto na complexidade. Nos últimos tempos tem-se observado uma crescente oferta de serviços na Internet que disponibilizam espaço nos seus servidores para um cliente armazenar e partilhar informação, normalmente ficheiros. No contexto deste trabalho tais serviços podem ser vistos como objectos base para a construção de um sistema de armazenamento. Contudo, terão de ser asseguradas características fundamentais como integridade, disponiblidade e confidencialidade, que são características básicas da segurança da informação, não estando esta segurança restrita somente a sistemas computacionais, informação digital ou sistemas de armazenamento. A segurança da informação está relacionada com a protecção de um conjunto de dados, no sentido de preservar o valor que possuem para uma entidade, indivíduo ou organização. O conceito de segurança informática está directamente relacionado com o de segurança da informação, incluindo não apenas este mas também a segurança dos próprios sistemas. Actualmente, muitas organizações começam a optar de forma progressiva pelo uso de clouds de armazenamento. Exemplos recentes são serviços como o Twitter e o Facebook que até há bem pouco tempo tinham os seus próprios data centers de armazenamento e hoje tercerizam parte deste serviço para a Amazon e o seu Simple Storage Service (Amazon S3) [1]. Esta tendência pode ser definida como o armazenamento de informação num sistema de armazenamento remoto mantido por terceiros. A Internet fornece a ligação entre o computador e esse sistema. Capítulo 1. Introdução 3 O armazenamento em clouds tem algumas vantagens sobre o armazenamento tradicional. Por exemplo, se se armazenar informação numa cloud, esta estará acessível a partir de qualquer local com acesso à Internet e evita a necessidade da manutenção de uma infra-estrutura de armazenamento na organização. À medida que as clouds de armazenamento se tornam mais populares, empresas que lidam com dados critícos começam a pensar em usar estes serviços para armazenar bases de dados de registos médicos, históricos de infra-estruturas críticas, dados financeiros, entre outros. No entanto, um perigo muitas vezes ignorado está no facto dos sistemas de armazenamento remoto estarem fora do controlo dos donos dos dados, apesar das garantias dadas pelos fornecedores (e.g., SLA - Service Level Agreement), o que faz da fiabilidade e da segurança as maiores preocupações sobre o armazenamento em clouds. 1.2 Objectivos O principal objectivo deste trabalho era a concretização de um sistema de armazenamento em clouds tolerante a intrusões, o D EP S KY, assegurando a integridade, disponibilidade e confidencialidade da informação. Outro dos objectivos deste trabalho era realizar diversos tipos de testes ao sistema, analisando o seu desempenho. 1.3 Contribuições No inicio desta dissertação, foi necessário realizar um estudo acerca do tema tolerância a intrusões, de forma a aprofundar conhecimentos nesta área de investigação, incidindo na replicação e confidencialidade de informação. Durante este estudo inicial foi dada uma pequena contribuição a um projecto paralelo, que consistiu na actualização de uma biblioteca baseada em sistemas de quóruns activos 2.1.2. Também foi necessária investigação sobre clouds de armazenamento (2.2), incluindo o estudo de API’s de variados serviços do género. Após este processo foi iniciado o desenho e concretização do D EP S KY. Estas tarefas foram realizadas de forma incremental tendo sido efectuadas várias revisões de modo a melhorar o sistema. À medida que se efectuava uma nova versão, eram realizados testes ao desempenho de modo a se perceber o que poderia ser melhorado. A principal contribuição desta tese é o D EP S KY, um sistema que garante disponibilidade, integridade e confidencialidade de informação armazenada em clouds. A ideia fundamental deste sistema é replicar a informação por várias clouds de armazenamento, utilizando algoritmos para armazenamento fiável e partilha de segredos. O D EP S KY fornece uma abstracção de um sistema de armazenamento tolerante a intrusões, possuindo algoritmos que permitem a leitura e escrita de dados em clouds. Durante o seu desenvolvimento tomaram-se opções tendo em conta a disponibilidade e o Capítulo 1. Introdução 4 custo do armazenamento em clouds. Outra contribuição importante é a análise das medidas efectuadas ao sistema e a esses serviços de armazenamento em clouds. Os resultados obtidos permitiram efectuar a avaliação aos protocolos do D EP S KY. É também de referir que a parte considerável do tempo dispendido em termos de desenvolvimento do sistema foi para estudo das API’s dos serviços usados e subjacente concretização do controlador (responsável pela comunicação) para cada serviço. 1.4 Publicações O trabalho descrito neste relatório deu origem à seguinte publicação: Título: Melhorando a Disponibilidade e Confidencialidade dos Dados Armazenados em Clouds [30] Autores: Bruno Quaresma, Alysson Bessani e Paulo Sousa Em: INForum 2010 [6] - Segurança de Sistemas de Computadores e Comunicações 1.5 Planeamento O planeamento inicial deste trabalho consistia nas seguintes tarefas: • T1 - Estudo da replicação e de técnicas de replicação • T2 - Estudo de técnicas que garantem confidencialidade em informação replicada, nomeadamente esquemas de partilha de segredos e códigos de apagamento • T3 - Estudo das clouds de armazenamento existentes na web e suas API’s • T4 - Desenho do sistema • T5 - Concretização do sistema • T6 - Testes ao sistema • T7 - Escrita da Tese de Mestrado A calendarização destas tarefas é apresentada na figura 1.5. Este planeamento foi seguido na perfeição até à fase de testes ao sistema (T6). Teve que ser investido mais um mês nesta tarefa devido à necessidade de se efectuarem melhoramentos ao sistema, o que levou ao adiamento da escrita desta tese para o mês de Junho de 2010. 5 Capítulo 1. Introdução Tarefas T1 T2 T3 T4 T5 T6 T7 Mês/Ano Setembro e Outubro de 2009 Novembro de 2009 Dezembro de 2009 e Janeiro de 2010 Fevereiro de 2010 Março de 2010 Abril de 2010 Maio de 2010 Tabela 1.1: Planeamento inicial do PEI. 1.6 Estrutura do Documento Este documento encontra-se organizado da seguinte forma: • Capítulo 2 - Este capítulo descreve o trabalho relacionado com o sistema desenvolvido. É introduzido o conceito tolerância a intrusões e como a replicação é importante para este tipo de sistemas. Também são introduzidas técnicas de distribuição de informação por réplicas de maneira a garantir confidencialidade. Mais especificamente são abordadas as seguintes técnicas: partilha de segredos e códigos de apagamento com criptografia simétrica. Neste capítulo também são apresentadas as clouds de armazenamento, assim como são analisadas propriedades e características que estas devem assegurar. • Capítulo 3 - Apresentação do sistema de armazenamento tolerante a intrusões D EP S KY, modelo de sistema, modelo de dados e protocolos concretizados. Para concluir são analisados trabalhos recentes que tentam fazer algo similar ao D EP S KY, sendo efectuadas algumas comparações entre os sistemas estudados. • Capítulo 4 - Neste capítulo são analisados os detalhes da concretização do sistema descrito no capítulo anterior. • Capítulo 5 - Este capítulo contém uma avaliação experimental ao D EP S KY, efectuada durante o mês de Junho de 2010. São analisados os desempenhos dos protocolos e das clouds individualmente. • Capítulo 6 - Neste último capítulo são apresentadas as conclusões deste trabalho assim como algum trabalho a desenvolver no futuro. Capítulo 1. Introdução 6 Capítulo 2 Trabalho Relacionado Neste capítulo é resumido o estudo inicial efectuado sobre a área de tolerância a intrusões e sobre clouds de armazenamento. 2.1 2.1.1 Tolerância a Intrusões Introdução ao Tema Com a utilização crescente dos sistemas distribuídos, em variadas áreas de actividade, aumentou a preocupação com a confiabilidade dos diversos componentes de um sistema [33, 17]. A tolerância a faltas é um dos aspectos mais importantes nos modelos de sistemas distribuídos clássicos e o seu objectivo é aumentar a disponibilidade e fiabilidade dos sistemas. Um sistema tolerante a faltas deve continuar a prestar o seu serviço correctamente mesmo na eventualidade de existir um problema com algum dos componentes. Esta visão levou à adopção de uma atitude pessimista em relação ao funcionamento dos sistemas distribuídos, na qual se assume que nenhum sistema é totalmente correcto (e.g., foram cometidos erros na fase de especificação, desenho ou concretização do sistema) e poderá estar susceptível a faltas. Os sistemas distribuídos em geral assentam no modelo: Falta ⇒ Erro ⇒ Falha. A tolerância a faltas não trata de impedir ou prevenir que faltas aconteçam mas antes evitar que estas levem a erros e consequente falha do sistema. Opta-se por esta abordagem porque pode ser impossível prever todas as faltas possíveis num sistema, já que estas podem ser causadas por diversos motivos assim como ter uma origem interna ou externa. A replicação foi a técnica encontrada para construir sistemas tolerantes a faltas pois contribui para um aumento da resiliência do sistema. A resiliência de um sistema distribuído está definida como o número f de um total de n máquinas que podem falhar sem este sistema renunciar à disponibilidade e à consistência. Esta distribuição também aumenta a resistência a faltas na medida em que, ao contrário de um sistema centralizado, não existe um ponto único de falha. Contudo, no paradigma da tolerância a faltas, as técnicas usadas assumem que componentes do sistema podem falhar por paragem ou por 7 Capítulo 2. Trabalho Relacionado 8 omissão de passos do algoritmo que executa. Isto significa que o sistema pode não estar preparado para lidar com falhas causadas com intencionalidade por um atacante malicioso, e consequentemente pode ser comprometido. O número de ataques efectuados com sucesso a sistemas distribuídos tem vindo a aumentar o que levou organizações a preocuparem-se com a segurança e confiabilidade dos seus serviços. Isto fez com que surgisse o conceito tolerância a intrusões [33, 20]. A tolerância a intrusões é uma extensão da tolerância a faltas tradicional que considera intrusões como faltas. Com esta abordagem tornou-se possível desenvolver sistemas tolerantes a faltas que, ao mesmo tempo, respeitam as propriedades de segurança definidas. Existe ainda outro conceito relacionado com tolerância a intrusões, denominado tolerância a faltas bizantinas. Faltas bizantinas [27], ou arbitrárias, são o tipo de faltas mais genérico que existe e englobam todos os tipos de faltas que podem ocorrer num sistema, incluindo as intrusões. Quando ocorre uma falta bizantina, o sistema pode responder de forma imprevisível a menos que tenha sido construído para tolerar este tipo de faltas. A maioria dos trabalhos relacionados com a tolerância a intrusões assume que o sistema está envolvido num ambiente bizantino, ou seja, que o sistema é susceptível a faltas arbitrárias, seja uma intrusão, acidental ou maliciosa, uma falha do software ou por motivos externos ao sistema. Tal como na tolerância a faltas clássica, recorre-se a replicação para conceber sistemas tolerantes a faltas bizantinas. Nas próximas secções são discutidas alguns modelos de replicação tolerantes a faltas bizantinas estudados. Também são discutidas técnicas para garantir a confidencialidade de dados replicados. 2.1.2 Replicação A ideia básica da replicação consiste em distribuir cópias de informação por um conjunto de servidores e tem sido amplamente usada em tolerância a faltas para garantir a disponibilidade e a fiabilidade de sistemas distribuídos. Muitos dos trabalhos em sistemas distribuídos tolerantes a intrusões são também baseados em replicação. Este tipo de solução permite garantir a disponibilidade e a integridade do sistema se existirem intrusões num número limitado de réplicas. Existem dois modelos de replicação tolerantes a faltas bizantinas, a Replicação de Máquina de Estados [25] e Sistemas de Quóruns Bizantinos [28]. Existe ainda uma outra abordagem que foi estudada e que pode ser vista como um híbrido entre os dois modelos referidos antes, denominada Sistemas de Quóruns Activos [12]. Seguidamente, todas estas abordagens são analisadas com mais detalhe. Replicação de Máquina de Estados A replicação de máquina de estados é a abordagem generalista para a concretização de serviços tolerantes a faltas em que cada servidor é uma máquina de estados definida Capítulo 2. Trabalho Relacionado 9 por variáveis de estado e comandos atómicos, que são operações sobre as variáveis de estado. Os clientes enviam pedidos para a execução de comandos para todas as réplicas do sistema. Nesta abordagem as réplicas começam todas com o mesmo estado e no tempo de actividade das réplicas existe acordo e ordem total o que significa que todas as réplicas executam os mesmos comandos pela mesma ordem. Obter estas propriedades, acordo e ordem total, requer o uso de algoritmos distribuídos que ofereçam certas garantias sobre a entrega das mensagens ao conjunto de réplicas. Para além disso, as operações executadas pelas réplicas têm de ser deterministas pois o estado resultante, após a operação, em todas as réplicas do sistema tem de ser o mesmo. Como é impossível resolver o problema do consenso, também conhecido como o problema da difusão atómica, em ambientes assíncronos de forma determinista os sistemas usualmente requerem a existência de certos limites temporais [19]. Sistemas de Quóruns Bizantinos Um sistema de quóruns bizantinos [28] pode ser definido como um conjunto de subconjuntos de servidores, em que cada sub-conjunto é um quórum. A intersecção e a disponibilidade são duas características fundamentais dos quóruns. A primeira assegura que as operações efectuadas nos diferentes quóruns mantêm-se consistentes enquanto que a segunda está implícita pois cada quórum actua em prol do sistema. Um sistema de quóruns pode ser usado para prover uma abstracção de memória partilhada fiável bastando para isso definir objectos distribuídos e operações a realizar sobre estes. Através de um sistema de quóruns é possível definir objectos distribuídos e sobre eles realizar operações de tal forma que simulam a existência de uma memória partilhada fiável. Na maioria das implementações de sistemas de quóruns bizantinos são usados n ≥ 3f + 1 servidores com quóruns de tamanho 2f + 1, sendo f o número de faltas toleradas. Assim é assegurado que, mesmo na eventualidade de acontecerem f faltas, existem pelo menos dois quóruns que se intersectam numa réplica correcta, ou seja, cada um dos dois quóruns mantém um número de servidores correctos de maneira a que pelo menos um quórum é formado apenas por servidores correctos. Tipicamente, em sistemas de quóruns, o estado de um registo em cada servidor é representado pelo seu valor e por uma estampilha temporal, ou número de versão. Uma operação de escrita sobre este registo é processada da seguinte maneira: a estampilha temporal é lida dos quóruns, incrementada, indicando a próxima versão do registo, e logo a seguir é escrito o novo valor para o sistema juntamente com a nova estampilha. Numa operação de leitura sobre este registo o sistema retorna o valor e estampilha correntes do registo. Em alguns sistemas de quóruns bizantinos em que existe concorrência entre operações, é usado um mecanismo denominado de writeback no qual o valor lido é escrito de volta no sistema obrigando a que todas as leituras realizadas posteriormente retornem Capítulo 2. Trabalho Relacionado 10 o mesmo par (valor, e estampilha temporal) ou uma versão mais recente desse par. Sistemas de Quóruns Activos Enquanto que a replicação de máquina de estados é uma solução genérica para concretizar sistemas tolerantes a faltas bizantinas, os quóruns são geralmente usados para construir repositórios de dados tolerantes a faltas bizantinas. Ao servirem para concretizar algo de mais simples do que replicação de máquina de estados, muitas vezes os trabalhos com quóruns evitam a necessidade de realizar consenso não ficando limitados pelo resultado FLP [19], podendo os algoritmos ser totalmente assíncronos. No entanto, a principal diferença entre a replicação de máquina de estados e os sistemas de quoruns é que as operações na replicação de máquina de estados envolvem sempre todos os servidores, enquanto que nos sistemas de quóruns as operações são geralmente feitas sobre um quórum, o que torna os algoritmos mais escaláveis. Segundo a proposta [12], os Sistemas de Quóruns Activos (SQA) surgiram da constatação de que os sistemas de quóruns apresentam uma escalabilidade e simplicidade maior que os protocolos baseados em máquinas de estados, mas apenas podem ser utilizados na concretização de sistemas simples como por exemplo sistemas de armazenamento. Sistemas mais complexos que necessitam que exista acordo entre servidores têm de ser concretizados recorrendo a replicação de máquinas de estado. Um sistema de quóruns activos pode ser visto como um híbrido entre sistemas de quóruns e máquinas de estado, que junta as duas abordagens num único sistema. Um sistema deste tipo usa diferentes protocolos para diferentes operações, ou seja, protocolos de sistemas de quóruns para as operações de leitura e escrita, e, protocolos de máquina de estados para outras mais complexas, como uma actualização. Através de SQA é assegurado que um sistema construído sobre esta abordagem permanece correcto na presença de n ≥ 3f + 1 réplicas, sendo f o número máximo de réplicas que podem falhar de forma bizantina. Se este pressuposto for satisfeito um objecto implementado usando o SQA satisfaz as seguintes propriedades: • Linearizability: O sistema executa operações numa determinada ordem de modo a que aparente ser acedido sequencialmente [21]; • Wait-freedom: Operações requesitadas por clientes correctos terminam, independentemente do comportamento de outros clientes, correctos ou maliciosos, do sistema [23]. A primeira é uma propriedade de safety que garante que as réplicas se comportam simulando um sistema centralizado, executando uma mensagem de cada vez. A segunda propriedade é uma propriedade de liveness importante para garantir a correcta terminação de todas as operações. Capítulo 2. Trabalho Relacionado 11 Um SQA permite replicar objectos sendo que, sobre estes, é possível realizar três tipos de operações distintas: • Escrita: O estado do objecto é alterado para o valor recebido como entrada. • Leitura: O estado do objecto é retornado. • Actualização (Read-Modify-Write): O estado do objecto é modificado de acordo com os parâmetros recebidos e o estado do objecto. As operações de leitura e escrita são implementadas através de sistemas de quóruns bizantinos e por isso são operações assíncronas, não dependentes de condições optimistas ou pressupostos sobre tempo para garantir a terminação ao contrário da operação de actualização que recorre a replicação de máquina de estados, necessitando de sincronia parcial para resolver o consenso. Os protocolos de leitura e escrita são baseados nos sistemas de quóruns e o de actualização é baseado no CL-BFT, apresentado em [15]. 2.1.3 Confidencialidade Confidencialidade é a propriedade da informação que garante que esta não será divulgada a entidades sem autorização, por outras palavras, garantir que a informação está apenas acessível para os que têm autorização de acesso a esta. A confidencialidade é compreendida no domínio da segurança informática, como a protecção de informação trocada entre um remetente e um ou mais destinatários contra terceiros. Isto deve ser feito independentemente da segurança do sistema de comunicação utilizado. De facto, uma questão de grande interesse é o problema de garantir o sigilo de comunicação utilizado quando o sistema é inerentemente inseguro, como a Internet. Num sistema que garante a confidencialidade, um terceiro que obtenha informação trocada entre rementente e destinatário não será capaz de extrair qualquer informação inteligível. Isto é garantido através de mecanismos de criptografia. A replicação é normalmente vista como sendo má para a confidencialidade, porque se informação privada se encontra replicada apenas se torna mais fácil para um atacante a conseguir, não mais difícil. Apesar disso, existem algumas técnicas para garantir confidencialidade em dados replicados, como as que são explicadas de seguida. Partilha de Segredos Um esquema de partilha de segredos [32] é o método para dividir um segredo entre um grupo de participantes, em que a cada um deles é atribuída um parte do segredo. O segredo pode ser reconstruído apenas quando um determinado número de partes são recombinadas, pois partes individuais não têm utilidade por si só. Mais formalmente, num esquema de de partilha de segredos existe um distribuidor e n participantes. O distribuidor gera o segredo a partir da informação original, divide-o por Capítulo 2. Trabalho Relacionado 12 n partes e entrega uma parte a cada participante. As partes poderão mais tarde ser usadas para a reconstrução da informação original mas individualmente não fornecem nenhuma informação sobre seu conteúdo, ou seja, é inexequível extrair de uma parte alguma da informação original. O distribuidor usa um algoritmo de maneira a que grupos de t ou mais participantes, possam reconstruir a informação original, com as suas partes. Se por exemplo n = 5 e t = 3, a informação original é distribuída por 5 partes, uma para cada participante, e um grupo de 3 ou mais partes participantes pode desvendar o segredo. Códigos de Apagamento Os códigos de apagamento são semelhantes aos códigos de correcção de erros (FEC - Forward Error Correction) usados em telecomunicações, mas enquanto nos primeiros a informação pode apenas ser apagada, nos últimos pode também ser modificada. A ideia base consiste na divisão de um ficheiro em n fragmentos de forma a que seja suficiente ter k fragmentos para reconstruí-lo, mas k − 1 fragmentos não cheguem para o fazer. Para este efeito usa-se um código de apagamento-(k,n). No contexto da confiabilidade apenas foram estudadas algumas propostas, nomeadamente o mecanismo denominado AVID (Asynchronous Verifiable Information Dispersal) e o mesmo mecanismo mas com confidencialidade, o cAVID. Ambos propostos em [14]. Um cliente que quer armazenar um ficheiro F começa por o codificar como um vector [F 1; ...; F n] usando um código de apagamento-(k,n). Além disso obtém um conjunto de fingerprints [24] calculando um vector com sínteses criptográficas de cada F i : D = [D1; ...; Dn]. Depois, toda essa informação é enviada para os servidores usando um protocolo de difusão fiável. Se o cliente for malicioso e alguns dos fragmentos estiverem corrompidos, há duas possibilidades: o número de fragmentos disponíveis permite reconstruir o ficheiro, o que é feito; ou não é possível reconstruir esses fragmentos e o ficheiro não é armazenado. Quando a operação termina os servidores apagam todos os fragmentos que não lhes pertencem. A operação de leitura consiste simplesmente em pedir fragmentos aos servidores até se obterem os k necessários para reconstruir F . O parâmetro k tem de verificar a condição: f + 1 ≤ k ≤ n − 2f . A melhor resistência é obtida quando n = 3f + 1, logo k = f + 1. O mesmo artigo apresenta o esquema cAVID que garante também a confidencialidade dos dados armazenados. Para garantir a confidencialidade é necessário haver controlo de acesso ao ficheiro. Para o efeito junto do ficheiro é guardada uma lista de controlo de acesso L com os identificadores dos clientes que a eles podem aceder. A forma como é conseguida a confidencialidade é simples: o ficheiro é cifrado usando criptografia simétrica antes de ser armazenado usando o esquema AVID. Uma desvantagem é a necessidade de partilha de uma chave secreta O problema é o que se faz da chave secreta. Se o cliente Capítulo 2. Trabalho Relacionado 13 ficasse com a chave para si, só ele poderia recuperar o ficheiro, o que em geral não é o objectivo. 2.2 2.2.1 Clouds de Armazenamento Considerações Gerais Uma cloud de armazenamento pode ser descrita como um serviço online que fornece espaço nos seus servidores para um cliente armazenar informação. A comunicação entre o cliente e o serviço, como o acesso ou actualização de dados, é efectuada sobre a Internet. Existem variados sistemas de armazenamento em clouds, uns possuem um foco muito específico, como armazenar apenas mensagens de e-mail ou imagens digitais, outros podem armazenar todo o tipo de informação digital. As instalações que abrigam sistemas de armazenamento em clouds são chamados de data centers. Uma cloud de armazenamento pode ser concretizada com um ou mais data centers. O seu funcionamento pode ser descrito da seguinte forma: um cliente envia ficheiros através da Internet para os servidores que guardam a informação. O acesso aos servidores pelo cliente é efectuado através de interfaces web ou serviços web, que permitem o acesso e manipulação dos dados armazenados. Tais serviços são usualmente baseados no modelo REST (REpresentational State Transfer) ou na arquitectura SOAP (Simple Object Access Protocol). Os sistemas de armazenamento em clouds geralmente usam centenas de servidores porque ocasionalmente os computadores precisam de manutenção ou reparação logo torna-se importante armazenar a mesma informação em várias máquinas, para introduzir redundância no sistema. Sem redundância, um sistema de armazenamento em clouds não poderia garantir a um cliente que a sua informação estará sempre disponível. Por exemplo, a maioria dos sistemas replica a informação por servidores que usam diferentes fontes de electricidade (normalmente também geograficamente afastados) ou usam UPS1 , permitindo aos clientes o acesso à sua informação mesmo em caso de falha no fornecimento de electricidade. Nem todos os clientes estão preocupados apenas com a falta de espaço, alguns usam sistemas de armazenamento em clouds para backup de informação, o que garante que, caso haja algum problema na infra-estrutura computacional do cliente, a informação estará intacta na cloud de armazenamento. Actualmente estão disponíveis na web algumas centenas de fornecedores de armazenamento em clouds e o número tem vindo a aumentar. Além disso, também o espaço de armazenamento oferecido aos clientes parece crescer regularmente. 1 UPS (Uninterruptible Power Supply) - é um sistema de alimentação elétrico que entra em funcionamento quando há interrupção no fornecimento de energia, alimentando os dispositivos a ele ligados. Capítulo 2. Trabalho Relacionado 14 Existem fornecedores de armazenamento em clouds que cobram uma quantia fixa por uma quota de espaço e largura de banda de entrada e saída de dados, enquanto outros usam um modelo pay-per-use e cobram quantias variáveis consoante o espaço ocupado e a largura de banda utilizada pelo cliente. Além disso, o modelo de cobrança das clouds pay-per-use incorpora o conceito de elasticidade de recursos: paga-se apenas pelo uso e o serviço pode crescer arbitrariamente para acomodar altas demandas esporádicas. De seguida exemplificam-se alguns dos serviços que fornecem armazenamento em clouds (Cloud Storaging): • Clouds Pay-per-use – Amazon Simple Storage Service (Amazon S3) [1] – Microsoft Windows Azure Platform [8] – Nirvanix Storage Delivery Network (Nirvanix SDN) [9] – RackSpace [10]; • Clouds de custo fixo – DivShare [3] – DocStoc [4] – Box.net [2] – FilesAnywhere [5] Em geral, o preço do armazenamento online tem vindo baixar devido à entrada de cada vez mais empresas neste negócio. Isto levou muitas empresas que cobram pelos seus serviços a optarem por fornecer uma alternativa gratuita que oferece algum espaço para armazenamento, mas com limitações quando comparados aos serviços pagos. As duas maiores preocupações acerca do armazenamento em clouds são a fiabilidade e a segurança. É improvável que uma organização confie a seus dados critícos a outra entidade sem a garantia que terá acesso a estes dados sempre que quiser (disponibilidade), que estes não serão corrompidos (integridade) e que mais ninguém terá acesso a eles sem a sua autorização (confidencialidade). Para garantir a segurança da informação, a maioria dos sistemas usa uma combinação de técnicas, incluindo: • Criptografia: algoritmos criptográficos são usados para codificar a informação tornandoa ininteligível e quase impossível de decifrar sem a chave usada para cifrar a informação, normalmente uma chave secreta partilhada entre cliente e o serviço; • Autenticação: é necessário o registo do cliente através da criação de credenciais de acesso (e.g., username e password); Capítulo 2. Trabalho Relacionado 15 • Autorização: o cliente define quem pode aceder à sua informação. Mesmo com estas medidas de protecção, muitas pessoas acreditam que informação armazenada num sistema de armazenamento remoto é vulnerável. Existe sempre a possibilidade de um hacker malicioso, de alguma maneira, ganhar acesso à informação do sistema, por exemplo, devido a vulnerabilidades existentes neste. Existe também a possibilidade de funcionários da empresa com acesso aos servidores poderem roubar, alterar ou destruir informação. As empresas no negócio de armazenamento em clouds investem muito dinheiro em medidas de segurança para limitar a possibilidade de roubo ou corrupção da informação. Além disso, há sempre a preocupação de colocar os dados critícos (e muitas vezes confidenciais) nas mãos de terceiros, que terão acesso às informações neles contidos. Finalmente, há também a questão da fiabilidade e disponibilidade dos serviços de armazenamento. Armazenar informação num sistema remoto acedido via Internet coloca a organização vulnerável a todos os problemas de conectividade e indisponibilidade temporária da Internet. Além disso, praticamente todos os grandes fornecedores de serviços de armazenamento já sofreram problemas de disponibilidade e/ou corromperam dados de clientes, mesmo com a redundância interna de seus sistemas (os dados são tipicamente armazenados em diferentes data centers do provedor). 2.2.2 Detalhes Adicionais Nesta secção são descritos detalhes adicionais de alguns serviços de armazenamento estudados. Distribuição geográfica de Data Centers A distribuição geográfica é importante na medida em que cria redundância no serviço, não existindo um ponto único de falha, e principalmente porque também aproxima os dados dos clientes. A lista seguinte relata esta distribuição global de data centers das clouds pay-per-use estudadas: • Amazon S3 - 3 nos Estados Unidos mais um na Irlanda e outro em Singapura. • Azure - Pelo menos um nos Estados Unidos (Chicago) e outro na Irlanda (Dublin). • Nirvanix - 3 nos Estados Unidos (California, Texas e New Jersey) mais um na Alemanha e outro no Japão. • RackSpace - 6 nos Estados Unidos (3 no Texas, 2 na Virginia e 1 em Chicago) mais 2 no Reino Unido e outro em Hong Kong. 16 Capítulo 2. Trabalho Relacionado Acordo de nível de serviço Um SLA (Service Level Agreement) é a parte de um contrato de serviços entre duas ou mais entidades no qual o nível de prestação do serviço é definido formalmente. Na prática, o termo é usado no contexto de tempo de entrega de um serviço ou de um desempenho específico. Por exemplo, se a empresa A contratar um nível de serviço de entregas de 95% em menos de 24 horas à Empresa B, esta já sabe que de todas as entregas que lhe forem dadas para fazer, no mínimo 95% tem que ser feitas em menos de 24 horas. No contexto do armazenamento em clouds este acordo concentra-se principalmente no nível de disponibilidade dos dados armazenados. Todas as clouds de armazenamento pay-per-use estudadas (i.e., Amazon S3, Azure, Nirvanix e RackSpace) garantem uma disponibilidade de 99,9% existindo compensações para o cliente caso esta percentagem não se verifique. Estas compensações são, em geral, aplicadas como descontos na facturação do cliente. Os descontos podem variar entre os 10% e os 100% dependendo do nível de disponibilidade efectivamente verificado. 2 A única desvantagem para o cliente é ter de monitorizar a disponibilidade e depois ter de relatar ao fornecedor se o nível contratualizado não se verificar para ter direito aos descontos. Existe também um tempo limite para reclamação dos descontos (e.g., 15 dias no caso da Nirvanix e 30 dias nos restantes). Custo do armazenamento em clouds O preço praticado pelos serviços de armazenamento em clouds é um dos factores que torna este tipo de armazenamento tão atractivo e que leva muitas organizações a migrarem os seus dados para estes serviços. A tabela 2.1 apresenta o preço praticado por 4 dos serviços mais utilizados actualmente. É de salientar que alguns dos serviços fazem a distinção de armazenamento em diferentes localizações (e.g., o custo de armazenamento num data center na Europa e num na Ásia é diferente). Por isso, apenas estão representados os custos para armazenamento em data centers europeus (i.e., Azure e Amazon S3). Armazenamento Entrada Saída Nirvanix 0,25 0,18 0,18 Azure - EU 0,15 0,10 0,15 Amazon S3 - EU 0,15 0,10 0,10 RackSpace 0,15 0,08 0,22 Tabela 2.1: Custo, em USD, do armazenamento, entrada e saída de 1 Gb de dados em serviços de armazenamento pay-per-use estudados. A tabela 2.2 complementa a informação apresentada na tabela 2.1 com o custo de pedidos efectuados aos serviços mencionados. 2 e.g., No SLA do Amazon S3 está contratualizado um desconto de 10%, se a disponibilidade verificada for inferior a 99,9% mas igual ou superior a 99%, e um desconto de 25% se esta for inferior a 99%. 17 Capítulo 2. Trabalho Relacionado Tipo de Pedido GET * PUT ** Nirvanix 0 0 Azure - EU 0,01 0,01 Amazon S3 - EU 0,01 0,10 RackSpace 0 0 *** Tabela 2.2: Custo, em USD, de efectuar 10000 pedidos a serviços de armazenamento pay-per-use estudados. Legenda da tabela 2.2 * ** *** também inclui pedidos do tipo HEAD e DELETE. também inclui pedidos do tipo POST, LIST ou COPY. cobra 0,20 se forem pedidos para ficheiros com menos de 250K bytes. Para finalizar esta análise a tabela 2.3 apresenta as limitações conhecidas de alternativas gratuitas fornecidas por algumas clouds de custo fixo estudadas. Serviço (conta gratuita) DivShare Docstoc FilesAnywhere Box.net Limitações conhecidas 5 Gb de armazenamento; 10 Gb downloads/mês; Um download apenas pode ser efectuado dez segundos após o pedido; 1000 pedidos por minuto; Número de uploads diário limitado a 50000; 50 Mb é o tamanho máximo permitido de um ficheiro; Apenas são permitidos 200 downloads diariamente; 1 Gb de armazenamento; 25 Mb é o tamanho máximo permitido de um ficheiro; Apenas são permitidos 25 downloads diariamente; 1 Gb de armazenamento; 25Mb é o tamanho máximo permitido de um ficheiro; Tabela 2.3: Alguns limites conhecidos de serviços livres de encargos estudados. É de salientar que com estas alternativas gratuitas, a maior parte destes serviços não permite transferências de dados concorrentes. No entanto estes limites são removidos ou alterados quando se adquire um dos serviços pagos (e.g., contas Premium ou Professional). 2.3 Considerações Finais Neste capítulo foram discutidos os paradigmas da tolerância a faltas e tolerância a intrusões, convergindo estas para um modelo mais generalista de tolerância a faltas bizantinas, e a razão da necessidade de adoptar este tipo de abordagens na concepção de sistemas seguros e confiáveis. Foram estudadas algumas técnicas para a concretização de sistemas tolerantes a faltas bizantinas, a replicação máquina de estados, os sistemas de quóruns bizantinos e os sistemas de quóruns activos. Também foram abordadas técnicas para garantir a confidencialidade em dados replicados, a partilha de segredos e os códigos de apagamento. Capítulo 2. Trabalho Relacionado 18 Finalmente houve também uma análise das características e a oferta existente de serviços para armazenamento de informação na cloud. Este estudo sobre o estado da arte foi importante na medida em que serviu de base para o desenho do sistema proposto nesta tese, que irá ser apresentado no próximo capítulo. Capítulo 3 D EP S KY 3.1 Apresentação Este capítulo apresenta o D EP S KY, um sistema para replicação de dados em várias clouds que melhora a disponibilidade, integridade e confidencialidade da informação armazenada. O D EP S KY é a contribuição mais importante desta tese. Os blocos atómicos de dados no D EP S KY designam-se por unidades de dados (data units), que podem ser actualizadas pelos seus donos e acedidas por um conjunto arbitrário de leitores. A disponbilidade destas unidades é garantida mesmo em caso de falhas devido ao uso de algoritmos de replicação para sistemas de quóruns bizantinos de disseminação [28], onde os dados armazenados em cada servidor (i.e., que neste caso são clouds de armazenamento) são auto-verificáveis devido ao uso de assinaturas digitais e resumos criptográficos (i.e., se um servidor alterar o conteúdo dos dados, o leitor descobre e ignora os dados corrompidos). O D EP S KY oferece também a possibilidade da informação mais sensível ser protegida através de um esquema de partilha de segredos [32, 31], introduzindo garantias de confidencialidade. Desta maneira, nenhuma cloud individualmente tem acesso à informação contida nos dados. A figura 3.1 ilustra como o D EP S KY distribui a informação (e.g., um ficheiro) pelas várias clouds. Estão representados dois clientes do sistema, um a usar o protocolo ADS (Available D EP S KY) e outro a usar o protocolo CADS (Confidential & Available D EP S KY). A diferença entre estes protocolos é a informação enviada para as clouds. No caso de um cliente usar o protocolo ADS , é enviada uma cópia da informação para todas as clouds. Com o protocolo CADS a informação é dividida em partes, tantas quanto o número de clouds, e depois cada parte é enviada para sua cloud. A informação é dividida de maneira a que apenas seja necessário um determinado número de partes para reconstruir a informação original, e não a totalidade das partes. Nas secções seguintes são apresentados o modelo de sistema, o modelo de dados, os dois protocolos já mencionados, ADS e CADS, e trabalhos similares ao D EP S KY. 19 20 Capítulo 3. D EP S KY Amazon S3 Nirvanix SDN Windows Azure RackSpace Parte #1 Parte #2 JSS Valor Valor Parte #3 Cliente [ADS] Parte #4 O valor é replicado pelas clouds. Cliente [CADS] O valor é dividido em partes que serão enviadas uma para cada cloud Figura 3.1: Visão sobre a distribuição de informação pelas clouds. 3.2 Modelo de Sistema O modelo de sistema utilizado no D EP S KY segue uma série de hipóteses pragmáticas tidas em conta no desenho dos protocolos de replicação em clouds de armazenamento. Cada cloud é representada por um servidor passivo (não executa nenhum código dos protocolos) que oferece operações de leitura e escrita de dados com semântica de consistência regular [26]: uma operação de leitura executada concorrentemente com uma operação de escrita retorna o valor da unidade de dados antes da escrita ou o valor que está a ser escrito. Em primeiro lugar, assume-se que para cada unidade de dados há apenas um escritor, e este escritor só sofre falhas por paragem. Isto significa que cada bloco de dados é escrito por uma única entidade 1 , o que simplifica os protocolos já que não têm de lidar com escritas concorrentes. Além disso, escritores maliciosos não são considerados pois estes poderiam escrever dados sem sentido do ponto de vista da aplicação de qualquer forma. Finalmente, estas duas hipóteses permitem a concretização de protocolos de leitura e escrita em sistemas onde os servidores são apenas discos passivos, como as clouds de 1 Na prática pode existir mais de um escritor para uma unidade de dados desde que os acessos para escrita sejam feitos isoladamente (o que pode requerer algum controlo de concorrência). Capítulo 3. D EP S KY 21 armazenamento. Os servidores (clouds) e leitores estão sujeitos a faltas arbitrárias ou bizantinas [27]. Esta decisão vai de encontro à hipótese pessimista de que não conhecemos o que há dentro de uma cloud e portanto é seguro assumir que os dados lá armazenados podem ser corrompidos arbitrariamente. Da mesma forma, como são suportados múltiplos leitores para cada unidade de dados, é conveniente também assumir que estes podem ter qualquer comportamento. Devido ao uso de sistemas de quóruns bizantinos de disseminação [28], o sistema requer n ≥ 3f + 1 servidores para tolerar até f servidores um número ilimitado de clientes faltosos. É assumida também a ausência de um sistema de distribuição de chaves entre os clientes. Os leitores apenas sabem como aceder ao sistema para ler dados e também possuem a chave pública do escritor para verificação e validação de dados. 3.3 Modelo de Dados A figura 3.2 apresenta o modelo de dados do D EP S KY em três níveis: Conceptual Data Unit Num nível conceptual temos os blocos representados por unidades de dados (data units) que contêm, além do seu valor (data), um número de versão (version number) e informações de verificação que tornam os dados auto-verificáveis (verification data). Além disso são identificadas por um nome único (e.g.,X). Generic Data Unit Genericamente, uma unidade de dados do D EP S KY é representada em cada cloud por dois ficheiros: um contendo os metadados e o outro com o valor mais recente armazenando na unidade. Estes dois ficheiros estão sempre dentro de um container. O container de uma unidade de dados, para além de conter os metadados e o valor actual, pode conter também versões anteriores do valor desta unidade. O identificador é usado para obter referências para container e metadados dessas unidades nos protocolos definidos, ou seja, o nome dos containers e dos ficheiros advém do identificador da unidade de dados (e.g., numa unidade de dados com o identificador X, o container denomina-se Xcontainer e o ficheiro de metadados denomina-se Xmetadata). Os ficheiros de metadados são os mais importantes pois é sempre necessário um quórum destes nos protocolos definidos. Os metadados consistem na seguinte informação: um número de versão (Version Number), o nome do ficheiro com o valor desta versão (Data Pointer) e informação de verificação (Verification Data), que inclui um resumo criptográfico do valor para verificação de integridade deste e, no caso de ser uma unidade de dados com confidencialidade, dados públicos necessários para a leitura do valor. Para escrever ou ler uma unidade de dados é sempre necessário obter o ficheiro de metadados deste em primeiro lugar. 22 Capítulo 3. D EP S KY Data Unit Implementation Ao nível de implementação, cada cloud possui uma representação da unidade de dados de acordo com a definição da sua estrutura interna (e.g., um container é mapeado para um bucket na Amazon S3 ou para um blobcontainer na Azure). Conceptual Data Unit X Generic Data Unit Container X Version Number Verification Data Metadata Version Number Data Unit Implementation Amazon S3 Bucket X Windows Azure BlobContainer X Metadata Metadata Data Pointer Data Data Data Nirvanix SDN DivShare Verification Data Data Folder X Folder X Metadata Metadata Data Data Figura 3.2: Decomposição do Data Unit X do D EP S KY, do conceito à concretização. 3.4 ADS - Available D EP S KY Esta secção apresenta o algoritmo ADS que promove uma melhoria da disponibilidade de dados na cloud através da replicação das unidades de dados por várias clouds de armazenamento. 3.4.1 Algoritmo de Escrita 1. Um cliente escritor começa por enviar um pedido de leitura dos metadados a todas as clouds. O escritor espera n − f ficheiros de metadados correctamente assinados por ele e lidos de diferentes clouds para então obter o número de versão máximo dentre os contidos nestes ficheiros. O algoritmo 1 ilustra como são lidos os metadados. 2. O número de versão lido no passo anterior é incrementado em uma unidade, dando origem ao número de versão dos dados a serem escritos nesta operação (linhas 4-8 do algoritmo 3). Um ficheiro, a conter os dados a serem escritos e cujo nome corresponde ao nome da unidade de dados concatenado com o número de versão, é criado em todas as clouds (linhas 9-10 do algoritmo 3). O escritor espera confirmação da escrita deste ficheiro de n − f clouds. Capítulo 3. D EP S KY 23 3. Após conclusão da escrita da nova versão, são actualizados os metadados para a nova versão sendo enviados pedidos de escrita para este efeito. Antes de serem enviados, os metadados são assinados pelo escritor (linhas 11-17 do algoritmo 3). Neste passo o ficheiro de metadados é actualizado (ficheiro com metadados anterior é sobrescrito), ao contrário do passo 2 em que é escrita uma nova versão dos dados num ficheiro diferente do da versão anterior. A operação de escrita termina quando se recebe confirmação da actualização de metadados de n − f clouds (linha 18 do algoritmo 3). Note que o algoritmo de escrita preserva as versões anteriores da unidade de dados. Estas versões podem ser apagadas quando o escritor achar conveniente através de um procedimento de garbage collection que envia pedidos de remoção a todas as clouds. 3.4.2 Algoritmo de Leitura 1. Um cliente leitor começa por efectuar pedidos de metadados a todas as clouds e esperar por n − f ficheiros de metadados correctamente assinados pelo escritor, como está descrito no algoritmo 1. O leitor obtém o número de versão máximo reportado nestes ficheiros. 2. Após obter o número de versão mais actual da unidade de dados, o cliente envia pedidos de leitura para esta versão a todas as clouds e aguarda. A operação termina quando é recebido um valor cujo resumo criptográfico é igual ao resumo criptográfico contido nos metadados. Só depois desta verificação de integridade é que o valor é retornado (linhas 8-11 do algoritmo 4). Optimização de leitura. Uma optimização importante para diminuir os custos monetários do protocolo de leitura (ver secção 5.1) é enviar o pedido de leitura da versão mais actual do valor da unidade de dados apenas à cloud que responder mais rapidamente à requisição de metadados e reportar a versão mais actual dos dados. Desta forma, em casos sem falhas, apenas uma das clouds será lida. Caso esta cloud não responda atempadamente (timeout) ou retorne uma versão anterior, outras clouds são acedidas até que se obtenha a versão mais recente. 3.5 CADS - Confidential & Available D EP S KY O ADS garante a integridade e disponibilidade dos dados em clouds de armazenamento. No entanto, um dos problemas fundamentais neste tipo de solução é evitar que entidades não autorizadas tenham acesso aos dados armazenados na cloud. Capítulo 3. D EP S KY 24 Esta secção apresenta o protocolo CADS, que integra um algoritmo criptográfico de partilha de segredo de tal forma que os dados armazenados em cada cloud individualmente sejam de pouca utilidade. Um esquema de partilha de segredos [32, 31], conforme já explicado na secção 2.1.3, é o método para dividir um segredo entre um grupo de n participantes, em que a cada um deles é atribuída um parte do segredo (que tem o mesmo tamanho do segredo original). O segredo pode ser reconstruído apenas quando f + 1 dessas partes são recombinadas e qualquer combinação de até f partes individuais não revelam nenhuma informação sobre o segredo. A única diferença entre os protocolos de escrita do ADS e do CADS é que neste último introduziu-se um algoritmo de partilha de segredos no passo 2 do ADS de tal forma a produzir tantas partes do segredo (valor a ser escrito na unidade de dados) quanto o número de clouds. Cada uma destas partes é depois enviada para sua respectiva cloud (linhas 8-10 do algoritmo 5). O algoritmo de leitura do CADS funciona de forma bastante similar ao ADS, porém, ao invés de aguardar apenas uma resposta com a versão mais actual dos dados (ADS passo 2), esperam-se f + 1 partes de diferentes clouds para combiná-las usando o algoritmo de partilha de segredos, obtendo o valor originalmente escrito (linhas 9-13 do algoritmo 6). Para garantir a confidencialidade ponto-a-ponto na Internet, o CADS depende da utilização de HTTP sobre SSL (HTTPS) para que a informação que circula na rede seja imperceptível para terceiros. Com a utilização de HTTP sem SSL um atacante que conseguisse interceptar f + 1 partes poderia reconstruir o segredo. Algoritmo 1: query_metadata(dataUnit) Entrada: unidade de dados do D EP S KY Saída: vector com n − f metadados assinados lidos de diferentes clouds 1 2 3 4 5 6 7 8 9 10 11 12 13 início m[0 .. n − 1] ←− ⊥ para 0 ≤ i ≤ n − 1 faça em paralelo tmi ←− cloudi .get(dataU nit, ”metadata”) se verif y(tmi , Pukw ) então m[i] ←− tmi fim fim enquanto |{i | m[i] 6=⊥}| < n − f faça sleep(50ms); /* aguarda 50ms antes de continuar */ fim retorna m fim Capítulo 3. D EP S KY 25 Algoritmo 2: write_value(dataUnit, n[0 .. n − 1], v[0 .. n − 1]) Entrada: unidade de dados do D EP S KY, identificadores (nomes) e valores a escrever Saída: nada 1 2 3 4 5 6 7 8 9 início ok[0 .. n − 1] ←− false para 0 ≤ i ≤ n − 1 faça em paralelo oki ←− cloudi .put(dataU nit, n[i], v[i]) fim enquanto |{i | m[i] = true}| < n − f faça sleep(50ms); /* aguarda 50ms antes de continuar */ fim fim Algoritmo 3: ADS_write(dataUnit,v) Entrada: unidade de dados do D EP S KY e valor a escrever Saída: nada 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 início n[0 .. n − 1] ←− ⊥ v[0 .. n − 1] ←− ⊥ se max_ver = −1 então m ←− query_metadata(dataU nit) max_ver ←− max ({m[i].version|0 ≤ i ≤ n − 1}) fim new_ver ←− max_ver + 1 ∀i ∈ {0 , ..., n − 1} : n[i] ←− ”value” + new_ver, v[i] ←− v write_value(dataU nit, n, v) ∀i ∈ {0 .. n − 1} : n[i] ←− ”metadata” para 0 ≤ i ≤ n − 1 faça new_meta ←− hnew_ver, H(v), n[i]i sign(new_meta, Prkw ) v[i] ←− new_meta fim write_value(dataU nit, n, v) max_ver ←− new_ver fim Capítulo 3. D EP S KY 26 Algoritmo 4: ADS_read(dataUnit) Entrada: unidade de dados do D EP S KY Saída: valor da unidade de dados do D EP S KY 1 2 3 4 5 6 7 8 9 10 11 12 início m ←− query_metadata(dataU nit) max_id ←− i | m[i].version = max ({m[i].version|0 ≤ i ≤ n − 1}) v[0 .. n − 1] ←−⊥ para 0 ≤ i < n − 1 faça em paralelo v[i] ←− cloudi .get(dataU nit, ”value” + m[max_id].version) fim enquanto ¬∃i : v[i] 6=⊥ ∧H(v[i]) = m[max_id].verif ication faça sleep(50ms); /* aguarda 50ms antes de continuar */ fim retorna v[i] fim Algoritmo 5: CADS_write(dataUnit,v) Entrada: unidade de dados do D EP S KY e valor a escrever Saída: nada 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 início n[0 .. n − 1] ←−⊥ se max_ver = −1 então m ←− query_metadata(dataU nit) max_ver ←− max ({m[i].version|0 ≤ i ≤ n − 1}) fim new_ver ←− max_ver + 1 v[0 .. n − 1] ←− get_shares(v) ∀i ∈ {0 .. n − 1} : n[i] ←− ”value” + new_ver write_value(dataU nit, n, v) para 0 ≤ i < n − 1 faça new_meta ←− hnew_ver, H(v[i]), n[i]i sign(new_meta, Prkw ) v[i] ←− new_meta fim ∀i ∈ {0 .. n − 1} : n[i] ←− ”metadata” write_value(dataU nit, n, v) max_ver ←− new_ver fim Capítulo 3. D EP S KY 27 Algoritmo 6: CADS_read(dataUnit) Entrada: unidade de dados do D EP S KY Saída: valor da unidade de dados do D EP S KY 1 2 3 4 5 6 7 8 9 10 11 12 13 14 início m ←− query_metadata(dataU nit) max_id ←− i | m[i].version = max ({m[i].version|0 ≤ i ≤ n − 1}) v[0 .. n − 1] ←−⊥ para 0 ≤ i ≤ n − 1 faça em paralelo v[i] ←− cloudi .get(dataU nit, ”value” + m[max_id].version) fim valueHash ←− m[max_idx].verif ication enquanto |{i | v[i] 6=⊥}| < n − f faça sleep(50ms); /* aguarda 50ms antes de continuar */ fim retorna combine_shares(v) fim 3.6 Trabalhos Similares De acordo com a pesquisa efectuada e até onde se sabe, existem apenas dois trabalhos bastante recentes que tentam fazer algo similar ao D EP S KY para melhorar a confiabilidade e segurança dos dados armazenados em clouds de armazenamento, e ambos foram desenvolvidos em paralelo com o trabalho aqui apresentado. O HAIL (High-Availability Integrity Layer) [13] consiste num conjunto de protocolos criptográficos que juntam códigos de apagamento com provas de recuperação que permitem a concretização de uma camada de software para proteger a integridade dos dados armazenados em clouds, mesmo que estas sejam invadidas e corrompidas por um adversário móvel. Quando comparado ao D EP S KY, o HAIL apresenta pelo menos três limitações: só lida com dados estáticos (i.e., os algoritmos não suportam actualizações e multiplas versões dos dados), requer que os servidores executem código (ao contrário do D EP S KY, que considera as clouds de armazenamento como discos passivos) e não usa nenhum mecanismo para protecção da confidencialidade dos dados armazenados. O sistema RACS (Redundant Array of Cloud Storage) [22] utiliza técnicas similares às empregues nos sistemas RAID nível 5 [29] para concretizar replicação de dados em diversas clouds. Diferentemente do D EP S KY, o RACS não se preocupa com problemas de segurança, mas sim com possíveis “falhas económicas”, onde uma cloud aumenta o seu custo de tal Capítulo 3. D EP S KY 28 forma que torna inviável o acesso aos dados. Além de não proteger contra corrupção de dados e violações de confidencialidade, o RACS também não suporta actualizações dos dados armazenados. Todas estas limitações tornam o RACS muito menos poderoso que o D EP S KY. Além das diferenças entre os sistemas, os trabalhos sobre o HAIL e RACS não apresentam nenhum tipo de medida que utilize a diversidade de clouds. O protocolo CADS e a sua concretização são baseados nas ferramentas desenvolvidas para a concretização da camada de confidencialidade do DepSpace [11]. Este sistema utiliza um esquema de partilha de segredos publicamente verificável para adicionar uma camada genérica de confidencialidade sobre sistemas replicados que seguem a abordagem de replicação por máquina de estados. Apesar de utilizar a mesma biblioteca de partilha de segredos escrita em Java (JSS [7]), os mecanismos e protocolos desenhados para o DepSpace não podem ser directamente aplicados ao armazenamento em clouds uma vez que requerem execução de código nos servidores na verificação dos dados, e assumem que as actualizações de unidades de dados são sempre processadas na mesma ordem global no sistema. 3.7 Considerações Finais Neste capítulo foi apresentado o D EP S KY, um novo sistema de armazenamento tolerante a intrusões, que promove uma melhoria da disponibilidade, integridade e confidencialidade dos dados armazenados em clouds. Tal como a maioria dos sistemas de armazenamento, o D EP S KY suporta duas operações básicas, leitura e escrita, mas oferece a possibilidade dos dados serem armazenados de acordo com um esquema de partilha de segredos, garantindo a confidencialidade destes. No próximo capítulo são apresentados os detalhes da concretização do sistema. Capítulo 4 Concretização do D EP S KY 4.1 Considerações Gerais O DepSky e todos os seus componentes foram concretizados na linguagem de programação Java. Em primeiro lugar foram concretizados alguns controladores, que são responsáveis pela comunicação com os diferentes sistemas de armazenamento em clouds. Cada controlador comunica com a respectiva cloud através dos seus serviços web disponibilizados, utilizando uma interface ReSTful ou através de envelopes SOAP. Toda a comunicação é efectuada sobre HTTPS (HyperText Tranfer Protocol secure). Os controladores foram os componentes que mais tempo consumiram em termos de desenvolvimento dada a variedade no funcionamento dos diferentes serviços web de cada cloud. Foram concretizados controladores para os seguintes serviços: Amazon Simple Storage Service, Microsoft Windows Azure Platform, Nirvanix Storage Delivery Network, DivShare, DocStoc e Box.net. Os controladores do Amazon S3 e do Windows Azure foram concretizados sobre bibliotecas Java, que contêm uma implementação completa dos serviços web, disponibilizadas pelos fornecedores. Estas bibliotecas foram usadas mas tiveram que ser ligeiramente modificadas para suportarem proxies sem autenticação, porque a rede do DI-FCUL está dependente de uma proxy deste tipo para acesso ao exterior (Internet). Os restantes controladores foram concretizados recorrendo a classes da API do Java como a URLConnection para as ligações, os parsers de XML para processar respostas dos serviços web e uma variedade de módulos Java vocacionados para segurança, como o JSSE (Java Secure Socket Extension) e o JCA (Java Cryptography Architecture), que inclui o JCE (Java Cryptographic Extension). Após a conclusão de um número suficiente de controladores, iniciou-se o desenvolvimento do componente responsável pelos protocolos (DepSky), e de outro responsável pela verificação, validação e criação de metadados do sistema (DepSkyManager). Foi também concretizado um wrapper para controladores que efectua a gestão dos retries e timeouts dos pedidos HTTP, para garantir fiabilidade ponto-a-ponto (DepSkyCloudManager). 29 30 Capítulo 4. Concretização do D EP S KY O componente DepSky fornece ao cliente o ponto de partida para a execução dos protocolos, ADS e CADS. A sua interface disponibiliza as operações de leitura (read) e escrita (write) para ambos. É ainda disponibilizada outra operação, denominada readOptimized, para inicializar o protocolo de leitura optimizada do ADS. É também neste componente que está incluído o processo para partilha de segredos. O DepSkyManager efectua a ponte entre o DepSky e os DepSkyCloudManager’s, gerindo os pedidos efectuados, processando as respostas obtidas e tratando as excepções lançadas internamente. Para além disso, este componente também é responsável por efectuar verificações de integridade dos valores das unidades de dados assim como assinar novos metadados ou verificar a assinatura de metadados recebidos. Um DepSkyCloudManager encapsula um controlador numa thread e é o componente responsável pela comunicação com a cloud que esse controlador representa. Este pode ser configurado para permitir um determinado número de tentativas (retries), caso a primeira falhe. Outros parâmetros que podem ser configurados são os timeouts das ligações HTTP1 . Finalmente, utilizou-se a biblioteca JSS (Java Secret Sharing) [7] para concretizar a partilha de segredos no sistema. Esta biblioteca concretiza um esquema de partilha de segredos publicamente verificável proposto por Schoenmakers [31]. A tabela 4.1 apresenta o número de linhas de código necessário para concretizar cada componente do D EP S KY. Componente Controlador Amazon S3 Controlador Azure Controlador Nirvanix Controlador DivShare Controlador DocStoc Controlador Box.net Controlador FilesAnywhere DepSky DepSkyManager DepSkyCloudManager Linhas de Código 175 200 280 350 350 380 460 600 300 300 Tabela 4.1: Número de linhas de código necessárias para cada componente do sistema. 1 Em Java, existem dois timeouts na classe URLConnection que podem ser redefinidos, o connectTimeout, relativo ao tempo máximo de espera para que a conexão seja estabelecida, e o readTimeout, relativo ao tempo máximo de espera até dados estarem disponíveis na socket, depois da ligação já estar estabelecida. 31 Capítulo 4. Concretização do D EP S KY 4.2 Arquitectura A figura 4.1 mostra a forma como foi estruturado o sistema, desde o nível da interface do utilizador até aos serviços de armazenamento em clouds, passando pelo DepSky. Interface Leitura Escrita Unidade de Dados A Unidade de Dados B ... Unidade de Dados <id> Iniciar / Terminar DepSky Controlador Cloud#1 Controlador Cloud#2 HTTP (REST) HTTP (SOAP) ... Controlador Cloud#n Sistemas de armazenamento em clouds Figura 4.1: Visão minimalista sobre a estrutura do DepSky. Para simplicidade de os componentes descritos na secção anterior estão incluídos no DepSky representado nesta figura. A interface permite que o utilizador execute as operações disponibilizadas pelo sistema (leitura e escrita). Com a execução de qualquer operação é inicializado o DepSky, mas apenas se ainda não estiver activo. O DepSky está basicamente encarregue da "tradução" entre uma unidade de dados e dois ficheiros que a representam em cada cloud. Isto significa que se, por exemplo, exitirem 4 clouds para as quais são replicados os dados vão necessariamente existir um total de 8 ficheiros que representam essa unidade de dados, 4 com metadados e outros 4 com o valor (ou uma parte deste no caso do CADS). Esta "tradução"é completamente transparente para o cliente, que apenas precisa saber o identificador de uma unidade de dados. Aliás, este identificador é o único parâmetro numa operação de leitura, e um dos dois parâmetros numa operação de escrita (o outro parâmetro é o valor a escrever). Capítulo 4. Concretização do D EP S KY 32 Este modelo foi adoptado para que, através da utilização de metadados, fosse mais fácil efectuar o controlo de versão e verificar a autenticidade do valor da unidade de dados. Esta separação entre dados e metadados também permitiu a concretização do ADS com leituras optimizadas já que neste protocolo é pedido o valor da unidade a apenas uma cloud (no melhor caso). Os controladores, representados abaixo do DepSky, são os componentes responsáveis pela comunicação com as clouds , como já foi referido. Uma descrição mais detalhada é efectuada na próxima secção. 4.3 Diagramas UML Nesta secção são apresentados alguns diagramas UML, como o diagrama de classes do sistema, e os diagramas de sequência para as operações de escrita e leitura. A figura 4.2 apresenta o diagrama de classes do D EP S KY. Através deste diagrama conseguimos ter uma visão mais abrangente sobre como funciona o sistema. Os componentes representados no diagrama passam mensagens e outra informação de uns para os outros através de handlers. Estes handlers estão representados pelas interfaces IDepSkyProtocol e ICloudDataManager. Por exemplo, sempre que um DepSkyCloudManager recebe um ficheiro de metadados, invoca o método processMetadata do DepSkyManager para verificação de assinatura e saber se se trata de uma unidade de dados com partilha de segredos, ou seja, se foi escrita através do ADS ou CADS. Já a outra interface, a IDepSkyDriver, representa todas as operações que um controlador deve implementar para ser compatível com o D EP S KY. Todos os controladores concretizados implementam os métodos desta interface. A classe DepSkyDataUnit representa uma unidade de dados. É um objecto desta classe que é passado como argumento às operações definidas. Para além de representar uma unidade de dados do D EP S KY um objecto deste tipo também tem outras funcionalidades, como manter uma cache com as versões e valores lidos anteriormente ou indicar, numa operação de escrita, se queremos utilizar o ADS ou o CADS, através de um parâmetro booleano (useSS). As classes CloudRequest e CloudReply são subclasses da classe CloudMessage, que representa um pedido ou resposta de uma cloud. Embora a interface seja comum foi necessário fazer a separação entre pedidos e respostas essencialmente para fazer debugging ao sistema e perceber a direcção das mensagens, se estavam a chegar ou a sair. Por fim, também é representada a excepção genérica lançada pelos DepSkyCloudManager’s sempre que houve um problema de comunicação com uma cloud. Estas excepções são tratadas ao nível do DepSkyManager, no entanto convém relembrar que o sistema foi concebido para tolerar apenas f faltas. Se acontecerem mais de f faltas os protocolos lançam uma excepção para a camada superior. Figura 4.2: Diagrama de classes do sistema. 1..* 1 DepSkyManager * «exception» StorageCloudException in message : String +id : String +version : Long +useSS : Boolean +getContainerName() : String +getMetadataFinename() : String +getValuedataFilename(in version : Long) : String DepSkyCloudManager +sequence : Long +protoOp : Integer +sid : String +cid : String +did : String +dataunit : DepSkyDataUnit +cloudOp : Integer +value : Object -isMetadata : Boolean -version : Long -valueHash : String DepSkyDriver 1 1 +requests : CloudRequest +replies : CloudReply +processRequest() +processReply() CloudRequest CloudMessage CloudReply +doRequest(in cloudId : String, in request : CloudRequest) DepSkyDataUnit 0..* 1 1 «interface» ICloudDataManager +processMetadata(in mdreply : CloudReply) +checkDataIntegrity(in vreply : CloudReply) +writeNewMetadata(in vreply : CloudReply) Esta classe representa uma unidade de dados do DepSky e também serve como cache para metadados e valor da última versão lida dessa unidade de dados. «utility» DepSkyLogger 0..1 1 DepSky «interface» IDepSkyProtocol +read(in dataunit : DepSkyDataUnit) : Object +readOptimized(in dataunit : DepSkyDataUnit) : Object +write(in dataunit : DepSkyDataUnit) +dataReceived(in reply : CloudReply) DivShareDriver AmazonS3Driver FilesAnywhereDriver WindowsAzureDriver Conjunto de controladores concretizados. São responsáveis pelos pedidos e respostas HTTP do serviço que representam. DocStocDriver NirvanixDriver BoxNetDriver RackSpaceDriver «interface» IDepSkyDriver +initSession(in properties : Object) : String +createContainer(in sid : String, in cid : String) : String +deleteContainer(in sid : String, in cid : String) : Boolean +uploadData(in sid : String, in cid : String, in did : String, in data : Object) : String +downloadData(in sid : String, in cid : String, in did : String) : Object +deleteData(in sid : String, in cid : String, in did : String) : Boolean +endSession(in sid : String) : Boolean +getSessionKey() : String +getDriverCloudID() : String +getContainerAndDataIDsByName(in sid : String, in cname : String, in dname : String) : Object Esta classe para além de gerir pedidos e respostas também efectua a gestão dos retries e timeouts das ligações HTTP. Capítulo 4. Concretização do D EP S KY 33 34 Capítulo 4. Concretização do D EP S KY Visual Paradigm for UML Community Edition [not for commercial use] Client DepSky DepSky Manager 1: init() 2: new (regid) DepSkyDataUnit : du loop [du.cloudVersion.size() < N - F] 3: write (du,data2write) 3.1: new (GET_DATA,du) CloudRequest : req 3.2: doRequest(req) 3.2.2: dataReceived(rep) 3.2.1: new (du,METADATA) CloudReply : rep 3.3: processMetadata(rep) 3.4: lastMetadata.add(rep) 3.5: cloudVersion.put(rep.cloudId,rep.version) 3.5: newVersion = du.getMaxVersion() + 1 loop [lastValuedata.size() < N - F] 3.6: new (NEW_DATA,du,data2write) 3.7: doRequest(req) 3.7.1: new (du,NEW_DATA_OK) 3.7.2: dataReceived(rep) 3.8: writeNewMetadata(rep) 3.8.1: new (du,NEW_DATA_OK) 3.8.2: lastValuedata.add(rep) 4: write completed Figura 4.3: Diagrama de sequência simplificado de uma operação de escrita. As figuras 4.3 e 4.4 ilustram os fluxos de informação e como são criados os objectos no D EP S KY, através de diagramas de sequência UML para as operações de escrita e leitura. Os diagramas estão simplificados pois todos os DepSkyCloudManager’s foram incluídos no DepSkyManager. Basicamente foi abstraída a comunicação com a cloud nos passos em que são criados novos objectos do tipo CloudReply. Se ocorrerem excepções durante esta comunicação, só depois de esgotados os retries de um DepSkyCloudManager, é que um CloudReply é criado e inicializado com um valor nulo. Nos diagramas estas excepções também não estão representadas. De referir que cada DepSkyCloudManager cria um novo objecto CloudReply sempre que recebe uma resposta do controlador, para depois o passar ao DepSkyManager. Operação write Numa operação de escrita o cliente começa por criar um objecto do tipo DepSkyDataUnit passando como argumento o identificador, que tem de ser único. Este objecto é depois passado como argumento da operação write juntamente com os dados que o cliente quer escrever na unidade de dados. Após este passo, o DepSky cria um objecto do tipo CloudRequest para obter os meta- Capítulo 4. Concretização do D EP S KY 35 dados da unidade de dados indicada e passa-o ao DepSkyManager. Este gestor é responsável por multiplicar este pedido pelos DepSkyCloudManager’s que por sua vez o passam aos controladores para o encaminhar para a cloud correspondente. Este último passo é efectuado em todos os controladores ao mesmo tempo, ou seja, os pedidos são enviados paralelamente a todas as clouds do sistema. Assim que os metadados são recebidos são reencaminhados para o DepSkyManager que verifica a assinatura dos metadados e, se esta for válida, guardar a informação contida nestes (i.e., versão ) porque será necessária nos passos seguintes. O DepSky aguarda a recepção de n − f metadados antes de prosseguir. Como já foi referido, obter os metadados é essencial para que o sistema calcule o valor da próxima versão. Assim que são obtidos, o DepSky cria um CloudRequest, mas desta vez para escrever uma nova versão do valor. Este pedido é encaminhado para o DepSkyManager que repete o processo com os DepSkyCloudManager’s já descrito anteriormente (pedidos efectuados paralelamente a todas as clouds). O novo número de versão é lido do objecto DepSkyDataUnit, que possui em cache o número de versão existente em cada cloud, obtido dos metadados. Após a recepção da confirmação de escrita do novo valor em n − f clouds dá-se início à actualização dos metadados nas clouds. Para este efeito, é criado outro objecto do tipo CloudRequest com o novo ficheiro de metadados. O novo ficheiro é construído pelo DepSkyManager e contém o novo número de versão, um resumo criptográfico do novo valor e o nome do ficheiro com a nova versão. A operação write termina quando são recebidas n − f confirmações da actualização dos metadados. Operação read Numa operação de leitura o cliente começa por criar um objecto do tipo DepSkyDataUnit, passando como argumento o identificador único, que por sua vez é passado como argumento da operação read. Após este passo, o DepSky cria um objecto do tipo CloudRequest para obter os metadados da unidade de dados, exactamente como na operação write, com a diferença que numa operação read é guardada temporariamente toda a informação contida nos metadados (i.e., versão, nome do ficheiro com o valor e resumo criptográfico do valor) pois serão necessárias nos passos seguintes (na operação write apenas é relevante o número de versão). O DepSky aguarda a recepção de n − f metadados antes de prosseguir2 . Assim que são obtidos os metadados, o DepSky cria um CloudRequest com o nome do ficheiro com 2 No protótipo, uma pequena optimização efectuada, é não aguardar os n − f metadados para pedir o valor e pedi-lo assim que os metadados sejam validados. Obviamente que o protocolo só prossegue após a recepção de n − f metadados válidos 36 Capítulo 4. Concretização do D EP S KY Visual Paradigm for UML Community Edition [not for commercial use] Client DepSky DepSky Manager 1: init() 2: new (regid) DepSkyDataUnit : du loop [hasMoreDrivers = true & du.cloudVersion.size() < N - F & lastValuedata.size() < F] 3: read (du) 3.1: new (GET_DATA,du) CloudRequest : req 3.2: doRequest(req) 3.2.1: new (du,METADATA) 3.2.2: dataReceived(rep) CloudReply : rep 3.3: processMetadata(rep) 3.4: lastMetadata.add(rep) 3.5: cloudVersion.put(rep.cloudId,rep.version) 3.5: maxVersion = du.getMaxVersion() 3.6: new (GET_DATA,du,rep.valueId) 3.7: doRequest(req) 3.7.1: new (du,VALUE) 3.7.2: [rep.version = maxVersion] lastValuedata.add(rep) 4: lastValuedata.get(0).response Figura 4.4: Diagrama de sequência simplificado de uma operação de leitura. o valor obtido dos metadados referentes à versão mais recente. Este pedido é passado ao DepSkyManager que o multiplica pelos DepSkyCloudManager’s, sendo depois efectuado em paralelo às clouds. Cada DepSkyCloudManager cria um objecto do tipoCloudReply e passa-o ao DepSkyManager com o valor recebido da cloud. O DepSkyManager quando recebe este objecto faz a verificação de integridade, e só se os dados não tiverem sido modificados é que entrega ao DepSky A operação termina quando é entregue no DepSky um CloudReply que reporte um valor íntegro e referente à versão mais actual da unidade de dados. 4.4 Controladores Foi definido que os controladores deviam fazer apenas as operações necessárias para o correcto funcionamento do D EP S KY. As funções básicas de um controlador são ler e escrever dados na cloud, no entanto para o D EP S KY foram definidas mais algumas operações (listadas na interface IDepSkyDriver do diagrama de classes 4.2), entre elas a possibilidade de criar containers. Para concretizar o controlador de uma cloud de armazenamento, é necessário o estudo da API dos serviços web disponibilizados. Devem ser analisadas as funcionalidades necessárias (e.g., uploadFile, createBucket) e concretizá-las seguindo a sua especificação. Esta especificação indica como devem ser construídos os pedidos HTTP a enviar ao serviço web, podendo ser necessários cabeçalhos adicionais (e.g., para autenticação), ou que Capítulo 4. Concretização do D EP S KY 37 o corpo HTTP do pedido esteja estruturado numa determinada forma. Embora a maioria das clouds pay-per-use disponibilizem serviços ReST e SOAP, todos os controladores para este tipo de clouds foram implementados usando os serviços ReSTfull. A maioria das clouds de custo fixo apenas disponibiliza API para uma das abordagens, normalmente ReST. Contudo o FilesAnywhere apenas disponibiliza serviços web através de SOAP. Comparando as duas abordagens, ReST e SOAP, o nível de complexidade de programação experienciado é semelhante, não havendo mais ou menos dificuldade de concretização. 4.5 Considerações Finais Neste capítulo foram descritos os detalhes da concepção do D EP S KY, como a sua arquitectura e como o sistema funciona na prática, ou seja, como efectua a "tradução"entre um unidade de dados D EP S KY e os dados armazenados nas clouds. Foram também apresentados detalhes da implementação do sistema, o diagrama de classes e diagramas de sequência para as operações de leitura e escrita. Os controladores do D EP S KY e a abordagem tomada na concretização destes também foi descrita. Uma avaliação ao desempenho do sistema, e das clouds individualmente, é efectuada no próximo capítulo. Capítulo 4. Concretização do D EP S KY 38 Capítulo 5 Avaliação Experimental do D EP S KY Neste capítulo apresenta-se uma avaliação do DepSky que tenta responder a três perguntas: • Qual o custo adicional em se utilizar replicação de clouds de armazenamento? • Qual o ganho de desempenho e de disponibilidade em se usar clouds replicadas para armazenar dados? • Qual o custo relativo das diferentes versões (ADS, ADS com leitura optimizada e CADS) do D EP S KY? 5.1 Custo do Armazenamento Replicado As clouds de armazenamento usualmente cobram pela quantidade de dados que entram, saem e ficam armazenados nos seus data centers. A tabela 5.11 mostra os gastos com leituras e escritas nas clouds, para diferentes tamanhos de blocos de dados. A tabela 5.2 vem no seguimento da tabela 5.1 e, adicionalmente, apresenta os custos da utilização do modelo de unidade de dados descrito neste artigo pelos protocolos do D EP S KY nas mesmas condições. É de salientar o baixo custo da utilização da leitura optimizada quando comparada com a normal. Ambas as tabelas mostram o custo, em USD, de se realizar 10.000 operações de leitura e escrita para diferentes tamanhos de blocos de dados. É necessário relembrar que os protocolos de leitura do DepSky efectuam 2 pedidos de leitura a cada cloud, e também, que os protocolos de escrita efectuam um pedido de leitura e 2 pedidos de escrita a cada cloud. A coluna “D EP S KY” apresenta os custos do uso dos protocolos ADS e CADS propostos. É importante referir que o uso de confidencialidade (protocolo CADS) não apresenta 1 Nesta tabela são paresentados os custos do RackSpace ao invés do Divshare (usado nas experiências de latência) devido ao facto do primeiro cobrar por uso, enquanto o segundo oferece apenas pacotes fixos. 39 40 Capítulo 5. Avaliação Experimental do D EP S KY Operação 10k Leituras 10k Escritas Tamanho 100 kb 1 Mb 10 Mb 100 kb 1 Mb 10 Mb Amazon S3 (EU) 0,11 1,01 10,01 0,20 1,10 10,10 RackSpace 0,22 2,20 22,0 0,28 0,80 8,00 Windows Azure 0,16 1,51 15,01 0,11 1,01 10,01 Nirvanix 0,18 1,80 18,0 0,18 1,80 18,0 Tabela 5.1: Custo estimado, em USD, de 10.000 operações de leitura e escrita de dados com 100KB, 1MB e 10MB nas clouds. Operação 10k Leituras 10k Escritas Tamanho 100 kb 1 Mb 10 Mb 100 kb 1 Mb 10 Mb D EP S KY 0,69 6,54 65,04 1,10 4,84 46,24 D EP S KY opt. (melhor caso) entre 0,12 e 0,22 entre 1,02 e 2,20 entre 10,02 e 22,0 1,10 4,84 46,24 Tabela 5.2: Custo estimado, em USD, de 10.000 operações de leitura e escrita de dados com 100KB, 1MB e 10MB usando os protocolos do D EP S KY. acréscimo representativo de custo, em termos de armazenamento, uma vez que os seus metadados ocupam, em média, 500 bytes enquanto os metadados para unidades de dados sem confidencialidade ocupam cerca de metade desse valor. A coluna “D EP S KY opt. (melhor caso)” apresenta os custos quando a optimização de leitura para o protocolo ADS é utilizada. O custo varia porque a cloud mais rápida a responder aos pedidos de metadados não é sempre a mesma, logo estão representados os custos mínimo (Amazon S3) e o máximo (RackSpace) para cada tamanho de dados. Custo de leitura. Este custo corresponde apenas ao custo de se ler os metadados da unidade de dados e os dados propriamente ditos. O custo de leitura do D EP S KY é similar a soma dos custos de leitura em cada uma das quatro clouds individualmente, enquanto que na versão optimizada o custo é bastante reduzido, já que só é pedido o valor a uma das clouds. No entanto, há que considerar um acréscimo de poucos cêntimos devido aos pedidos de metadados a todas as clouds. Custo de escrita. O custo da escrita considera o custo de se ler os metadados, escrever uma nova versão destes e escrever a nova versão dos dados. Além disso, neste custo estão incluídos os custos de armazenamento dos dados, o que significa que se considera um sistema onde nenhuma versão de uma unidade de dados será apagada (i.e., escritas apenas criam novas versões). Como já foi referido, esta funcionalidade é importante para dados critícos na medida que permite recuperar versões anteriores das unidades de dados Capítulo 5. Avaliação Experimental do D EP S KY 41 armazenadas. Entretanto, na prática esse custo pode ser amortizado eliminando versões antigas dos valores das unidades de dados. Os resultados das tabelas 5.1 e 5.2 mostram que o custo apresentado para as versões do D EP S KY correspondem a soma dos custos de escrita nas clouds. Estes custos, assim como na leitura não-optimizada, advém do modelo de replicação utilizado onde o bloco de dados é replicado em todas as clouds. Se tivessem sido aplicadas técnicas similares ao RAID nível 5 [29], estes custos diminuiriam aproximadamente para metade, já que os dados armazenados em cada cloud teriam um tamanho menor. 5.2 Desempenho e Disponibilidade O D EP S KY foi desenhado tendo em conta um modelo em que as leituras são muito mais frequentes que as escritas, como é observado em praticamente todos os sistemas de armazenamento [16]. Por isso, a avaliação efectuada concentra-se na latência das operações de leitura em diferentes configurações. No entanto, são reportados também alguns valores de latência do protocolo de escrita no fim desta secção para fins de completude do estudo. 5.2.1 Metodologia As medidas de latência de leitura foram obtidas através de uma aplicação que acede os dados de 7 formas diferentes (configurações): às 4 clouds de armazenamento individualmente sem utilização do D EP S KY (Amazon S3, Windows Azure, Nirvanix e Divshare) e às 3 versões do protocolo de leitura do D EP S KY (ADS, ADS com leituras optimizadas e CADS). Todas as versões do D EP S KY usam as quatro clouds mencionadas para armazenar dados, e portanto toleram uma falha. Foram medidos tempos de leitura para unidades de dados de três tamanhos: 100K, 1M e 10M bytes. A aplicação executou todas estas leituras periodicamente - de um em um minuto (10K e 1M) ou de cinco em cinco minutos (10M) - e armazenou os tempos obtidos em ficheiros de log. O objectivo foi ler os dados através das diferentes configurações dentro de um intervalo de tempo o mais curto possível tentando minimizar as variações no desempenho da Internet. As experiências aqui reportadas foram efectuadas entre 31 de Maio e 13 de Junho de 2010, com o cliente a executar numa máquina do Departamento de Informática da FCUL e a aceder às quatro clouds de armazenamento. Foram efectuadas 99414 medidas de latência, isto é, 14202 medidas por cada uma das 7 configurações. 42 1 1 0.9 0.9 0.8 0.8 0.7 0.6 0.5 0.4 0.3 0.2 Legenda Divshare Nirvanix Azure Amazon S3 0.1 0 Função de Distribuição Cumulativa Função de Distribuição Cumulativa Capítulo 5. Avaliação Experimental do D EP S KY 0.7 0.6 0.5 0.4 0.3 0.2 Legenda DS−ReadO DS−Read DS−ReadSS Amazon S3 0.1 0 0 1000 2000 3000 4000 5000 6000 7000 Latência (milisegundos) 8000 (a) Clouds. 9000 10000 0 1000 2000 3000 4000 Latência (milisegundos) 5000 6000 (b) D EP S KY. Figura 5.1: FDC para as latências de leitura de dados com 100K bytes observadas em quatro diferentes clouds (Amazon S3, Windows Azure, Nirvanix e DivShare) e nas três versões do D EP S KY replicando dados por essas clouds. 5.2.2 Latência de Leitura As figuras 5.1, 5.2 e 5.3 apresentam a FDC (função de distribução cumulativa) das latências medidas na leitura dos diversos tamanhos dos dados nas diversas clouds individualmente e utilizando as diferentes versões do D EP S KY. São apresentados resultados relativos ao acesso às clouds individualmente, e utilizando diferentes versões do D EP S KY (com os resultados da Amazon S3, para fins de comparação). Através da figura 5.1(a) observa-se que as distribuições de latência para todas as configurações são bastante semelhantes com destaque para a Azure que demonstra ser mais lenta. Já a figura 5.1(b) mostra que com este tamanho o desempenho dos protocolos de leitura do D EP S KY é bastante semelhante ao da Amazon S3. Mais especificamente, o ADS e o ADS com leituras optimizadas obtiveram melhor tempo de resposta em relação à Amazon S3 em cerca de 70% das medidas. Nas experiências com unidades de dados de 1M já se pode observar alguma discrepância entre os desempenhos da Amazon S3 e da Nirvanix (figura 5.2(a)). Na verdade a Nirvanix obteve um desempenho pelo menos duas vezes melhor que as restantes clouds. Além disso, com este tamanho já se commeça a notar a diferença entre usar replicação de dados em clouds e apenas uma cloud: 90% das leituras optimizadas com o D EP S KY estão abaixo de 3,2 segundos, enquanto com a Amazon S3 este valor aproxima-se de 8 segundos (o pior resultado de 90% das medidas). Através da comparação das figuras 5.2(a) e 5.2(b) pode afirmar-se que o bom desempenho dos protocolos do D EP S KY está directamente relacionado com o desempenho da Nirvanix no intervalo em que foram efectuadas as medições. As experiências com unidades de dados de 10M já demonstram as dificuldades em lidar com o armazenamento de dados na Internet. 43 1 1 0.9 0.9 0.8 0.8 Função de Distribuição Cumulativa Função de Distribuição Cumulativa Capítulo 5. Avaliação Experimental do D EP S KY 0.7 0.6 0.5 0.4 0.3 0.2 Legenda Divshare Nirvanix Azure Amazon S3 0.1 0.7 0.6 0.5 0.4 0.3 0.2 Legenda DS−ReadO DS−Read DS−ReadSS Amazon S3 0.1 0 0 0 1000 2000 3000 4000 5000 6000 Latência (milisegundos) 7000 8000 9000 0 1000 (a) Clouds. 2000 3000 4000 5000 6000 Latência (milisegundos) 7000 8000 9000 (b) D EP S KY. Figura 5.2: FDC para as latências de leitura de dados com 1M bytes observadas em quatro dife- 1 1 0.9 0.9 0.8 0.8 Função de Distribuição Cumulativa Função de Distribuição Cumulativa rentes clouds (Amazon S3, Windows Azure, Nirvanix e DivShare) e nas três versões do D EP S KY replicando dados por essas clouds. 0.7 0.6 0.5 0.4 0.3 0.2 Legenda Divshare Nirvanix Azure Amazon S3 0.1 0.7 0.6 0.5 0.4 0.3 0.2 Legenda DS−ReadO DS−Read DS−ReadSS Amazon S3 0.1 0 0 0 5000 10000 15000 20000 25000 Latência (milisegundos) (a) Clouds. 30000 35000 40000 0 5000 10000 15000 20000 25000 Latência (milisegundos) 30000 35000 40000 (b) D EP S KY. Figura 5.3: FDC para as latências de leitura de dados com 10M bytes observadas em quatro diferentes clouds (Amazon S3, Windows Azure, Nirvanix e DivShare) e nas três versões do D EP S KY replicando dados por essas clouds. Na figura 5.3(a) observa-se uma larga discrepância entre os resultados observados para a Nirvanix e a Divshare quando comparados com os resultados da Azure e da S3. Também se manteve a tendência verificada nos dados de 1M, a Nivanix continua a mostar ser o serviço com melhor tempo de resposta. Em particular, no decorrer destas medidas observou-se um acentuado período de indisponibilidade da Azure (ver tabela 5.3), o que é representado no gráfico pelos cerca de 20% de resultados que não estão na figura. No que diz respeito às diversas versões do D EP S KY, a figura 5.3(b) mostra que neste caso a replicação dos dados em diversas clouds diminui de forma significativa a latência de leitura dos dados, mesmo na versão optimizada em que não se tenta ler de várias clouds mas apenas da que retornou os metadados mais rapidamente. De notar também que o uso da primitiva de partilha de segredos para confidencialidade 44 Capítulo 5. Avaliação Experimental do D EP S KY (protocolo CADS), torna o D EP S KY muito menos eficiente já que se têm de obter os dados de duas clouds diferentes, ao invés de apenas de uma (como acontece no ADS e no ADS com leitura optimizada). Falhas Durante as experiências foram observadas várias falhas no acesso aos sistemas de armazenamento, conforme reportado na tabela 5.3. Dados (bytes) 100K 1M 10M Todas falharam 1 1 0 Amazon S3 0 9 0 Azure 0 13 10+10hs Nirvanix 1 2 7 Tabela 5.3: Número de falhas observadas durante as experiências de leitura. O “10+10hs” para a Azure na experiência de 10M significa que para além das 10 falhas reportadas houve um período de 10 horas onde mais de 95% dos acessos individuais a este sistema falharam. Durante as experiências observou-se um período de instabilidade e indisponibilidade na cloud Azure entre as 11 e as 21 horas do dia 10 de Junho. Neste período mais de 95% das leituras dos dados falharam com a mensagem de erro “Unable to read complete data from server”. Para além deste evento, o número de operações mal sucedidas é bastante pequeno se tivermos em conta a quantidade total de operações executadas (14202 em cada cloud). É de salientar que o D EP S KY falhou apenas duas vezes, quando todas as clouds estavam indisponíveis. Estas falhas aconteceram possivelmente devido a problemas de conectividade na saída da rede do DI/FCUL. 5.2.3 Latência de Escrita Para fins de completude da avaliação são reportados na tabela 5.4 os tempos médios de escrita em diferentes configurações (obtidos a partir de um conjunto de 100 escritas para cada tamanho de unidade de dados, executadas no dia 14 de Junho). Dados 100K 1M 10M D EP S KY-ADS 1767 4376 20315 D EP S KY-CADS 2790 4928 24012 Amazon S3 2336 5640 32204 DivShare 3287 4684 8298 Azure 2801 3823 20017 Nirvanix 2802 2626 4816 Tabela 5.4: Latência média (ms) de escrita para diferentes tamanhos de unidades de dados, configurações do D EP S KY e clouds de armazenamento. Estes resultados mostram que algumas clouds (Divshare e Nirvanix) apresentam pouco aumento de latência quando passamos a escrever altos volumes de dados, enquanto outras Capítulo 5. Avaliação Experimental do D EP S KY 45 (Azure e S3), apresentam uma perda de desempenho proporcional ao tamanho dos dados sendo escritos. O desempenho das versões do D EP S KY é similar a estas versões mais lentas na medida que os protocolos de escrita requerem a confirmação de escrita em 3 das 4 clouds utilizadas. 5.3 Considerações Finais Neste capítulo foi efectuada uma avaliação experimental aos protocolos concretizados no D EP S KY (ADS e CADS) assim como uma análise crítica aos resultados verificados. Mais especificamente, foram avaliados os custos e medida a latência, para operações de leitura e escrita, em 4 clouds e através da utilização do D EP S KY. Para finalizar este relatório, no próximo capítulo são apresentadas as conclusões e o trabalho futuro. Capítulo 5. Avaliação Experimental do D EP S KY 46 Capítulo 6 Conclusões e Trabalho Futuro 6.1 Conclusões Construir sistemas de armazenamento de maneira distribuída é muito atractivo, porque a disponibilidade da informação pode ser aumentada significativamente. Algoritmos de armazenamento distribuído podem ser optimizados para fornecerem um nível elevado de coerência, disponibilidade e resiliência, enquanto ao mesmo tempo induzem um overhead muito pequeno em comparação com uma solução centralizada e falível. Não é de surpreender que através da combinação de propriedades de armazenamento desejáveis incorrem diferentes tradeoffs. No entanto, vale a pena mencionar que, na prática, sistemas de armazenamento distribuído enfrentam outros desafios, como sobrevivência, interoperabilidade, escalabilidade e balanceamento de carga. Neste trabalho foi apresentado o D EP S KY, um sistema que garante disponibilidade, integridade e confidencialidade de informação armazenada na cloud. Com estas garantias pode-se definir o D EP S KY como um sistema confiável e seguro. Para garantir a disponibilidade do sistema a informação é replicada por várias clouds. A confidencialidade da informação é garantida nas clouds, através da utilização de um esquema de partilha de segredos, que permite a divisão da informação pelas clouds de maneira a que nenhuma delas possua a informação na íntegra, e ponto-a-ponto na Internet, através da utilização de HTTPS. Na avaliação de resultados mostrou-se que o D EP S KY não fica muito aquém, em termos de desempenho, dos serviços testados. Pode-se afirmar que com o D EP S KY temos sempre o melhor serviço independentemente das condições que cada cloud de armazenamento experiencia individualmente. Além disso, os resultados demonstram a viabilidade económica (especialmente para cargas de trabalho com bastantes mais leituras que escritas) e os benefícios em termos de desempenho e disponibilidade do sistema. 47 Capítulo 6. Conclusões e Trabalho Futuro 6.2 48 Trabalho Futuro O trabalho futuro deverá passar pela inclusão de códigos de apagamento no sistema. O propósito será diminuir o tamanho dos blocos armazenados (de forma similar ao RAID [29] e permitir uma avaliação da disponibilidade e desempenho do D EP S KY a partir de diferentes locais no mundo. Esta avaliação também deverá ser realizada usando diferentes configurações de clouds, desenvolvendo-se novos controladores (para serviços não contemplados neste trabalho) se tal for necessário. Referências [1] Amazon Simple Storage Service (https://s3.amazonaws.com), June 2010. [2] Box.net (http://www.box.net), June 2010. [3] DivShare (http://www.divshare.com), June 2010. [4] DocStoc (http://www.docstoc.com), June 2010. [5] FilesAnywhere (http://www.filesanywhere.com), June 2010. [6] Inforum2010 (http://inforum.org.pt/INForum2010), September 2010. [7] Java Secret Sharing (http://www.navigators.di.fc.ul.pt/ software/jitt/jss.html), June 2010. [8] Microsoft Windows Azure Platform (http://www.windowsazure.com), June 2010. [9] Nirvanix Storage Delivery Network (http://www.nirvanix.com), June 2010. [10] RackSpace CloudFiles (http://www.rackspace.com), June 2010. [11] Alysson Neves Bessani, Eduardo Pelison Alchieri, Miguel Correia, and Joni Silva Fraga. Depspace: a byzantine fault-tolerant coordination service. In Eurosys ’08: Proceedings of the 3rd ACM SIGOPS/EuroSys European Conference on Computer Systems 2008, pages 163–176, New York, NY, USA, 2008. ACM. [12] Alysson Neves Bessani, Miguel Correia, and Paulo Sousa. Active quorum systems: Specification and correction proof. Technical report, Department of Informatics, Faculty of Sciences, University of Lisbon, December 2008. [13] Kevin D. Bowers, Ari Juels, and Alina Oprea. HAIL: a high-availability and integrity layer for cloud storage. In CCS ’09: Proceedings of the 16th ACM conference on Computer and communications security, pages 187–198, New York, NY, USA, 2009. ACM. 49 Referências 50 [14] Christian Cachin and Stefano Tessaro. Asynchronous verifiable information dispersal. In DISC, pages 503–504, 2005. [15] Miguel Castro and Barbara Liskov. Practical byzantine fault tolerance and proactive recovery. ACM Transactions on Computer Systems (TOCS), 20(4):398–461, November 2002. [16] Gregory Chockler, Rachid Guerraoui, Idit Keidar, and Marko Vukolić. Reliable Distributed Storage. Computer, 42(4):60–67, 2009. [17] Miguel Correia. Serviços distribuídos tolerantes a intrusões: resultados recentes e problemas abertos. In V Simpósio Brasileiro em Segurança da Informação e de Sistemas Computacionais - Livro Texto dos Minicursos, pages 113–162. Sociedade Brasileira de Computação, September 2005. [18] Miguel Correia, Nuno Ferreira Neves, Lau Cheuk Lung, and Paulo Veríssimo. Low complexity byzantine-resilient consensus. Distributed Computing, 17(3):237–249, 2005. [19] Michael J. Fischer, Nancy A. Lynch, and Michael S. Paterson. Impossibility of distributed consensus with one faulty process. In PODS ’83: Proceedings of the 2nd ACM SIGACT-SIGMOD symposium on Principles of database systems, pages 1–7, New York, NY, USA, 1983. ACM. [20] J. Fraga and D. Powell. A fault- and intrusion-tolerant file system. In In Proceedings of the 3rd International Conference on Computer Security, pages 203–218, 1985. [21] David K. Gifford. Weighted voting for replicated data. In SOSP, pages 150–162, 1979. [22] L. Princehouse H. Abu-Libdeh and H. Weatherspoon. RACS: A case for cloud storage diversity. ACM Symposium on Cloud Computing (SOCC), June 2010. [23] Maurice Herlihy. Wait-free synchronization. ACM Transactions on Programming Languages and Systems (TOPLAS), 13(1):124–149, 1991. [24] Hugo Krawczyk. Distributed fingerprints and secure information dispersal. In PODC ’93: Proceedings of the twelfth annual ACM symposium on Principles of distributed computing, pages 207–218, New York, NY, USA, 1993. ACM. [25] Leslie Lamport. Time, clocks, and the ordering of events in a distributed system. Commun. ACM, 21(7):558–565, 1978. [26] Leslie Lamport. On Interprocess Communication. Part I: Basic Formalism. Distributed Computing, 1(2):77–85, 1986. Referências 51 [27] Leslie Lamport, Robert Shostak, and Marshall Pease. The Byzantine Generals Problem. ACM Trans. Program. Lang. Syst., 4(3):382–401, 1982. [28] Dahlia Malkhi and Michael Reiter. Byzantine Quorum Systems. Distributed Computing, 11(4):203–213, October 1998. [29] David A. Patterson, Garth Gibson, and Randy H. Katz. A case for redundant arrays of inexpensive disks (RAID). In SIGMOD ’88: Proceedings of the 1988 ACM SIGMOD international conference on Management of data, pages 109–116, New York, NY, USA, 1988. ACM. [30] Bruno Quaresma, Alysson Bessani, and Paulo Sousa. Melhorando a Disponibilidade e Confidencialidade dos Dados Armazenados em Clouds. In 2a edição do INForum - Segurança de Sistemas de Computadores e Comunicações, 2010. [31] Berry Schoenmakers. A simple publicly verifiable secret sharing scheme and its application to electronic. In CRYPTO ’99: Proceedings of the 19th Annual International Cryptology Conference on Advances in Cryptology, pages 148–164, London, UK, 1999. Springer-Verlag. [32] Adi Shamir. How to Share a Secret. Commun. ACM, 22(11):612–613, 1979. [33] P. E. Veríssimo, N. F. Neves, and M. P. Correia. Intrusion-tolerant architectures: Concepts and design. In R. Lemos, C. Gacek, and A. Romanovsky, editors, Architecting Dependable Systems, volume 2677. 2003.