Segurança no MongoDB - parte 1
Tags: mongodb, nosql, security
Published: 2018-09-07 16:01:27

---
title: Segurança no MongoDB - parte 1
published: true
description: Conheça os métodos de segurança para proteger seus dados e seu ambiente MongoDB
tags: mongodb, nosql, security
---

Fala pessoal, hoje vou compartilhar com vocês alguns aspectos de segurança no MongoDB. Em minhas caminhadas por diversos cenários tenho notado que questões tão importantes como segurança têm sido deixadas de lado. A facilidade de se instalar e iniciar um projeto com MongoDB é tão grande que pontos importantes são deixados de lado.

Nessa série de posts vamos falar sobre como funciona e como implementar o básico de segurança no MongoDB Community, porém, ao final vou passar sobre as features da versão Enterprise.

Dividi essa série com os seguintes pontos:
* Localhost Exception
* Autenticação
* Autorização
* TLS / SSL
* Métodos e features exclusivas da versão Enterprise

Então vamos lá… começando por Autenticação!

##Localhost Exception
Antes de nos autenticarmos, você deve estar se perguntando: como meu autentico se nem usuário eu tenho?

É aí que entra a Localhost Exception. Quando habilitamos a autenticação em um ambiente MongoDB, precisamos criar um usuário com privilégios suficientes para administrar a instância ou o cluster por inteiro. 

Diferentemente de uma instalação de SQL Server por exemplo, o MongoDB não exige que seja definido um método de autenticação no momento da instalação, e isso pode causar muitos problemas de segurança. 

Porém, a partir da versão alguns parâmetros de segurança foram alterados, como por exemplo, por default só conseguimos nos conectar a uma instância em localhost. Obviamente isso pode ser alterado nas configurações do MongoDB posteriormente.

O Localhost Exception é um procedimento que permite criar apenas um e somente um usuário, desde que estejamos conectados diretamente na máquina onde a instância de MongoDB está rodando, ou seja, precisamos ter esse nível de acesso para isso.

A partir do momento em que criamos esse usuário, nenhuma operação será permitida sem uma autenticação, por isso é importante que esse usuário criado tenha privilégios suficientes para fazermos demais operações na instância ou no cluster.

Aqui um exemplo de criação de usuário com super-poderes, ou equivalente ao SA num SQL Server:
```javascript
use admin
db.createUser({
	user: "username",
	pwd: "password",
	roles: [
		{ "role": "root", "db": "admin" }
	]
})
```
Feito! Como disse, a partir desse momento só poderemos efetuar qualquer operação estando autenticado.

##Autenticação
No MongoDB Autenticação e Autorização são dois processos diferentes. Podemos descrever Autenticação como uma pergunta que o banco de dados nos faz: quem é você? Por outro lado Autorização a pergunta é: o que você pode fazer?

O processo de autenticação verifica a identidade do cliente que está tentando se conectar com a instância do MongoDB. Uma vez habilitada, todos os clientes deverão passar por esse processo para determinar seu nível de acesso.

###Métodos de autenticação
Para se autenticar no MongoDB, você deve passar usuário, senha e a base de dados de autenticação. Esse último parâmetro vale uma atenção especial:

Os usuários do MongoDB precisam "residir" em uma base de dados. Não existe uma obrigação para isso, eu por convenção, centralizo todos os usuários no database admin, porém, você pode ter usuários que estão em bases de dados específicas, por isso sempre devemos informar qual é a base de dados de autenticação.

Podemos utilizar duas maneiras diferentes através do shell do MongoDB:
* Utilizando a linha de comando da seguinte forma: 
```bash
mongo --username <nome_de_usuario> --password <senha_do_usuario> --authenticationDatabase <nome_da_base_de_dados_de_autenticacao>
```
* Também podemos nos conectar numa instância mongod ou mongos, e utilizar o comando de autenticação db.auth() contra a base de dados de autenticação. Os parâmetros desse comando são usuário e senha: db.auth("usuario","senha")
Mecanismos de autenticação
MongoDB suporta alguns mecanismos de autenticação:
* SCRAM (default)
* x.509 Certificate Authentication

Além desses, a versão Enterprise suporta os seguintes mecanismos:
* LDAP, e
* Kerberos

###SCRAM
Salted Challenge Response Authentication Mechanism (SCRAM) é o mecanismo de autenticação default para o MongoDB. Como sabemos o SCARM é baseado no IETF RFC 5802, padrão de define as melhores práticas para implementação de mecanismos challenge-response para autenticação de usuários com senhas.
Mecanismos SCRAM
Até a versão 3.6 estava disponível somente o SCRAM-SHA-1, a partir da versão 4.0 o SCRAM-SHA-256 já está disponível. Nesse último caso o featureCompatibilityVersion deve estar setado para 4.0.

Informações adicionais e sobre o suporte dos drivers podem ser encontrados na [documentação](https://docs.mongodb.com/manual/core/security-scram/#authentication-scram)

###x.509
O MongoDB também suporta certificados de autenticação x.509 para clientes e autenticação interna dos membros de replica sets e sharded clusters. Esse último caso é altamente recomendável para proteger melhor nossos clusters, utilizando um certificado previnimos que um nó seja colocado no cluster e acesse os dados armazenados.

x.509 requer uma conexão segura TLS/SSL que abordaremos mais à frente. Vale ressaltar que a partir da versão 4.0 o MongoDB desabilitou o suporte para TLS 1.0 em sistemas que a TLS 1.1+ está disponível. Mais detalhes [aqui]( https://docs.mongodb.com/manual/release-notes/4.0/#disable-tls)

Os certificados podem ser gerados à partir de um servidor responsável por isso dentro de sua própria companhia ou ser comprado através de uma empresa certificadora. Os nós de seu cluster devem compartilhar esse mesmo certificado para que se comuniquem em segurança.

Outra dica importante é que você pode utilizar esses certificados para autenticar os clientes que conectam em sua instância do MongoDB, como por exemplo, aplicações não precisam conter os nomes de usuários e senhas na connection string, utilizando certificados, você elimina mais essa "brecha" de segurança.

Mais detalhes sobre como implementar e se autenticar com certificados x.509 podem ser encontrados [aqui](https://docs.mongodb.com/manual/core/security-x.509/#security-auth-x509)

Bem, espero que tenham gostado e na próxima veremos toda a parte de Autorização, passando pelas roles pré-definidas, habilitação da autenticação e gerenciamento de usuários.

Até mais!