使用 RLS 策略的注意事项
以下是使用 RLS 策略时的注意事项:
Amazon Redshift 可将 RLS 策略应用于 SELECT、UPDATE 或 DELETE 语句。
Amazon Redshift 不会将 RLS 策略应用于 INSERT、COPY、ALTER TABLE APPEND 语句。
行级别安全性与列级别安全性配合使用,以保护您的数据。
如果您的 Amazon Redshift 集群先前位于支持 RLS 的最新正式发布版本上,但现在已降级到早期版本,则当您对附加了 RLS 策略的基表运行查询时,Amazon Redshift 将返回错误。sys:secadmin 可以撤消被授予受限策略的用户的访问权限、关闭针对表的 RLS,以及删除策略。
在为源关系启用 RLS 后,Amazon Redshift 将为超级用户、已被明确授予系统权限 IGNORE RLS 或 sys:secadmin 角色的用户支持 ALTER TABLE APPEND 语句。在这种情况下,您可以通过从现有源表移动数据,运行 ALTER TABLE APPEND 语句,以将行附加到目标表。Amazon Redshift 会将所有元组从源关系移动到目标关系中。目标关系的 RLS 状态不会影响 ALTER TABLE APPEND 语句。
为了便于从其他数据仓库系统迁移,您可以通过指定变量名称和值,以设置和检索连接的自定义会话上下文变量。
以下示例为行级别安全性 (RLS) 策略设置了会话上下文变量。
-- Set a customized context variable. SELECT set_config(‘app.category’, ‘Concerts’, FALSE); -- Create a RLS policy using current_setting() to get the value of a customized context variable. CREATE RLS POLICY policy_categories WITH (catgroup VARCHAR(10)) USING (catgroup = current_setting('app.category', FALSE)); -- Set correct roles and attach the policy on the target table to one or more roles. ATTACH RLS POLICY policy_categories ON tickit_category_redshift TO ROLE analyst, ROLE dbadmin;
有关如何设置和检索自定义会话上下文变量的详细信息,请转至 SET、SET_CONFIG、SHOW、CURRENT_SETTING 和 RESET。有关在一般情况下修改服务器配置的更多信息,请访问修改服务器配置。
重要
在 RLS 策略中使用会话上下文变量时,安全策略依赖于调用该策略的用户或角色。在 RLS 策略中使用会话上下文变量时,请注意避免安全漏洞。
在 DECLARE 和 FETCH 之间或后续 FETCH 语句之间使用 SET SESSION AUTHORIZATION 更改会话用户不会刷新根据 DECLARE 时的用户策略已经准备好的计划。将游标与受 RLS 保护的表一起使用时,请避免更改会话用户。
当视图对象内的基础对象受 RLS 保护时,附加到运行查询的用户的策略将应用于相应的基本对象。这与对象级权限检查不同,在对象级权限检查中,根据视图基本对象检查视图所有者的权限。您可以在查询的 EXPLAIN 计划输出中查看受 RLS 保护的关系。
当在附加到用户的关系的 RLS 策略中引用用户定义函数 (UDF) 时,用户必须拥有对该 UDF 的 EXECUTE 权限才能查询该关系。
行级安全性可能会限制查询优化。我们建议在大型数据集上部署受 RLS 保护的视图之前,仔细评估查询性能。
应用于后期绑定视图的行级安全策略可能会推送到联合表中。这些 RLS 策略可能在外部处理引擎日志中可见。
限制
以下是使用 RLS 策略时的限制:
Amazon Redshift 可以针对某些包含具有复杂联接的查询的 RLS 策略支持 SELECT 语句,但不支持 UPDATE 或 DELETE 语句。在使用 UPDATE 或 DELETE 语句的情况下,Amazon Redshift 将返回以下错误:
ERROR: One of the RLS policies on target relation is not supported in UPDATE/DELETE.
-
每当在附加到用户的关系的 RLS 策略中引用用户定义函数 (UDF) 时,用户都必须拥有对该 UDF 的 EXECUTE 权限才能查询该关系。
不支持关联的子查询。Amazon Redshift 将返回以下错误:
ERROR: RLS policy could not be rewritten.
RLS 策略不能附加到外部表。
Amazon Redshift 不支持与 RLS 的数据共享。如果关系没有对数据共享关闭 RLS,则使用者集群上的查询将失败,并出现以下错误:
RLS-protected relation "rls_protected_table" cannot be accessed via datasharing query.
您可以使用 ALTER TABLE 命令以及参数 ROW LEVEL SECURITY OFF FOR DATASHARES,关闭数据共享的 RLS。有关使用 ALTER TABLE 启用或禁用 RLS 的更多信息,请查看 ALTER TABLE。
在跨数据库查询中,Amazon Redshift 会阻止读取受 RLS 保护的关系。拥有 IGNORE RLS 权限的用户可以使用跨数据库查询访问受保护的关系。当没有 IGNORE RLS 权限的用户通过跨数据库查询访问受 RLS 保护的关系时,会出现以下错误:
RLS-protected relation "rls_protected_table" cannot be accessed via cross-database query.
ALTER RLS POLICY 仅支持使用 USING(using_predicate_exp)子句修改 RLS 策略。运行 ALTER RLS POLICY 时,您无法使用 WITH 子句修改 RLS 策略。
-
如果以下任一配置选项的值与会话的默认值不匹配,则无法查询已开启行级安全性的关系:
enable_case_sensitive_super_attribute
enable_case_sensitive_identifier
downcase_delimited_identifier
如果您试图查询具有行级安全性的关系,并看到消息“RLS 保护的关系不支持会话级别配置,因为区分大小写不同于其默认值”,请考虑重置会话的配置选项。
当您的预调配集群或无服务器命名空间具有任何行级安全策略时,普通用户将无法使用以下命令:
ALTER <current_user> SET enable_case_sensitive_super_attribute/enable_case_sensitive_identifier/downcase_delimited_identifier
创建 RLS 策略时,我们建议您更改普通用户的默认配置选项设置,使其与创建策略时会话的配置选项设置相匹配。超级用户和具有 ALTER USER 权限的用户可以使用参数组设置或 ALTER USER 命令来执行此操作。有关参数组的信息,请参阅《Amazon Redshift 管理指南》中的 Amazon Redshift 参数组。有关 ALTER USER 命令的信息,请参阅 ALTER USER。
-
普通用户无法使用 CREATE VIEW 命令替换具有行级安全策略的视图和后期绑定视图。要替换具有 RLS 策略的视图或 LBV,请先分离附加到这些视图的所有 RLS 策略,替换视图或 LBV,然后重新附加策略。具有
sys:secadmin permission
的超级用户和用户可以在具有 RLS 策略的视图或 LBV 上使用 CREATE VIEW,而无需分离策略。 -
具有行级安全策略的视图不能引用系统表和系统视图。
-
常规视图引用的后期绑定视图无法受到 RLS 保护。
-
无法在同一个查询中访问受 RLS 保护的关系和来自数据湖的嵌套数据。