sexta-feira, 18 de janeiro de 2013

Segurança no MongoDB


O objetivo deste artigo é explicar como é o sistema de segurança do MongoDB, assim como demonstrar como ativar e gerenciar esse recurso.
Se você ainda não tem o MongoDB instalado ou ainda não está familiarizado com as operações básica dele, sugiro ler os artigos abaixo:
O MongoDB dá suporte básico para autenticação através da configuração auth. Para o caso de implantações com múltiplas instancias como Replica Sets ou Sharded Clusters é necessário usar a configuração keyFile, na qual está implícita a configuração auth.  Como padrão, sempre que fizermos uma instalação do MongoDB, a autenticação estará desativada.
Esse sistema possui apenas dois tipos de acesso: o Somente Leitura e Normal.  Usuários com acesso de somente leitura poderão ler apenas os dados do banco de dados. Já os usuários com acesso nomal poderão ler e gravar informações.
O acesso Normal também dá direito ao usuário de adicionar novos usuários ao banco de dados.
Toda instalação do MongoDB possui um único banco de dados admin que possui informações administrativas do MongoDB.  Usuários com acesso Normal a esse banco de dados tem acesso à todos os demais bancos de dados gerenciados pelo MongoDB.
Agora, vamos aprender como ativar cada uma das opções disponíveis de segurança.

Opção --auth

  • Inicie o servidor MongoDB (mongod.exe) sem qualquer uma das configurações de autenticação  (--auth ou --keyFile)
  • Adicione  um usuário ao banco de dados admin.  O usuário será usado sempre para administrar o banco de dados.  Para isso, primeiro temos que selecionar o banco de dados admin e depois adicionar o usuário e sua respectiva senha;
use admin;
db.addUser('admin', '123');
  • Feche o console e finalize o servidor MongoDB;
  • Incie novamente o servidor MongoDB com a configuração de autenticação auth
mongod.exe --auth
  • A partir deste momento qualquer operação com o console exigirá uma autenticação de usuário.  Abra o console e execute o comando show dbs. O resultado será um erro informando a necessidade de autenticação;
  • Faça agora a autenticação no banco de dados admin e tente novamente executar o comando acima;
use admin;
db.auth('admin', '123');
show dbs;
  • Crie, agora, os bancos de dados que desejar e adicionar os usuários a ele.  Exemplo abaixo: selecionar o novoBanco e adicionar o usuário novoUsuario.  Lembre-se que no MongoDB não há necessidade de criar o banco de dados, basta selecioná-lo (use) e executar qualquer operação que ele será criado automaticamente.
    IMPORTANTE: Para adicionar qualquer usuário ao banco de dados você deve estar autenticado ao banco de dados admin
use novoBanco;
db.auth('novoUsuario', 'novaSenha'); 

Opção --keyFile

  • Os passos para ativar a segurança com esta opção são praticamente os mesmos que para a opção auth.  A mudança fica por conta da própria opção keyFile que exige como parâmetro o nome de um arquivo que conterá uma chave de autenticação.  Qualquer valor pode ser usado para esta chave, mas sugiro usar algo mais seguro como um hash md5 ou qualquer outro tipo de criptografia.
  • Inicie o servidor MongoDB (mongod.exe) sem qualquer uma das configurações de autenticação  (--auth ou --keyFile)
  • Adicione  um usuário ao banco de dados admin.  O usuário será usado sempre para administrar o banco de dados.  Para isso, primeiro temos que selecionar o banco de dados admin e depois adicionar o usuário e sua respectiva senha;
use admin;
db.addUser('admin', '123');
  • Feche o console e finalize o servidor MongoDB;
  • Crie um arquivo um arquivo texto em uma pasta e com um nome de sua preferencia.  No nosso exemplo criamos em c:\mongodb\mongo.key.  O conteúdo desse arquivo deve ser um chave de preferencia criptografada, mas para demonstrar usaremos o valor chave-123456.
  • Incie novamente o servidor MongoDB com a configuração de autenticação keyFile.  
mongod.exe --keyFile c:\mongodb\mongo.key
  • A partir deste momento qualquer operação com o console exigirá uma autenticação de usuário.  Abra o console e execute o comando show dbs. O resultado será um erro informando a necessidade de autenticação;
  • Faça agora a autenticação no banco de dados admin e tente novamente executar o comando acima;
use admin;
db.auth('admin', '123');
show dbs;
  • Crie, agora, os bancos de dados que desejar e adicionar os usuários a ele.  Exemplo abaixo: selecionar o novoBanco e adicionar o usuário novoUsuario.  Lembre-se que no MongoDB não há necessidade de criar o banco de dados, basta selecioná-lo (use) e executar qualquer operação que ele será criado automaticamente.
    IMPORTANTE: Para adicionar qualquer usuário ao banco de dados você deve estar autenticado ao banco de dados admin
use novoBanco;
db.auth('novoUsuario', 'novaSenha'); 

Considerações Finais

A coleção system.users, existente em cada banco de dados, armazena todas as credenciais.  É possível consultar as permissões dos usuários através do comando:
db.system.users.find();
Mesmo que o servidor MongoDB seja iniciado com as opções de autenticação auth ou keyFile, e não exista usuário algum adicionado ao banco de dados admin, o sistema de segurança não estará ativado completamente. Isso significa que deve existir pelo menos um usuário adicionado ao banco de dados admin antes de ativar essas opções.
Para adicionar um usuário com acesso de somente leitura a um banco de dados execute:
use nomeBancoDeDados;
db.addUser('novoUsuario', 'senhaUsuario', true);
Se for usar a opção keyFile em um ambiente Linux você terá que deixar o arquivo com permissão apenas de leitura e execução.  Caso o arquivo esteja com permissão de gravação o MongoDB não ativará o sistema de seguraça.  Também no Linux você pode usar o comando openssl para gerar o arquivo com um conteúdo seguro.
Você pode obter mais informações sobre o sistema de segurança olhando a documentação oficial do MongoDB.