Partager via


Utiliser l’accès en fonction du rôle du plan de contrôle avec Azure Cosmos DB for Table (préversion)

S’APPLIQUE À : Table

Diagramme de l’emplacement actuel (« Contrôle d’accès en fonction du rôle ») dans la séquence du guide de déploiement.

Diagramme de la séquence du guide de déploiement comprenant ces emplacements, dans l’ordre : Vue d’ensemble, Concepts, Préparation, Contrôle d’accès en fonction du rôle et Référence. L’emplacement « Contrôle d’accès en fonction du rôle » est actuellement mis en surbrillance.

Cet article décrit les étapes d’octroi d’un accès d’identité pour gérer les données dans un compte Azure Cosmos DB for Table. Les étapes décrites dans cet article couvrent uniquement l’accès au plan de données pour effectuer des opérations sur des éléments individuels et exécuter des requêtes.

Prérequis

  • Compte Azure avec un abonnement actif. Créez un compte gratuitement.
  • Un compte Azure Cosmos DB for Table existant.
  • Une ou plusieurs identités existantes dans Microsoft Entra ID.

Préparer la définition de rôle

Tout d’abord, vous devez préparer une définition de rôle avec une liste de dataActions pour accorder l’accès à la lecture, à la requête et à la gestion des données dans Azure Cosmos DB for Table.

Tout d’abord, obtenez l’identificateur de ressource du compte Azure Cosmos DB pour Table existant à l’aide de az cosmsodb show et stockez-le dans une variable. Ensuite, répertoriez toutes les définitions de rôle associées à votre compte Azure Cosmos DB for Table à l’aide de az rest. Finalement, passez en revue la sortie et recherchez la définition de rôle nommée Contributeur de données intégré Cosmos DB. La sortie contient l’identificateur unique de la définition de rôle dans la propriété id. Enregistrez cette valeur, car vous devrez l’utiliser dans l’étape d’affectation plus loin dans ce guide.

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

Remarque

Pour cet exemple, la valeur id serait /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/tableRoleDefinitions/00000000-0000-0000-0000-000000000002. Cet exemple utilise des données fictives et votre identificateur sera distinct de cet exemple. La sortie de cet exemple est tronquée.

Utilisez Get-AzCosmosDBAccount pour obtenir l'identifiant de ressource du compte Azure Cosmos DB for Table existant et de le stocker dans une variable. Ensuite, utilisez Invoke-AzRestMethod pour répertorier toutes les définitions de rôle associées à votre compte Azure Cosmos DB for Table. Passez en revue la sortie et recherchez la définition de rôle nommée Contributeur de données intégré Cosmos DB. La sortie contient l’identificateur unique de la définition de rôle dans la propriété Id. Enregistrez cette valeur, car vous devrez l’utiliser dans l’étape d’affectation plus loin dans ce guide.

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

Remarque

Pour cet exemple, la valeur Id serait /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/tableRoleDefinitions/00000000-0000-0000-0000-000000000002. Cet exemple utilise des données fictives et votre identificateur sera distinct de cet exemple. La sortie de cet exemple est tronquée.

Attribuer un rôle à l’identité

À présent, affectez le rôle nouvellement défini à une identité afin que vos applications puissent accéder aux données dans Azure Cosmos DB for Table.

Important

Cette tâche d’attribution nécessite que vous disposiez de l’identificateur unique de l’identité à laquelle vous souhaitez accorder des autorisations de contrôle d’accès en fonction du rôle. Si vous n’avez pas d’identificateur unique pour une identité, suivez les instructions de la créer une identité managée ou obtenir des guides d’identité de connexion.

  1. Utilisez az cosmosdb show pour obtenir l’identificateur unique de votre compte actuel.

    az cosmosdb show \
        --resource-group "<name-of-existing-resource-group>" \
        --name "<name-of-existing-resource-group>" \
        --query "{id:id}"
    
  2. Observez la sortie de la commande précédente. Enregistrez la valeur de la propriété id pour ce compte, car il est nécessaire d’utiliser à l’étape suivante.

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

    Remarque

    Pour cet exemple, la valeur id serait /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql. Cet exemple utilise des données fictives et votre identificateur sera distinct de cet exemple.

  3. Créez un fichier JSON nommé role-assignment.json. Dans le fichier JSON, ajoutez l’identificateur unique de votre identité et identificateur unique pour la ressource de compte.

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

    Remarque

    Dans cet exemple, le GUID unique spécifié était d3d3d3d3-eeee-ffff-aaaa-b4b4b4b4b4b4. Vous pouvez utiliser le GUID unique que vous avez utilisé précédemment pour votre propre définition de rôle.

  4. Créez ou mettez à jour une attribution de rôle à l’aide de az cosmosdb show et az rest ensemble pour émettre une requête HTTP PUT. Dans le cadre de cette requête, spécifiez un GUID unique pour votre attribution de rôle.

    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
    

    Remarque

    Dans cet exemple, le GUID unique spécifié était e4e4e4e4-ffff-aaaa-bbbb-c5c5c5c5c5c5. Vous pouvez spécifier n’importe quel GUID unique pour votre propre attribution de rôle.

  1. Créez un autre fichier Bicep pour attribuer un rôle à une identité. Nommez ce fichier 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. Créez un nouveau fichier de paramètres Bicep nommé data-plane-role-assignment.bicepparam. Dans ce fichier de paramètres, affectez le nom de votre compte Azure Cosmos DB for Table existant au paramètre accountName , les identificateurs de définition de rôle précédemment enregistrés au paramètre roleDefinitionId et l’identificateur unique de votre identité au paramètre 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. Déployez ce modèle Bicep à l’aide de 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. Répétez ces étapes pour accorder l’accès au compte à partir d’autres identités que vous souhaitez utiliser.

    Conseil

    Vous pouvez répéter ces étapes pour autant d’identités que vous le souhaitez. En règle générale, ces étapes sont au moins répétées pour permettre aux développeurs d’accéder à un compte à l’aide de leur identité humaine et pour accorder aux applications l’accès à l’aide d’une identité managée.

  1. Utilisez `Get-AzCosmosDBAccount pour obtenir l’identificateur unique de votre compte actuel.

    $parameters = @{
        ResourceGroupName = "<name-of-existing-resource-group>"
        Name = "<name-of-existing-nosql-account>"
    }
    Get-AzCosmosDBAccount @parameters | Select -Property Id
    
  2. Observez la sortie de la commande précédente. Enregistrez la valeur de la propriété Id pour ce compte, car il est nécessaire d’utiliser à l’étape suivante.

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

    Remarque

    Pour cet exemple, la valeur Id serait /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql. Cet exemple utilise des données fictives et votre identificateur sera distinct de cet exemple.

  3. Créez ou mettez à jour une attribution de rôle à l’aide de Get-AzCosmosDBAccount et Invoke-AzRestMethod ensemble pour émettre une requête HTTP PUT. Dans le cadre de cette requête, spécifiez un GUID unique pour votre attribution de rôle. Enfin, créez une charge utile d’affectation de ressource en spécifiant l’identificateur unique de votre identité.

    $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
    

    Remarque

    Dans cet exemple, le GUID unique spécifié était e4e4e4e4-ffff-aaaa-bbbb-c5c5c5c5c5c5. Vous pouvez spécifier n’importe quel GUID unique pour votre propre attribution de rôle.

Valider l’accès au plan de données dans le code

Enfin, vérifiez que vous avez correctement accordé l’accès à l’aide du code d’application et du Kit de développement logiciel (SDK) Azure dans votre langage de programmation préféré.

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

Important

Cet exemple de code utilise les bibliothèques Azure.Data.Tables et Azure.Identity de NuGet.

Avertissement

Si vous utilisez une identité managée affectée par l’utilisateur(-trice), vous devez spécifier l’identificateur unique de l’identité managée dans le cadre de la création de l’objet d’informations d’identification.