DEV Community

Leandro Domingues
Leandro Domingues

Posted on

Segurança no MongoDB - Parte 2 - Autorização

Fala pessoal, dando continuidade a nossa série de posts sobre segurança no MongoDB, hoje veremos a parte de autorização, seus conceitos e por fim criaremos dois usuários e daremos a eles permissões diferentes. Vamos lá...

Recap

Apenas para recapitular e se você perdeu pode acessar a parte 1 aqui, lá vimos autenticação. No MongoDB a autenticação é equivalente à pergunta: "quem é você?", já a autorização é: "Ok, sei quem você é. Mas o que você pode fazer?"

Controle de Acesso

Como na maioria dos bancos de dados, o MongoDB utiliza Role-Based Access Control (RBAC) para gerenciar o seu acesso. Para um usuário podemos atribuir uma ou mais roles para determinar quais os recursos e operações ele pode acessar e realizar dentro do banco de dados. Uma vez habilitado, nada que estiver fora dessas roles será permitido ao usuário.

Habilitando o Controle de Acesso

Comentei na parte 1 que por default o MongoDB não habilita nenhum controle de acesso, diferentemente do SQL Server por exemplo, que na instalação nos força a escolher uma forma de autenticação. Podemos habilitar a autorização utilizando os parâmetros de configuração --auth ou security.authorization. Habilitando autenticação interna, também habilitamos autorização implicitamente.

Uma vez habilitado o controle de acesso, o usuário precisa estar autenticado para realizar qualquer operação.

Roles

Uma role dá privilégios para executar ações específicas num recurso. É considerado como recurso um banco de dados, uma coleção, um conjunto de coleções ou um cluster.

Cada privilégio pode ser especificado explicitamente na role, herdado de outra role ou os dois!

Herdando Privilégios

Uma role pode incluir uma ou mais roles em sua definição, nesse caso essa role herda todos os privilégios das roles incluídas. Ou seja, se estou criando uma role que tenha um privilégio específico como read por exemplo, e incluir uma role que tenha write, a nova role passa a ter acesso de readWrite por herança. Pode parecer complicado, mas veremos isso na prática mais à frente.

Nota: uma role criada no banco de dados admin pode herdar privilégios das roles de qualquer banco de dados

Visualizando os Privilégios das Roles

Para visualizar os privilégios de uma role através do comando rolesInfo, com os atributos showPrivileges e showBuiltinRoles definidos como true

db.runCommand(
    {
      rolesInfo: 1,
      showPrivileges: true
    }
)

db.runCommand(
    {
      rolesInfo: 1,
      showBuiltinRoles: true
    }
)
Enter fullscreen mode Exit fullscreen mode

Usuários e Roles

Você pode atribuir roles durante o processo de criação de um usuário. Mas também pode alterar usuários existente atribuindo ou revogando roles. Todos os métodos para o gerenciamento de usuários no MongoDB podem ser encontrados nesse link.

Um usuário com uma role atribuída, recebe todos os privilégios dessa role. Um usuário pode ter várias roles.

DICA: é importante (mas não obrigatório) centralizar a criação de usuários e roles num banco de dados único, eu costumo utilizar o admin. Assim fica mais fácil a manutenção dos usuários.

Built-In Roles e User-Defined Roles

O MongoDB nos fornece uma série de built-in roles, ou seja, roles pré-definidas com os privilégios mais comuns para a administração e acesso aos bancos de dados.

Porém, se não quisermos utilizar esse conjunto de roles, podemos criar nossas prórias roles (user-defined roles)

Mão na massa

Bem, passado esses conceitos importantes, vamos agora criar usuários e dar permissões a eles. Como mencionei como dica, eu gosto de utilizar o banco admin para centralizar os usuários e é assim que vou demonstrar aqui.

Criando um usuário root

Da mesma forma que temos um usuário SA no SQL Server, podemos ter um super-usuário no MongoDB, geralmente criamos esse usuário quando estamos implementando cluster e depois o desabilitamos, uma vez que temos usuários com permissões suficientes e específicas para administra-lo.

use admin
db.createUser({
    user: "admin",
    pwd: "password",
    roles: [
        { role: "root", db: "admin" }
    ]
})
Enter fullscreen mode Exit fullscreen mode

Feito! No script acima criamos um usuário chamado admin, com a senha password, atribuindo a role root, para o banco de dados admin

Criando um usuário de leitura

Agora, com nosso usuário root criado (veja Localhost Exception na parte 1), iremos criar um usuário com privilégios somente de leitura em um banco de dados chamado products:

use admin
db.auth("admin","password")
db.createUser({
    user: "usrProductsRead",
    pwd: "passProducts",
    roles: [
        { role: "read", db: "products" }
    ]
})
Enter fullscreen mode Exit fullscreen mode

Note, que precisamos estar autenticados para criar o novo usuário, por isso utilizei o comando db.auth(), passando como parâmetros o usuário e senha. Em seguida o usuário foi criado, ainda no banco admin, porém com privilégios de leitura no banco products.

Por hoje é isso, o objetivo foi dar um panorama dos conceitos de autorização no MongoDB, mais informações vocês podem encontrar nesse link que leva diretamente para o tópico.

Espero que tenham gostado e até a próxima! ;)

Top comments (3)

Collapse
 
urielsouza29 profile image
Uriel dos Santos Souza • Edited

Existe alguma role de Escrita, leitura e apagar?
Apenas de UM banco?
Seria root deste banco?

Collapse
 
wanderson304 profile image
Wanderson Silva

Muito bom!

Collapse
 
wanderson304 profile image
Wanderson Silva

Muito bom!