Thunderclap: controle de acesso não-SQL

AnyWhichWay Seg , 8 de Julho · 6 min ler

é um banco de dados e biblioteca de aplicativos orientados por funções e banco de dados de valor-chave JSON indexados por estágio Alpha e projetado especificamente para o Cloudflare. Ele é executado em Cloudflare Workers no topo da loja Cloudflare KV e tem um cliente baseado em navegador. Sua linguagem de consulta, (JavaScript Object Query Language), é semelhante, mas mais extensa, à linguagem de consulta associada ao MongoDB.

Um dos principais recursos do Thunderclap é um poderoso mecanismo de controle de acesso (FGAC) declarativo, flexível e flexível que pode ser usado para abordar muitas das preocupações atuais da política de privacidade. Este artigo descreve como esse controle de acesso refinado é atingido. No entanto, os princípios do artigo também poderiam ser aplicados ao MongoDB com um proxy de processamento colocado entre o MongoDB e o aplicativo usando seus dados; assim, aliviando uma aplicação da responsabilidade de segurança para simplificar a lógica, aumentar a resiliência e melhorar a capacidade de auditoria.

Controle de acesso fino granulado definido

Para JavaScript, o controle de acesso granulado se estende além de coleções ou classes de objetos. Inclui a aplicação de controle de acesso com base em nomes de propriedades, intervalos de nomes de propriedades, a presença de nomes de propriedades, o tipo e o valor dos dados armazenados nas propriedades e informações de contexto, como solicitação de endereço IP. Para armazenamentos de dados de valores-chave, inclui a aplicação de políticas com base em nomes-chave ou tipo e valor dos dados associados às chaves. Para plataformas que suportam invocação de função remota, também implica controle da execução da função por nome ou ponto final.

Estado da Indústria

Atualmente, o é o banco de dados No-SQL mais referenciado, suportando qualquer tipo de controle de acesso granulado. No entanto, o sofisticado controle de acesso em nível de elemento de dados também está disponível no do Google. O MongoDB não possui suporte nativo para controle de acesso refinado no momento da redação deste artigo. O Cosmos da Microsoft está em algum lugar entre o Firebase e o MongoDB. De uma perspectiva de capacidade, o Firebase está mais próximo do Thunderclap.

Para mais informações sobre este tópico, procure por “NoSQL de controle de acesso refinado”. Para referência rápida, aqui estão alguns links:

Capacidade de trovoada

Os mecanismos de segurança Thunderclap suportam a aplicação de regras de acesso de leitura e gravação baseadas em função para funções, objetos, propriedades e chaves de armazenamento.

Se um usuário não tiver acesso de leitura autorizado a um objeto ou valor de chave, ele não será retornado. Se um usuário não tiver acesso autorizado a uma propriedade específica, a propriedade será removida do objeto antes que o objeto seja retornado. Além disso, uma consulta para um objeto usando propriedades para as quais um usuário não tem acesso descartará automaticamente as propriedades do processo de pesquisa de índice para evitar o vazamento de dados por meio de inferência.

Se um usuário não tiver autorização para gravar o acesso a propriedades específicas em um objeto, as tentativas de atualização voltarão para atualizações parciais apenas nas propriedades para as quais o acesso de gravação é permitido. Se o acesso de gravação a uma chave ou a um objeto inteiro não for permitido, a gravação simplesmente falhará e retornará `undefined`.

Arquitetura Thunderclap

Um dos principais recursos dos documentos JavaScript e JavaScript é que eles são interpretados ou compilados em tempo de execução, tornando simples:

  1. inspecionar nomes de propriedades como strings
  2. mapear a estrutura de um objeto para outro
  3. comparar os tipos de valores
  4. Modifique o comportamento e a estrutura em tempo de execução

Thunderclap aproveita o acima usando regras de controle de acesso com especificações que combinam com a estrutura dos dados que estão sendo controlados enquanto também fornece uma correspondência mais generalizada usando funções ou expressões regulares. Essas regras de controle de acesso são armazenadas em um arquivo especial acl.js que contém um único objeto JavaScript, conforme descrito posteriormente.

O Thunderclap combina o conteúdo do arquivo acl.js com as definições de função especificadas em roles.js que roles.js hierarquicamente funções, como dbo (operador de banco de dados), user ou outras funções específicas do aplicativo.

User é uma classe interna do Thunderclap e contém uma propriedade para anexar as próprias funções às instâncias. Isso também é descrito posteriormente no artigo.

O arquivo Thunderclap ACL

O conjunto de regras de ACL do Thunderclap é representado como um objeto JavaScript. Por motivos de segurança, esse objeto é incluído no momento da criação como um arquivo JavaScript em vez de ser carregado em tempo de execução como um arquivo JSON. Isso também permite que a linguagem ACL use funções e nomes de chave inicializados abreviados representando expressões regulares, que normalmente não podem ser carregadas ao usar o JSON.

Eu forneço o padrão Thunderclap acl.js título de exemplo e siga com uma explicação de sua estrutura.

O objeto JSON em acl.js consiste em um conjunto de propriedades usadas para pesquisa de regra. As propriedades de nível superior são:

  1. expressões regulares
  2. nomes de funções,
  3. os nomes das chaves para armazenamento básico de valores-chave,
  4. nomes de classe seguidos por um sinal @ ,

Imediatamente abaixo de cada chave estão as especificações de read/write/execute que se aplicam à chave controlada como um todo. Para chaves que apontam para objetos, existe também uma propriedade especial chamada properties . Isso contém nomes de propriedades que devem ser paralelos aos nomes de propriedades potenciais no objeto que está sendo controlado e contêm especificações de controle de acesso aninhadas.

As especificações de read/write/execute são os nomes de propriedades read , write , execute seguidos por uma matriz de nomes de função, um mapa de nomes de função com true como cada um de seus valores ou uma função para determinar se ler, gravar ou executar deve permitido com base na natureza real dos dados, no usuário atual e no contexto de execução. Também pode haver uma chave especial, filter, que tenha uma função como argumento. É efetivamente um curinga que gerencia o acesso de leitura, gravação e execução.

As funções do ACL têm a async function({action, user, data, object, request}) assinatura async function({action, user, data, object, request}) . A action pode ser de read , write , execute . O user é a instância do usuário da qual a propriedade userName ou roles pode ser obtida. Os data são os dados reais sendo controlados. Quando um objeto está sendo controlado, isso também é aliado ao object por conveniência. E a request é o objeto de solicitação de HTTP que pode ser usado para limitar o acesso com base em itens como a solicitação de endereço IP. Se os dados de destino forem um objeto, as funções de ACL estarão livres para modificá-lo antes de retornar. Se um valor geral for retornado, o processamento continuará; caso contrário, o Thunderclap retornará um erro de acesso HTTP 401 ao cliente solicitante.

Sempre que é feita uma tentativa de ler / escrever uma chave ou objeto e suas propriedades ou executar uma função exposta a clientes, o Thunderclap analisa as especificações da ACL para ver se há uma regra correspondente baseada no nome da função, chave ou classe sendo acessado. Se houver, as especificações de nível de nível superior serão avaliadas. Se eles forem bem-sucedidos, as especificações do nível de propriedade serão avaliadas para objetos.

A menos que haja uma regra de ACL correspondente, o Thunderclap assume que todo o acesso está disponível para todas as funções e dados. Para controlar algo, deve haver uma regra que corresponda. Como resultado, existem algumas regras padrão em acl.js para evitar certos tipos de atividade, por exemplo, acesso direto ao índice por qualquer pessoa que não seja um dbo .

O arquivo de funções Thunderclap

Thunderclap suporta um número arbitrário de funções hierárquicas. Os nomes são restritos àqueles que são nomes de propriedade JavaScript válidos. As funções são especificadas em um arquivo chamado roles.js. Thunderclap tem apenas duas funções dbo , dbo e user . O arquivo padrão está abaixo:

Para tornar um papel um sub-papel do outro, basta fornecê-lo como uma chave dentro de outro papel.

O objeto de usuário Thunderclap

Thunderclap tem uma classe de User interna. Tem apenas duas propriedades userName , userName e roles . Outras propriedades podem ser adicionadas passando um objeto de configuração ao criar um usuário, por exemplo:

const user = new User("jjones",{age: 27});

resultará no objeto:

 { 
userName: "jjones",
funções: {
usuário: true
}
idade: 27 anos
}

O objeto de configuração também pode ser usado para passar funções adicionais, por exemplo:

const user = new User("jjones",{age: 27,roles:{dbo:true});

 { 
userName: "jjones",
funções: {
usuário: true
dbo: true
}
idade: 27 anos
}

Note que o usuário acima não poderá ser inserido em um banco de dados Thunderclap por alguém que não seja outro usuário com a função dbo .

As propriedades e funções podem ser usadas pelas regras de ACL para controlar o acesso a dados ou a execução de funções no servidor.

Conclusão

Espero que você tenha achado esta breve introdução ao modelo de controle de acesso do Thunderclap interessante. No mínimo, talvez você possa ver como simplificar seus aplicativos MongoDB aplicando uma abordagem semelhante ao MongoDB com reescritas de consultas ou resultados de filtragem. O ideal é que você seja suficientemente intrigante para aplaudir e dar uma olhada no for Cloudflare.