Use o controle de acesso baseado em função (RBAC) do painel de controle no Azure Cosmos DB for NoSQL

APLICA-SE A: NoSQL

Diagrama da localização atual (

Diagrama da sequência do guia de implantação, incluindo estes locais, em ordem: Visão geral, Conceitos, Preparação, Controle de acesso baseado em função, Rede e Referência. O local "Controle de acesso baseado em função" está destacado no momento.

Esse artigo descreve as etapas para conceder acesso de identidade para gerenciar uma conta do Azure Cosmos DB for NoSQL e seus recursos.

Importante

As etapas nesse artigo abrangem apenas o acesso ao painel de controle para realizar operações na conta em si ou em qualquer recurso dentro da hierarquia dessa conta. Para aprender a gerenciar funções, definições e atribuições para o plano de controle, veja conceder acesso baseado em função ao plano de dados.

Pré-requisitos

  • Uma conta do Azure com uma assinatura ativa. Crie uma conta gratuitamente.
  • Uma conta existente do Azure Cosmos DB.
  • Uma ou mais identidades existentes no Microsoft Entra ID.

Preparar definição de função

Primeiro, você deve preparar uma definição de função com uma lista de actions e conceder acesso para gerenciar recursos da conta no Azure Cosmos DB.

Liste todas as definições de função associadas à sua conta do Azure Cosmos DB usando az role definition list. Revise a saída e localize a definição de função chamada Colaborador interno de dados do Cosmos DB. A saída contém o identificador exclusivo da definição de função na propriedade id. Registre esse valor, pois ele será necessário para uso na etapa de atribuição mais adiante nesse guia.

az role definition list \
    --name "Cosmos DB Operator"
[
  {
    "assignableScopes": [
      "/"
    ],
    "description": "Lets you manage Azure Cosmos DB accounts, but not access data in them. Prevents access to account keys and connection strings.",
    "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/providers/Microsoft.Authorization/roleDefinitions/230815da-be43-4aae-9cb4-875f7bd000aa",
    "name": "230815da-be43-4aae-9cb4-875f7bd000aa",
    "permissions": [
      {
        "actions": [
          "Microsoft.DocumentDb/databaseAccounts/*",
          "Microsoft.Insights/alertRules/*",
          "Microsoft.Authorization/*/read",
          "Microsoft.ResourceHealth/availabilityStatuses/read",
          "Microsoft.Resources/deployments/*",
          "Microsoft.Resources/subscriptions/resourceGroups/read",
          "Microsoft.Support/*",
          "Microsoft.Network/virtualNetworks/subnets/joinViaServiceEndpoint/action"
        ],
        "condition": null,
        "conditionVersion": null,
        "dataActions": [],
        "notActions": [
          "Microsoft.DocumentDB/databaseAccounts/dataTransferJobs/*",
          "Microsoft.DocumentDB/databaseAccounts/readonlyKeys/*",
          "Microsoft.DocumentDB/databaseAccounts/regenerateKey/*",
          "Microsoft.DocumentDB/databaseAccounts/listKeys/*",
          "Microsoft.DocumentDB/databaseAccounts/listConnectionStrings/*",
          "Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions/write",
          "Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions/delete",
          "Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments/write",
          "Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments/delete",
          "Microsoft.DocumentDB/databaseAccounts/mongodbRoleDefinitions/write",
          "Microsoft.DocumentDB/databaseAccounts/mongodbRoleDefinitions/delete",
          "Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/write",
          "Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/delete"
        ],
        "notDataActions": []
      }
    ],
    "roleName": "Cosmos DB Operator",
    "roleType": "BuiltInRole",
    "type": "Microsoft.Authorization/roleDefinitions",
  }
]

Observação

Por exemplo, neste exemplo, o valor de id seria /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/providers/Microsoft.Authorization/roleDefinitions/230815da-be43-4aae-9cb4-875f7bd000aa. Esse exemplo usa dados fictícios e seu identificador seria diferente deste exemplo. No entanto, o identificador (230815da-be43-4aae-9cb4-875f7bd000aa) é globalmente exclusivo em todas as definições de função no Azure.

  1. Entre no portal do Azure (https://portal.azure.com).

  2. Insira Grupo de recursos na barra de pesquisa global.

    Captura de tela da barra de pesquisa global no portal do Azure.

  3. Dentro de Serviços, selecione Grupos de recursos.

    Captura de tela da opção

  4. No painel Grupos de recursos, selecione o seu grupo de recursos existente.

    Captura de tela de um grupo de recursos que já existe na lista de grupos de recursos para a assinatura.

    Observação

    Este exemplo de captura de tela mostra o grupo de recursos msdocs-identity-example. O nome do seu grupo de recursos pode ser diferente.

  5. Dentro do painel do grupo de recursos, selecione Controle de acesso (IAM) no menu de serviços.

    Captura de tela da opção

  6. No painel Controle de Acesso (IAM), selecione Funções.

    Captura de tela da opção

  7. Na seção Funções, use a frase de pesquisa Cosmos DB e localize a definição de função Operador do Cosmos DB. Depois, selecione a opção Exibir associada a essa definição.

    Captura de tela de uma lista de definições de função no escopo atribuível atual, filtrada para incluir apenas aquelas com

  8. Na caixa de diálogo da definição de função Operador do Cosmos DB, observe as ações atribuídas como parte dessa definição de função.

    Captura de tela da caixa de diálogo

  9. Feche a caixa de diálogo da definição de função Operador do Cosmos DB.

Use Get-AzRoleDefinition para listar todas as definições de função associadas à sua conta do Azure Cosmos DB. Revise a saída e localize a definição de função chamada Colaborador interno de dados do Cosmos DB. A saída contém o identificador exclusivo da definição de função na propriedade Id. Registre esse valor, pois ele será necessário para uso na etapa de atribuição mais adiante nesse guia.

$parameters = @{
    Name = "Cosmos DB Operator"
}
Get-AzRoleDefinition @parameters
Name             : Cosmos DB Operator
Id               : 230815da-be43-4aae-9cb4-875f7bd000aa
IsCustom         : False
Description      : Lets you manage Azure Cosmos DB accounts, but not access data in them. Prevents access to account keys and connection strings.
Actions          : {Microsoft.DocumentDb/databaseAccounts/*, Microsoft.Insights/alertRules/*, Microsoft.Authorization/*/read, Microsoft.ResourceHealth/availabilityStatuses/read…}
NotActions       : {Microsoft.DocumentDB/databaseAccounts/dataTransferJobs/*, Microsoft.DocumentDB/databaseAccounts/readonlyKeys/*, Microsoft.DocumentDB/databaseAccounts/regenerateKey/*, Microsoft.DocumentDB/databaseAccounts/listKeys/*…}
DataActions      : {}
NotDataActions   : {}
AssignableScopes : {/}

Observação

Por exemplo, neste exemplo, o valor de Id seria 230815da-be43-4aae-9cb4-875f7bd000aa. Esse identificador é globalmente exclusivo entre todas as definições de função no Azure.

Atribuir função à identidade

Agora, atribua a função recém-definida a uma identidade para que seus aplicativos possam acessar recursos no Azure Cosmos DB.

Importante

Essa tarefa de atribuição requer que você já tenha o identificador exclusivo de qualquer identidade à qual deseja conceder permissões de controle de acesso baseado em função.

  1. Use az group show para obter os metadados do seu grupo de recursos atual novamente.

    az group show \
        --name "<name-of-existing-resource-group>"
    
  2. Observe a saída do comando anterior. Registre o valor da propriedade id para esse grupo de recursos, pois será necessário na próxima etapa.

    {
      "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example",
      "location": "westus",
      "name": "msdocs-identity-example",
      "type": "Microsoft.Resources/resourceGroups"
    }
    

    Observação

    Por exemplo, neste exemplo, o valor de id seria /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example. Esse exemplo usa dados fictícios e seu identificador seria diferente deste exemplo. Este é um exemplo truncado da saída.

  3. Atribuir a nova função usando az role assignment create. Use o identificador do seu grupo de recursos para o argumento --scope, o identificador da função para o argumento -role e o identificador exclusivo da sua identidade para o argumento --assignee.

    az role assignment create \
        --assignee "<your-principal-identifier>" \
        --role "subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.Authorization/roleDefinitions/ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0" \
        --scope "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example"
    

    Observação

    Neste comando de exemplo, o scope foi definido como o exemplo fictício /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example do exemplo da etapa anterior. O identificador do seu grupo de recursos seria distinto deste exemplo. Assim como a role, que também foi definida para o caminho /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.Authorization/roleDefinitions/ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0 fictício. Novamente, seu identificador de função será diferente.

  4. Observe a saída do comando . A saída inclui um identificador exclusivo para a atribuição na propriedade id.

    {
      "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.Authorization/roleAssignments/ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0",
      "name": "ffffffff-5555-6666-7777-aaaaaaaaaaaa",
      "principalId": "aaaaaaaa-bbbb-cccc-1111-222222222222",
      "resourceGroup": "msdocs-identity-example",
      "roleDefinitionId": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.Authorization/roleDefinitions/ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0",
      "scope": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example",
      "type": "Microsoft.Authorization/roleAssignments"
    }
    

    Observação

    Neste exemplo, a propriedade id é /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.Authorization/roleAssignments/ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0, que é outro exemplo fictício.

  5. Repita essas etapas para conceder acesso à conta de qualquer outra identidade que você queira usar.

    Dica

    Você pode repetir essas etapas para quantas identidades desejar. Normalmente, essas etapas são pelo menos repetidas para permitir que os desenvolvedores acessem uma conta usando sua identidade humana e para permitir que os aplicativos acessem usando uma identidade gerenciada.

  1. Crie um novo arquivo Bicep para definir sua atribuição de função. Nomeie o arquivo control-plane-role-assignment.bicep.

    metadata description = 'Assign RBAC role for control plane access to Azure Cosmos DB.'
    
    @description('Id of the role definition to assign to the targeted principal in the context of the account.')
    param roleDefinitionId string
    
    @description('Id of the identity/principal to assign this role in the context of the account.')
    param identityId string
    
    resource assignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
      name: guid(subscription().id, resourceGroup().id, roleDefinitionId, identityId)
      scope: resourceGroup()
      properties: {
        roleDefinitionId: roleDefinitionId
        principalId: identityId
      }
    }
    
  2. Crie um novo arquivo de parâmetros do Bicep chamado control-plane-role-assignment.bicepparam. Neste arquivo de parâmetros, atribua os identificadores de definição de função registrados anteriormente para o parâmetro roleDefinitionId e o identificador exclusivo para sua identidade para o parâmetro identityId.

    using './control-plane-role-assignment.bicep'
    
    param roleDefinitionId = '<id-of-new-role-definition>'
    param identityId = '<id-of-existing-identity>'
    
  3. Implante este modelo Bicep usando az deployment group create.

    az deployment group create \
        --resource-group "<name-of-existing-resource-group>" \
        --parameters control-plane-role-assignment.bicepparam \
        --template-file control-plane-role-assignment.bicep
    
  4. Repita essas etapas para conceder acesso à conta de qualquer outra identidade que você queira usar.

    Dica

    Você pode repetir essas etapas para quantas identidades desejar. Normalmente, essas etapas são pelo menos repetidas para permitir que os desenvolvedores acessem uma conta usando sua identidade humana e para permitir que os aplicativos acessem usando uma identidade gerenciada.

  1. No painel Controle de acesso (IAM), clique em Adicionar e depois em Adicionar atribuição de função.

    Captura de tela da opção

  2. No painel Função, pesquise por Azure Cosmos DB e selecione a função Proprietário do Painel de Controle do Azure Cosmos DB criada anteriormente neste guia. Em seguida, selecione Avançar.

    Captura de tela do painel

    Dica

    Você pode opcionalmente filtrar a lista de funções para incluir apenas funções personalizadas.

  3. No painel Membros, selecione a opção Selecionar membros. Na caixa de diálogo "Membros", escolha a identidade para a qual deseja conceder esse nível de acesso à sua conta do Azure Cosmos DB e, em seguida, use a opção Selecionar para confirmar sua escolha.

    Captura de tela do painel

    Captura de tela da caixa de diálogo de seleção de identidade para adicionar uma atribuição de função.

    Observação

    Esta captura de tela ilustra um exemplo de usuário chamado "Kai Carter" com uma entidade de segurança kai@adventure-works.com.

  4. De volta ao painel Membros, revise os membros selecionados e, em seguida, clique em Revisar + atribuir.

    Captura de tela do painel

  5. No painel Revisar + atribuir, revise as opções especificadas para a nova atribuição de função. Por fim, selecione Examinar + atribuir.

    Captura de tela do painel

  6. Aguarde o portal terminar a criação da atribuição de função.

  1. Atribuir a nova função usando New-AzRoleAssignment. Use o nome da função para o parâmetro RoleDefinitionName e o identificador exclusivo da sua identidade para o parâmetro ObjectId.

    $parameters = @{
        ResourceGroupName = "<name-of-existing-resource-group>"
        ObjectId = "<your-principal-identifier>"
        RoleDefinitionName = "Azure Cosmos DB Control Plane Owner"
    }
    New-AzRoleAssignment @parameters
    
  2. Observe a saída do comando . A saída inclui um identificador exclusivo para a atribuição na propriedade RoleAssignmentId.

    RoleAssignmentName : ffffffff-5555-6666-7777-aaaaaaaaaaaa
    RoleAssignmentId   : /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.Authorization/roleAssignments/ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0
    Scope              : /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example
    DisplayName        : Kai Carter
    SignInName         : <kai@adventure-works.com>
    RoleDefinitionName : Azure Cosmos DB Control Plane Owner
    RoleDefinitionId   : e4e4e4e4-ffff-aaaa-bbbb-c5c5c5c5c5c5
    

    Observação

    Neste exemplo, a propriedade RoleAssignmentId é /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.Authorization/roleAssignments/ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0, que é outro exemplo fictício. Este é um subconjunto da saída típica da implantação, para facilitar o entendimento.

  3. Repita essas etapas para conceder acesso à conta de qualquer outra identidade que você queira usar.

    Dica

    Você pode repetir essas etapas para quantas identidades desejar. Normalmente, essas etapas são pelo menos repetidas para permitir que os desenvolvedores acessem uma conta usando sua identidade humana e para permitir que os aplicativos acessem usando uma identidade gerenciada.

Validar acesso ao painel de controle no código

Por fim, valide se você concedeu acesso corretamente usando o código do aplicativo e o SDK do Gerenciamento do Azure na sua linguagem de programação preferida.

using Azure.Identity;
using Azure.ResourceManager;

DefaultAzureCredential credential = new();

ArmClient client = new(credential);

Importante

Esse exemplo de código usa as bibliotecas Azure.ResourceManager.CosmosDB e Azure.Identity do NuGet.

Próxima etapa