Partager via


Tutoriel : Ajouter une condition d’attribution de rôle pour restreindre l’accès aux objets blob en utilisant Azure PowerShell

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 précis 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 étiquette d’index d’objets 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’attribut de ressource des métadonnées de conteneur et l’attribut de requête d’inclusion des blobs de liste 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.

Pour connaître les conditions juridiques qui s’appliquent aux fonctionnalités Azure en version bêta, en préversion ou plus généralement non encore en disponibilité générale, consultez l’Avenant aux conditions d’utilisation des préversions de Microsoft Azure.

Prérequis

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 dotés d’une étiquette spécifique. Par exemple, vous ajoutez une condition à une attribution de rôle afin que Chandra puisse uniquement lire les fichiers auxquels est associée l’étiquette 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 dotés de l’étiquette 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 : Installer les prérequis

  1. Ouvrez une fenêtre PowerShell.

  2. Utilisez Get-InstalledModule pour vérifier les versions des modules installés.

    Get-InstalledModule -Name Az
    Get-InstalledModule -Name Az.Resources
    Get-InstalledModule -Name Az.Storage
    
  3. Si nécessaire, utilisez Install-Module afin d’installer les versions requises pour les modules Az, Az.Resources et Az.Storage.

    Install-Module -Name Az -RequiredVersion 5.5.0
    Install-Module -Name Az.Resources -RequiredVersion 3.2.1
    Install-Module -Name Az.Storage -RequiredVersion 2.5.2-preview -AllowPrerelease
    
  4. Fermez et rouvrez PowerShell pour actualiser la session.

Étape 2 : Se connecter à Azure

  1. Utilisez la commande Connect-AzAccount et suivez les instructions qui s’affichent pour vous connecter à votre annuaire en tant qu’Administrateur de l’accès utilisateur ou Propriétaire.

    Connect-AzAccount
    
  2. Utilisez Get-AzSubscription pour lister tous vos abonnements.

    Get-AzSubscription
    
  3. Déterminez l’ID d’abonnement et initialisez la variable.

    $subscriptionId = "<subscriptionId>"
    
  4. Définissez l’abonnement en tant qu’abonnement actif.

    $context = Get-AzSubscription -SubscriptionId $subscriptionId
    Set-AzContext $context
    

Étape 3 : Créer un utilisateur

  1. Utilisez New-New-MgUser pour créer un utilisateur ou recherchez un utilisateur existant. Ce tutoriel utilise Chandra comme exemple.

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

    $userObjectId = "<userObjectId>"
    

Étape 4 : Configurer le stockage

  1. Utilisez New-AzStorageAccount pour créer un compte de stockage compatible avec la fonctionnalité d’index d’objets 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 New-AzStorageContainer pour créer un conteneur d’objets blob dans le compte de stockage, puis définir le niveau d’accès public sur Privé (pas d’accès anonyme).

  3. Utilisez Set-AzStorageBlobContent pour charger un fichier texte sur le conteneur.

  4. Ajoutez l’étiquette d’index d’objets blob suivante au fichier texte. Pour plus d’informations, consultez Utiliser des étiquettes d’index d’objets blob pour gérer et rechercher des données sur Stockage Blob Azure.

    Notes

    Les objets blob prennent également en charge la possibilité de stocker des métadonnées de 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
    Project Cascade
  5. Chargez un second fichier texte sur le conteneur.

  6. Ajoutez l’étiquette d’index d’objets blob suivante au second fichier texte.

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

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

Étape 5 : 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. Initialisez l’étendue pour le 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 PowerShell, si votre condition comprend un signe dollar ($), vous devez le faire précéder d’un guillemet inversé (`). Par exemple, cette condition utilise des signes dollar pour délimiter le nom de la clé d’étiquette.

  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 New-AzRoleAssignment pour attribuer le rôle Lecteur des données blob du stockage avec une condition à l’utilisateur dans une étendue de groupe de ressources.

    New-AzRoleAssignment -ObjectId $userObjectId -Scope $scope -RoleDefinitionId $roleDefinitionId -Description $description -Condition $condition -ConditionVersion $conditionVersion
    

    Voici un exemple de sortie :

    RoleAssignmentId   : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>/providers/Microso
                         ft.Authorization/roleAssignments/<roleAssignmentId>
    Scope              : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>
    DisplayName        : Chandra
    SignInName         : chandra@contoso.com
    RoleDefinitionName : Storage Blob Data Reader
    RoleDefinitionId   : 2a2b9908-6ea1-4ae2-8e65-a410df84e7d1
    ObjectId           : <userObjectId>
    ObjectType         : User
    CanDelegate        : False
    Description        : Read access to blobs with the tag Project=Cascade
    ConditionVersion   : 2.0
    Condition          : ((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT
                         SubOperationMatches{'Blob.List'})) OR
                         (@Resource[Microsoft.Storage/storageAccounts/blobServices/co
                         ntainers/blobs/tags:Project<$key_case_sensitive$>] StringEquals 'Cascade'))
    

Étape 6 : (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, cliquez sur Afficher/Modifier pour afficher la condition.

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

Étape 7 : Tester la condition

  1. Ouvrez une nouvelle fenêtre PowerShell.

  2. Utilisez Connect-AzAccount pour vous connecter en tant que Chandra.

    Connect-AzAccount
    
  3. Initialisez les variables suivantes avec les noms que vous avez utilisés.

    $storageAccountName = "<storageAccountName>"
    $containerName = "<containerName>"
    $blobNameBaker = "<blobNameBaker>"
    $blobNameCascade = "<blobNameCascade>"
    
  4. Utilisez New-AzStorageContext afin de créer un contexte spécifique pour accéder à votre compte de stockage plus facilement.

    $bearerCtx = New-AzStorageContext -StorageAccountName $storageAccountName
    
  5. Utilisez Get-AzStorageBlob pour essayer de lire le fichier du projet Baker.

    Get-AzStorageBlob -Container $containerName -Blob $blobNameBaker -Context $bearerCtx 
    

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

    Get-AzStorageBlob : This request is not authorized to perform this operation using this permission. HTTP Status Code:
    403 - HTTP Error Message: This request is not authorized to perform this operation using this permission.
    ErrorCode: AuthorizationPermissionMismatch
    ErrorMessage: This request is not authorized to perform this operation using this permission.
    RequestId: <requestId>
    Time: Sat, 24 Apr 2021 13:26:25 GMT
    At line:1 char:1
    + Get-AzStorageBlob -Container $containerName -Blob $blobNameBaker -Con ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : CloseError: (:) [Get-AzStorageBlob], StorageException
        + FullyQualifiedErrorId : StorageException,Microsoft.WindowsAzure.Commands.Storage.Blob.Cmdlet.GetAzureStorageBlob
       Command
    
  6. Lisez le fichier du projet Cascade.

    Get-AzStorageBlob -Container $containerName -Blob $blobNameCascade -Context $bearerCtx 
    

    Voici un exemple de sortie. Notez que vous pouvez lire le fichier, car il a l’étiquette Project=Cascade.

       AccountName: <storageAccountName>, ContainerName: <containerName>
    
    Name                 BlobType  Length          ContentType                    LastModified         AccessTier SnapshotT
                                                                                                                  ime
    ----                 --------  ------          -----------                    ------------         ---------- ---------
    CascadeFile.txt      BlockBlob 7               text/plain                     2021-04-24 05:35:24Z Hot
    

Étape 8 : (facultatif) Modifier la condition

  1. Dans l’autre fenêtre PowerShell, utilisez Get-AzRoleAssignment pour récupérer l’attribution de rôle que vous avez ajoutée.

    $testRa = Get-AzRoleAssignment -Scope $scope -RoleDefinitionName $roleDefinitionName -ObjectId $userObjectId
    
  2. Modifiez 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' OR @Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<`$key_case_sensitive`$>] StringEquals 'Baker'))"
    
  3. Initialisez la condition et la description.

    $testRa.Condition = $condition
    $testRa.Description = "Read access to blobs with the tag Project=Cascade or Project=Baker"
    
  4. Utilisez Set-AzRoleAssignment pour mettre à jour la condition de l’attribution de rôle.

    Set-AzRoleAssignment -InputObject $testRa -PassThru
    

    Voici un exemple de sortie :

    RoleAssignmentId   : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>/providers/Microso
                         ft.Authorization/roleAssignments/<roleAssignmentId>
    Scope              : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>
    DisplayName        : Chandra
    SignInName         : chandra@contoso.com
    RoleDefinitionName : Storage Blob Data Reader
    RoleDefinitionId   : 2a2b9908-6ea1-4ae2-8e65-a410df84e7d1
    ObjectId           : <userObjectId>
    ObjectType         : User
    CanDelegate        : False
    Description        : Read access to blobs with the tag Project=Cascade or Project=Baker
    ConditionVersion   : 2.0
    Condition          : ((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT
                         SubOperationMatches{'Blob.List'})) OR
                         (@Resource[Microsoft.Storage/storageAccounts/blobServices/co
                         ntainers/blobs/tags:Project<$key_case_sensitive$>] StringEquals 'Cascade' OR @Resource[Microsoft.S
                         torage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>]
                         StringEquals 'Baker'))
    

Étape 9 : Nettoyer les ressources

  1. Utilisez Remove-AzRoleAssignment pour supprimer l’attribution de rôle et la condition que vous avez ajoutés.

    Remove-AzRoleAssignment -ObjectId $userObjectId -RoleDefinitionName $roleDefinitionName -ResourceGroupName $resourceGroup
    
  2. Supprimez le compte de stockage que vous avez créé.

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

Étapes suivantes