Autoriser l’accès en lecture aux objets BLOB en fonction des balises et des attributs de sécurité personnalisés

Cet article vous explique comment autoriser l’accès en lecture aux objets blob en fonction d’attributs de sécurité personnalisés et de balises d’index d’objets blob en utilisant les conditions de contrôle d’accès en fonction des attributs (ABAC). Ceci peut faciliter la gestion de l’accès aux objets blob.

Prérequis

Pour affecter des attributs de sécurité personnalisés et ajouter des conditions d’attribution de rôle dans votre locataire Microsoft Entra, vous avez besoin des éléments suivants :

Important

Par défaut, les rôles Administrateur général et d’autres d’administrateur ne sont pas autorisés à lire, à définir ou à affecter des attributs de sécurité personnalisés. Si vous ne remplissez pas ces conditions préalables, vous ne verrez pas les attributs principal/utilisateur dans l’éditeur de condition.

Condition

Dans le cadre de cet article, vous autorisez l’accès en lecture aux objets blob si l’utilisateur a un attribut de sécurité personnalisé qui correspond à la balise d’index d’objets blob. Pour cela, vous devez ajouter une condition à l’attribution de rôle.

Diagram of role assignment with a condition.

Par exemple, si Brenda a l’attribut Project=Baker, elle peut uniquement lire des blobs avec la balise d’index d’objets blob Project=Baker. De même, Chandra peut uniquement lire des blobs avec Project=Cascade.

Diagram showing read access to blobs based on tags and custom security attributes.

Voici à quoi ressemble la condition exprimée sous forme de code :

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

Pour plus d’informations sur les conditions, consultez Qu’est-ce que le contrôle d’accès basé sur les attributs Azure (Azure ABAC) ?.

Étape 1 : Ajouter un nouvel attribut de sécurité personnalisé

  1. Connectez-vous au portail Azure.

  2. Cliquez sur Attributs de sécurité personnalisés microsoft Entra ID>.

  3. Ajoutez un attribut nommé Project avec les valeurs Baker et Cascade ou utilisez un attribut existant. Pour plus d’informations, consultez Ajouter ou désactiver des attributs de sécurité personnalisés dans l’ID Microsoft Entra.

    Screenshot of adding a custom security attribute.

Étape 2 : Attribuer l’attribut de sécurité personnalisé à un utilisateur

  1. Dans Microsoft Entra ID, créez un groupe de sécurité.

  2. Ajoutez un utilisateur comme membre du groupe.

  3. Attribuez l’attribut Project avec la valeur Cascade à l’utilisateur. Pour plus d’informations, consultez Affecter, mettre à jour, lister ou supprimer des attributs de sécurité personnalisés pour un utilisateur.

    Screenshot of assigning a custom security attribute.

  4. N’oubliez pas de cliquer sur Enregistrer pour enregistrer votre attribution.

Étape 3 : Configurer des balises d’index de stockage et d’objets blob

  1. Créez un compte de stockage compatible avec la fonctionnalité de balises 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. Créez un conteneur dans le compte de stockage et définissez le niveau d’accès public sur Privé (pas d’accès anonyme).

  3. Définissez le type d’authentification sur Compte d’utilisateur Azure AD.

  4. Chargez les fichiers texte dans le conteneur et définissez les balises d’index d’objets blob suivantes.

    File Clé Valeur
    Fichier texte Baker Project Baker
    Fichier texte Cascade Project Cascade

    Conseil

    Pour plus d’informations sur les caractères autorisés pour les balises d’index d’objets blob, consultez Définition des balises d’index d’objets blob.

Étape 4 : Attribuer le rôle Lecteur des données Blob du stockage avec une condition

  1. Ouvrez un nouvel onglet et connectez-vous au portail Azure.

  2. Ouvrez le groupe de ressources contenant le compte de stockage.

  3. Cliquez sur Contrôle d’accès (IAM) .

  4. Cliquez sur l’onglet Attributions de rôles afin d’afficher les attributions de rôles pour cette étendue.

  5. Cliquez sur Ajouter>Ajouter une attribution de rôle.

  6. Sous l’onglet Rôle, sélectionnez le rôle Lecteur des données Blob du stockage.

  7. Sous l’onglet Membres, sélectionnez le groupe de sécurité que vous avez créé.

  8. (Facultatif) Dans la zone Description, entrez Accès en lecture aux objets blob si l’utilisateur a un attribut de sécurité personnalisé qui correspond à la balise d’index d’objets blob.

  9. Sous l’onglet Conditions (facultatif) , cliquez sur Ajouter une condition.

    La page Ajouter une condition d’attribution de rôle s’affiche.

  10. Dans la section Ajouter une action, cliquez sur Ajouter une action.

    Le volet Sélectionner une action s’affiche. Ce volet est une liste filtrée d’actions de données basée sur l’attribution de rôle destinée à être la cible de votre condition.

  11. Cliquez sur Lire un objet blob, puis cliquez sur Sélectionner.

  12. Dans la section Générer l’expression, cliquez sur Ajouter.

  13. Entrez les paramètres suivants :

    Paramètre Value
    Source de l’attribut Principal
    Attribut <jeu d’attributs>_Project
    Opérateur StringEquals
    Option Attribut
    Source de l’attribut Ressource
    Attribut Balises d’index de blob [Valeurs dans la clé]
    Clé : Project

    Remarque

    Si principal n’est pas listé comme option dans la source de l’attribut, vérifiez que vous avez défini un attribut de sécurité personnalisé comme décrit précédemment à l’étape 1 : Ajouter un nouvel attribut de sécurité personnalisé.

    Screenshot of condition using principal attribute displayed in visual editor.

  14. Faites défiler la liste jusqu’à Type d’éditeur, puis cliquez sur Code.

    Votre condition doit ressembler à ce qui suit :

    (
     (
      !(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})
     )
     OR 
     (
      @Principal[Microsoft.Directory/CustomSecurityAttributes/Id:Engineering_Project] StringEquals @Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>]
     )
    )
    
  15. Cliquez sur Enregistrer pour enregistrer la condition.

  16. Sous l’onglet Vérifier + attribuer, cliquez sur Vérifier + attribuer pour attribuer le rôle Lecteur des données Blob du stockage avec une condition.

Étape 5 : affecter le rôle Lecteur

  • Répétez les étapes précédentes pour attribuer le rôle Lecteur au groupe de sécurité dans l’étendue du groupe de ressources.

    Remarque

    En général, vous n’avez pas besoin d’affecter le rôle Lecteur. Toutefois, cette opération vous permet de tester la condition à l’aide du portail Azure.

Étape 6 : Tester la condition

  1. Dans une nouvelle fenêtre, ouvrez le portail Azure.

  2. Connectez-vous sous l’identité de l’utilisateur que vous avez créé avec l’attribut de sécurité personnalisé Project=Cascade.

  3. Ouvrez le compte de stockage et le conteneur que vous avez créés.

  4. Vérifiez que la méthode d’authentification est définie sur Compte d’utilisateur Azure AD et non sur Clé d’accès.

    Screenshot of storage container with test files.

  5. Cliquez sur le fichier texte Baker.

    Vous ne devriez PAS pouvoir afficher ou télécharger l’objet blob et un message d’échec de l’autorisation devrait s’afficher.

  6. Cliquez sur le fichier texte Cascade.

    Vous devriez être en mesure d’afficher et de télécharger l’objet blob.

Azure PowerShell

Vous pouvez également utiliser Azure PowerShell pour ajouter des conditions d’attribution de rôle. Les commandes suivantes montrent comment ajouter des conditions. Pour plus d’informations, consultez Tutoriel : Ajouter une condition d’attribution de rôle pour restreindre l’accès aux objets blob à l’aide d’Azure PowerShell.

Ajouter une condition

  1. Utilisez la commande Connecter-AzAccount et suivez les instructions qui semblent vous connecter à votre annuaire en tant que contrôle d’accès en fonction du rôle Administration istrator.

    Connect-AzAccount
    
  2. Utilisez Get-AzRoleAssignment pour récupérer l’attribution de rôle que vous avez attribuée au groupe de sécurité.

    $groupRoleAssignment = Get-AzRoleAssignment -ObjectId <groupObjectId> -Scope <scope>
    
  3. Définissez la propriété Condition de l’objet d’attribution de rôle. Veillez à utiliser le nom de votre jeu d’attributs.

    $groupRoleAssignment.Condition="((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})) OR (@Principal[Microsoft.Directory/CustomSecurityAttributes/Id:Engineering_Project] StringEquals @Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<`$key_case_sensitive`$>]))"
    
  4. Définissez la propriété ConditionVersion de l’objet d’attribution de rôle.

    $groupRoleAssignment.ConditionVersion = "2.0"
    
  5. Utilisez Set-AzRoleAssignment pour mettre à jour l’attribution de rôle.

    Set-AzRoleAssignment -InputObject $groupRoleAssignment
    

Tester la condition

  1. Dans une nouvelle fenêtre PowerShell, utilisez la commande Connect-AzAccount pour vous connecter en tant que membre du groupe de sécurité.

    Connect-AzAccount
    
  2. Utilisez New-AzStorageContext pour définir le contexte du compte de stockage.

    $bearerCtx = New-AzStorageContext -StorageAccountName <accountName>
    
  3. Utilisez Get-AzStorageBlob pour essayer de lire le fichier Baker.

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

    Vous ne devriez PAS pouvoir lire l’objet blob et un message d’échec de l’autorisation devrait s’afficher.

    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.
    ...
    
  4. Utilisez Get-AzStorageBlob pour essayer de lire le fichier Cascade.

    Get-AzStorageBlob -Container <containerName> -Blob <blobNameCascade> -Context $bearerCtx
    You should be able to read the blob.
    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
    

Azure CLI

Vous pouvez également utiliser Azure CLI pour ajouter des conditions d’attribution de rôle. Les commandes suivantes montrent comment ajouter des conditions. Pour plus d’informations, consultez Tutoriel : Ajouter une condition d’attribution de rôle pour restreindre l’accès aux objets blob à l’aide d’Azure CLI.

Ajouter une condition

  1. Utilisez la commande az login et suivez les instructions qui semblent vous connecter à votre annuaire en tant que contrôle d’accès en fonction du rôle Administration istrator.

    az login
    
  2. Utilisez az role assignment list pour récupérer l’attribution de rôle que vous avez attribuée au groupe de sécurité.

    az role assignment list --assignee <groupObjectId> --scope <scope>
    
  3. Créez un fichier JSON au format suivant.

    {
        "canDelegate": null,
        "condition": "",
        "conditionVersion": "",
        "description": "",
        "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Authorization/roleAssignments/{roleAssignmentId}",
        "name": "{roleAssignmentId}",
        "principalId": "{groupObjectId}",
        "principalName": "{principalName}",
        "principalType": "Group",
        "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"
    }
    
  4. Mettez à jour la propriété condition. Veillez à utiliser le nom de votre jeu d’attributs.

    "condition": "((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})) OR (@Principal[Microsoft.Directory/CustomSecurityAttributes/Id:Engineering_Project] StringEquals @Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>]))",
    
  5. Mettez à jour la propriété conditionVersion.

    "conditionVersion": "2.0",
    
  6. Utilisez az role assignment update pour ajouter la condition à l’attribution de rôle.

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

Tester la condition

  1. Dans une nouvelle fenêtre de commande, utilisez la commande az login pour vous connecter en tant que membre du groupe de sécurité.

    az login
    
  2. Utilisez az storage blob show pour essayer de lire les propriétés du fichier Baker.

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

    Vous ne devriez PAS pouvoir lire l’objet blob et un message d’échec de l’autorisation devrait s’afficher.

    You do not have the required permissions needed to perform this operation.
    ...
    
  3. Utilisez az storage blob show pour essayer de lire les propriétés du fichier Cascade.

    az storage blob show --account-name <storageAccountName> --container-name <containerName> --name <blobNameCascade> --auth-mode login
    You should be able to read the blob.
    {
      "container": "<containerName>",
      "content": "",
      "deleted": false,
      "encryptedMetadata": null,
      "encryptionKeySha256": null,
      "encryptionScope": null,
    ...
    }
    

Étapes suivantes