共用方式為


搭配 Azure Cosmos DB for Table 使用角色型存取控制 (預覽)

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

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

本文逐步解說授與身分識別存取權,以管理 Azure Cosmos DB for Table 帳戶中的數據。 本文中的步驟只涵蓋數據平面存取,以對個別專案執行作業並執行查詢。

必要條件

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

準備角色定義

首先,您必須準備具有 清單 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 中的數據。

重要

此指派工作會要求您擁有任何想要授與角色型訪問控制許可權之身分識別的唯一標識符。 如果您沒有身分識別的唯一標識符,請遵循建立受控識別取得登入身分識別指南中的指示。

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

    az cosmosdb show \
        --resource-group "<name-of-existing-resource-group>" \
        --name "<name-of-existing-resource-group>" \
        --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. 建立名為 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。

  4. 現在,使用 az cosmosdb showaz rest 一起建立或更新角色指派,以發出 HTTP PUT 要求。 在此要求中,請為角色指派指定唯一的 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。

  1. 建立另一個 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
    
  2. 建立名為 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>'
    
  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. 現在,使用 Get-AzCosmosDBAccountInvoke-AzRestMethod 一起建立或更新角色指派,以發出 HTTP PUT 要求。 在此要求中,請為角色指派指定唯一的 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.TablesAzure.Identity 連結庫。

警告

如果您使用使用者指派的受控識別,您必須在建立認證物件時指定受控識別的唯一標識符。