搭配 Azure Cosmos DB for Table 使用角色型存取控制 (預覽)
部署指南順序的圖表,包括這些位置,依序排列:概觀、概念、準備、角色型訪問控制和參考。 「角色型訪問控制」位置目前已醒目提示。
本文逐步解說授與身分識別存取權,以管理 Azure Cosmos DB for Table 帳戶中的數據。 本文中的步驟只涵蓋數據平面存取,以對個別專案執行作業並執行查詢。
必要條件
- 具有有效訂用帳戶的 Azure 帳戶。 免費建立帳戶。
- 適用於數據表帳戶的現有 Azure Cosmos DB。
- 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。
準備角色定義
首先,您必須準備具有 清單 dataActions
的角色定義,以授與 Azure Cosmos DB for Table 中讀取、查詢及管理數據的存取權。
首先,使用 az cosmsodb show
取得現有 Azure Cosmos DB for Table 帳戶的資源識別碼,並將其儲存在變數中。 然後,使用 az rest
列出與您的 Azure Cosmos DB for Table 帳戶相關聯的所有角色定義。 最後,檢閱輸出,並找出名為 Cosmos DB內建數據參與者的角色定義。 輸出包含 屬性中 id
角色定義的唯一標識碼。 請記錄此值,因為本指南稍後必須在指派步驟中使用。
resourceId=$( \
az cosmosdb show \
--resource-group "<name-of-existing-resource-group>" \
--name "<name-of-existing-table-account>" \
--query "id" \
--output tsv \
)
az rest \
--method "GET" \
--url $resourceId/tableRoleDefinitions?api-version=2023-04-15
[
...,
{
"id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/tableRoleDefinitions/00000000-0000-0000-0000-000000000002",
"name": "00000000-0000-0000-0000-000000000002",
"properties": {
"assignableScopes": [
"/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql"
],
"permissions": [
{
"dataActions": [
"Microsoft.DocumentDB/databaseAccounts/readMetadata",
"Microsoft.DocumentDB/databaseAccounts/tables/*",
"Microsoft.DocumentDB/databaseAccounts/tables/containers/entities/*"
],
"notDataActions": []
}
],
"roleName": "Cosmos DB Built-in Data Contributor",
"type": "BuiltInRole"
},
"type": "Microsoft.DocumentDB/databaseAccounts/tableRoleDefinitions"
}
...
]
注意
在此範例中,id
值會是 /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/tableRoleDefinitions/00000000-0000-0000-0000-000000000002
。 此範例會使用虛構的數據,而且您的標識符會與這個範例不同。 此範例輸出已截斷。
用來 Get-AzCosmosDBAccount
取得現有 Azure Cosmos DB for Table 帳戶的資源識別碼,並將其儲存在變數中。 然後,使用 Invoke-AzRestMethod
列出與 Azure Cosmos DB for Table 帳戶相關聯的所有角色定義。 檢閱輸出,並找出名為 Cosmos DB內建數據參與者的角色定義。 輸出包含 屬性中 Id
角色定義的唯一標識碼。 請記錄此值,因為本指南稍後必須在指派步驟中使用。
$parameters = @{
ResourceGroupName = "<name-of-existing-resource-group>"
Name = "<name-of-existing-table-account>"
}
$resourceId = (
Get-AzCosmosDBAccount @parameters |
Select-Object -Property Id -First 1
).Id
$parameters = @{
Path = "$resourceId/tableRoleDefinitions?api-version=2023-04-15"
Method = "GET"
}
Invoke-AzRestMethod @parameters
StatusCode : 200
Content : {
"value": [
...,
{
"id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/tableRoleDefinitions/00000000-0000-0000-0000-000000000002",
"name": "00000000-0000-0000-0000-000000000002",
"properties": {
"assignableScopes": [
"/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql"
],
"permissions": [
{
"dataActions": [
"Microsoft.DocumentDB/databaseAccounts/readMetadata",
"Microsoft.DocumentDB/databaseAccounts/tables/*",
"Microsoft.DocumentDB/databaseAccounts/tables/containers/entities/*"
],
"notDataActions": []
}
],
"roleName": "Cosmos DB Built-in Data Contributor",
"type": "BuiltInRole"
},
"type": "Microsoft.DocumentDB/databaseAccounts/tableRoleDefinitions"
}
...
]
}
...
注意
在此範例中,Id
值會是 /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/tableRoleDefinitions/00000000-0000-0000-0000-000000000002
。 此範例會使用虛構的數據,而且您的標識符會與這個範例不同。 此範例輸出已截斷。
將角色指派給身分識別
現在,將新定義的角色指派給身分識別,讓您的應用程式可以存取 Azure Cosmos DB for Table 中的數據。
使用
az cosmosdb show
取得您目前帳戶的唯一標識碼。az cosmosdb show \ --resource-group "<name-of-existing-resource-group>" \ --name "<name-of-existing-resource-group>" \ --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
。 此範例會使用虛構的數據,而且您的標識符會與這個範例不同。建立名為 role-assignment.json 的新 JSON 檔案。 在 JSON 檔案中,新增您身分識別的唯一標識碼和帳戶資源的唯一標識碼。
{ "properties": { "roleDefinitionId": "<account-resource-id>/tableRoleDefinitions/d3d3d3d3-eeee-ffff-aaaa-b4b4b4b4b4b4", "scope": "<account-resource-id>", "principalId": "<id-of-existing-identity>" } }
注意
在這裡範例中,指定的唯一 GUID 是
d3d3d3d3-eeee-ffff-aaaa-b4b4b4b4b4b4
。 您可以使用您先前用於自己角色定義的唯一 GUID。現在,使用
az cosmosdb show
和az rest
一起建立或更新角色指派,以發出 HTTPPUT
要求。 在此要求中,請為角色指派指定唯一的 GUID。resourceId=$( \ az cosmosdb show \ --resource-group "<name-of-existing-resource-group>" \ --name "<name-of-existing-table-account>" \ --query "id" \ --output tsv \ ) az rest \ --method "PUT" \ --url $resourceId/tableRoleAssignments/e4e4e4e4-ffff-aaaa-bbbb-c5c5c5c5c5c5?api-version=2023-04-15 \ --body @role-assignment.json
注意
在這裡範例中,指定的唯一 GUID 是
e4e4e4e4-ffff-aaaa-bbbb-c5c5c5c5c5c5
。 您可以為自己的角色指派指定任何唯一的 GUID。
建立另一個 Bicep 檔案,將角色指派給身分識別。 將此檔案 命名為 data-plane-role-assignment.bicep。
metadata description = 'Assign RBAC role for data plane access to Azure Cosmos DB for Table.' @description('Name of the Azure Cosmos DB for Table 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@2023-04-15' existing = { name: accountName } resource assignment 'Microsoft.DocumentDB/databaseAccounts/tableRoleAssignments@2023-04-15' = { name: guid(roleDefinitionId, identityId, account.id) parent: account properties: { principalId: identityId roleDefinitionId: roleDefinitionId scope: account.id } } output id string = assignment.id
建立名為
data-plane-role-assignment.bicepparam
的新 Bicep 參數檔案。 在此參數檔案中;將現有 Azure Cosmos DB for Table 帳戶的名稱指派給accountName
參數、先前記錄的角色定義標識碼給roleDefinitionId
參數,並將您身分識別的唯一標識符指派給identityId
參數。using './data-plane-role-assignment.bicep' param accountName = '<name-of-existing-table-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
。 此範例會使用虛構的數據,而且您的標識符會與這個範例不同。現在,使用
Get-AzCosmosDBAccount
和Invoke-AzRestMethod
一起建立或更新角色指派,以發出 HTTPPUT
要求。 在此要求中,請為角色指派指定唯一的 GUID。 最後,建立資源指派承載,指定您身分識別的唯一標識符。$parameters = @{ ResourceGroupName = "<name-of-existing-resource-group>" Name = "<name-of-existing-table-account>" } $resourceId = ( Get-AzCosmosDBAccount @parameters | Select-Object -Property Id -First 1 ).Id $payload = @{ properties = @{ roleDefinitionId = "$resourceId/tableRoleDefinitions/00000000-0000-0000-0000-000000000002" scope = "$resourceId" principalId = "<id-of-existing-identity>" } } $parameters = @{ Path = "$resourceId/tableRoleAssignments/e4e4e4e4-ffff-aaaa-bbbb-c5c5c5c5c5c5?api-version=2023-04-15" Method = "PUT" Payload = $payload | ConvertTo-Json -Depth 2 } Invoke-AzRestMethod @parameters
注意
在這裡範例中,指定的唯一 GUID 是
e4e4e4e4-ffff-aaaa-bbbb-c5c5c5c5c5c5
。 您可以為自己的角色指派指定任何唯一的 GUID。
驗證程式代碼中的數據平面存取
最後,使用您慣用的程式設計語言使用應用程式程式代碼和 Azure SDK,驗證您是否已正確授與存取權。
using Azure.Identity;
using Azure.Data.Tables;
string endpoint = "<account-endpoint>";
DefaultAzureCredential credential = new();
TableServiceClient client = new(
endpoint: new Uri(endpoint),
tokenCredential: credential
);
TableClient table = client.GetTableClient(
tableName: "<name-of-table>"
);
重要
此程式代碼範例會使用 NuGet 中的 Azure.Data.Tables
和 Azure.Identity
連結庫。
警告
如果您使用使用者指派的受控識別,您必須在建立認證物件時指定受控識別的唯一標識符。