Autorização no CouchDB - Controlando acesso e permissões
Autorização se refere àquilo que podemos fazer dentro de um sistema. O CouchDB conta com um bom mecanismo de autorização dá liberdade para definirmos quais usuários e roles podem ler, criar, editar e apagar documentos e bancos de dados.
De maneira resumida, o CouchDB permite nativamente os seguintes níveis de permissão:
Admin do servidor - capaz de ler, editar apagar e criar bancos de dados, seus conteúdos, configurações, permissões e usuários.
Admin do banco de dados - capaz de ler, editar apagar e criar documentos, configurações e permissões apenas dentro de um ou mais bancos de dados.
Member do banco de dados - capaz de ler, editar apagar e criar documentos apenas dentro de um ou mais bancos de dados.
Member do banco de dados (com restrições) - capaz de ler tudo, mas editar, apagar e criar documentos com restrições.
Percebe-se que o usuário sempre poderá ler todos os documentos presentes no banco em que ele for "Member".
Entrarei em mais detalhes nos próximos tópicos, começando com a arquitetura base de autorização do CouchDB.
Autorização sobre Servidor - Conta de administrador do servidor
O administrador do banco de dados possui um nível de permissões capaz de criar e apagar novos bancos de dados, alterar configurações do servidor (como portas, tamanho de logs e outros detalhes). Ao criar um usuário administrador do servidor, ele pertencerá a role "_admin" em todos os bancos de dados presentes no servidor, consequentemente terá acesso Admin a todos os bancos de dados.
Este usuário tem muitos poderes, você não pode deixá-lo na mão do usuário final. Uma conta de servidor admin será a conta utilizada em seu backend para criar bancos de dados novos sob demanda e gerenciar criação de usuários.
Se quiser que o servidor crie bancos automaticamete assim que um usuário novo for criado habilite a configuração "couch_peruser".
Autorização sobre Bancos de Dados
Um usuário ou role tem apenas 3 tipos de autorizações sobre um banco de dados, e são elas:
- Nenhum tipo de autorização
Ao tentar acesso no banco receberá um código HTTP 403 e a seguinte mensagem
{"error":"forbidden","reason":"You are not allowed to access this db."}
- Member
Um member pode visualizar, criar, editar e apagar (quase) todos os documentos do banco de dados.
As excessões são:
Apenas leitura em Design Documents "_design_docs"
Apenas leitura em Security "_security", onde são armazenados os usuários e roles deste banco.
- Admin
Um admin pode visualizar, criar, editar e apagar todos os documentos do banco de dados.
Incluindo Design Documentos "_design_docs" e Security "_security".
Em outras palavras, pode criar, editar e apagar Design Documents (views, validate document update functions, etc) e também permissões de adicionar, e remover usuários e roles das listas de Member e Admin neste banco.
Autorização sobre Documentos
É possível através de uma categoria de Design Documents chamada "Validate Document Update Functions" restringir criação, edição e exclusão de documentos com base no nome ou roles do usuário. Essa restrição é feita utilizando código JavaScript customizável que tem acesso ao documento manipulado e ao usuário e suas roles. Este código precisa ser inserido no banco de dados através de uma conta Admin.
Perceba que esse nível de autorização é insuficiente para algumas aplicações que precisam restringir a leitura do usuário somente a alguns documentos do banco e não o banco inteiro.
E como restringir a leitura dentro de um mesmo banco?
Nesse caso é necessário colocar uma ferramenta para intermediar toda a comunicação com o CouchDB como um backend ou um proxy reverso com funcionalidades de processamento de dados (como HAProxy, NGINX ou OpenResty) ou um API gateway.
Mas se a leitura completa do banco não for um problema em sua aplicação, poderá aproveitar e utilizar o CouchDB com muita facilidade.
Referências
Documento _security
http://localhost:5984/_utils/docs/api/database/security.html#db-security
Documento _design_docs
https://docs.couchdb.org/en/3.2.0/api/database/bulk-api.html#db-design-docs