MongoDB: Gestión de usuarios y seguridad
La seguridad es un pilar fundamental en cualquier base de datos. En MongoDB, la gestión de usuarios y roles permite controlar quién puede acceder y qué acciones puede realizar sobre los datos. MongoDB utiliza un sistema basado en roles que facilita la administración de permisos.
En este artículo veremos cómo funciona la gestión de usuarios en MongoDB, desde la creación de usuario hasta entender los diferentes roles que ofrece.
Requisitos previos
Para seguir las prácticas de este artículo, necesitará una cuenta en un servidor con MongoDB y los privilegios adecuados.
Para crear nuevos usuarios, su usuario actual debe tener habilitadas las siguientes acciones de privilegio:
createUser
grantRole
Para cambiar la contraseña o los detalles de la cuenta de un usuario, necesitará los siguientes privilegios:
changeOwnPassword
: Para cambiar la contraseña de su propia cuentachangeOwnCustomData
: Para cambiar datos personalizados de su propia cuentachangePassword
: Para cambiar las contraseñas de otros usuarios
¿Cómo funciona la autenticación y autorización en MongoDB?
En MongoDB existen dos conceptos clave:
- Autenticación: Verifica la identidad del usuario (usuario + contraseña).
- Autorización: Determina qué operaciones puede realizar un usuario autenticado.
Antes de comenzar a crear y administrar cuentas, es útil tomarse un tiempo para familiarizarse y entender cómo MongoDB define y almacena esta información.
En MongoDB, las cuentas de usuarios son una combinación del nombre de usuario de la cuenta y una base de datos de autenticación específica. La base de datos de autenticación es simplemente la base de datos donde se define el usuario y no implica ninguna limitación de alcance. Las bases de datos de autenticación son bases de datos comunes que se utilizan para gestionar otros datos y no son bases de datos especiales ni dedicadas.
El nombre de una cuenta de usuario debe ser único en su base de datos de autenticación. Sin embargo, el mismo nombre de usuario puede reutilizarse con una base de datos de autenticación diferente para crear una cuenta de usuario nueva y distinta.
Gracias a este diseño, una cuenta solo puede identificarse con precisión incluyendo el nombre de usuario y la base de datos de autenticación. Para autenticarse, también es necesario proporcionar las credenciales asociadas. Estas suelen ser una contraseña, pero también puede ser un certificado.
¿Cómo crear usuarios?
MongoDB proporciona un método interno llamado db.createUser()
, que se utiliza para crear nuevos usuarios en el sistema. Esto se ve representado en el siguiente diagrama de secuencia:
Vamos a comenzar asimilando que somos administradores de las bases de datos y necesitamos generar dos usuarios para una base de datos:
- EL primer usuario le llamaremos lector el cuál solo tendrá acceso de lectura a la base de datos.
- El segundo tendrá como nombre escritor y tendrá acceso de lectura y escritura a la base de datos.
El primer paso será crear la base de datos, que es sencillamente ejecutando la siguiente sentencia:
1
use blog
Luego insertamos un par de documentos en la colección ( collection ) posts:
1
2
db.posts.insertOne({ title: "Articulo 1" });
db.posts.insertOne({ title: "Articulo 2" });
Crear usuario de solo lectura
Este usuario solo puede leer posts, pero no podrá bajo ningún motivo crear nuevos artículos.
Para lograr esto vamos a usar el método createUser. Este método acepta como parámetro un objeto con las siguientes propiedades:
- user: Esta propiedad representa el nombre del usuario.
- pwd: Esta propiedad es para asignar la contraseña para el usuario.
- roles: Un arreglo de objetos. Cada objeto se le puede definir dos propiedades como role y db
El código que crea un usuario que solo puede leer una base de datos quedaría de la siguiente manera:
1
2
3
4
5
6
7
8
9
db.createUser(
{
user: "lector",
pwd: "12345",
roles: [
{ role: "read", db: "blog" }
]
}
)
Mongo viene con roles predefinidos, uno de ellos es el role de read que permite ejecutar métodos de solo lectura.
Crear usuario de escritura y lectura
Para poder ingresar con el nuevo usuario invocaremos el shell de mongo usando los parámetros -u y -p. En la terminal escribimos lo siguiente:
1
mongo -u lector -p 123456
O mediante una cadena de conexión:
1
mongo "mongodb://lector:123456@localhost:27017/blog"
Si intentamos insertar un nuevo documento obtendremos el siguiente error:
1
2
3
4
5
6
7
8
> db.posts.insertOne({title: "articulo5"});
Error: error: {
"ok" : 0,
"errmsg" : "command find requires authentication",
"code" : 13,
"codeName" : "Unauthorized"
}
....
Puntos de consideración
Para habilitar el acceso restringido debemos asegurarnos de que nuestro archivo mongodb.cfg tenga esto:
security: enabled
(En algunas instalaciones el valor predeterminado esauthorization
, y en otra esta opción está comentada precedida de un #)
En Linux:
1
sudo nano /etc/mongod.conf
En Windows abres un notepad como administrador y modificas el siguiente archivo
1
C:\\Program Files\\MongoDB\\Server\\version\\bin\\mongod.cfg