共用方式為


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

適用於:NoSQL

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

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

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

重要

本文中的步驟只涵蓋控制平面存取,以在帳戶階層中的任何資源本身執行作業。 若要瞭解如何管理數據平面的專案和執行查詢,請參閱 授與數據平面角色型存取

必要條件

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

準備角色定義

首先,您必須準備角色定義,並列出 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) 在全域上是唯一的。

  1. 登入 Azure 入口網站 (https://portal.azure.com)。

  2. 在全域搜尋列中輸入 資源群組

    顯示全域搜尋列的 Azure 入口網站螢幕擷取畫面。

  3. 在 [服務] 中,選取 [資源群組]。

    搜尋選單中已選取 [資源群組] 選項的螢幕快照。

  4. 在 [ 資源群組] 窗格中,選取現有的資源群組。

    訂用帳戶資源群組清單中現有資源群組的螢幕快照。

    注意

    此範例螢幕快照包含 msdocs-identity-example 資源群組。 您的實際資源組名可能不同。

  5. 在資源群組的窗格中,選取 服務功能表中的 [存取控制][IAM ]。

    資源群組服務功能表中 [存取控制 (IAM)] 選項的螢幕快照。

  6. 在 [ 訪問控制 (IAM)] 窗格中,選取 [ 角色]。

    [存取控制 (IAM)] 窗格中 [角色] 選項的螢幕快照。

  7. 在 [角色]段中,使用搜尋詞組 Cosmos DB 並找出 Cosmos DB 操作員角色定義。 然後,選取與該定義相關聯的 [ 檢視] 選項。

    目前可指派範圍中角色定義清單的螢幕快照,該清單只會在標題中包含具有 『Cosmos DB』 的定義。

  8. 在 [ Cosmos DB 操作員 角色定義] 對話框中,觀察指派為此角色定義一部分的動作。

    [Cosmos DB 操作員] 對話框的螢幕快照,其中包含內建角色定義的詳細數據。

  9. 關閉 [ 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 中的資源。

重要

此指派工作會要求您已經有您想要授與角色型訪問控制許可權之任何身分識別的唯一標識符。

  1. 使用 az group show 再次取得目前資源群組的元數據。

    az group show \
        --name "<name-of-existing-resource-group>"
    
  2. 觀察上一個命令的輸出。 記錄此資源群組的 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。 此範例會使用虛構的數據,而且您的標識符會與這個範例不同。 這是輸出的截斷範例。

  3. 使用 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的 。 同樣地,您的角色識別碼會是不同的。

  4. 觀察 命令的輸出。 輸出包含 屬性中 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 另一個虛構範例。

  5. 重複這些步驟,從您想要使用的任何其他身分識別授與帳戶的存取權。

    提示

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

  1. 建立新的 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
      }
    }
    
  2. 建立名為 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>'
    
  3. 使用 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
    
  4. 重複這些步驟,從您想要使用的任何其他身分識別授與帳戶的存取權。

    提示

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

  1. 在 [訪問控制 (IAM)] 窗格中,選取 [新增],然後選取 [新增角色指派]。

    [新增] 選項之 [存取控制 (IAM)] 功能表中 [新增角色指派] 選項的螢幕快照。

  2. 在 [ 角色] 窗格中,搜尋 Azure Cosmos DB ,然後選取本指南稍早建立的 Azure Cosmos DB 控制平面擁有者 角色。 然後選取下一步

    用於新增角色指派的 [角色] 窗格螢幕快照。

    提示

    您可以選擇性地篩選角色清單,只包含自定義角色。

  3. 在 [ 成員] 窗格中,選取 [ 選取成員] 選項。 在 [成員] 對話框中,選取您想要為 Azure Cosmos DB 帳戶授與此層級存取權的身分識別,然後使用 [ 選取 ] 選項來確認您的選擇。

    用於新增角色指派的 [成員] 窗格螢幕快照。

    用於新增角色指派的身分識別選取對話框螢幕快照。

    注意

    此螢幕擷取畫面說明一個名為 "Kai Carter" 且主體為 kai@adventure-works.com 的範例使用者。

  4. 回到 [ 成員 ] 窗格中,檢閱選取的成員[s],然後選取 [ 檢閱 + 指派]。

    [成員] 窗格的螢幕快照,其中已選取角色指派的身分識別。

  5. 在 [ 檢閱 + 指派 ] 窗格中,檢閱新角色指派的指定選項。 最後,選取 [檢閱 + 指派]

    角色指派 [檢閱 + 建立] 窗格的螢幕快照。

  6. 等候入口網站完成角色指派的建立。

  1. 使用 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
    
  2. 觀察 命令的輸出。 輸出包含 屬性中 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 另一個虛構範例。 這是部署一般輸出的子集,為了清楚起見。

  3. 重複這些步驟,從您想要使用的任何其他身分識別授與帳戶的存取權。

    提示

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

驗證程式代碼中的控制平面存取

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

using Azure.Identity;
using Azure.ResourceManager;

DefaultAzureCredential credential = new();

ArmClient client = new(credential);

重要

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

後續步驟