Compartir vía


Configuración del control de acceso basado en rol de Azure Cosmos DB for MongoDB

SE APLICA A: MongoDB

Este artículo trata sobre el control de acceso basado en rol para las operaciones del plano de datos en Azure Cosmos DB for MongoDB.

Si usa operaciones del plano de administración, consulte la documentación sobre el control de acceso basado en roles aplicado a las operaciones de este plano.

Azure Cosmos DB for MongoDB expone un sistema de control de acceso basado en rol (RBAC) integrado que permite autorizar las solicitudes de datos con un modelo de permisos específico basado en roles. Los usuarios y los roles residen en una base de datos y se administran mediante la CLI de Azure, Azure PowerShell o Azure Resource Manager (ARM).

Conceptos

Resource

Un recurso es una colección o base de datos a la que estamos aplicando reglas de control de acceso.

Privilegios

Los privilegios son acciones que se pueden realizar en un recurso específico. Por ejemplo, "acceso de lectura a la colección xyz". Los privilegios se asignan a un rol específico.

Rol

Un rol tiene uno o varios privilegios. Los roles se asignan a los usuarios (cero o más) para permitirles realizar las acciones definidas en dichos privilegios. Los roles se almacenan en una base de datos única.

Auditoría del registro de diagnóstico

Se ha agregado otra columna denominada userId a la tabla MongoRequests en la característica de diagnóstico de Azure Portal. Esta columna identifica qué usuario realizó cada operación del plan de datos. El valor de esta columna está vacío cuando RBAC no está habilitado.

Privilegios disponibles

Consulta y escritura

  • find
  • insert
  • quitar
  • actualización

Flujos de cambios

  • changeStream

Administración de bases de datos

  • createCollection
  • createIndex
  • dropCollection
  • killCursors
  • killAnyCursor

administración del servidor

  • dropDatabase
  • dropIndex
  • reIndex

Diagnóstico

  • collStats
  • dbStats
  • listDatabases
  • listCollections
  • listIndexes

Roles integrados

Estos roles ya existen en todas las bases de datos y no es necesario crearlos.

read readWrite dbAdmin dbOwner
changeStream ✅ Sí ✅ Sí ✅ Sí ✅ Sí
collStats ✅ Sí ✅ Sí ✅ Sí ✅ Sí
listCollections ✅ Sí ✅ Sí ✅ Sí ✅ Sí
listIndexes ✅ Sí ✅ Sí ✅ Sí ✅ Sí
createCollection ✖️ No ✅ Sí ✅ Sí ✅ Sí
createIndex ✖️ No ✅ Sí ✅ Sí ✅ Sí
dropCollection ✖️ No ✅ Sí ✅ Sí ✅ Sí
dbStats ✖️ No ✖️ No ✅ Sí ✅ Sí
dropDatabase ✖️ No ✖️ No ✅ Sí ✅ Sí
reIndex ✖️ No ✖️ No ✅ Sí ✅ Sí
find ✅ Sí ✅ Sí ✖️ No ✅ Sí
killCursors ✅ Sí ✅ Sí ✖️ No ✅ Sí
dropIndex ✖️ No ✅ Sí ✅ Sí ✅ Sí
insert ✖️ No ✅ Sí ✖️ No ✅ Sí
remove ✖️ No ✅ Sí ✖️ No ✅ Sí
update ✖️ No ✅ Sí ✖️ No ✅ Sí

Configuración de la CLI de Azure (inicio rápido)

Se recomienda usar la consola cmd al utilizar Windows.

  1. Asegúrese de que tiene instalada localmente la versión más reciente de la CLI (no la extensión). Pruebe el comando az upgrade.
  2. Conéctese a su suscripción.
az cloud set -n  AzureCloud
az login
az account set --subscription <your subscription ID>
  1. Habilite la funcionalidad de RBAC en la cuenta de base de datos existente de la API para MongoDB. Debe agregar la funcionalidad "EnableMongoRoleBasedAccessControl" a la cuenta de base de datos. RBAC también se puede habilitar desde la pestaña características de Azure Portal. Si prefiere una nueva cuenta de base de datos, créela con la funcionalidad RBAC establecida en true.
az cosmosdb create -n <account_name> -g <azure_resource_group> --kind MongoDB --capabilities EnableMongoRoleBasedAccessControl
  1. Cree una base de datos para que los usuarios se conecten a ella en Azure Portal.
  2. Cree un usuario de RBAC con un rol de lectura integrado.
az cosmosdb mongodb user definition create --account-name <YOUR_DB_ACCOUNT> --resource-group <YOUR_RG> --body {\"Id\":\"<YOUR_DB_NAME>.<YOUR_USERNAME>\",\"UserName\":\"<YOUR_USERNAME>\",\"Password\":\"<YOUR_PASSWORD>\",\"DatabaseName\":\"<YOUR_DB_NAME>\",\"CustomData\":\"Some_Random_Info\",\"Mechanisms\":\"SCRAM-SHA-256\",\"Roles\":[{\"Role\":\"read\",\"Db\":\"<YOUR_DB_NAME>\"}]}

Autenticación mediante pymongo

from pymongo import MongoClient
client = MongoClient("mongodb://<YOUR_HOSTNAME>:10255/?ssl=true&replicaSet=globaldb&retrywrites=false&maxIdleTimeMS=120000", username="<YOUR_USER>", password="<YOUR_PASSWORD>", authSource='<YOUR_DATABASE>', authMechanism='SCRAM-SHA-256', appName="<YOUR appName FROM CONNECTION STRING IN AZURE PORTAL>")

Autenticación mediante el controlador de Node.js

connectionString = "mongodb://" + "<YOUR_USER>" + ":" + "<YOUR_PASSWORD>" + "@" + "<YOUR_HOSTNAME>" + ":10255/" + "<YOUR_DATABASE>" +"?ssl=true&retrywrites=false&replicaSet=globaldb&authmechanism=SCRAM-SHA-256&appname=@" + "<YOUR appName FROM CONNECTION STRING IN AZURE PORTAL>" + "@";
var client = await mongodb.MongoClient.connect(connectionString, { useNewUrlParser: true, useUnifiedTopology: true });

Autenticación mediante el controlador de Java

connectionString = "mongodb://" + "<YOUR_USER>" + ":" + "<YOUR_PASSWORD>" + "@" + "<YOUR_HOSTNAME>" + ":10255/" + "<YOUR_DATABASE>" +"?ssl=true&retrywrites=false&replicaSet=globaldb&authmechanism=SCRAM-SHA-256&appname=@" + "<YOUR appName FROM CONNECTION STRING IN AZURE PORTAL>" + "@";
MongoClientURI uri = new MongoClientURI(connectionString);
MongoClient client = new MongoClient(uri);

Autenticación mediante Mongosh

mongosh --authenticationDatabase <YOUR_DB> --authenticationMechanism SCRAM-SHA-256 "mongodb://<YOUR_USERNAME>:<YOUR_PASSWORD>@<YOUR_HOST>:10255/?ssl=true&replicaSet=globaldb&retrywrites=false&maxIdleTimeMS=120000"

Autenticación mediante MongoDB Compass/Azure Data Studio

connectionString = "mongodb://" + "<YOUR_USER>" + ":" + "<YOUR_PASSWORD>" + "@" + "<YOUR_HOSTNAME>" + ":10255/" + "?ssl=true&retrywrites=false&replicaSet=globaldb&authmechanism=SCRAM-SHA-256&appname=@" + "<YOUR appName FROM CONNECTION STRING IN AZURE PORTAL>" + "@"
+"&authSource=" +"<YOUR_DATABASE>";

Comandos de RBAC de la CLI de Azure

Los comandos de administración de RBAC solo funcionarán con las versiones más recientes de la CLI de Azure instaladas. Consulte la guía de inicio rápido anterior para obtener información sobre cómo empezar.

Creación de una definición de roles

az cosmosdb mongodb role definition create --account-name <account-name> --resource-group <resource-group-name> --body {\"Id\":\"test.My_Read_Only_Role101\",\"RoleName\":\"My_Read_Only_Role101\",\"Type\":\"CustomRole\",\"DatabaseName\":\"test\",\"Privileges\":[{\"Resource\":{\"Db\":\"test\",\"Collection\":\"test\"},\"Actions\":[\"insert\",\"find\"]}],\"Roles\":[]}

Creación de un rol pasando el cuerpo de un archivo JSON

az cosmosdb mongodb role definition create --account-name <account-name> --resource-group <resource-group-name> --body role.json
Archivo JSON
{
	"Id": "test.My_Read_Only_Role101",
	"RoleName": "My_Read_Only_Role101",
	"Type": "CustomRole",
	"DatabaseName": "test",
	"Privileges": [{
		"Resource": {
			"Db": "test",
			"Collection": "test"
		},
		"Actions": ["insert", "find"]
	}],
	"Roles": []
}

Actualización de una definición de roles

az cosmosdb mongodb role definition update --account-name <account-name> --resource-group <resource-group-name> --body {\"Id\":\"test.My_Read_Only_Role101\",\"RoleName\":\"My_Read_Only_Role101\",\"Type\":\"CustomRole\",\"DatabaseName\":\"test\",\"Privileges\":[{\"Resource\":{\"Db\":\"test\",\"Collection\":\"test\"},\"Actions\":[\"insert\",\"find\"]}],\"Roles\":[]}

Actualización de un rol pasando el cuerpo de un archivo JSON

az cosmosdb mongodb role definition update --account-name <account-name> --resource-group <resource-group-name> --body role.json
Archivo JSON
{
	"Id": "test.My_Read_Only_Role101",
	"RoleName": "My_Read_Only_Role101",
	"Type": "CustomRole",
	"DatabaseName": "test",
	"Privileges": [{
		"Resource": {
			"Db": "test",
			"Collection": "test"
		},
		"Actions": ["insert", "find"]
	}],
	"Roles": []
}

Lista de roles

az cosmosdb mongodb role definition list --account-name <account-name> --resource-group <resource-group-name>

Comprobación de si existe un rol

az cosmosdb mongodb role definition exists --account-name <account-name> --resource-group <resource-group-name> --id test.My_Read_Only_Role

Eliminación de un rol

az cosmosdb mongodb role definition delete --account-name <account-name> --resource-group <resource-group-name> --id test.My_Read_Only_Role

Creación de una definición de usuario

az cosmosdb mongodb user definition create --account-name <account-name> --resource-group <resource-group-name> --body {\"Id\":\"test.myName\",\"UserName\":\"myName\",\"Password\":\"pass\",\"DatabaseName\":\"test\",\"CustomData\":\"Some_Random_Info\",\"Mechanisms\":\"SCRAM-SHA-256\",\"Roles\":[{\"Role\":\"My_Read_Only_Role101\",\"Db\":\"test\"}]}

Creación de un usuario pasando el cuerpo de un archivo JSON

az cosmosdb mongodb user definition create --account-name <account-name> --resource-group <resource-group-name> --body user.json
Archivo JSON
{
	"Id": "test.myName",
	"UserName": "myName",
	"Password": "pass",
	"DatabaseName": "test",
	"CustomData": "Some_Random_Info",
	"Mechanisms": "SCRAM-SHA-256",
	"Roles": [{
		"Role": "My_Read_Only_Role101",
		"Db": "test"
	}]
}

Actualización de una definición de usuario

Para actualizar la contraseña del usuario, envíe la nueva contraseña en el campo de contraseña.

az cosmosdb mongodb user definition update --account-name <account-name> --resource-group <resource-group-name> --body {\"Id\":\"test.myName\",\"UserName\":\"myName\",\"Password\":\"pass\",\"DatabaseName\":\"test\",\"CustomData\":\"Some_Random_Info\",\"Mechanisms\":\"SCRAM-SHA-256\",\"Roles\":[{\"Role\":\"My_Read_Only_Role101\",\"Db\":\"test\"}]}

Actualización de un usuario pasando el cuerpo de un archivo JSON

az cosmosdb mongodb user definition update --account-name <account-name> --resource-group <resource-group-name> --body user.json
Archivo JSON
{
	"Id": "test.myName",
	"UserName": "myName",
	"Password": "pass",
	"DatabaseName": "test",
	"CustomData": "Some_Random_Info",
	"Mechanisms": "SCRAM-SHA-256",
	"Roles": [{
		"Role": "My_Read_Only_Role101",
		"Db": "test"
	}]
}

Enumerar usuarios

az cosmosdb mongodb user definition list --account-name <account-name> --resource-group <resource-group-name>

Comprobación de si existe un usuario

az cosmosdb mongodb user definition exists --account-name <account-name> --resource-group <resource-group-name> --id test.myName

Eliminación de usuario

az cosmosdb mongodb user definition delete --account-name <account-name> --resource-group <resource-group-name> --id test.myName

Limitaciones

  • El número de usuarios y roles que puede crear debe ser inferior a 10 000.
  • Los comandos listCollections, listDatabases, killCursors y currentOp están excluidos de RBAC.
  • No se admite el uso de usuarios y roles entre bases de datos.
  • Las contraseñas de usuario solo se pueden establecer o restablecer mediante la CLI de Azure o Azure PowerShell.
  • La configuración de usuarios y roles solo se admite mediante la CLI de Azure o PowerShell.
  • No se admite la deshabilitación de la autenticación con clave principal o secundaria. Se recomienda rotar las claves para evitar el acceso al habilitar RBAC.
  • Las directivas de RBAC para Cosmos DB para RU de Mongo DB no se restablecerán automáticamente después de una operación de restauración. Deberá volver a configurar estas directivas una vez completado el proceso de restauración.

Preguntas más frecuentes (P+F)

¿Es posible administrar las definiciones de roles y las asignaciones de roles desde Azure Portal?

La compatibilidad de Azure Portal con la administración de roles no está disponible. Sin embargo, RBAC también se puede habilitar desde la pestaña características de Azure Portal.

¿Cómo puedo cambiar la contraseña de un usuario?

Actualice la definición del usuario con la nueva contraseña.

¿Qué versiones de Cosmos DB for MongoDB admiten el control de acceso basado en rol (RBAC)?

Las versiones 3.6 y posteriores.

Pasos siguientes