Partager via


Tutoriel : Ajouter une condition d’attribution de rôle pour restreindre l’accès aux objets blob à l’aide d’Azure CLI

Dans la plupart des cas, une attribution de rôle accorde les autorisations dont vous avez besoin pour les ressources Azure. Toutefois, dans certains cas, vous souhaiterez peut-être fournir un contrôle d’accès plus granulaire en ajoutant une condition d’attribution de rôle.

Dans ce tutoriel, vous allez apprendre à :

  • Ajouter une condition à une attribution de rôle
  • Restreindre l’accès aux objets blob en fonction d’une balise d’index de blob

Important

Le contrôle d’accès en fonction des attributs Azure (Azure ABAC) est en disponibilité générale (GA) pour contrôler l’accès au Stockage Blob Azure, à Azure Data Lake Storage Gen2 et aux files d’attente Azure à l’aide des attributs request, resource, environment et principal dans les niveaux de performances des comptes de stockage standard et premium. Actuellement, l’objet blob de liste inclut l’attribut de requête et l’attribut de requête d’instantané pour l’espace de noms hiérarchique sont en PRÉVERSION. Pour obtenir des informations complètes sur l’état des fonctionnalités d’ABAC pour Stockage Azure, consultez État des fonctionnalités de condition dans Stockage Azure.

Consultez les Conditions d’utilisation supplémentaires pour les préversions Microsoft Azure pour les conditions légales qui s’appliquent aux fonctionnalités Azure en version bêta, en préversion ou qui ne sont pas encore publiées en disponibilité générale.

Conditions préalables

Pour plus d’informations sur les prérequis à l’ajout ou à la modification des conditions d’attribution de rôle, consultez Prérequis aux conditions.

Condition

Dans ce tutoriel, vous limitez l’accès aux objets blob avec une balise spécifique. Par exemple, vous ajoutez une condition à une attribution de rôle afin que Chandra puisse uniquement lire des fichiers avec la balise Project=Cascade.

Diagramme de l’attribution de rôle avec une condition.

Si Chandra tente de lire un objet blob sans la balise Project=Cascade, l’accès n’est pas autorisé.

Diagramme montrant l’accès en lecture aux objets blob avec la balise Project=Cascade.

Voici à quoi ressemble la condition dans le code :

(
    (
        !(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'}
        AND NOT
        SubOperationMatches{'Blob.List'})
    )
    OR
    (
        @Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>] StringEquals 'Cascade'
    )
)

Étape 1 : Se connecter à Azure

  1. Utilisez la commande az login et suivez les instructions qui s’affichent pour vous connecter à votre annuaire en tant qu’administrateur d’accès utilisateur ou propriétaire.

    az login
    
  2. Utilisez az account show pour obtenir l’ID de vos abonnements.

    az account show
    
  3. Déterminez l’ID d’abonnement et initialisez la variable.

    subscriptionId="<subscriptionId>"
    

Étape 2 : Créer un utilisateur

  1. Utilisez az ad user create pour créer un utilisateur ou rechercher un utilisateur existant. Ce tutoriel utilise Chandra comme exemple.

  2. Initialisez la variable pour l’ID d’objet de l’utilisateur.

    userObjectId="<userObjectId>"
    

Étape 3 : Configurer le stockage

Vous pouvez autoriser l’accès au stockage Blob depuis l’Azure CLI avec les identifiants Microsoft Entra ou à l’aide de la clé d’accès du compte de stockage. Cet article montre comment autoriser les opérations Blob Storage à l'aide de Microsoft Entra ID. Pour plus d’informations, consultez Démarrage rapide : Créer, télécharger et répertorier des objets blob avec Azure CLI

  1. Utilisez az storage account pour créer un compte de stockage compatible avec la fonctionnalité d’index d’objet blob. Pour plus d’informations, consultez Gérer et rechercher des données Azure Blob à l’aide de balises d’index d’objets blob.

  2. Utilisez az storage container pour créer un conteneur d’objets blob dans le compte de stockage et définir le niveau d’accès anonyme sur Private (pas d’accès anonyme).

  3. Utilisez az storage blob upload pour télécharger un fichier texte dans le conteneur.

  4. Ajoutez la balise d’index d’objet blob suivante au fichier texte. Pour plus d’informations, consultez Utiliser des balises d’index de blob pour gérer et rechercher des données dans Azure Blob Storage.

    Remarque

    Les blobs prennent également en charge la possibilité de stocker des métadonnées clé-valeur arbitraires définies par l’utilisateur. Bien que les métadonnées soient similaires aux étiquettes d’index d’objet blob, vous devez utiliser des étiquettes d’index d’objet blob avec les conditions.

    Clé Valeur
    Projet Cascade
  5. Chargez un deuxième fichier texte dans le conteneur.

  6. Ajoutez la balise d’index d’objet blob suivante au deuxième fichier texte.

    Clé Valeur
    Projet Boulanger
  7. Initialisez les variables suivantes avec les noms que vous avez utilisés.

    resourceGroup="<resourceGroup>"
    storageAccountName="<storageAccountName>"
    containerName="<containerName>"
    blobNameCascade="<blobNameCascade>"
    blobNameBaker="<blobNameBaker>"
    

Étape 4 : Attribuer un rôle avec une condition

  1. Initialisez les variables du rôle Lecteur des données blob du stockage.

    roleDefinitionName="Storage Blob Data Reader"
    roleDefinitionId="2a2b9908-6ea1-4ae2-8e65-a410df84e7d1"
    
  2. Définir l’étendue du groupe de ressources.

    scope="/subscriptions/$subscriptionId/resourceGroups/$resourceGroup"
    
  3. Initialisez la condition.

    condition="((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<\$key_case_sensitive\$>] StringEquals 'Cascade'))"
    

    Dans Bash, si l’extension de l’historique est activée, vous pouvez voir le message bash: !: event not found en raison du point d’exclamation ( !). Dans ce cas, vous pouvez désactiver l’extension de l’historique avec la commande set +H. Pour réactiver l’extension de l’historique, utilisez set -H.

    Dans Bash, un signe dollar ($) a une signification spéciale pour l’expansion. Si votre condition inclut un signe dollar ($), vous devrez peut-être le préfixer avec une barre oblique inverse (\). Par exemple, cette condition utilise des signes dollar pour délimiter le nom de clé de balise. Pour plus d’informations sur les règles de guillemets dans Bash, consultez Guillemets doubles.

  4. Initialisez la version de la condition et la description.

    conditionVersion="2.0"
    description="Read access to blobs with the tag Project=Cascade"
    
  5. Utilisez az role assignment create pour attribuer au utilisateur le rôle Storage Blob Data Reader avec une condition à l'échelle d'un groupe de ressources.

    az role assignment create --assignee-object-id $userObjectId --scope $scope --role $roleDefinitionId --description "$description" --condition "$condition" --condition-version $conditionVersion
    

    Voici un exemple de sortie :

    {
      "canDelegate": null,
      "condition": "((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>] StringEquals 'Cascade'))",
      "conditionVersion": "2.0",
      "description": "Read access to blobs with the tag Project=Cascade",
      "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Authorization/roleAssignments/{roleAssignmentId}",
      "name": "{roleAssignmentId}",
      "principalId": "{userObjectId}",
      "principalType": "User",
      "resourceGroup": "{resourceGroup}",
      "roleDefinitionId": "/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/2a2b9908-6ea1-4ae2-8e65-a410df84e7d1",
      "scope": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}",
      "type": "Microsoft.Authorization/roleAssignments"
    }
    

Étape 5 : (facultatif) Afficher la condition dans le portail Azure

  1. Dans le portail Azure, ouvrez le groupe de ressources.

  2. Sélectionnez Contrôle d’accès (IAM) .

  3. Sous l’onglet Attributions de rôles, recherchez l’attribution de rôle.

  4. Dans la colonne Condition , sélectionnez Afficher/Modifier pour afficher la condition.

Capture d’écran de la condition Ajouter une attribution de rôle dans le portail Azure.

Étape 6 : Tester la condition

  1. Ouvrez une nouvelle fenêtre de commande.

  2. Utilisez az login pour vous connecter en tant que Chandra.

    az login
    
  3. Initialisez les variables suivantes avec les noms que vous avez utilisés.

    storageAccountName="<storageAccountName>"
    containerName="<containerName>"
    blobNameBaker="<blobNameBaker>"
    blobNameCascade="<blobNameCascade>"
    
  4. Utilisez az storage blob show pour essayer de lire les propriétés du fichier pour le projet Baker.

    az storage blob show --account-name $storageAccountName --container-name $containerName --name $blobNameBaker --auth-mode login
    

    Voici un exemple de sortie. Notez que vous ne pouvez pas lire le fichier en raison de la condition que vous avez ajoutée.

    You do not have the required permissions needed to perform this operation.
    Depending on your operation, you may need to be assigned one of the following roles:
        "Storage Blob Data Contributor"
        "Storage Blob Data Reader"
        "Storage Queue Data Contributor"
        "Storage Queue Data Reader"
    
    If you want to use the old authentication method and allow querying for the right account key, please use the "--auth-mode" parameter and "key" value.
    
  5. Lisez les propriétés du fichier pour le projet Cascade.

    az storage blob show --account-name $storageAccountName --container-name $containerName --name $blobNameCascade --auth-mode login 
    

    Voici un exemple de sortie. Notez que vous pouvez lire les propriétés du fichier, car elle a la balise Project=Cascade.

    {
      "container": "<containerName>",
      "content": "",
      "deleted": false,
      "encryptedMetadata": null,
      "encryptionKeySha256": null,
      "encryptionScope": null,
      "isAppendBlobSealed": null,
      "isCurrentVersion": null,
      "lastAccessedOn": null,
      "metadata": {},
      "name": "<blobNameCascade>",
      "objectReplicationDestinationPolicy": null,
      "objectReplicationSourceProperties": [],
      "properties": {
        "appendBlobCommittedBlockCount": null,
        "blobTier": "Hot",
        "blobTierChangeTime": null,
        "blobTierInferred": true,
        "blobType": "BlockBlob",
        "contentLength": 7,
        "contentRange": null,
    
      ...
    
    }
    

Étape 7 : (facultatif) Modifier la condition

  1. Dans l’autre fenêtre de commande, utilisez az role assignment list pour obtenir l’attribution de rôle que vous avez ajoutée.

    az role assignment list --assignee $userObjectId --resource-group $resourceGroup
    

    Le résultat ressemble à ce qui suit :

    [
      {
        "canDelegate": null,
        "condition": "((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>] StringEquals 'Cascade'))",
        "conditionVersion": "2.0",
        "description": "Read access to blobs with the tag Project=Cascade",
        "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Authorization/roleAssignments/{roleAssignmentId}",
        "name": "{roleAssignmentId}",
        "principalId": "{userObjectId}",
        "principalName": "chandra@contoso.com",
        "principalType": "User",
        "resourceGroup": "{resourceGroup}",
        "roleDefinitionId": "/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/2a2b9908-6ea1-4ae2-8e65-a410df84e7d1",
        "roleDefinitionName": "Storage Blob Data Reader",
        "scope": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}",
        "type": "Microsoft.Authorization/roleAssignments"
      }
    ]
    
  2. Créez un fichier JSON avec le format suivant et mettez à jour les propriétés condition et description.

    {
        "canDelegate": null,
        "condition": "((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>] StringEquals 'Cascade' OR @Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>] StringEquals 'Baker'))",
        "conditionVersion": "2.0",
        "description": "Read access to blobs with the tag Project=Cascade or Project=Baker",
        "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Authorization/roleAssignments/{roleAssignmentId}",
        "name": "{roleAssignmentId}",
        "principalId": "{userObjectId}",
        "principalName": "chandra@contoso.com",
        "principalType": "User",
        "resourceGroup": "{resourceGroup}",
        "roleDefinitionId": "/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/2a2b9908-6ea1-4ae2-8e65-a410df84e7d1",
        "roleDefinitionName": "Storage Blob Data Reader",
        "scope": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}",
        "type": "Microsoft.Authorization/roleAssignments"
    }
    
  3. Utilisez az role assignment update pour mettre à jour la condition de l’attribution de rôle.

    az role assignment update --role-assignment "./path/roleassignment.json"
    

Étape 8 : Nettoyer les ressources

  1. Utilisez az role assignment delete pour supprimer l’attribution de rôle et la condition que vous avez ajoutées.

    az role assignment delete --assignee $userObjectId --role "$roleDefinitionName" --resource-group $resourceGroup
    
  2. Supprimez le compte de stockage que vous avez créé.

  3. Supprimez l’utilisateur que vous avez créé.

Étapes suivantes