在 Azure Synapse 无服务器 SQL 池中管理用户权限

已完成

为了保护数据,Azure 存储实现了一个访问控制模型,该模型支持 Azure 基于角色的访问控制 (Azure RBAC) 和用于 Unix 的可移植操作系统接口 (POSIX) 之类的访问控制列表 (ACL)

可将安全主体关联到文件和目录的访问级别。 这些关联在访问控制列表 (ACL) 中捕获。 存储帐户中的每个文件和目录都有一个访问控制列表。 当安全主体尝试对文件或目录执行操作时,ACL 检查将确定安全主体(用户、组、服务主体或托管标识)是否具有执行该操作所需的正确权限级别。

有两种访问控制列表:

  • 访问 ACL

    控制对对象的访问。 文件和目录都具有访问 ACL。

  • 默认 ACL

    是与目录关联的 ACL 模板,用于确定在该目录下创建的任何子项的访问 ACL。 文件没有默认 ACL。

访问 ACL 和默认 ACL 具有相同的结构。

容器对象权限为“读取”、“写入”和“执行”,可对文件和目录使用这些权限,如下表所示:

权限级别

权限 文件 Directory
读取 (R) 可以读取文件内容 需有“读取”和“执行”权限才能列出目录内容
写入 (W) 可以在文件中写入或追加内容 需有“写入”和“执行”权限才能在目录中创建子项
执行 (X) 不表示 Data Lake Storage Gen2 上下文中的任何内容 需要遍历目录的子项

设置 ACL 的指南

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

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

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

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

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

无服务器 SQL 池用户所需的角色

对于需要“只读”访问权限的用户,你应该分配名为“存储 Blob 数据读取器”的角色。

对于需要“读/写”访问权限的用户,你应该分配名为“存储 Blob 数据参与者”的角色。 如果用户应具有 create external table as select (CETAS) 的权限,则需要读/写访问权限。

注意

如果用户应具有角色所有者或参与者的权限,则该角色不足够。 Azure Data Lake Storage Gen 2 具有应分配的超级角色。

数据库级别权限

若要向用户提供更精细的访问权限,应使用 Transact-SQL 语法创建登录名和用户。

若要向用户授予对单个无服务器 SQL 池数据库的访问权限,请执行此示例中的步骤:

  1. 创建登录名

    use master
    CREATE LOGIN [alias@domain.com] FROM EXTERNAL PROVIDER;
    
  2. 创建用户

    use yourdb -- Use your DB name
    CREATE USER alias FROM LOGIN [alias@domain.com];
    
  3. 将用户添加到指定角色的成员

    use yourdb -- Use your DB name
    alter role db_datareader 
    Add member alias -- Type USER name from step 2
    -- You can use any Database Role which exists 
    -- (examples: db_owner, db_datareader, db_datawriter)
    -- Replace alias with alias of the user you would like to give access and domain with the company domain you are using.
    

服务器级别权限

  1. 若要向用户授予对所有无服务器 SQL 池数据库的完全访问权限,请执行此示例中的步骤:

    CREATE LOGIN [alias@domain.com] FROM EXTERNAL PROVIDER;
    ALTER SERVER ROLE sysadmin ADD MEMBER [alias@domain.com];