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.
Role
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 de 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.
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 (Guia de início rápido)
Recomendamos usar o cmd ao usar o Windows.
- Certifique-se de ter a versão mais recente da CLI (não extensão) instalada localmente. tente
az upgrade
o comando. - Estabelecer a ligação à subscrição.
az cloud set -n AzureCloud
az login
az account set --subscription <your subscription ID>
- 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
- Crie um banco de dados para os usuários se conectarem no portal do Azure.
- 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 Node.js driver
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"
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 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
- Saiba mais sobre o RBAC para gerenciamento do Azure Cosmos DB.