Controle de acesso baseado em atributos (abac) em nosql
Um padrão útil para a segurança é para aplicar permissões com base em dados dentro de um registro em vez de atribuir separadamente permissões para o registro. Isto pode ser baseado em ambos os metadados, coluna individual (clones Bigtable), ou elemento (bases de dados agregada NoSQL) valores.
Um bom exemplo é um nome de cliente a ser mencionado em um documento. Você pode querer restringir o acesso a todos os documentos que citam esse cliente para apenas as pessoas com acesso à informação deste cliente. Você pode restringir o acesso a estes documentos através do processamento dos dados no documento, e aplicar as permissões de segurança relevantes com base no valor dos dados.
Nenhum banco de dados NoSQL fornecer essa capacidade para a direita fora da caixa. Isso porque permissões devem ser atribuídas para o registro após os dados são salvos pela aplicação, mas antes que seja disponível para recuperação por outros aplicativos ou usuários. Então, essa atribuição de permissão deve ocorrer dentro do limite de transação.
Além disso, muito poucos bancos de dados NoSQL suportar transações ACID-compliant (MarkLogic, FoundationDB e Neo4j, fazer por exemplo). Se um banco de dados não suporta atribuição out-of-the-box de permissões com base em dados dentro de um documento, mas suporta transações ACID e gatilhos pré-cometem, em seguida, uma solução fácil é possível.
Em geral, é fácil escrever um gatilho que verifica a presença de um valor dentro de um registro e modificar permissões com base em seu valor. Enquanto um banco de dados suporta fazê-lo durante o processo de confirmação, e não depois de commit, então você sabe que seus dados é feito seguro usando um simples pré-commit gatilho.
Como exemplo, MarkLogic Server suporta transações ACID totalmente serializados e gatilhos pré-cometem. A seguir é um documento XML simples que eu quero apoiar para controle de acesso baseado em atributos:
jbloggs ACME Lorem Ipsum Dolar sit amet ...
gatilhos de MarkLogic Server usam a linguagem W3C XQuery. O seguinte exemplo de XQuery é um gatilho simples que, quando instalado em MarkLogic, atribui permissões de leitura e de escrita:
versão xquery "1,0 ml"módulo -import namespacetrgr = `https://marklogic.com/xdmp/triggers`at` /MarkLogic/triggers.xqy`-declare $ trgr variável: uri como xs: corda externa declarar-variável $ trgr: gatilho como nó () external-se ( “ACME” = fn: doc ($ trgr: uri) / MeetingReport / Cliente) thenxdmp: set-document-permissões ($ trgr-uri, (xdmp: permissão ( “seniorsales”,”update”), xdmp : permissão ( “vendas”,”ler”))) else ()
Uma vez que o gatilho é instalado no arquivo setperms.xqy em um banco de dados MarkLogic Servidor módulos, execute o seguinte código na aplicação de codificação web para MarkLogic - Consulta Console para ativar o gatilho. Em uma instalação MarkLogic servidor padrão, você pode encontrar o Console de consulta na URL: http: // localhost: 8000 / qconsole.
Aqui está o código mostrando como instalar o gatilho usando o Query Console:
versão xquery "1,0 ml"-import módulo namespacetrgr = `http: //marklogic.com/xdmp/triggers`at` /MarkLogic/triggers.xqy`-trgr:create-trigger ("setperms","Definir permissões de vendas Doc", Trgr: gatilho-dados-acontecimento (trgr: recolha do escopo ("meetingreports"), Trgr: document-conteúdo ("modificar"), Trgr: pré-cometer ()), trgr: gatilho-módulo (xdmp: banco de dados ("módulos"), "/gatilhos/","setperms.xqy"), Fn: true (), xdmp: default-permissions (), fn: false ())