Como gerenciar privilégios de usuários no MongoDB

E aí, Devs! Vamos falar sobre MongoDB, o banco de dados não relacional que é simplesmente incrível? Eu tive a oportunidade de trabalhar com ele e aprendi algumas dicas valiosas para ajudar a garantir a segurança dos dados.
O MongoDB é uma ferramenta poderosa, mas como todo banco de dados, ele precisa ser configurado corretamente para garantir que os dados sejam protegidos adequadamente. Algumas das medidas que aprendi incluem a configuração adequada de senhas fortes e a utilização de autenticação para evitar acessos não autorizados.
Mas hoje vou focar em um aspecto importante do MongoDB: a gestão de usuários e permissões/privilégios. Essa prática é fundamental para garantir o controle de acesso e a segurança dos dados.
E como posso aplicar isso no meu dia a dia?
Imagine uma EdTech fictícia que utiliza uma instância do Mongo como seu banco de dados principal para armazenar informações de alunos e servir dados em sua ferramenta de Business Intelligence (BI).
Nesse caso, quem terá acesso a esses dados será a própria ferramenta de BI, um administrador de banco de dados (DBA) ou assim como eu, um DevOps e o painel de controle que alimenta e controla esses dados.
Primeiro vamos se logar ao banco, estou considerando que estamos montando um novo banco de dados porém esse tutorial também pode servir para bancos já existentes, então vamos do princípio. Nessa caso iremos usar uma instância do tipo standalone, mas também serve para clusters. Após ter uma máquina com o Mongo instalado, vamos fazer o primeiro acesso. Execute o camando abaixo em seu terminal:
mongo --host localhost
Criando um usuário no MongoDB
Vamos executar o comando abaixo debtro do Mongo para criar o nosso primeiro usuário que será o root:
use admin
db.createUser({
user: "root",
pwd: "password",
roles: [
{ "role": "root", "db": "admin" }
]
})
Este comando cria um usuário com privilégios de "root" (superusuário) no banco de dados "admin".
O comando começa selecionando o banco de dados "admin" com o comando "use admin". Em seguida, é utilizado o método "createUser" para criar um novo usuário com nome de usuário "username" e senha "password". A propriedade "roles" é usada para especificar as funções ou papéis que o usuário terá no banco de dados.
No exemplo acima, o usuário tem apenas uma função, que é o papel de "root" no banco de dados "admin". Isso significa que o usuário terá privilégios de superusuário para realizar tarefas administrativas, como criar e excluir bancos de dados, criar e excluir usuários e configurar as configurações do servidor.
Suponhamos que este usuário foi o primeiro a ser criado imediatamente após a implementação do banco de dados, com o objetivo de garantir que operações não sejam realizadas sem autenticação, e que este usuário será atribuído ao nosso DBA ou DevOps, mas tome muito cuidado esse usuário tem os privilégios máximos e a senha deve ser armazenada em um local seguro.
Essa conta root será guardada para momentos críticos e pouquíssimas pessoas terão aceosso. Criei um usuário de administrador chamado "lossMan", não se importe com a escolha do nome, mas tenha em mente que eu não usei algo como "admin" apenas para dificultar a vida de "crackers" que usam bot de força bruta ou algo do tipo. Também não se preocupe por enquanto com a role que eu dei para esse usuário, falaremos disso mais à frente.
use admin
db.createUser(
{
user: "myUserAdmin",
pwd: "password",
roles: [
{ role: "userAdminAnyDatabase", db: "admin" },
{ role: "readWriteAnyDatabase", db: "admin" }
]
}
)
Ativando a autenticação no MongoDB
Para garantir a segurança do seu banco de dados, é importante configurar o Mongo para aceitar apenas acesso por autenticação. Se você está seguindo este tutorial em um banco de dados existente, pode pular esta etapa.
Para começar, abra o arquivo de configuração do Mongo e faça as alterações necessárias para permitir apenas o acesso autenticado:
sudo nano /etc/mongod.conf
Adicione a seguinte linha ao arquivo de configuração
security:
authorization: enabled
Essa linha de configuração garante que o Mongo só permitirá o acesso autenticado ao banco de dados, proporcionando maior segurança aos dados. Certifique-se de salvar as alterações no arquivo e reiniciar o serviço do Mongo para que as mudanças tenham efeito.
Autenticando-se no MongoDB
Agora, o acesso ao seu banco de dados só será possível através da autenticação com o usuário criado anteriormente. O usuário "lossMan" se autentica na base "admin" e tem os seguintes privilégios:
userAdminAnyDatabase: Permite que o usuário crie, adicione ou remova roles, bem como crie e modifique roles personalizadas para qualquer base de dados.
readWriteAnyDatabase: Permite que o usuário faça modificações em qualquer base de dados.
Tendo isso em mente irel logar com meu usuário administrador:
mongo --host localhost -u lossMan --authenticationDatabase admin -p
Agora que já me autentiquei no banco de dados podemos criar a base da "edetch" e os usuários que terão acesso.
Para começar, vamos criar um usuário para a ferramenta de Business Intelligence com acesso restrito ao tipo "somente leitura":
use admin
db.createUser({
user: "dataAnalysis",
pwd: "password",
roles: [
{ "role": "read", "db": "edtech" }
]
})
Por questões de segurança, o usuário foi criado na base "admin", mas seu acesso está restrito apenas à base "edtech" e com permissão somente de leitura. Caso ele tente realizar operações de escrita nessa base, receberá uma mensagem de erro.
Por fim, criamos o usuário "controlPanel" com a role "readWrite", que permite que ele leia e escreva na base "edtech".
Adicionando privilégios a um usuário no MongoDB
Suponha que, por algum motivo, o usuário "dataAnalysis" da ferramenta de BI precise de privilégios de escrita para registrar na nossa base e, talvez, cadastrar métricas de alunos no banco para que sejam visualizadas pelos próprios alunos. Para conceder a ele permissão de escrita na base, precisaremos adicionar o privilégio de escrita.
use admin
db.grantRolesToUser(
"dataAnalysis",
[
{ role: "readWrite", db: "edtech" }
]
)
Execute o seguinte comando para verificar os privilégios que esse usuário agora possui:
db.getUser("dataAnalysis")
A saída será como essa:
{
"_id" : "admin.dataAnalysis",
"user" : "dataAnalysis",
"db" : "admin",
"roles" : [
{
"role" : "readWrite",
"db" : "edtech"
},
{
"role" : "read",
"db" : "edtech"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
Observe que agora temos privilégios redundantes, pois ambas as roles concedem privilégios de leitura na base. Portanto, vamos remover a role de somente leitura.
Revogando privilégios no MongoDB
O próximo comando irá remover a role de "somente leitura" deixando apenas a role de "leitura e escrita":
db.revokeRolesFromUser(
"dataAnalysis",
[
{ role: "read", db: "edtech" }
]
)
Pronto! Agora execute novamente o comando db.getUser() para garantir que a redundância foi eliminada:
{
"_id" : "admin.dataAnalysis",
"user" : "dataAnalysis",
"db" : "admin",
"roles" : [
{
"role" : "readWrite",
"db" : "edtech"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
Se esta for a saída, então está tudo certo. Neste caso, utilizamos a revogação de privilégios apenas para eliminar a redundância, mas este comando pode ser usado para controlar acessos temporários e outras situações semelhantes.
Se você é um desenvolvedor ou está começando uma empresa, a segurança dos dados é fundamental. Nesse sentido, o uso de técnicas como a atribuição de privilégios em usuários MongoDB pode ser uma ótima maneira de garantir a integridade das informações.
Embora este post se concentre nas Built-In roles, é importante lembrar que a utilização dessas roles é um caminho para um controle ainda mais refinado de privilégios. Não deixe de conferir futuras postagens do blog pois falarei sobre as roles customizadas, para aqueles que desejam ter um controle de privilégios mais avançado.
Referências:
https://www.mongodb.com/docs/manual/reference/built-in-roles/
https://www.mongodb.com/docs/manual/tutorial/configure-scram-client-authentication/




