Exposição pública de objetos, é uma boa ideia?

Exposição pública de objetos, é uma boa ideia?

Nós, engenheiros/arquitetos de nuvem pública, estamos acostumados com os benefícios gerados pelo uso de uma solução de storage (como o Azure Storage e o AWS S3). Comumente considerado um benefício, a possibilidade de exposição pública dos objetos permite que a solução aproveite a escalabilidade e alta disponibilidade nativa do recurso, mas como fica a segurança? Quais as preocupações existentes em uma solução que expõe seus objetos para a internet? É sobre esse assunto que vamos falar hoje!


💡
Ao longo do texto, alguns termos farão referência às soluções de storage em nuvem da Azure e AWS, porém os conceitos podem ser aplicados em qualquer outra solução de storage.

Motivações

Os times de negócio apresentam aos arquitetos as mais diferentes necessidades. Todo o trabalho feito pelos times de tecnologia tem o intuito de atender da melhor forma a demanda de negócio e no final do pipeline, o cliente final.

Os clientes podem se beneficiar do uso de soluções de storage para armazenamento de objetos estáticos, visto que essas soluções podem ser integradas com uma solução de CDN (Content Delivery Network) e oferecem alta disponibilidade e velocidade no acesso aos recursos.

Utilizar os object storages também pode facilitar a entrega de arquivos/documentos ao usuário final, bastando apenas disponibilizá-lo na estrutura e comunicar ao usuário ao link de acesso ao objeto.

Vamos entender um pouco melhor como os storages funcionam e tudo que permeia a exposição pública dos documentos.


Estruturas do Object Storage

Nas soluções de object storage mais utilizadas no mercado, é comum nos depararmos com a possibilidade de organizar nosso recurso em uma estrutura hierarquica, dividindo em caminhos (paths) diferentes os diversos tipos de objetos que serão armazenados ali.

Dentro dos storages, temos basicamente 3 níveis de organização que podem ser criados dentro dessa hirarquia:

  • Repositório;

  • Pasta;

  • Objeto.

O repositório é o nome genérico dado ao recurso que realmente criamos dentro da plataforma. Para o Azure ele é uma Azure Storage Account, para a AWS ele é um S3 Bucket. Esse é o maior componente da estrutura e normalmente é criado com a responsabilidade de armazenar os objetos de uma mesma categoria em uma solução. As regras de criação desse componente costumam ser bem simples, devemos respeitar os padrões de nomenclatura impostos pelo provedor e nosso nome deve ser único globalmente dentro daquela plataforma.

As pastas são o segundo nível organizacional do nosso componente. Abaixo do repositório, podemos criar inúmeras pastas diferentes e inclusive incluí-las dentro de outras pastas. Além de se respeitar o tamanho máximo do nome da pasta imposto pelo provedor, pastas no mesmo nível não poderão ter nomes repetidos.

O último nível da hierarquia são os objetos. Essas são as informações que nós realmente temos interesse e desejamos acessar. Não é possível criar nada abaixo dos objetos, os sacramentando como o último nível dentro do nosso recurso. Por padrão, não temos restrições relacionadas aos objetos, a não ser que durante a configuração do seu repositório, o time responsável tenha realizado alguma mudança nos valores padrão, como por exemplo para limitar o tamanho dos arquivos que poderão ser armazenados.

A imagem acima representa graficamente a estrutura dos objects storage. Temos um repositório contendo diversas pastas diferentes e as pastas contendo os objetos e outras pastas.

Agora que entendemos esse modelo, vamos falar um pouco sobre as diferentes formas de exposição desses objetos de maneira pública.


Escopos de exposição

Entender como os storages são estruturados é essencial para conseguirmos compreender e avaliar os modelos de exposição disponíveis. As estruturas existentes impactam diretamente como os recursos podem ser organizados e expostos. Vamos aos escopos!

Container/Pasta

Como apresentamos anteriormente, o repositório é composto internamente por pastas, essas que armazenarão os documentos que tornaremos disponíveis.

Quando a exposição é configurada nesse nível, tudo que está dentro das pastas torna-se publicamente acessível.

Neste caso as pastas também são expostas, permitindo que os usuários realizem requisições para o recurso e obtenham informações (e metadados) não apenas sobre os objetos, mas também sobre a estrutura onde estão presentes.

Objetos

Sendo a forma mais segura de expor publicamente os objetos, nesse modelo "nenhuma" informação sobre a estrutura de pastas fica disponível. Apenas o objeto em questão tem seu acesso liberado.

💡
Note as aspas em nenhuma. Expor apenas os blobs não permitirá que metadados das pastas sejam acessados, porém a estrutura de pastas até chegar ao objeto estará disponível na URI utilizada para acessar o recurso.

Modelos de exposição dos blobs

Passamos brevemente aos escopos pois é necessário compreendermos em quais níveis nós podemos publicar nossos recursos. Com isso estabelecido, agora falaremos sobre como esses objetos podem ser expostos.

Exposição atemporal

Neste modelo nós habilitamos o acesso público aos recursos das pastas para todos os usuários e sem restrição de tempo. Os objetos serão acessíveis a qualquer momento e seu acesso será não será revogado automaticamente, devendo ser feito de maneira explícita.

Este é o modelo mais simples, visto que selecionamos uma das estruturas de pastas e habilitamos o acesso à partir daquele nível. O que resta determinar é o escopo (como foi tratado na seção anterior).

Todos os objetos presentes no escopo selecionado estarão visíveis até que o acesso público seja revogado por algum usuário com permissão suficiente.

Exposição temporária

Esse modelo faz uso de outra função dos object storages, que permite a criação de um "link" de acesso que estará temporariamente disponível. O acesso ao recurso exposto pelo link será revogado quando o tempo de expiração cadastrado for atingido.

💡
No Azure esse recurso se chama SAS (Shared Access Signature) e utiliza as chaves de criptografia da storage account para construir a URL e assiná-la, a tornando disponível para uso.

Preocupações de Segurança

Em qualquer um dos modelos e qualquer um dos escopos há preocupações de segurança. O principal ponto que deve ser considerado quando estivermos estruturando a nossa arquitetura é: que dados serão armazenados nos storages?

Essa pergunta é importante pois ela que guiará qual modelo apresenta menos risco em relação aos outros.

Arquivos públicos, que não contém dados sensíveis e que serão acessados por diferentes grupos de usuários, podem ter seu acesso liberado sem nenhum controle. Isso se dá ao fato de que as informações contidas nos documentos não geram nenhuma preocupação aos negócios da organização que a detém.

Alguns documentos tem vida útil mais curta do que outros. Documentos que contém informações válidas por apenas algumas horas podem ter seu acesso liberado apenas pelo tempo em que se fazem úteis. Essa é uma boa estratégia de governar o ciclo de vida dos objetos armazenados nos storages. O ponto de atenção desse cenário é o mesmo do anterior, os dados. Mesmo temporariamente, o documento estará acessível de maneira irrestrita, permitindo que qualquer usuário com a URI do recurso possa acessá-lo.

Esquecendo quais dados estarão presentes nos documentos, outra preocupação é a revelação da estrutura do storage. A exposição dos objetos trará à tona parte da estrutura hierarquica de pastas existentes no storage. Isso pode ser um problema caso seu recurso armazene não apenas documentos públicos, mas também informações que devem ser protegidas do acesso externo.

A preocupação exposta pelo trecho anterior é agravada quando pensamos na possibilidade de erro de configuração. Expor publicamente mais do que era necessário pode causar sérios danos à organização, por isso além de ter um processo bem estabelecido para a liberação de acessos públicos, a arquitetura deve ser bem pensada para segregar informações sensíveis e públicas em repositórios diferentes.


As soluções de object storage são utilizadas em grande parte das empresas que fazem uso de nuvem pública. Independente do provedor, os benefícios gerados por esse tipo de recurso são os mesmos, porém precisamos nos atentar para não acabarmos expondo nossa organização a ataques e para evitar o vazamento de dados sensíveis.

Espero que esse texto te ajudado a compreender as preocupações existentes na exposição pública de documentos através de soluções de storage.

Até logo!