Proteger o acesso aos dados no Azure Cosmos DB

APLICA-SE A: API do SQL

Este artigo fornece uma visão geral do controle de acesso aos dados no Azure Cosmos DB.

O Azure Cosmos DB fornece três maneiras de controlar o acesso aos seus dados.

Tipo de controle de acesso Características
Chaves primária e secundária Segredo compartilhado que permite qualquer operação de gerenciamento ou de dados. Ele é fornecido em variantes de leitura/gravação e somente leitura.
Controle de acesso baseado em função Modelo de permissão refinada e baseado em função usando identidades do AAD (Azure Active Directory) para autenticação.
Tokens de recurso Modelo de permissão refinada baseado em permissões e usuários nativos do Azure Cosmos DB.

Chaves primária e secundária

As chaves primária e secundária fornecem acesso a todos os recursos administrativos da conta de banco de dados. Cada conta é formada por duas chaves: uma chave primária e uma chave secundária. A finalidade das chaves duplas é deixá-lo gerar novamente, ou reverter as chaves, fornecendo acesso contínuo à sua conta e dados. Para saber mais sobre as chaves primária e secundária, consulte o artigo Segurança do banco de dados.

Rotação e regeneração de chaves

Observação

Siga as instruções descritas aqui para girar e regenerar chaves na API do Azure Cosmos DB para Mongo DB, API do Cassandra, API do Gremlin ou API de Tabela.

O processo de rotação e regeneração de chave é simples. Primeiro, configure seu aplicativo para usar a chave primária ou secundária para acessar sua conta do Azure Cosmos DB. Em seguida, siga as etapas descritas abaixo.

  1. Navegue até sua conta do Azure Cosmos DB no portal do Azure.

  2. Selecione Chaves no menu à esquerda e, em seguida, selecione Regenerar a Chave Secundária nas reticências à direita da chave secundária.

    Captura de tela do portal do Azure que mostra como regenerar a chave secundária

  3. Valide se a nova chave secundária funciona corretamente em sua conta do Azure Cosmos DB. A regeneração de chaves pode levar de menos de um minuto a algumas horas, dependendo do tamanho da conta do Cosmos DB.

  4. Substitua a chave primária pela chave secundária em seu aplicativo.

  5. Volte para o portal do Azure e dispare a regeneração da chave primária.

    Captura de tela do portal do Azure que mostra como regenerar a chave primária

Exemplo de código para uso de uma chave primária

O exemplo de código a seguir mostra como usar o ponto de extremidade e a chave primária da conta do Azure Cosmos DB para criar uma instância de um CosmosClient:

// Read the Azure Cosmos DB endpointUrl and authorization keys from config.
// These values are available from the Azure portal on the Azure Cosmos DB account blade under "Keys".
// Keep these values in a safe and secure location. Together they provide Administrative access to your Azure Cosmos DB account.

private static readonly string endpointUrl = ConfigurationManager.AppSettings["EndPointUrl"];
private static readonly string authorizationKey = ConfigurationManager.AppSettings["AuthorizationKey"];

CosmosClient client = new CosmosClient(endpointUrl, authorizationKey);

Controle de acesso baseado em função

O Azure Cosmos DB expõe um sistema interno de RBAC (controle de acesso baseado em função) que permite:

  • Autenticar as solicitações de dados com uma identidade do AAD (Azure Active Directory).
  • Autorizar as solicitações de dados com um modelo de permissão refinado e baseado em função.

O RBAC do Azure Cosmos DB é o método de controle de acesso ideal em situações em que:

  • Você não deseja usar um segredo compartilhado como a chave primária, e preferir contar com um mecanismo de autenticação baseado em token,
  • Você deseja usar as identidades do Azure AD para autenticar suas solicitações,
  • Você precisa de um modelo de permissão refinada para restringir rigorosamente as operações de banco de dados que suas identidades têm permissão para executar,
  • Você deseja materializar suas políticas de controle de acesso como "funções" que podem ser atribuídas a várias identidades.

Veja Configurar o controle de acesso baseado em função para sua conta do Azure Cosmos DB para obter mais informações sobre o RBAC do Azure Cosmos DB.

Tokens de recurso

Os tokens de recurso fornecem acesso aos recursos do aplicativo em um banco de dados. Tokens de recurso:

  • Fornece acesso a contêineres, chaves de partição, documentos, anexos, procedimentos armazenados, gatilhos e UDFs específicos.
  • São criados quando um usuário recebe permissões para um recurso específico.
  • São recriados quando um recurso de permissão recebe uma ação de uma chamada POST, GET ou PUT.
  • Use um token de recurso de hash construído especificamente para o usuário, o recurso e a permissão.
  • São associados a um período de validade personalizável. O intervalo de tempo válido padrão é de uma hora. O tempo de vida do token, no entanto, pode ser especificado explicitamente, até o máximo de cinco horas.
  • Fornecem uma alternativa segura para o fornecimento da chave primária.
  • Permitem aos clientes ler, gravar e excluir recursos da conta do Cosmos DB de acordo com as permissões que receberam.

Você pode usar um token de recurso (criando usuários e permissões do Cosmos DB) quando desejar fornecer acesso aos recursos de sua conta do Cosmos DB a um cliente que não é confiável para receber a chave primária.

Os tokens de recurso do Cosmos DB fornecem uma alternativa segura que permite aos clientes ler, gravar e excluir recursos de sua conta do Cosmos DB de acordo com as permissões que você concedeu e sem a necessidade de uma chave primária ou somente leitura.

Este é um padrão de design típico no qual tokens de recurso podem ser solicitados, gerados e fornecidos aos clientes:

  1. Um serviço de camada intermediária é configurado para atender a um aplicativo móvel de compartilhamento de fotos do usuário.

  2. O serviço de camada intermediária tem a chave primária da conta do Cosmos DB.

  3. O aplicativo de fotos é instalado em dispositivos móveis de usuários finais.

  4. No logon, o aplicativo de fotos estabelece a identidade do usuário com o serviço de camada intermediária. Esse mecanismo de estabelecimento de identidade depende apenas do aplicativo.

  5. Depois que a identidade é estabelecida, o serviço de camada intermediária solicita permissões com base na identidade.

  6. O serviço de camada intermediária envia um token de recurso de volta para o aplicativo móvel.

  7. O aplicativo de telefone pode continuar usando o token de recurso para acessar diretamente recursos do Cosmos DB com as permissões definidas pelo token de recurso e no intervalo permitido por ele.

  8. Quando o token de recurso expira, as solicitações seguintes recebem uma exceção 401 de não autorizado. Nesse ponto, o aplicativo móvel restabelece a identidade e solicita um novo token de recurso.

    Fluxo de trabalho dos tokens de recurso do Azure Cosmos DB

A geração e o gerenciamento do token de recurso são manipulados pelas bibliotecas de cliente nativas do Cosmos DB; no entanto, se você usar a REST, deverá construir os cabeçalhos de solicitação/autenticação. Para obter mais informações sobre como criar cabeçalhos de autenticação para a REST, consulte Controle de Acesso em recursos do Cosmos DB ou o código-fonte de nossos .NET SDK ou Node.js SDK.

Para obter um exemplo de um serviço de camada intermediária usado para gerar, ou tokens de recurso do agente, confira o aplicativo ResourceTokenBroker.

Usuários

Os usuários do Azure Cosmos DB são associados a um banco de dados do Cosmos. Cada banco de dados pode conter nenhum ou mais usuários do Cosmos DB. O exemplo de código a seguir mostra como criar um recurso de usuário do Cosmos DB usando o .NET SDK do Azure Cosmos DB v3.

//Create a user.
Database database = benchmark.client.GetDatabase("SalesDatabase");

User user = await database.CreateUserAsync("User 1");

Observação

Cada usuário do Cosmos DB tem um método ReadAsync() que pode ser usado para recuperar a lista de permissões associadas ao usuário.

Permissões

Um recurso de permissão é associado a um usuário e atribuído a um recurso específico. Cada usuário pode conter nenhuma ou mais permissões. Um recurso de permissão fornece acesso a um token de segurança de que o usuário precisa ao tentar acessar um contêiner ou dado específico em uma chave da partição específica. Há dois níveis de acesso disponíveis que podem ser fornecidos por um recurso de permissão:

  • Tudo: o usuário tem permissão total com relação ao recurso.
  • Leitura: O usuário pode apenas ler o conteúdo do recurso, mas não pode executar operações de gravação, atualização ou exclusão no recurso.

Observação

Para executar os procedimentos armazenados, o usuário precisa ter a permissão Tudo no contêiner no qual o procedimento armazenado será executado.

Se você habilitar os logs de diagnóstico em solicitações de plano de dados, as duas propriedades a seguir correspondentes à permissão serão registradas em log:

  • resourceTokenPermissionId - essa propriedade indica a Id de permissão de token do recurso que você especificou.

  • resourceTokenPermissionMode - essa propriedade indica o modo de permissão que você definiu ao criar o token de recurso. O modo de permissão pode ter valores como "todos" ou "leitura".

Exemplo de código para criar permissão

O exemplo de código a seguir mostra como criar um recurso de permissão, ler o token de recurso do recurso de permissão e associar as permissões ao usuário criado anteriormente.

// Create a permission on a container and specific partition key value
Container container = client.GetContainer("SalesDatabase", "OrdersContainer");
user.CreatePermissionAsync(
    new PermissionProperties(
        id: "permissionUser1Orders",
        permissionMode: PermissionMode.All,
        container: container,
        resourcePartitionKey: new PartitionKey("012345")));

Exemplo de código para permissão de leitura para usuário

O trecho de código a seguir mostra como recuperar a permissão associada ao usuário criado acima e instanciar um novo CosmosClient em nome do usuário, com escopo para uma única chave da partição.

//Read a permission, create user client session.
PermissionProperties permissionProperties = await user.GetPermission("permissionUser1Orders")

CosmosClient client = new CosmosClient(accountEndpoint: "MyEndpoint", authKeyOrResourceToken: permissionProperties.Token);

Diferenças entre o RBAC e os tokens de recurso

Assunto RBAC Tokens de recurso
Autenticação Com o Azure AD (Azure Active Directory). Com base nos usuários nativos do Azure Cosmos DB
A integração de tokens de recurso ao Azure AD requer trabalho extra para estabelecer uma ponte com as identidades do Azure AD e os usuários do Azure Cosmos DB.
Autorização Baseado em função: as definições de função mapeiam as ações permitidas e podem ser atribuídas a várias identidades. Baseado em permissão: para cada usuário do Azure Cosmos DB, você precisa atribuir permissões de acesso a dados.
Escopo do token Um token do AAD carrega a identidade do solicitante. Essa identidade é correspondida com todas as definições de função atribuídas para executar a autorização. Um token de recurso carrega a permissão concedida a um usuário específico do Azure Cosmos DB em um recurso específico do Azure Cosmos DB. As solicitações de autorização em diferentes recursos podem exigir tokens diferentes.
Atualização do token O token do AAD é atualizado automaticamente pelos SDKs do Azure Cosmos DB quando ele expira. Não há suporte para a atualização do token de recurso. Quando um token de recurso expira, um novo precisa ser emitido.

Adicionar usuários e atribuir funções

Para adicionar o acesso de leitor de conta do Azure Cosmos DB à sua conta de usuário, peça ao proprietário de uma assinatura que execute as seguintes etapas no portal do Azure.

  1. Abra o portal do Azure e selecione sua conta do Azure Cosmos DB.
  2. Clique na guia Controle de acesso (IAM) e, em seguida, clique em + Adicionar atribuição de função.
  3. No painel Adicionar atribuição de função, na caixa Função, selecione Função de leitor de conta do Cosmos DB.
  4. Na caixa Atribuir acesso à caixa, selecione Usuário, grupo ou aplicativo do Microsoft Azure Active Directory.
  5. Selecione o usuário, o grupo ou o aplicativo no diretório ao qual você deseja conceder acesso. Você pode pesquisar o diretório por nome para exibição, endereço de email ou identificadores de objeto. O usuário, grupo ou aplicativo selecionado aparece na lista de membros selecionados.
  6. Clique em Salvar.

A entidade agora poderá ler recursos do Azure Cosmos DB.

Excluir ou exportar dados do usuário

Como um serviço de banco de dados, o Azure Cosmos DB permite que você pesquise, selecione, modifique e exclua todos os dados localizados no banco de dados ou nos contêineres. No entanto, é sua responsabilidade usar as APIs fornecidas e definir a lógica necessária para localizar e apagar todos os dados pessoais, se necessário. Cada API multimodelo (SQL, MongoDB, Gremlin, Cassandra, tabela) fornece SDKs de linguagens diferentes que contêm métodos para pesquisar e excluir dados baseados em predicados personalizados. Você também pode habilitar o recurso TTL (vida útil) para excluir os dados automaticamente após um período especificado, sem resultar em nenhum custo adicional.

Observação

Para obter informações sobre como exibir ou excluir dados pessoais, confira Solicitações do titular dos dados do Azure para RGPD. Para obter mais informações sobre o GDPR, confira a seção GDPR da Central de Confiabilidade da Microsoft e a seção GDPR do Portal de Confiança do Serviço.

Próximas etapas