Puntos clave: El Control de Acceso Basado en Roles (RBAC) de MongoDB mejora la seguridad gestionando los permisos de usuario a través de roles. Permite la asignación de roles integrados y personalizados, soportando múltiples métodos de autenticación, aunque requiere configuración para el control de acceso.
- El control de acceso no está activado por defecto.
- Un usuario puede tener múltiples roles que definen su alcance de acceso.
El control de acceso de MongoDB permite a los administradores de bases de datos proteger las instancias de MongoDB imponiendo la autenticación de usuarios. MongoDB soporta múltiples métodos de autenticación y concede acceso mediante autorización basada en roles.
Los roles son los bloques fundamentales en MongoDB, proporcionando aislamiento al usuario para un gran grado de seguridad y manejabilidad.
En este artículo, analizaremos los roles más comunes en MongoDB. Luego, exploraremos la gestión de roles ilustrando muchas funciones comunes relacionadas con los roles.
Cómo funciona el RBAC de MongoDB
A un usuario se le puede asignar uno o más roles, y el alcance del acceso del usuario al sistema de base de datos están determinado por los roles asignados. Los usuarios no tienen acceso al sistema fuera de los roles designados.
Es importante destacar que el control de acceso de MongoDB no están habilitado por defecto; te tiene que Permite a través de la configuración security.authorization.
Cuando esa configuración está activada, los usuarios deben autoautorizarse antes de interactuar con la base de datos. Los privilegios de usuario pueden incluir un recurso específico (base de datos, colección, clúster) y acciones permitidas sobre ese recurso.
Un rol concede permiso para realizar acciones concretas sobre un recurso específico. Una sola cuenta de usuario puede consistir en varios roles. Se pueden asignar roles:
- En el momento de la creación del usuario
- Al actualizar los roles de los usuarios existentes
En MongoDB son dos tipos de roles:
- Roles integrados. MongoDB proporciona roles integrados para ofrecer un conjunto de privilegios que son comúnmente necesarios en un sistema de bases de datos.
- Roles definidos por el usuario. Si los roles integrados no proporcionan todos los privilegios esperados, los administradores de bases de datos pueden Define roles personalizados usando el método createRole. Esos roles son llamados roles definidos por el usuario.
A continuación, veamos con más detalle la variedad de roles.
Roles integrados
Roles definidos por el usuario
En esta sección, repasaremos los roles integrados más comunes de MongoDB.
Roles de usuario en bases de datos
Los roles de usuario de la base de datos son roles normales de usuario que son útiles en interacciones regulares con bases de datos.
| Función | Descripción |
| leer | Lee todas las colecciones no relacionadas con el sistema y la colección system.js |
| readWrite | Funcionalidad tanto de Lectura como de Escritura en colecciones no del sistema y en la colección system.js |
Funciones de administración de bases de datos
Estos son roles que son utilizados para llevar a cabo operaciones administrativas en bases de datos.
| Función | Descripción |
| dbAdmin | Realizar tareas administrativas como indexar y recopilar estadísticas, pero no puede gestionar usuarios ni roles |
| userAdmin | Proporciona la capacidad de Crea y modificar roles y usuarios de una base de datos específica |
| dbOwner | Este están el propietario de la base de datos que puede realizar cualquier acción. Eso está igual a combinar todos los roles mencionados anteriormente: readWrite, dbAdmin y userAdmin |
Roles de administrador de clúster
Estos roles Permite a los usuarios interactuar y administrar clústeres de MongoDB.
| Función | Descripción |
| ClusterManager | Permite la gestión y la monitorización en el clúster. Proporciona acceso a bases de datos de configuración y locales utilizadas en el sharding y la replicación |
| clusterMonitor | Proporcionar acceso de solo lectura a herramientas de monitorización de MongoDB como Cloud Manager o Ops Manager Monitoring Agent |
| hostManager | Permite supervisar y gestionar servidores individuales |
| clusterAdmin | Este rol incluye el mayor número de privilegios administrativos de clúster, permitiendo a un usuario hacer prácticamente cualquier cosa. Esta funcionalidad está igual a la combinación de clusterManager, clusterMonitor, roles hostManager y acción dropDatabase. |
Roles de respaldo y restauración
Estos son los roles necesarios para son la copia de seguridad y la restauración de datos en una instancia de MongoDB. Solo pueden asignarse con la base de datos de administrador.
| Función | Descripción |
| Respaldo | Proporciona los privilegios necesarios para hacer copias de seguridad de datos. Este rol está necesario para MongoDB Cloud Manager y Ops Manager, agentes de respaldo y la utilidad monogdump. |
| Restauración | Proporciona los privilegios para llevar a cabo funciones de restauración |
Todos los roles en bases de datos
Estos son roles de base de datos que otorgan privilegios para interactuar con todas las bases de datos, excluyendo las bases de datos locales y de configuración.
| Función | Descripción |
| readAnyDatabase | Lee cualquier base de datos |
| readWriteAnyDatabase | Proporciona privilegios de lectura y escritura a todas las bases de datos |
| userAdminAnyDatabase | Crea y modifica usuarios y roles en todas las bases de datos |
| dbAdminAnyDatabase | Realizar funciones administrativas de bases de datos en todas las bases de datos |
Roles de superusuario
MongoDB puede proporcionar acceso directo o indirecto a todo el sistema para superusuarios. Los siguientes roles otorgan privilegios de superusuario que abarcan una o varias bases de datos específicas.
- dbOwner
- userAdmin
- userAdminAnyDatabase
El verdadero rol de superusuario está el rol raíz, que proporciona privilegios a nivel de sistema para todas las funciones y recursos.
Para una explicación detallada de todos los roles y privilegios de los usuarios, consulte la documentación oficial de MongoDB.
En situaciones en las que los roles integrados no son capaces de proporcionar los privilegios necesarios que cubran el alcance de los requisitos de acceso o de restringir el alcance y las acciones de un usuario, te puedes Define roles personalizados definidos por el usuario.
La Gestión de Roles de MongoDB proporciona los métodos necesarios para Crea y gestiona roles definidos por el usuario. Los métodos más comúnmente usados para la creación de roles definidos por el usuario son muestran en la siguiente tabla. (Aquí se puede encontrar una lista completa de métodos.)
Gestión de roles en MongoDB
| Método | Descripción |
| db.createRole() | Crea un rol y sus privilegios |
| db.updateRole() | Actualizar el rol definido por el usuario |
| db.dropRole() | Eliminar un rol definido por el usuario |
| db.grantPrivilegesToRole() | Asigna nuevos privilegios a un rol |
| db.revokePrivilegesFromRole() | Elimina privilegios a un rol |
En esta sección, hablemos de cómo Crea y modificar roles dentro de una instancia de MongoDB.
Los roles son definidos usando la siguiente sintaxis:
roles: [
{
role: "", db: ""
}
]
Asignación de roles de usuario en la creación del usuario
Primero, Crea un usuario con acceso de lectura y escritura a una base de datos específica (supermercado) usando el método createUser con el parámetro roles.
Resultado:
db.createUser(
{
user: "harry",
pwd: "test123",
roles: [
{
role: "readWrite",
db: "supermarket"
}
]
}
)
Resultado:
Luego, Crea un usuario administrativo en la base de datos del supermercado con funciones que concedan acceso de lectura a todas las demás bases de datos y a las funciones de copia de seguridad y restauración.
Resultado:
db.createUser(
{
user: "harryadmin",
pwd: "admin12345",
roles: [
{
role: "dbOwner", db: "supermarket"
},
{
role: "readAnyDatabase", db: "admin"
},
{
role: "backup", db: "admin"
},
{
role: "restore", db: "admin"
}
]
}
)
Resultado:
Como se muestra en el bloque de código anterior, te puede Crea usuarios con múltiples roles proporcionando acceso a una amplia gama de funcionalidades dentro de la base de datos.
Recuperación de información sobre roles
Usando el método getRole, los usuarios pueden obtener información sobre un rol específico. El siguiente código muestra cómo Obtén los detalles del rol readWriteAnyDatabase desde la base de datos administradora.
Resultado:
db.getRole("readWriteAnyDatabase")
Resultado:
Para obtener los privilegios asociados a ese rol, utiliza la opción showPrivileges estableciendo su valor como 'verdadero'. Esto también puede usarse en el método getUser.
Resultado:
db.getRole("readWriteAnyDatabase", { showPrivileges: true})
Resultado:
Identificación de roles de usuario asignados
El método getUser te permite identificar los roles asignados a un usuario específico usando la siguiente sintaxis:
db.getUser("")
En el siguiente ejemplo, te pueden recuperar los datos de usuario de los usuarios, "harry" y "harryadmin", con sus roles usando el método getUser.
Resultado:
db.getUser("harry")
db.getUser("harryadmin")
Resultado:
Concesión y revocación de roles de usuario
Utilizando los métodos grantRolesToUser y revokeRolesFromUser, te pueden modificar los roles asignados a los usuarios existentes. Estos métodos utiliza la siguiente sintaxis:
db. (
"",
[
{ role: "", db: "" }
]
)
El siguiente ejemplo muestra cómo conceder roles de usuario. te añadirá un nuevo rol al usuario "harry" proporcionando los privilegios necesarios para actuar como administrador de la base de datos (dbAdmin) y recopilar estadísticas de la tabla "vehículos".
Resultado:
db.grantRolesToUser(
"harry",
[
{ role: "dbAdmin", db: "vehicles" }
]
)
Resultado:
Ahora te añadido un nuevo rol al usuario, "harry". Así que vamos a eliminar ese nuevo rol otorgado usando el método revokeRolesFromUser.
Resultado:
db.revokeRolesFromUser(
"harry",
[
{ role: "dbAdmin", db: "vehicles" }
]
)
Resultado:
Creación de roles definidos por el usuario
Usando el método createRole, te puede Crea un nuevo rol según tus necesidades. La estructura básica del método createRole están muestra a continuación.
Nota: Utilizar el parámetro roles dentro del método createRole te permite heredar los privilegios de otros roles dentro del rol definido por el usuario. Si no se son necesarios otros privilegios, te necesario Define un parámetro de roles vacíos al crear un rol definido por el usuario.
db.createRole(
{
role: "",
privileges: [
{
resource: { db: "", collection: ""},
actions: [ "" ]
}
],
roles: [
{ role: "", db: "" } ] } )
Para asociar un rol definido por el usuario a todas las bases de datos o colecciones, te puede especificar los recursos con comillas dobles vacías, como se muestra a continuación.
resource: { db: "", collection: ""}
En el siguiente bloque de código, te crearás un rol que limita el acceso del usuario a una colección específica de bases de datos (colección de inventario de la base de datos de supermercado). Limita las acciones del usuario para encontrar y actualizar comandos sin heredar ningún otro privilegio.
Resultado:
db.createRole(
{
role: "inventoryeditor",
privileges: [
{
resource: { db: "supermarket", collection: "inventory"},
actions: [ "find", "update" ]
}
],
roles: [ ]
}
)
Resultado:
Podemos identificar los roles definidos por el usuario usando el parámetro isBuiltin . El rol inventoryeditor tiene false para ese parámetro, indicándolo como un rol no incorporado.
Ahora te saber cómo Crea un rol independiente definido por el usuario. A continuación, te Crea un rol definido por el usuario que hereda algunos privilegios de otro rol incorporado.
En el bloque de código siguiente, te Crea un rol de gestor de inventario con todos los privilegios CURD y heredará los privilegios del rol de usuarioAdministrador.
Resultado:
db.createRole(
{
role: "inventorymanager",
privileges: [
{
resource: { db: "supermarket", collection: "inventory"},
actions: [ "find", "update", "insert", "remove" ]
}
],
roles: [
{ role: "userAdmin", db: "supermarket" }
]
}
)
Resultado:
Si te revisas el rol inventorymanager usando el método getRole, mostrará los detalles del rol, incluidos los permisos heredados.
Asignación de roles definidos por el usuario a los usuarios
te puede asignar roles definidos por el usuario a un nuevo usuario o actualizar los roles de un usuario existente de la misma manera te hacerlo con un rol incorporado. Vamos a Crea un nuevo usuario con el rol de gestor de inventario asignado y actualizar a un usuario existente con el rol editoreditor, en los siguientes ejemplos.
Crear un nuevo usuario:
Resultado:
Otorgar nuevos roles:
Resultado:
db.createUser(
{
user: "managerjerry",
pwd: "manager123",
roles: [
{
role: "inventorymanager",
db: "admin"
}
]
}
)
Resultado:
Otorgar nuevos roles:
db.grantRolesToUser(
"repairmanager",
[
{ role: "inventoryeditor", db: "admin" }
]
)
Resultado:
Actualizar y eliminar roles definidos por el usuario
te puede actualizar los roles definidos por el usuario usando el método updateRole y eliminar los roles usando el método dropRole.
Actualicemos el rol inventoryeditor con un privilegio adicional para Crea documentos dentro de la colección especificada, en el siguiente ejemplo.
Resultado:
db.updateRole(
"inventoryeditor",
{
privileges: [
{
resource: { db: "supermarket", collection: "inventory"},
actions: [ "find", "update", "insert" ]
}
],
roles: [ ]
}
)
Resultado:
Lo más importante a tener en cuenta al actualizar roles están que reemplazará completamente los valores antiguos en los arrays de privilegios y roles. Por lo tanto, te necesario proporcionar las modificaciones completas a los arrays al actualizar un rol definido por el usuario.
El método dropRole tiene una única funcionalidad para eliminar un rol definido por el usuario. te puede eliminar el rol inventoryeditor de la base de datos, como se muestra a continuación.
Resultado:
db.dropRole("inventoryeditor")
Resultado:
La captura de pantalla anterior indica que la eliminación de rol fue exitosa, y si intentamos recuperar el rol eliminado, devolverá un valor nulo. Cuando un rol están eliminado, afectará a todos los usuarios asociados con el rol eliminado, revocando todos los privilegios concedidos por ese rol definido por el usuario.
Antes, tú asignabas el rol de editor de inventario al gestor de reparaciones de usuario. Ahora, si te revisas esos datos de usuario, te puedes dar cuenta de que el rol de "editor de inventario" ya no está asignado al usuario de "gestor de reparaciones".
Resultado:
db.getUser("repairmanager")
Resultado:
En situaciones en las que solo se están asignado un único rol definido por el usuario cuando dicho rol están eliminado, se formará un array de roles vacío, negando efectivamente todos los privilegios de usuario.
te puede comprobar este escenario eliminando el rol inventorymanager y obteniendo los datos de usuario del managerjerry. Esto resultará en un array de roles vacío para usermanagerjerry, demostrado a continuación comparando los datos de usuario antes y después de la eliminación de roles.
Resultado:
db.getUser("managerjerry")
db.dropRole("inventorymanager")
db.getUser("managerjerry")
Resultado:
Por tanto, están fundamental comprobar te si los roles son asociados a algún usuario y cómo afectarán al alcance funcional del usuario antes de eliminar cualquier rol definido por el usuario.
Como observación final, el método dropRole solo puede eliminar roles definidos por el usuario. Si te intentas eliminar un rol incorporado usando ese método, resultará en un error, como se muestra a continuación.
Con esto concluye esta visión exhaustiva de los roles y la gestión de roles de MongoDB.
Lecturas relacionadas
- Blog de Aprendizaje Automático y Big Data de BMC
- 23 operadores comunes de MongoDB y cómo utilizarlos, parte de nuestra guía de MongoDB
- BMC Guides, serie de artículos sobre temas como Apache Cassandra & Spark, AWS, Aprendizaje Automático y Visualización de Datos
- Explicación sobre el almacenamiento de datos: Data Lake vs Almacén vs Base de datos
Guía de MongoDB
- Resumen de MongoDB: Empezando con MongoDB
- Cómo instalar MongoDB en Ubuntu y Mac
- Creación de una base de datos en MongoDB
- Comandos básicos de MongoDB Shell
- MongoDB Compass: Uso de la interfaz gráfica de Mongo
- Explicación del Control de Acceso Basado en Roles (RBAC) de MongoDB
- Explicación de los operadores de proyección y proyección de MongoDB
- Explicación de las funciones agregadas de MongoDB
- Ordenación de MongoDB: método y ejemplos de sort()
- Uso de operadores de Push & Pull en MongoDB
- Cómo utiliza MongoDB $unwind
- 23 operadores comunes de consultas de MongoDB y cómo utilizarlos
- Ejemplos de consultas de geolocalización de MongoDB
- Introducción a las transacciones de MongoDB
- Índices de MongoDB: Principales tipos de índices y cómo gestionarlos
- Mejores comandos de MongoDB te necesitas saber
- Replicación de MongoDB: Una introducción completa
- Cómo configurar un clúster de MongoDB
- Fragmentos de MongoDB: Conceptos, Ejemplos y Tutoriales
- MongoDB Atlas: Configuración y uso de MongoDB gestionado
- Cómo ejecutar MongoDB como contenedor Docker
- Uso, gestión y requisitos de memoria de MongoDB
- Cómo utilizar Mongodump para copias de seguridad de MongoDB
- Ejemplos de Mongorestore para restaurar copias de seguridad de MongoDB
- Cómo utilizar PyMongo
- Cómo utilizar Mongoose para MongoDB y NodeJS
- Chuletas de MongoDB
- MongoDB vs Cassandra: Comparación de bases de datos NoSQL
- PostgreSQL vs MongoDB: Comparando bases de datos
- MySQL vs MongoDB: Comparando bases de datos
- Certificaciones MongoDB: Una introducción
Estas publicaciones son mías y no representan necesariamente la posición, estrategias u opinión de BMC.