Configurar o controlo de acesso baseado em funções no Azure Cosmos DB for MongoDB

APLICA-SE A: MongoDB

Este artigo é sobre controle de acesso baseado em função para operações de plano de dados no Azure Cosmos DB para 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 para 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 refinado e baseado em função. Os usuários e funções residem em um banco de dados e são gerenciados usando a CLI do Azure, o Azure PowerShell ou o Azure Resource Manager (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 à 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 único banco de dados.

Auditoria de log de diagnóstico

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

Privilégios disponíveis

Consulta e gravação

  • find
  • insert
  • remove
  • update

Alterar fluxos

  • changeStream

Gestão de Bases de Dados

  • createCollection
  • createIndex
  • dropColeção
  • killCursors
  • matarAnyCursor

Administração de Servidores

  • dropDatabase
  • dropIndex
  • reIndex

Diagnóstico

  • collStats
  • dbStats
  • listDatabases
  • listCollections
  • listIndexes

Funções incorporadas

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

leitura

Tem os seguintes privilégios: changeStream, collStats, find, killCursors, listIndexes, listCollections

readEscrever

Tem os seguintes privilégios: collStats, createCollection, dropCollection, createIndex, dropIndex, find, insert, killCursors, listIndexes, listCollections, remove, update

dbAdmin

Tem os seguintes privilégios: collStats, createCollection, createIndex, dbStats, dropCollection, dropDatabase, dropIndex, listCollections, listIndexes, reIndex

dbProprietário

Tem os seguintes privilégios: collStats, createCollection, createIndex, dbStats, dropCollection, dropDatabase, dropIndex, listCollections, listIndexes, reIndex, find, insert, killCursors, listIndexes, listCollections, remover, atualizar

Configuração da CLI do Azure (Guia de início rápido)

Recomendamos usar o cmd ao usar o Windows.

  1. Certifique-se de ter a versão mais recente da CLI (não extensão) instalada localmente. tente az upgrade o comando.
  2. Estabelecer a ligação à subscrição.
az cloud set -n  AzureCloud
az login
az account set --subscription <your subscription ID>
  1. Habilite o recurso RBAC em sua API existente para a conta de banco de dados MongoDB. Você precisa adicionar o recurso "EnableMongoRoleBasedAccessControl" à sua conta de banco de dados. O RBAC também pode ser habilitado por meio da guia recursos no portal do Azure. Se preferir uma nova conta de banco de dados, crie uma nova conta de banco de dados com o recurso RBAC definido 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 RBAC com 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);

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

Comandos RBAC da CLI do Azure

Os comandos de gerenciamento RBAC só funcionarão com versões mais recentes da CLI do Azure instalada. Veja o Guia de início rápido acima sobre como começar.

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

Função de atualizaçã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
Ficheiro 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 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 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
Ficheiro 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 definição de usuário

Para atualizar a senha do usuário, envie a nova senha no campo 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 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
Ficheiro 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 utilizadores

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

Verifique se o usuário existe

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

Eliminar utilizador

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

Limitações

  • O número de funções e utilizadores criados tem de ser inferior a 10000.
  • Os comandos listCollections, listDatabases, killCursors, e currentOp estão excluídos do RBAC.
  • Não há suporte para usuários e funções em bancos de dados.
  • A palavra-passe de um utilizador só pode ser definida/reposta através do Azure PowerShell/CLI do Azure.
  • A configuração de Utilizadores e Funções só é suportada através do PowerShell/CLI do Azure.
  • Não há suporte para a desativação da autenticação de chave primária/secundária. Recomendamos que alterne as suas chaves para prevenir o acesso ao ativar o RBAC.
  • As políticas RBAC para Cosmos DB para Mongo DB RU 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 mais frequentes (FAQ)

É possível gerir definições de funções e atribuições de funções no portal do Azure?

O suporte do portal do Azure para gerenciamento de funções não está disponível. No entanto, o RBAC pode ser ativado através do separador de funcionalidades no portal do Azure.

Como posso alterar a palavra-passe de um utilizador?

Atualize a definição do utilizador com a nova palavra-passe.

Que versões do Cosmos DB for MongoDB suportam do controlo de acesso baseado em funções (RBAC)?

As versões 3.6 e posteriores suportam o RBAC.

Próximos passos