搭配適用於 NoSQL 的 Azure Cosmos DB 使用控制平面角色型訪問控制
適用於:NoSQL
部署指南順序的圖表,包括這些位置,順序如下:概觀、概念、準備、角色型訪問控制、網路和參考。 「角色型訪問控制」位置目前已醒目提示。
本文將逐步解說授與身分識別存取權,以管理適用於 NoSQL 的 Azure Cosmos DB 帳戶及其資源。
重要
本文中的步驟只涵蓋控制平面存取,以在帳戶階層中的任何資源本身執行作業。 若要瞭解如何管理控制平面的角色、定義和指派,請參閱 授與數據平面角色型存取。
必要條件
- 具有有效訂用帳戶的 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。
- 如果您選擇在本機使用 Azure PowerShell:
- 安裝最新版的 Az PowerShell 模組。
- 使用 Connect-AzAccount Cmdlet 連線至 Azure 帳戶。
- 如果您選擇使用 Azure Cloud Shell:
- 請參閱 Azure Cloud Shell 概觀 以取得詳細資訊。
準備角色定義
首先,您必須準備角色定義,並列出 actions
,以授與存取權以管理 Azure Cosmos DB 中的帳戶資源。
使用 az role definition list
列出與您的 Azure Cosmos DB 帳戶相關聯的所有角色定義。 檢閱輸出,並找出名為 Cosmos DB內建數據參與者的角色定義。 輸出包含 屬性中 id
角色定義的唯一標識碼。 請記錄此值,因為本指南稍後必須在指派步驟中使用。
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",
}
]
注意
在此範例中,id
值會是 /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/providers/Microsoft.Authorization/roleDefinitions/230815da-be43-4aae-9cb4-875f7bd000aa
。 此範例會使用虛構的數據,而且您的標識符會與這個範例不同。 不過,在 Azure 中的所有角色定義中,標識碼 (230815da-be43-4aae-9cb4-875f7bd000aa
) 在全域上是唯一的。
登入 Azure 入口網站 (https://portal.azure.com)。
在全域搜尋列中輸入 資源群組 。
在 [服務] 中,選取 [資源群組]。
在 [ 資源群組] 窗格中,選取現有的資源群組。
注意
此範例螢幕快照包含
msdocs-identity-example
資源群組。 您的實際資源組名可能不同。在資源群組的窗格中,選取 服務功能表中的 [存取控制][IAM ]。
在 [ 訪問控制 (IAM)] 窗格中,選取 [ 角色]。
在 [角色] 區段中,使用搜尋詞組 Cosmos DB 並找出 Cosmos DB 操作員角色定義。 然後,選取與該定義相關聯的 [ 檢視] 選項。
在 [ Cosmos DB 操作員 角色定義] 對話框中,觀察指派為此角色定義一部分的動作。
關閉 [ Cosmos DB 操作員 角色定義] 對話方塊。
使用 Get-AzRoleDefinition
列出與您的 Azure Cosmos DB 帳戶相關聯的所有角色定義。 檢閱輸出,並找出名為 Cosmos DB內建數據參與者的角色定義。 輸出包含 屬性中 Id
角色定義的唯一標識碼。 請記錄此值,因為本指南稍後必須在指派步驟中使用。
$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 : {/}
注意
在此範例中,Id
值會是 230815da-be43-4aae-9cb4-875f7bd000aa
。 標識元在 Azure 中的所有角色定義中都是全域唯一的。
將角色指派給身分識別
現在,將新定義的角色指派給身分識別,讓您的應用程式可以存取 Azure Cosmos DB 中的資源。
重要
此指派工作會要求您已經有您想要授與角色型訪問控制許可權之任何身分識別的唯一標識符。
使用
az group show
再次取得目前資源群組的元數據。az group show \ --name "<name-of-existing-resource-group>"
觀察上一個命令的輸出。 記錄此資源群組的
id
屬性值,因為下一個步驟需要使用此屬性。{ "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example", "location": "westus", "name": "msdocs-identity-example", "type": "Microsoft.Resources/resourceGroups" }
注意
在此範例中,
id
值會是/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example
。 此範例會使用虛構的數據,而且您的標識符會與這個範例不同。 這是輸出的截斷範例。使用
az role assignment create
指派新角色。 使用資源群組的自變數標識碼--scope
、自變數的角色標識碼-role
,以及您身分識別的唯一標識碼至--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"
注意
在此範例命令中,
scope
已設定為上一個步驟範例中的虛構範例/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example
。 您的資源群組標識碼會與這個範例不同。role
也設定為虛構/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.Authorization/roleDefinitions/ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0
的 。 同樣地,您的角色識別碼會是不同的。觀察 命令的輸出。 輸出包含 屬性中
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" }
注意
在此範例中
id
,屬性是/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.Authorization/roleAssignments/ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0
另一個虛構範例。重複這些步驟,從您想要使用的任何其他身分識別授與帳戶的存取權。
提示
您可以針對您想要的身分識別重複這些步驟。 一般而言,這些步驟至少會重複執行,以允許開發人員使用其人為身分識別存取帳戶,並允許應用程式使用受控識別進行存取。
建立新的 Bicep 檔案,以定義您的角色指派。 將檔案 命名為 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 } }
建立名為 control-plane-role-assignment 的新 Bicep 參數檔案。
bicepparam
在此參數檔案中;將先前記錄的角色定義標識碼指派給roleDefinitionId
參數,並將您身分識別的唯一標識符指派給identityId
參數。using './control-plane-role-assignment.bicep' 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 control-plane-role-assignment.bicepparam \ --template-file control-plane-role-assignment.bicep
重複這些步驟,從您想要使用的任何其他身分識別授與帳戶的存取權。
提示
您可以針對您想要的身分識別重複這些步驟。 一般而言,這些步驟至少會重複執行,以允許開發人員使用其人為身分識別存取帳戶,並允許應用程式使用受控識別進行存取。
在 [訪問控制 (IAM)] 窗格中,選取 [新增],然後選取 [新增角色指派]。
在 [ 角色] 窗格中,搜尋
Azure Cosmos DB
,然後選取本指南稍早建立的 Azure Cosmos DB 控制平面擁有者 角色。 然後選取下一步。提示
您可以選擇性地篩選角色清單,只包含自定義角色。
在 [ 成員] 窗格中,選取 [ 選取成員] 選項。 在 [成員] 對話框中,選取您想要為 Azure Cosmos DB 帳戶授與此層級存取權的身分識別,然後使用 [ 選取 ] 選項來確認您的選擇。
注意
此螢幕擷取畫面說明一個名為 "Kai Carter" 且主體為
kai@adventure-works.com
的範例使用者。回到 [ 成員 ] 窗格中,檢閱選取的成員[s],然後選取 [ 檢閱 + 指派]。
在 [ 檢閱 + 指派 ] 窗格中,檢閱新角色指派的指定選項。 最後,選取 [檢閱 + 指派]。
等候入口網站完成角色指派的建立。
使用
New-AzRoleAssignment
指派新角色。 將角色的名稱用於RoleDefinitionName
參數,並將您身分識別的唯一標識碼用於ObjectId
參數。$parameters = @{ ResourceGroupName = "<name-of-existing-resource-group>" ObjectId = "<your-principal-identifier>" RoleDefinitionName = "Azure Cosmos DB Control Plane Owner" } New-AzRoleAssignment @parameters
觀察 命令的輸出。 輸出包含 屬性中
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
注意
在此範例中
RoleAssignmentId
,屬性是/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.Authorization/roleAssignments/ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0
另一個虛構範例。 這是部署一般輸出的子集,為了清楚起見。重複這些步驟,從您想要使用的任何其他身分識別授與帳戶的存取權。
提示
您可以針對您想要的身分識別重複這些步驟。 一般而言,這些步驟至少會重複執行,以允許開發人員使用其人為身分識別存取帳戶,並允許應用程式使用受控識別進行存取。
驗證程式代碼中的控制平面存取
最後,使用您慣用的程式設計語言使用應用程式程式代碼和 Azure 管理 SDK,驗證您是否已正確授與存取權。
using Azure.Identity;
using Azure.ResourceManager;
DefaultAzureCredential credential = new();
ArmClient client = new(credential);
重要
此程式代碼範例會使用 NuGet 中的 Azure.ResourceManager.CosmosDB
和 Azure.Identity
連結庫。