搭配適用於 NoSQL 的 Azure Cosmos DB 使用數據平面角色型訪問控制

適用於:NoSQL

部署指南順序中目前位置 (『角色型存取控制』) 的圖表。

部署指南順序的圖表,包括這些位置,順序如下:概觀、概念、準備、角色型訪問控制、網路和參考。 「角色型訪問控制」位置目前已醒目提示。

本文將逐步解說授與身分識別存取權,以管理適用於 NoSQL 的 Azure Cosmos DB 帳戶中的數據。

重要

本文中的步驟只涵蓋數據平面存取,以對個別專案執行作業並執行查詢。 若要瞭解如何管理控制平面的角色、定義和指派,請參閱 授與控制平面角色型存取

必要條件

  • 具有有效訂用帳戶的 Azure 帳戶。 免費建立帳戶
  • 現有的 Azure Cosmos DB for NoSQL 帳戶。
  • Microsoft Entra ID 中的一或多個現有身分識別。

準備角色定義

首先,您必須準備具有 清單 dataActions 的角色定義,以授與 Azure Cosmos DB for NoSQL 中讀取、查詢及管理數據的存取權。

使用 az cosmosdb sql role definition list列出與適用於 NoSQL 的 Azure Cosmos DB 帳戶相關聯的所有角色定義。 檢閱輸出,並找出名為 Cosmos DB內建數據參與者的角色定義。 輸出包含 屬性中 id 角色定義的唯一標識碼。 請記錄此值,因為本指南稍後必須在指派步驟中使用。

az cosmosdb sql role definition list \
    --resource-group "<name-of-existing-resource-group>" \
    --account-name "<name-of-existing-nosql-account>"
[
  ...,
  {
    "assignableScopes": [
      "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql"
    ],
    "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/sqlRoleDefinitions/00000000-0000-0000-0000-000000000002",
    "name": "00000000-0000-0000-0000-000000000002",
    "permissions": [
      {
        "dataActions": [
          "Microsoft.DocumentDB/databaseAccounts/readMetadata",
          "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/*",
          "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/*"
        ],
        "notDataActions": []
      }
    ],
    "resourceGroup": "msdocs-identity-example",
    "roleName": "Cosmos DB Built-in Data Contributor",
    "type": "Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions",
    "typePropertiesType": "BuiltInRole"
  }
  ...
]

注意

在此範例中,id 值會是 /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/sqlRoleDefinitions/00000000-0000-0000-0000-000000000002。 此範例會使用虛構的數據,而且您的標識符會與這個範例不同。

用來 Get-AzCosmosDBSqlRoleDefinition 列出與適用於 NoSQL 的 Azure Cosmos DB 帳戶相關聯的所有角色定義。 檢閱輸出,並找出名為 Cosmos DB內建數據參與者的角色定義。 輸出包含 屬性中 Id 角色定義的唯一標識碼。 請記錄此值,因為本指南稍後必須在指派步驟中使用。

$parameters = @{
    ResourceGroupName = "<name-of-existing-resource-group>"
    AccountName = "<name-of-existing-nosql-account>"
}
Get-AzCosmosDBSqlRoleDefinition @parameters
Id                         : /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/sqlRoleDefinitions/00000000-0000-0000-0000-000000000002
RoleName                   : Cosmos DB Built-in Data Contributor
Type                       : BuiltInRole
AssignableScopes           : {/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccountsmsdocs-identity-example-nosql}
Permissions.DataActions    : {Microsoft.DocumentDB/databaseAccounts/readMetadata, Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/*, Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/*}
Permissions.NotDataActions : 

注意

在此範例中,Id 值會是 /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/sqlRoleDefinitions/00000000-0000-0000-0000-000000000002。 此範例會使用虛構的數據,而且您的標識符會與這個範例不同。 不過,在您的帳戶中的所有角色定義中,標識碼 (00000000-0000-0000-0000-000000000002) 是唯一的。

將角色指派給身分識別

現在,將新定義的角色指派給身分識別,讓您的應用程式可以存取適用於 NoSQL 的 Azure Cosmos DB 中的數據。

  1. 使用 az cosmosdb show 取得您目前帳戶的唯一標識碼。

    az cosmosdb show \
        --resource-group "<name-of-existing-resource-group>" \
        --name "<name-of-existing-nosql-account>" \
        --query "{id:id}"
    
  2. 觀察上一個命令的輸出。 記錄此帳戶的 id 屬性值,因為下一個步驟需要使用 。

    {
      "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql"
    }
    

    注意

    在此範例中,id 值會是 /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql。 此範例會使用虛構的數據,而且您的標識符會與這個範例不同。

  3. 使用 az cosmosdb sql role assignment create指派新角色。 使用先前記錄的角色定義標識碼至 --role-definition-id 自變數,並將您身分識別的唯一標識碼用於 --principal-id 自變數。 最後,使用您帳戶的自變數標識碼 --scope

    az cosmosdb sql role assignment create \
        --resource-group "<name-of-existing-resource-group>" \
        --account-name "<name-of-existing-nosql-account>" \
        --role-definition-id "<id-of-new-role-definition>" \
        --principal-id "<id-of-existing-identity>" \
        --scope "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql"
    
  4. 用來 az cosmosdb sql role assignment list 列出適用於 NoSQL 的 Azure Cosmos DB 帳戶的所有角色指派。 檢閱輸出,以確保已建立角色指派。

    az cosmosdb sql role assignment list \
        --resource-group "<name-of-existing-resource-group>" \
        --account-name "<name-of-existing-nosql-account>"
    
  1. 建立新的 Bicep 檔案,以定義您的角色指派。 將檔案 命名為 data-plane-role-assignment.bicep

    metadata description = 'Assign RBAC role for data plane access to Azure Cosmos DB for NoSQL.'
    
    @description('Name of the Azure Cosmos DB for NoSQL account.')
    param accountName string
    
    @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 account 'Microsoft.DocumentDB/databaseAccounts@2024-05-15' existing = {
      name: accountName
    }
    
    resource assignment 'Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments@2024-05-15' = {
      name: guid(roleDefinitionId, identityId, account.id)
      parent: account
      properties: {
        principalId: identityId
        roleDefinitionId: roleDefinitionId
        scope: account.id
      }
    }
    
    output assignmentId string = assignment.id
    
  2. 建立名為 data-plane-role-assignmentbicepparam 的新 Bicep 參數檔案。 在此參數檔案中,將現有適用於 NoSQL 帳戶的 Azure Cosmos DB 名稱指派給 accountName 參數、先前記錄的角色定義標識元給 roleDefinitionId 參數,並將您身分識別的唯一標識符指派給 identityId 參數。

    using './data-plane-role-assignment.bicep'
    
    param accountName = '<name-of-existing-nosql-account>'
    param roleDefinitionId = '<id-of-new-role-definition>'
    param identityId = '<id-of-existing-identity>'
    
  3. 使用 az deployment group create 部署 Bicep 範本。

    az deployment group create \
        --resource-group "<name-of-existing-resource-group>" \
        --parameters data-plane-role-assignment.bicepparam \
        --template-file data-plane-role-assignment.bicep
    
  4. 重複這些步驟,從您想要使用的任何其他身分識別授與帳戶的存取權。

    提示

    您可以針對您想要的身分識別重複這些步驟。 一般而言,這些步驟至少會重複執行,以允許開發人員使用其人為身分識別存取帳戶,並允許應用程式使用受控識別進行存取。

  1. 使用 Get-AzCosmosDBAccount 取得您目前帳戶的元數據。

    $parameters = @{
        ResourceGroupName = "<name-of-existing-resource-group>"
        Name = "<name-of-existing-nosql-account>"
    }    
    Get-AzCosmosDBAccount @parameters | Select -Property Id
    
  2. 觀察上一個命令的輸出。 記錄此帳戶的 Id 屬性值,因為下一個步驟需要使用 。

    Id
    --    
    /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql
    

    注意

    在此範例中,Id 值會是 /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql。 此範例會使用虛構的數據,而且您的標識符會與這個範例不同。

  3. 使用 New-AzCosmosDBSqlRoleAssignment 來指派新的角色。 將先前記錄的角色定義標識碼用於 RoleDefinitionId 參數,並將您身分識別的唯一標識碼用於 PrincipalId 參數。 最後,針對參數使用您的帳戶標識碼 Scope

    $parameters = @{
        ResourceGroupName = "<name-of-existing-resource-group>"
        AccountName = "<name-of-existing-nosql-account>"
        RoleDefinitionId = "<id-of-new-role-definition>"
        PrincipalId = "<id-of-existing-identity>"
        Scope = "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql"
    }    
    New-AzCosmosDBSqlRoleAssignment @parameters
    
  4. 使用 Get-AzCosmosDBSqlRoleAssignment列出適用於 NoSQL 的 Azure Cosmos DB 帳戶的所有角色指派。 檢閱輸出,以確保已建立角色指派。

    $parameters = @{
        ResourceGroupName = "<name-of-existing-resource-group>"
        AccountName = "<name-of-existing-nosql-account>"
    }
    Get-AzCosmosDBSqlRoleAssignment @parameters
    

驗證程式代碼中的數據平面存取

最後,使用您慣用的程式設計語言使用應用程式程式代碼和 Azure SDK,驗證您是否已正確授與存取權。

using Azure.Core;
using Azure.Identity;
using Microsoft.Azure.Cosmos;

string endpoint = "<account-endpoint>";

TokenCredential credential = new DefaultAzureCredential();

CosmosClient client = new(endpoint, credential);

重要

此程式代碼範例會使用 NuGet 中的 Microsoft.Azure.CosmosAzure.Identity 連結庫。