Azure Data Lake Storage Gen2 中的访问控制模型

Data Lake Storage Gen2 支持以下授权机制:

  • 共享密钥授权
  • 共享访问签名 (SAS) 授权
  • 基于角色的访问控制 (Azure RBAC)
  • 访问控制列表 (ACL)

共享密钥和 SAS 授权向用户(或应用程序)授予访问权限,不要求其在 Azure Active Directory (Azure AD) 中有标识。 使用这两种形式的身份验证时,Azure RBAC 和 ACL 不起作用。

Azure RBAC 和 ACL 都要求用户(或应用程序)在 Azure AD 中有标识。 使用 Azure RBAC,你可以授予对存储帐户数据的“粗粒度”访问权限(例如,对存储帐户中 所有 数据的读取或写入访问权限),而使用 ACL,你可以授予“细粒度”访问权限,例如,对特定目录或文件的写入访问权限。

本文重点介绍 Azure RBAC 和 ACL,以及系统如何将它们一起评估,以便针对存储帐户资源做出授权决策。

基于角色的访问控制 (Azure RBAC)

Azure RBAC 使用角色分配向安全主体应用权限集。 安全主体是一个对象,表示在 Azure Active Directory (AD) 中定义的用户、组、服务主体或托管标识。 权限集可以向安全主体授予“粗粒度”级别的访问权限,例如,对存储帐户中 所有 数据或容器中 所有 数据的读取或写入访问权限。

以下角色允许安全主体访问存储帐户中的数据。

角色 描述
存储 Blob 数据所有者 对 Blob 存储容器和数据的完全访问权限。 此访问权限允许安全主体设置项的所有者,以及修改所有项的 ACL。
存储 Blob 数据参与者 对 Blob 存储容器和 Blob 的读取、写入和删除访问权限。 此访问权限不允许安全主体设置项的所有权,但它可以修改安全主体拥有的项的 ACL。
存储 Blob 数据读者 读取和列出存储容器与 Blob。

所有者参与者读取者存储帐户参与者等角色允许安全主体管理存储帐户,但不提供对该帐户中数据的访问权限。 但是,这些角色(读取者 除外)可以获取对存储密钥的访问权限,存储密钥可在各种客户端工具中用来访问数据。

访问控制列表 (ACL)

使用 ACL,你可以对目录和文件应用“更细粒度”的访问级别。 ACL 是一个包含一系列 ACL 条目的权限构造。 每个 ACL 条目都将安全主体与一个访问级别相关联。 有关详细信息,请参阅 Azure Data Lake Storage Gen2 中的访问控制列表 (ACL)

权限是如何评估的

在基于安全主体的授权过程中,将按以下顺序对权限进行评估。

1️⃣  Azure 角色分配将首先进行评估,优先于任何 ACL 分配。

2️⃣  如果根据 Azure 角色分配向操作完全授权,则根本不会评估 ACL。

3️⃣  如果操作未完全获得授权,则会评估 ACL。

Data Lake Storage 权限流

由于系统评估访问权限的方式,你 无法 使用 ACL 来 限制 已通过角色分配授予的访问权限。 这是因为系统会首先评估 Azure 角色分配,如果该分配授予了足够的访问权限,则会忽略 ACL。

下图显示了这三个常见操作的权限流:列出目录内容、读取文件和写入文件。

Data Lake Storage 权限流示例

权限表:组合使用 Azure RBAC 和 ACL

下表显示了如何组合使用 Azure 角色和 ACL 条目,以便安全主体可以执行“操作”列中列出的操作。 此表显示的列代表虚构目录层次结构的每个级别。 容器的根目录 (/)、名为 Oregon 的子目录、Oregon 目录的名为 Portland 的子目录以及 Portland 目录中名为 Data.txt 的文本文件分别对应一个列。 这些列中显示了授予权限所需的 ACL 条目的简短形式的表示形式。 如果某个 ACL 条目不是执行操作所必需的,则列中将显示 N/A(不适用)。

操作 分配的 Azure 角色 / Oregon/ Portland/ Data.txt
Read Data.txt 存储 Blob 数据所有者 不适用 空值 空值 不适用
存储 Blob 数据参与者 不适用 空值 空值 不适用
存储 Blob 数据读取者 不适用 空值 空值 不可用
None --X --X --X R--
Append to Data.txt 存储 Blob 数据所有者 不适用 空值 空值 不适用
存储 Blob 数据参与者 不适用 空值 空值 不适用
存储 Blob 数据读取者 --X --X --X -W-
None --X --X --X RW-
Delete Data.txt 存储 Blob 数据所有者 不适用 空值 空值 不适用
存储 Blob 数据参与者 不适用 空值 空值 不适用
存储 Blob 数据读取者 --X --X -WX 不可用
None --X --X -WX 不适用
Create Data.txt 存储 Blob 数据所有者 不适用 空值 空值 不适用
存储 Blob 数据参与者 不适用 空值 空值 不适用
存储 Blob 数据读取者 --X --X -WX 不可用
None --X --X -WX 不适用
List / 存储 Blob 数据所有者 不适用 空值 空值 不适用
存储 Blob 数据参与者 不适用 空值 空值 不适用
存储 Blob 数据读取者 不适用 空值 空值 不可用
None R-X 不适用 空值 不适用
List /Oregon/ 存储 Blob 数据所有者 不适用 空值 空值 不适用
存储 Blob 数据参与者 不适用 空值 空值 不适用
存储 Blob 数据读取者 不适用 空值 空值 不可用
None --X R-X 不适用 不适用
List /Oregon/Portland/ 存储 Blob 数据所有者 不适用 空值 空值 不适用
存储 Blob 数据参与者 不适用 空值 空值 不适用
存储 Blob 数据读取者 不适用 空值 空值 不可用
None --X --X R-X 不适用

备注

若要在 Azure 存储资源管理器中查看某个容器的内容,安全主体必须使用 Azure AD 登录到存储资源管理器,并且必须(至少)拥有对容器的根文件夹 (\) 的读取访问权限 (R--)。 此权限级别允许安全主体列出根文件夹的内容。 如果不希望根文件夹的内容可见,可以向安全主体分配读取者角色。 使用该角色,安全主体将能够列出帐户中的容器,但不能列出容器内容。 然后,你可以使用 ACL 授予对特定目录和文件的访问权限。

安全组

始终将 Azure AD 安全组用作 ACL 条目中分配的主体。 拒绝直接分配各个用户或服务主体。 使用此结构,你可以添加和删除用户或服务主体,不需要向整个目录结构重新应用 ACL。 可以仅在适当的 Azure AD 安全组中添加或删除用户和服务主体。

有多种不同的方法可用来设置组。 例如,假设你有一个名为 /LogData 的目录,该目录包含服务器生成的日志数据。 Azure 数据工厂 (ADF) 将数据引入到该文件夹中。 服务工程团队中的特定用户将上传日志并管理此文件夹的其他用户,而各个 Databricks 群集将分析来自该文件夹的日志。

若要启用这些活动,可以创建一个 LogsWriter 组和一个 LogsReader 组。 然后,可以按如下所示分配权限:

  • LogsWriter 组添加到 /LogData 目录的具有 rwx 权限的 ACL。
  • LogsReader 组添加到 /LogData 目录的具有 r-x 权限的 ACL。
  • LogsWriters 组添加用于 ADF 的服务主体对象或托管服务标识 (MSI)。
  • 将服务工程团队中的用户添加到 LogsWriter 组。
  • 将 Databricks 的服务主体对象或 MSI 添加到 LogsReader 组。

如果服务工程团队中的用户离开了公司,则只需将其从 LogsWriter 组中删除即可。 如果未将该用户添加到组中,而是为该用户添加了专用 ACL 条目,则必须从 /LogData 目录中删除此 ACL 条目。 还必须从 /LogData 目录的整个目录层次结构中的所有子目录和文件中删除此条目。

若要创建组并添加成员,请参阅使用 Azure Active Directory 创建基本组并添加成员

对 Azure 角色分配和 ACL 条目的限制

通过使用组,你不太可能超出每个订阅的角色分配的最大数量,以及每个文件或目录的 ACL 条目的最大数量。 下表介绍了这些限制。

机制 范围 限制 支持的权限级别
Azure RBAC 存储帐户、容器。
在订阅或资源组级别进行跨资源 Azure 角色分配。
一个订阅中 2000 个 Azure 角色分配 Azure 角色(内置或自定义)
ACL 目录、文件 每个文件和每个目录有 32 个 ACL 条目(实际上是 28 个 ACL 条目)。 访问 ACL 和默认 ACL 都有自己的 32 个 ACL 条目的限制。 ACL 权限

共享密钥和共享访问签名 (SAS) 授权

Azure Data Lake Storage Gen2 还支持使用共享密钥SAS 方法进行身份验证。 这两种身份验证方法的特点是没有与调用方关联的标识,因此不能执行基于安全主体权限的身份验证。

就共享密钥这一种方法而言,调用方有效地获得了“超级用户”访问权限,这意味着对所有资源上所有操作(包括数据操作、设置所有者的操作和更改 ACL 的操作)的完全访问权限。

SAS 令牌本身就包含允许的权限。 它包含的权限有效地应用到所有授权决策,但不执行额外的 ACL 检查。

后续步骤

若要详细了解访问控制列表,请参阅 Azure Data Lake Storage Gen2 中的访问控制列表 (ACL)