Segurança no MongoDB - Parte 2 - Autorização
Tags: mongodb, security, nosql
Published: 2018-09-13 09:49:18

---
title: Segurança no MongoDB - Parte 2 - Autorização
published: true
description: Um panorama de como funciona a autorização no MongoDB
tags: mongodb, security, nosql
---
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](https://dev.to/delbussoweb/segurana-no-mongodb---parte-1-3bik), 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](https://dev.to/delbussoweb/segurana-no-mongodb---parte-1-3bik) 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](https://docs.mongodb.com/manual/reference/program/mongod/#cmdoption-mongod-auth) ou [security.authorization](https://docs.mongodb.com/manual/reference/configuration-options/#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](https://docs.mongodb.com/manual/reference/privilege-actions/#security-user-actions) específicas num [recurso](https://docs.mongodb.com/manual/reference/resource-document/). É 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](https://docs.mongodb.com/manual/reference/command/rolesInfo/#dbcmd.rolesInfo), com os atributos **showPrivileges** e **showBuiltinRoles** definidos como **true**

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

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

### 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](https://docs.mongodb.com/manual/reference/method/#user-management-methods).

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](https://docs.mongodb.com/manual/core/security-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)](https://docs.mongodb.com/manual/core/security-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.

```javascript
use admin
db.createUser({
    user: "admin",
    pwd: "password",
    roles: [
        { role: "root", db: "admin" }
    ]
})
```

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)](https://dev.to/delbussoweb/segurana-no-mongodb---parte-1-3bik), iremos criar um usuário com privilégios somente de leitura em um banco de dados chamado **products**:

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

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](https://docs.mongodb.com/manual/core/authorization/) que leva diretamente para o tópico.

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