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

You should also read:

CouchDB + HAProxy

Instalando o CouchDB pelo Docker sudo docker run -d --restart unless-stopped --hostname couchdb1 --name couchdb1 -p 5984:5984 couchdb Instalando o HAProxy via APT…