搭配適用於 NoSQL 的 Azure Cosmos DB 使用數據平面角色型訪問控制
適用於:NoSQL
部署指南順序的圖表,包括這些位置,順序如下:概觀、概念、準備、角色型訪問控制、網路和參考。 「角色型訪問控制」位置目前已醒目提示。
提示
如需建置新應用程式的最新範例,請瀏覽我們的新範例資源庫
本文將逐步解說授與身分識別存取權,以管理適用於 NoSQL 的 Azure Cosmos DB 帳戶中的數據。
重要
本文中的步驟只涵蓋數據平面存取,以對個別專案執行作業並執行查詢。 若要瞭解如何管理控制平面的資料庫和容器,請參閱 授與控制平面角色型存取。
必要條件
- 具有有效訂用帳戶的 Azure 帳戶。 免費建立帳戶。
- 現有的 Azure Cosmos DB for NoSQL 帳戶。
- Microsoft Entra ID 中的一或多個現有身分識別。
在 Azure Cloud Shell 中使用 Bash 環境。 如需詳細資訊,請參閱 Azure Cloud Shell 中的 Bash 快速入門。
若要在本地執行 CLI 參考命令,請安裝 Azure CLI。 若您在 Windows 或 macOS 上執行,請考慮在 Docker 容器中執行 Azure CLI。 如需詳細資訊,請參閱〈如何在 Docker 容器中執行 Azure CLI〉。
如果您使用的是本機安裝,請使用 az login 命令,透過 Azure CLI 來登入。 請遵循您終端機上顯示的步驟,完成驗證程序。 如需其他登入選項,請參閱使用 Azure CLI 登入。
出現提示時,請在第一次使用時安裝 Azure CLI 延伸模組。 如需擴充功能詳細資訊,請參閱使用 Azure CLI 擴充功能。
執行 az version 以尋找已安裝的版本和相依程式庫。 若要升級至最新版本,請執行 az upgrade。
- 如果您選擇在本機使用 Azure PowerShell:
- 安裝最新版的 Az PowerShell 模組。
- 使用 Connect-AzAccount Cmdlet 連線至 Azure 帳戶。
- 如果您選擇使用 Azure Cloud Shell:
- 請參閱 Azure Cloud Shell 概觀 以取得詳細資訊。
準備角色定義
首先,您必須準備具有 清單 dataActions
的角色定義,以授與 Azure Cosmos DB for NoSQL 中讀取、查詢及管理數據的存取權。
重要
取得現有的數據平面角色定義需要這些控制平面許可權:
Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions/read
如需詳細資訊,請參閱 授與控制平面角色型存取。
使用 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 中的數據。
重要
建立新的數據平面角色指派需要這些控制平面許可權:
Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions/read
Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments/read
Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments/write
如需詳細資訊,請參閱 授與控制平面角色型存取。
使用
az cosmosdb show
取得您目前帳戶的唯一標識碼。az cosmosdb show \ --resource-group "<name-of-existing-resource-group>" \ --name "<name-of-existing-nosql-account>" \ --query "{id:id}"
觀察上一個命令的輸出。 記錄此帳戶的
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
。 此範例會使用虛構的數據,而且您的標識符會與這個範例不同。使用
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"
用來
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>"
建立新的 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
建立名為 data-plane-role-assignment
bicepparam
的新 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>'
使用
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
重複這些步驟,從您想要使用的任何其他身分識別授與帳戶的存取權。
提示
您可以針對您想要的身分識別重複這些步驟。 一般而言,這些步驟至少會重複執行,以允許開發人員使用其人為身分識別存取帳戶,並允許應用程式使用受控識別進行存取。
使用
Get-AzCosmosDBAccount
取得您目前帳戶的元數據。$parameters = @{ ResourceGroupName = "<name-of-existing-resource-group>" Name = "<name-of-existing-nosql-account>" } Get-AzCosmosDBAccount @parameters | Select -Property Id
觀察上一個命令的輸出。 記錄此帳戶的
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
。 此範例會使用虛構的數據,而且您的標識符會與這個範例不同。使用
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
使用
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.Cosmos
和 Azure.Identity
連結庫。