Explicación del Control de Acceso Basado en Roles (RBAC) de MongoDB

Explicación del Control de Acceso Basado en Roles (RBAC) de MongoDB

  • Seguridad
6 min de lectura Actualizado Jan 28, 2021

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

Roles incorporados en MongoDB

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

Guía de MongoDB

  1. Resumen de MongoDB: Empezando con MongoDB
  2. Cómo instalar MongoDB en Ubuntu y Mac
  3. Creación de una base de datos en MongoDB
  4. Comandos básicos de MongoDB Shell
  5. MongoDB Compass: Uso de la interfaz gráfica de Mongo
  6. Explicación del Control de Acceso Basado en Roles (RBAC) de MongoDB
  7. Explicación de los operadores de proyección y proyección de MongoDB
  8. Explicación de las funciones agregadas de MongoDB
  9. Ordenación de MongoDB: método y ejemplos de sort()
  10. Uso de operadores de Push & Pull en MongoDB
  11. Cómo utiliza MongoDB $unwind
  12. 23 operadores comunes de consultas de MongoDB y cómo utilizarlos
  13. Ejemplos de consultas de geolocalización de MongoDB
  14. Introducción a las transacciones de MongoDB
  15. Índices de MongoDB: Principales tipos de índices y cómo gestionarlos
  16. Mejores comandos de MongoDB te necesitas saber
  17. Replicación de MongoDB: Una introducción completa
  18. Cómo configurar un clúster de MongoDB
  19. Fragmentos de MongoDB: Conceptos, Ejemplos y Tutoriales
  20. MongoDB Atlas: Configuración y uso de MongoDB gestionado
  21. Cómo ejecutar MongoDB como contenedor Docker
  22. Uso, gestión y requisitos de memoria de MongoDB
  23. Cómo utilizar Mongodump para copias de seguridad de MongoDB
  24. Ejemplos de Mongorestore para restaurar copias de seguridad de MongoDB
  25. Cómo utilizar PyMongo
  26. Cómo utilizar Mongoose para MongoDB y NodeJS
  27. Chuletas de MongoDB
  28. MongoDB vs Cassandra: Comparación de bases de datos NoSQL
  29. PostgreSQL vs MongoDB: Comparando bases de datos
  30. MySQL vs MongoDB: Comparando bases de datos
  31. Certificaciones MongoDB: Una introducción

Estas publicaciones son mías y no representan necesariamente la posición, estrategias u opinión de BMC.

Más de Seguridad

Suscríbete al Informe

Al registrarse para esta oferta te son confirmar que te leído y aceptado la Política de Privacidad de BMC.

Gracias te

Tú te has suscrito a The Brief
El Brief abarca la orquestación de mainframe y empresa—BMC AMI y Control-M—y la investigación de analistas, despliegues de clientes y eventos en ambas áreas.