Azure Data Lake存储第2代权限

Azure Data Lake存储第2代权限,azure,terraform,acl,azure-data-lake,rbac,Azure,Terraform,Acl,Azure Data Lake,Rbac,我目前正在Azure中构建一个数据湖(Gen2)。我使用Terraform提供所有资源。然而,我遇到了一些不一致的许可。根据,可以使用RBAC和ACL为数据湖设置权限 我的选择是使用ACL,因为它允许对数据湖中的目录进行细粒度的权限。在data lake中,我在其他目录中创建了一个目录raw,其中某个组具有r--(只读)默认权限。默认值表示此目录下的所有对象都被分配了与该目录上的权限相同的权限。当该组中的用户试图使用Storage Explorer访问data lake时,他们看不到存储帐户,也

我目前正在Azure中构建一个数据湖(Gen2)。我使用Terraform提供所有资源。然而,我遇到了一些不一致的许可。根据,可以使用RBAC和ACL为数据湖设置权限

我的选择是使用ACL,因为它允许对数据湖中的目录进行细粒度的权限。在data lake中,我在其他目录中创建了一个目录
raw
,其中某个
具有
r--
(只读)默认权限。
默认值
表示此目录下的所有对象都被分配了与该目录上的权限相同的权限。当该组中的用户试图使用Storage Explorer访问data lake时,他们看不到存储帐户,也看不到目录所在的实际文件系统/容器。因此,他们无法访问具有只读权限的目录

因此,我考虑为至少列出存储帐户和文件系统(容器)分配所需的权限。在评估现有角色时,我获得了以下权限:

  • Microsoft.Storage/storageAccounts/listKeys/action
  • Microsoft.Storage/storageAccounts/read
  • 在应用权限1后,没有任何更改。在应用权限2之后,组中的用户可以突然在数据池中执行所有操作,就好像没有指定ACL一样


    我现在的问题是:如何使用ACL(和RBAC)创建一个数据湖,其中的目录对不同的组具有不同的权限,这样组实际上只能读取或写入ACL中的目录?此外,他们应该能够列出他们有权访问某些目录的存储帐户和文件系统(容器)。

    我认为您还需要在文件夹的整个层次结构上创建访问ACL,直到您尝试读取的文件或文件夹,包括根容器

    因此,如果您的文件夹“raw”是在顶层创建的,那么您需要为该组创建以下ACL

    "/"    --x (access)
    "/raw" r-x (access)
    "/raw" r-x (default)
    
    。。。然后,默认ACL将为组提供所有创建的子文件夹和文件的读取和执行ACL

    您还需要至少为组授予资源的读卡器RBAC权限—这可以是在存储帐户上,也可以是在容器上,如果您想限制对其他容器的访问

    您可以使用Terraform资源的
    ace
    属性在容器上设置ACL,然后使用Terraform资源在文件夹上设置ACL

    下面是一个示例,我将Azure Active Directory的对象id存储在名为aad_group_object_id的变量中

    # create the data lake
    resource "azurerm_storage_account" "data_lake" {
      ....
    }
    
    # create a container named "acltest" with execute ACL for the group
    resource "azurerm_storage_data_lake_gen2_filesystem" "data_lake_acl_test" {
      name               = "acltest"
      storage_account_id = azurerm_storage_account.data_lake.id
      
      ace {
        type = "group"
        scope = "access"
        id = var.aad_group_object_id
        permissions = "--x"
      }
    }
    
    # create the folder "raw" and give read and execute access and default permissions to group
    resource "azurerm_storage_data_lake_gen2_path" "folder_raw" {
      path               = "raw"
      filesystem_name    = azurerm_storage_data_lake_gen2_filesystem.data_lake_acl_test.name
      storage_account_id = azurerm_storage_account.data_lake.id
      resource           = "directory"
      ace {
        type = "group"
        scope = "access"
        id = var.aad_group_object_id
        permissions = "r-x"
      }
      ace {
        type = "group"
        scope = "default"
        id = var.aad_group_object_id
        permissions = "r-x"
      }
    }
    
    我没有在代码示例中包括它,但是您还必须为所属组、所有者、掩码和其他身份添加ACL,这些身份将添加到根容器和子文件夹中。否则,你会在你的地形图中看到它每次都试图放弃并重新创建它们

    您可以只添加这个-不幸的是,您需要将它添加到您创建的每个文件夹中,除非有人知道如何解决这个问题

      ace {
        permissions = "---" 
        scope       = "access"
        type        = "other"
      }
      ace {
        permissions = "r-x"
        scope       = "access"
        type        = "group"
      }
      ace {
        permissions = "r-x"
        scope       = "access"
        type        = "mask"
      }
      ace {
        permissions = "rwx"
        scope       = "access"
        type        = "user"
      }