Azure Data Lake 存储 Gen2 权限

问题描述 投票:0回答:2

我目前正在 Azure 中构建数据湖 (Gen2)。我使用 Terraform 来配置所有资源。但是,我遇到了一些权限不一致的问题。根据文档,可以使用 RBAC 和 ACL 为数据湖设置权限。

我的选择是使用 ACL,因为它允许对数据湖中的目录进行细粒度的权限。在数据湖中,我在其他目录中创建了一个目录

raw
,其中某个
group
具有
r--
(只读)默认权限。
default
表示该目录下的所有对象都被分配了与该目录相同的权限。当该组中的用户尝试使用存储资源管理器访问数据湖时,他们看不到存储帐户,也看不到目录所在的实际文件系统/容器。因此他们无法访问他们具有只读权限的目录。

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

  1. Microsoft.Storage/storageAccounts/listKeys/action
  2. Microsoft.Storage/storageAccounts/read

申请权限1后,没有任何变化。同样申请权限2后,群里的用户突然可以在数据湖里做任何事情,就好像没有指定ACL一样。

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

azure terraform acl azure-data-lake rbac
2个回答
6
投票

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

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

"/"    --x (access)
"/raw" r-x (access)
"/raw" r-x (default)

...然后默认的 ACL 将为该组提供对创建的所有子文件夹和文件的读取和执行 ACL。

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

您可以使用

azurerm_storage_data_lake_gen2_filesystem
Terraform 资源的 ace 属性在容器上设置 ACL,然后使用 azurerm_storage_data_lake_gen2_path Terraform 资源在文件夹上设置 ACL。

这是一个示例,我将 Azure Active Directory 的 object_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。否则,您会在 Terraform 计划中不断看到它每次都尝试删除并重新创建它们。

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

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

-1
投票

感谢您的清晰解释,我们是否需要为资源提供“读取器”或“存储 blob 读取器”? SPn 失败并出现 403 错误,因为它只有 ACL 访问权限

© www.soinside.com 2019 - 2024. All rights reserved.