Administrando MongoDB: User & Password

Este artigo possui versão em videoaula, exclusiva para os alunos do meu curso de Node.js e MongoDB.

Nesta altura do campeonato é bem possível que você saiba que adoro Node.js e MongoDB. Mas caso esteja chegando agora, trabalho com estas tecnologias desde 2015, tenho alguns livros publicados sobre estes assuntos e até um curso online em videoaulas.

No entanto, eu estou mais para o lado “programador” destas duas tecnologias do que para o lado “administrador”, nunca fui um “cara de infra”. Ainda assim, eu sei me virar e sei os fundamentos básicos a ponto de poder lhe ajudar nos primeiros passos de administração de um servidor MongoDB, por exemplo.

Embora a opção mais segura e confiável seja utilizar serviços em nuvem como MongoDB Atlas, eles são caros, o que inviabiliza pequenos projetos que não consigam aproveitar o plano free deles. Pensando nesse segundo público, no artigo de hoje, o primeiro de uma série sobre administração de MongoDB, vou ensinar como você pode adicionar usuário e senha no seu servidor MongoDB, uma vez que por padrão ele vem “aberto”. Caso não conheça o Atlas que acabei de citar, dê uma olhada neste vídeo.

Atenção: existe estudos que mostram que existem mais de 30.000 instâncias de MongoDB expostas sem usuário e senha na Internet. Não faça parte dessa lista de tolos, implemente autenticação no seu banco de dados.

Subindo uma instância nova de MongoDB

Não vou repetir aqui todo o passo a passo de MongoDB para iniciantes em NoSQL. Essa é uma ótima série aqui do blog e recomendo que dê uma lida nela caso esteja começando agora com Mongo. Baixe a versão community (gratuita) do MongoDB no site oficial e coloque uma instância para rodar usando o comando abaixo (dentro do diretório bin da sua instalação de Mongo).

A variável dbpath eu apontei para uma pasta mongoauth/data por uma questão de organização (crie essa pasta se quiser seguir a mesma linha de raciocínio que a minha).

Já a variável port eu coloquei para definir outra porta para o meu MongoDB por uma questão de segurança. Atacantes de bancos de dados sempre usam as portas padrões dos bancos para tentar invadi-los e é um chamariz para bandido deixar o MongoDB na porta 27017, troque para outro à sua escolha (mais dicas como essa, aqui).

Para testar se sua instância está funcionando, em outra janela do terminal rode o comando abaixo para se conectar, sem qualquer credencial ao banco local.

Lembre-se de usar a mesma porta da instância que você subiu anteriormente.

Terminais mongod e mongo
Terminais mongod e mongo

Agora, para testarmos via software, instale o Node.js na sua máquina a partir do site oficial (tanto faz a versão) e rode o comando abaixo para inicializar um projeto na sua pasta mongoauth que foi criada anteriormente.

Apenas siga respondendo às perguntas que ele fizer e depois rode o comando abaixo para instalar a dependência do MongoDB Node.js Driver que vamos usar.

Depois crie um arquivo index.js na raiz dessa pasta para colar o código Javascript abaixo, que apenas testa a conexão com o Mongo e printa no console o resultado.

Esse código não é o foco aqui do artigo, mas ele se conecta na instância local do Mongo, porta 27018 e, se funcionar, imprime as informações da conexão. Se não funcionar, imprime o erro.

Para testar, apenas rode o comando abaixo no terminal, dentro da pasta do projeto (para funcionar, certifique-se de que a janela de terminal do mongod esteja rodando ou derrube-a para simular erro).

Exemplo de sucesso:

Conexão sem usuário OK
Conexão sem usuário OK

Exemplo de erro:

Erro de conexão no Mongo
Erro de conexão no Mongo

Note que o erro é bem claro em informar que foi uma falha de rede, que ele não encontrou um banco Mongo no endereço informado. Mais pra frente vamos simular erros de autenticação. Agora que temos esta estrutura mínima pronta, vamos adicionar usuário e senha neste banco, para não deixá-lo mais aberto.

Adicionando usuário e senha admin

O primeiro passo de autenticação é criarmos um usuário e senha de administrador, certo? Mais tarde podemos criar usuários com menos privilégios para bancos específicos, mas por ora, temos de ter o master.

Certifique-se de que sua instância do mongod continua rodando. Conecte-se à ela usando outra janela de terminal com o utilitário mongo (fizemos isso antes, lembra?). Agora execute os seguintes comandos no terminal mongo:

O primeiro comando aponta para o banco admin do MongoDB, o equivalente à database master de outros SGBDs. Já o segundo, cria um novo usuário com o nome, senha e perfil de acesso especificado. “userAdminAnyDatabase” vai conferir poderes totais à esse usuário, então crie ele com uma senha bem forte, por favor.

Agora, derrube a sua instância de mongodb e suba ela de novo, mas com uma variação no comando:

O –auth fará com que o seu banco esteja “protegido” com usuário e senha a partir de agora. Se você tentar se conectar com o utilitário mongo, sem passar usuário e senha, até vai rolar localmente, mas não vai conseguir fazer nada pois nenhum banco de dados será visível para você (experimente um ‘show databases’ e verá que não retorna nada) e mesmo que tente criar um, consultar, etc não vai rolar.

Agora, tente se conectar via terminal usando o comando abaixo, em que passo usuário e senha:

E depois, com um ‘show databases’ você vai ver que possui privilégios totais nesta instância de Mongo.

Agora, se tentar passar uma senha errada, terá como retorno um “authentication failed”. E o nosso código Node.js? O mesmo vale para as conexões anônimas locais: não vai dar erro, mas também não vai fazer nada nessa instância de Mongo.

Para poder fazer suas consultas, inserções, etc será necessário se autenticar. Mas não vamos nos autenticar como admin em uma aplicação, certo? Vamos criar um user específico para ela.

Adicionando usuário e senha de aplicação

Usuário admin é para o administrador da instância de Mongo, onde podem existir diversos bancos de dados. Considerando que cada aplicação tenha o seu banco, crie um usuário isolado para cada uma. O processo é idêntico ao realizado para criar o user admin, mas agora muda a role e o nome do usuário, como abaixo:

Aqui foi criado um usuário luiz, dentro da database teste com permissão de “dono” nesta database, ou seja, ele pode fazer leituras e escritas livremente em todas coleções da database teste.

Reforço que criei o user na própria database teste, deixando a database admin apenas para administradores. Agora, para se conectar ao banco teste localmente será necessário o comando abaixo:

Note que no último parâmetro coloquei a base de dados onde existe o usuário e senha informados. Já no Node.js, passamos essas informações na própria connection string, respeitando URI encoding (caracteres especiais tem de ser codificados para URI):

A sintaxe é “usuário:[email protected]:porta/?authSource=banco-com-user”. Experimente colocar uma senha errada e você deve receber um erro de authentication failed no seu console do Node.js. E com isso encerramos este artigo de administração de MongoDB. Espero ter ajudado!

Quer aprender tópicos mais avançados em administração de MongoDB? Que tal espelhamento de instâncias?

Espero que este artigo tenha sido útil para você que está aprendendo Node.js e MongoDB. Para conteúdo mais aprofundado, recomendo meus livros. Para videoaulas, recomendo o meu curso online.

Curso Node.js e MongoDB
Curso Node.js e MongoDB

Publicado por

Luiz Duarte

Pós-graduado em computação, professor, empreendedor, autor, Agile Coach e programador nas horas vagas.