使用 RLS 策略的注意事项 - Amazon Redshift

使用 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;

    有关如何设置和检索自定义会话上下文变量的详细信息,请转至 SETSET_CONFIGSHOWCURRENT_SETTINGRESET。有关在一般情况下修改服务器配置的更多信息,请访问修改服务器配置

    重要

    在 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 保护的关系和来自数据湖的嵌套数据。