行级安全性 (RLS) 是 OneLake 安全性(预览版)的一项功能,可用于为存储在 OneLake 中的表数据定义行级数据限制。 用户可以在 OneLake 中定义角色,其中包含为该角色成员筛选数据行的规则。 当 RLS 角色的成员查询数据时,RLS 规则会被评估,然后只返回允许的行。
注释
OneLake 安全性目前处于有限预览阶段。 要请求参与预览并访问这些功能,请填写 https://aka.ms/onelakesecuritypreview 的表单。
先决条件
- 已启用 OneLake 数据访问角色的 OneLake 中的湖屋。 有关详细信息,请参阅 OneLake 数据访问角色入门。
- 启用了架构的 Lakehouse。
- 通过“ 安全 ”选项卡将 lakehouse 上的 SQL Analytics 终结点切换到“用户标识”模式。
- 若要创建语义模型,请使用步骤创建 DirectLake 模型。
- 有关限制的完整列表,请参阅 已知限制部分。
强制实施行级安全性
OneLake 安全性 RLS 通过以下两种方式之一强制执行:
- 在 Fabric 引擎中筛选表:对 Spark 笔记本等受支持的 Fabric 引擎列表进行查询时,用户将只能看到 RLS 规则允许其查看的行。
- 阻止访问表:已应用 RLS 规则的表无法在受支持的 Fabric 引擎之外读取。
对于经过筛选的表,适用以下行为:
- RLS 规则不会限制管理员、成员和参与者角色的用户的访问权限。
- 如果 RLS 规则与其所定义的表不匹配,查询将失败,且不会返回任何行。 例如,如果 RLS 规则引用了一个不属于表的列。
- 如果用户属于两个不同的角色,且其中一个角色具有列级安全性 (CLS) 设置,则对 RLS 表的查询将失败,并且会显示错误。
- 只能对 Delta Parquet 表对象实施 RLS 规则。
- 应用于非 Delta 表对象的 RLS 规则会阻止该角色的成员访问整个表。
- 如果 RLS 语句包含阻止对表进行计算的语法错误,则可能会阻止对该表的访问。
定义行级安全性规则
可将行级安全性规则定义为任何授予对 Delta Parquet 格式表数据的访问权限的 OneLake 安全角色的一部分。 行仅与表数据相关,因此不允许针对非表文件夹或非结构化数据定义 RLS。
RLS 规则使用 SQL 语法来指定用户可以查看的行。 此语法采用 SQL SELECT
语句的形式,其中 RLS 规则在 WHERE
子句中定义。 RLS 规则仅支持语法规则中定义的 SQL 语言的一个子集。 具有无效 RLS 语法或与基础表不匹配的 RLS 语法的查询将导致不向用户显示任何行,或者在 SQL 分析终结点中出现查询错误。
使用以下步骤定义 RLS 规则:
导航到湖屋并选择“管理 OneLake 数据访问(预览版)”。
选择要为其定义表或文件夹安全性的现有角色,或者选择“新建”以创建新角色。
在角色详细信息页面上,选择要为其定义 RLS 的表旁边的“更多选项 (...)”,然后选择“行级安全性(预览版)”。
选择“保存”以确认行级安全性规则。
为 SQL 分析终结点启用 OneLake 安全性
在将 OneLake 安全性与 SQL 分析终结点配合使用之前,必须启用其 用户的标识模式。 在启用了预览的工作区中新建的 SQL 分析终结点将默认为用户的标识模式,因此对于现有 SQL 分析终结点,必须遵循这些步骤。
注释
每个 SQL 分析终结点只需切换到 用户的标识 模式一次。 未切换到用户的标识模式的终结点将继续使用委派标识来评估权限。
转到 SQL 分析端点。
在 SQL 分析终结点体验中,选择顶部功能区中的 “安全性 ”选项卡。
在 OneLake 访问模式下选择用户的标识。
在提示符下,选择确认,使用用户的身份。
现在,SQL 分析端点已准备好用于保障 OneLake 的安全。
语法规则
所有行级安全性规则均采用以下形式:
SELECT * FROM {schema_name}.{table_name} WHERE {column_level_boolean_1}{column_level_boolean_2}...{column_level_boolean_N}
例如:
SELECT * FROM Sales WHERE Amount>'50000' AND State='CA'
行级安全性规则中的最大字符数为 1000。
占位符 | 说明 |
---|---|
{schema_name} | {table_name} 所在架构的名称。 如果构件支持架构,则需要 {schema_name}。 |
{table_name} | 应用 RLS 谓词的表的名称。 此值必须与表名称完全匹配,否则 RLS 将不显示任何行。 |
{column_level_boolean} | 一个布尔语句,其中包含以下组件: * 列名:在 Delta 日志架构中指定的 {table_name} 中的列名。 列名可以格式化为 {column_name} 或 {table_name}.{column_name}。 * 运算符:支持的运算符之一,用于将列名和值计算为布尔值。 * 值:需要进行评估的静态值或一组值。 可以有一个或多个由 AND 或 OR 分隔的布尔语句。 |
支持的运算符
行级安全性规则支持以下运算符和关键字列表:
操作员 | 说明 |
---|---|
=(等于) | 当两个值的数据类型相同且完全匹配时,计算结果为 true。 |
<>(不等于) | 当两个值的数据类型不同且不完全匹配时,计算结果为 true。 |
> (大于) | 当列值大于计算值时,计算结果为 true。 对于字符串值,此运算符使用按位比较来确定一个字符串是否大于另一个字符串。 |
>=(大于或等于) | 当列值大于或等于计算值时,计算结果为 true。 对于字符串值,此运算符使用按位比较来确定一个字符串是否大于或等于另一个字符串。 |
< (小于) | 当列值小于计算值时,计算结果为 true。 对于字符串值,此运算符使用按位比较来确定一个字符串是否小于另一个字符串。 |
<=(小于或等于) | 当列值小于或等于计算值时,计算结果为 true。 对于字符串值,此运算符使用按位比较来确定一个字符串是否小于或等于另一个字符串。 |
在 | 当任何评估值的数据类型与列值相同且完全匹配时,计算结果为 true。 |
不是 | 当任何评估值的数据类型与列值不同或不完全匹配时,计算结果为 true。 |
和 | 使用布尔 AND 运算将前一个语句和后一个语句组合在一起。 只有两个语句都为真,整个谓词才为真。 |
或者 | 使用布尔 OR 运算将前一个语句和后一个语句组合在一起。 只要其中一个语句为 true,整个谓词就为 true。 |
真 | 表示 true 的布尔表达式。 |
假 | 表示 false 的布尔表达式。 |
空白 | 空白数据类型,可与 IS 运算符一起使用。 例如,row IS BLANK 。 |
Null | null 数据类型,可与 IS 运算符一起使用。 例如,row IS NULL 。 |
结合使用行级和列级安全性
可以将行级和列级安全性一起使用,以限制用户对表的访问。 但是,这两种策略必须通过统一的 OneLake 安全角色来应用。 在这种情况下,对数据的访问将根据单个角色中设置的规则进行限制。
OneLake 安全功能不支持将两个或多个角色组合使用,其中一个角色包含 RLS 规则,另一个角色包含 CLS 规则。 尝试访问属于不支持的角色组合的表的用户将收到查询错误。