Compartilhar via


Configurar o controle de acesso baseado em função no Azure Cosmos DB for MongoDB

APLICA-SE AO: MongoDB

Este artigo trata do controle de acesso baseado em função para operações do plano de dados no Azure Cosmos DB for MongoDB.

Se você estiver usando operações de plano de gerenciamento, consulte o artigo Controle de acesso baseado em função aplicado às operações do plano de gerenciamento.

O Azure Cosmos DB for MongoDB expõe um sistema RBAC (controle de acesso baseado em função) interno que permite autorizar suas solicitações de dados com um modelo de permissão baseado em função refinado. Os usuários e as funções residem em um banco de dados e são gerenciados usando a CLI do Azure, o Azure PowerShell ou o ARM.

Conceitos

Recurso

Um recurso é uma coleção ou banco de dados ao qual estamos aplicando regras de controle de acesso.

Privilégios

Privilégios são ações que podem ser executadas em um recurso específico. Por exemplo, "acesso de leitura para coleção xyz". Os privilégios são atribuídos a uma função específica.

Função

Uma função tem um ou mais privilégios. As funções são atribuídas aos usuários (zero ou mais) para permitir que eles executem as ações definidas nesses privilégios. As funções são armazenadas em um banco de dados individual.

Auditoria de log de diagnóstico

Outra coluna chamada userId foi adicionada à tabela MongoRequests no recurso de diagnóstico do portal do Azure. Essa coluna identifica qual usuário executou qual operação do plano de dados. O valor dessa coluna fica vazio quando o RBAC não está habilitado.

Privilégios disponíveis

Consulta e gravação

  • localizar
  • insert
  • remover
  • atualizar

Alterar os fluxos

  • changeStream

Gerenciamento de banco de dados

  • createCollection
  • createIndex
  • dropCollection
  • killCursors
  • killAnyCursor

Administração de servidor

  • dropDatabase
  • dropIndex
  • reIndex

Diagnósticos

  • collStats
  • dbStats
  • listDatabases
  • listCollections
  • listIndexes

Funções internas

Essas funções já existem em todos os bancos de dados e não precisam ser criadas.

read readWrite dbAdmin dbOwner
changeStream ✅ Sim ✅ Sim ✅ Sim ✅ Sim
collStats ✅ Sim ✅ Sim ✅ Sim ✅ Sim
listCollections ✅ Sim ✅ Sim ✅ Sim ✅ Sim
listIndexes ✅ Sim ✅ Sim ✅ Sim ✅ Sim
createCollection ✖️ Não ✅ Sim ✅ Sim ✅ Sim
createIndex ✖️ Não ✅ Sim ✅ Sim ✅ Sim
dropCollection ✖️ Não ✅ Sim ✅ Sim ✅ Sim
dbStats ✖️ Não ✖️ Não ✅ Sim ✅ Sim
dropDatabase ✖️ Não ✖️ Não ✅ Sim ✅ Sim
reIndex ✖️ Não ✖️ Não ✅ Sim ✅ Sim
find ✅ Sim ✅ Sim ✖️ Não ✅ Sim
killCursors ✅ Sim ✅ Sim ✖️ Não ✅ Sim
dropIndex ✖️ Não ✅ Sim ✅ Sim ✅ Sim
insert ✖️ Não ✅ Sim ✖️ Não ✅ Sim
remove ✖️ Não ✅ Sim ✖️ Não ✅ Sim
update ✖️ Não ✅ Sim ✖️ Não ✅ Sim

Configuração da CLI do Azure (Início Rápido)

É recomendável usar o cmd quando usar Windows.

  1. Verifique se você tem a versão mais recente da CLI (não a extensão) instalada localmente. tente o comando az upgrade.
  2. Conecte-se à sua assinatura.
az cloud set -n  AzureCloud
az login
az account set --subscription <your subscription ID>
  1. Habilite a funcionalidade RBAC na sua conta de banco de dados existente da API para o MongoDB. Você precisa adicionar a funcionalidade “EnableMongoRoleBasedAccessControl” à conta de banco de dados. O RBAC também pode ser habilitado na guia de recursos no portal do Azure. Se preferir uma nova conta de banco de dados, crie uma conta de banco de dados com a funcionalidade RBAC definida como true.
az cosmosdb create -n <account_name> -g <azure_resource_group> --kind MongoDB --capabilities EnableMongoRoleBasedAccessControl
  1. Crie um banco de dados para os usuários se conectarem no portal do Azure.
  2. Crie um usuário de RBAC com uma função de leitura interna.
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>\"}]}

Autenticar usando 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>")

Autenticar usando o driver 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 });

Autenticar usando o driver 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);

Autenticação usando o 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"

Autenticar usando o 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 da CLI do Azure

Os comandos de gerenciamento de RBAC funcionarão apenas com versões mais recentes da CLI do Azure instalada. Consulte o Início Rápido acima sobre como começar.

Criar uma definição de função

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\":[]}

Criar uma função passando o corpo do arquivo JSON

az cosmosdb mongodb role definition create --account-name <account-name> --resource-group <resource-group-name> --body role.json
Arquivo 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": []
}

Atualizar definição de função

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\":[]}

Atualizar uma função passando o corpo do arquivo JSON

az cosmosdb mongodb role definition update --account-name <account-name> --resource-group <resource-group-name> --body role.json
Arquivo 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": []
}

Listar funções

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

Verificar se a função existe

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

Excluir função

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

Criar uma definição de usuário

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\"}]}

Criar um usuário passando o corpo do arquivo JSON

az cosmosdb mongodb user definition create --account-name <account-name> --resource-group <resource-group-name> --body user.json
Arquivo 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"
	}]
}

Atualizar uma definição de usuário

Para atualizar a senha do usuário, envie a nova senha no campo de senha.

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\"}]}

Atualizar um usuário passando o corpo do arquivo JSON

az cosmosdb mongodb user definition update --account-name <account-name> --resource-group <resource-group-name> --body user.json
Arquivo 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"
	}]
}

Listar usuários

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

Verificar se o usuário existe

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

Excluir usuário

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

Limitações

  • O número de usuários e funções que você pode criar deve ser menor que 10.000.
  • Os comandos listCollections, listDatabases, killCursors e currentOp são excluídos do RBAC.
  • Não há suporte para usuários e funções entre bancos de dados.
  • Uma senha de usuário só pode ser definida/redefinida por meio da CLI do Azure/Azure PowerShell.
  • A configuração de usuários e funções só tem suporte por meio da CLI do Azure/PowerShell.
  • Não há suporte para desabilitar a autenticação de chave primária/secundária. É recomendável girar suas chaves para impedir o acesso ao habilitar o RBAC.
  • As políticas RBAC de RU do Cosmos DB para Mongo DB não serão restabelecidas automaticamente após uma operação de restauração. Será necessário reconfigurar essas políticas após a conclusão do processo de restauração.

Perguntas frequentes (FAQs)

É possível gerenciar definições de função e atribuições de função pelo portal do Azure?

O suporte do portal do Azure para o gerenciamento de funções não está disponível. No entanto, o RBAC também pode ser habilitado na guia de recursos no portal do Azure.

Como posso alterar uma senha de usuário?

Atualize a definição do usuário com a nova senha.

Quais versões do Cosmos DB para MongoDB dão suporte ao RBAC (controle de acesso baseado em função)?

As versões 3.6 e superior dão suporte ao RBAC.

Próximas etapas