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.
- Verifique se você tem a versão mais recente da CLI (não a extensão) instalada localmente. tente o comando
az upgrade
. - Conecte-se à sua assinatura.
az cloud set -n AzureCloud
az login
az account set --subscription <your subscription ID>
- 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
- Crie um banco de dados para os usuários se conectarem no portal do Azure.
- 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
- Saiba mais sobre o RBAC para o gerenciamento do Azure Cosmos DB.