Sdílet prostřednictvím


Použití řízení přístupu na základě role se službou Azure Cosmos DB for Table (Preview)

Diagram aktuálního umístění (řízení přístupu na základě role) v posloupnosti průvodce nasazením

Diagram posloupnosti průvodce nasazením, včetně těchto umístění, v uvedeném pořadí: Přehled, Koncepty, Příprava, Řízení přístupu na základě role a Reference Umístění Řízení přístupu na základě role je aktuálně zvýrazněné.

Tento článek vás provede postupem udělení přístupu k identitě pro správu dat v účtu služby Azure Cosmos DB for Table. Kroky v tomto článku pokrývají pouze přístup roviny dat k provádění operací s jednotlivými položkami a spouštění dotazů.

Požadavky

  • Účet Azure s aktivním předplatným. Vytvoření účtu zdarma
  • Existující účet služby Azure Cosmos DB for Table.
  • Jedna nebo více existujících identit v Microsoft Entra ID.

Příprava definice role

Nejprve musíte připravit definici role se seznamem dataActions pro udělení přístupu ke čtení, dotazování a správě dat ve službě Azure Cosmos DB for Table.

Nejprve získejte identifikátor prostředku existujícího účtu služby Azure Cosmos DB pro tabulku a az cosmsodb show uložte ho do proměnné. Pak vypíšete seznam všech definic rolí přidružených k vašemu účtu tabulky Azure Cosmos DB pomocí az rest. Nakonec si prohlédněte výstup a vyhledejte definici role s názvem Předdefinovaný přispěvatel dat cosmos DB. Výstup obsahuje jedinečný identifikátor definice role ve id vlastnosti. Tuto hodnotu si poznamenejte, protože je potřeba ji použít v kroku přiřazení dále v tomto průvodci.

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"
  }
  ...
]

Poznámka:

V tomto příkladu id by hodnota byla /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/tableRoleDefinitions/00000000-0000-0000-0000-000000000002. Tento příklad používá fiktivní data a váš identifikátor by se od tohoto příkladu odlišil. Tento příklad výstupu je zkrácený.

Slouží Get-AzCosmosDBAccount k získání identifikátoru prostředku existujícího účtu služby Azure Cosmos DB for Table a jeho uložení do proměnné. Pak použijte Invoke-AzRestMethod k výpisu všech definic rolí přidružených k vašemu účtu tabulky Azure Cosmos DB. Zkontrolujte výstup a vyhledejte definici role s názvem Předdefinovaný přispěvatel dat Cosmos DB. Výstup obsahuje jedinečný identifikátor definice role ve Id vlastnosti. Tuto hodnotu si poznamenejte, protože je potřeba ji použít v kroku přiřazení dále v tomto průvodci.

$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"
                }
                ...
               ]
             }
...

Poznámka:

V tomto příkladu Id by hodnota byla /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/tableRoleDefinitions/00000000-0000-0000-0000-000000000002. Tento příklad používá fiktivní data a váš identifikátor by se od tohoto příkladu odlišil. Tento příklad výstupu je zkrácený.

Přiřazení role identitě

Teď přiřaďte nově definovanou roli identitě, aby vaše aplikace mohly přistupovat k datům ve službě Azure Cosmos DB for Table.

Důležité

Tento úkol přiřazení vyžaduje, abyste měli jedinečný identifikátor jakékoli identity, kterou chcete udělit oprávnění řízení přístupu na základě role. Pokud nemáte jedinečný identifikátor identity, postupujte podle pokynů v průvodci vytvořením spravované identity nebo získejte příručky pro přihlášení k identitě .

  1. Slouží az cosmosdb show k získání jedinečného identifikátoru pro váš aktuální účet.

    az cosmosdb show \
        --resource-group "<name-of-existing-resource-group>" \
        --name "<name-of-existing-resource-group>" \
        --query "{id:id}"
    
  2. Prohlédněte si výstup předchozího příkazu. Poznamenejte si hodnotu id vlastnosti pro tento účet, protože je nutné ji použít v dalším kroku.

    {
      "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql"
    }
    

    Poznámka:

    V tomto příkladu id by hodnota byla /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql. Tento příklad používá fiktivní data a váš identifikátor by se od tohoto příkladu odlišil.

  3. Vytvořte nový soubor JSON s názvem role-assignment.json. Do souboru JSON přidejte jedinečný identifikátor vaší identity a jedinečný identifikátor prostředku účtu.

    {
      "properties": {
        "roleDefinitionId": "<account-resource-id>/tableRoleDefinitions/d3d3d3d3-eeee-ffff-aaaa-b4b4b4b4b4b4",
        "scope": "<account-resource-id>",
        "principalId": "<id-of-existing-identity>"
      }
    }
    

    Poznámka:

    V tomto příkladu byl d3d3d3d3-eeee-ffff-aaaa-b4b4b4b4b4b4zadaný jedinečný identifikátor GUID . Jedinečný identifikátor GUID, který jste použili dříve pro vlastní definici role, můžete použít.

  4. Teď vytvořte nebo aktualizujte přiřazení role pomocí az cosmosdb show a az rest společně za účelem vydání požadavku HTTP PUT . V rámci tohoto požadavku zadejte jedinečný identifikátor GUID pro přiřazení role.

    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
    

    Poznámka:

    V tomto příkladu byl e4e4e4e4-ffff-aaaa-bbbb-c5c5c5c5c5c5zadaný jedinečný identifikátor GUID . Můžete zadat libovolný jedinečný identifikátor GUID pro vlastní přiřazení role.

  1. Vytvořte další soubor Bicep pro přiřazení role k identitě. Pojmenujte tento soubor data-rovina-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. Vytvořte nový soubor parametrů Bicep s názvem data-plane-role-assignment.bicepparam. V tomto souboru parametrů; přiřaďte k parametru název existujícího účtu accountName služby Azure Cosmos DB for Table, dříve zaznamenané identifikátory roleDefinitionId definic rolí parametru a jedinečný identifikátor vaší identity k parametru 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. Nasaďte tuto šablonu Bicep pomocí az deployment group create.

    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. Pokud chcete udělit přístup k účtu z jiných identit, které chcete použít, opakujte tyto kroky.

    Tip

    Tento postup můžete opakovat pro tolik identit, kolik chcete. Tyto kroky se obvykle opakují, aby vývojáři měli přístup k účtu pomocí své lidské identity a povolili aplikacím přístup pomocí spravované identity.

  1. Pomocí rutiny Get-AzCosmosDBAccount získejte jedinečný identifikátor vašeho aktuálního účtu.

    $parameters = @{
        ResourceGroupName = "<name-of-existing-resource-group>"
        Name = "<name-of-existing-nosql-account>"
    }
    Get-AzCosmosDBAccount @parameters | Select -Property Id
    
  2. Prohlédněte si výstup předchozího příkazu. Poznamenejte si hodnotu Id vlastnosti pro tento účet, protože je nutné ji použít v dalším kroku.

    Id
    --    
    /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql
    

    Poznámka:

    V tomto příkladu Id by hodnota byla /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql. Tento příklad používá fiktivní data a váš identifikátor by se od tohoto příkladu odlišil.

  3. Teď vytvořte nebo aktualizujte přiřazení role pomocí Get-AzCosmosDBAccount a Invoke-AzRestMethod společně za účelem vydání požadavku HTTP PUT . V rámci tohoto požadavku zadejte jedinečný identifikátor GUID pro přiřazení role. Nakonec vytvořte datovou část přiřazení zdroje, která určuje jedinečný identifikátor vaší identity.

    $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
    

    Poznámka:

    V tomto příkladu byl e4e4e4e4-ffff-aaaa-bbbb-c5c5c5c5c5c5zadaný jedinečný identifikátor GUID . Můžete zadat libovolný jedinečný identifikátor GUID pro vlastní přiřazení role.

Ověření přístupu k rovině dat v kódu

Nakonec ověřte, že jste správně udělili přístup pomocí kódu aplikace a sady Azure SDK ve vašem preferovaném programovacím jazyce.

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>"
);

Důležité

Tento vzorový kód používá knihovny Azure.Data.Tables z Azure.Identity NuGetu.

Upozorňující

Pokud používáte spravovanou identitu přiřazenou uživatelem, budete muset jako součást vytváření objektu přihlašovacích údajů zadat jedinečný identifikátor spravované identity.