更新时间:2024-10-25 GMT+08:00

CREATE REDACTION POLICY

功能描述

对表创建数据脱敏策略。

注意事项

  • 只有表对象的属主具有创建脱敏策略的权限。
  • 仅支持在普通表创建数据脱敏策略,不支持为系统表、HDFS表、外表、临时表、UNLOGGED表以及视图和函数对象创建脱敏策略。
  • 不支持通过同义词向普通表对象创建脱敏策略。
  • 表对象与脱敏策略间一一对应。一个脱敏策略是表对象所有脱敏列的集合,可以给脱敏表对象的多个列字段指定脱敏函数,且不同脱敏列对象可以采用不同的脱敏函数。
  • 创建脱敏策略时,默认策略生效,即属性enable值为true。
  • 具有sysadmin权限的用户,可跳过脱敏策略检查,对脱敏列数据一直具有可见性,即脱敏策略不生效。
  • 支持通过指定角色匹配脱敏策略。

语法格式

1
2
3
4
CREATE REDACTION POLICY policy_name ON table_name [ { AFTER | BEFORE } old_policy_name ]
    [INHERIT]
    [ WHEN (when_expression) ]
    [ ADD COLUMN column_name WITH redaction_function_name ( [ argument [, ...] ] )] [, ... ];

参数说明

  • policy_name

    脱敏策略名称。

  • table_name

    应用脱敏策略的表名。

  • AFTER | BEFORE

    指定当前策略创建的相对位置,通常一张表使用一个脱敏策略即可。缺省时表示:默认当前策略创建在当前系统表中记录的目标表的候选策略的最后一个之后。

  • INHERIT

    说明脱敏策略是否是“继承”自其他脱敏策略,不推荐使用。

  • WHEN ( when_expression )

    WHEN子句指定一个生效表达式。仅当此表达式为真时,脱敏策略才可能生效。

    查询语句涉及脱敏表对象时,仅当脱敏策略的WHEN子句表达式为真时,查询对脱敏列数据才可能不可见,即脱敏策略生效。通常,采用WHEN子句来限定脱敏策略的生效用户范围,具有较严格的约束规格。

    WHEN子句的规格约束如下:

    1. 表达式可以是AND、OR连接的多个子表达式。
    2. 每个子表达式仅支持=、<>、!=、>=、>、<=、<七种运算符,左右值只能取常量值或者下列系统常量值之一:SESSION_USER、CURRENT_USER、USER、CURRENT_ROLE、CURRENT_SCHEMA系统常量或者SYS_CONTEXT系统函数。
    3. 每个子表达式可以是IN、NOT IN表达式,左值可以是上述2中所列系统常量值,右值数组的每个元素必须是常量值。
    4. 每个子表达式可以是pg_has_role(user, role, privilege)系统函数。
    5. 当脱敏策略永远成立时,即对所有用户(含表对象属主)均生效,建议使用表达式(1=1)创建脱敏策略。
    6. WHEN子句缺省时,脱敏策略默认不生效,需用户手动指定WHEN子句表达式。
  • column_name

    脱敏策略应用的表对象的列名。

  • function_name

    对脱敏列应用的脱敏函数。

  • arguments

    脱敏函数的参数列表。

    • MASK_NONE,表示不进行任何脱敏处理。
    • MASK_FULL,表示全脱敏成固定值。
    • MASK_PARTIAL,表示按指定的字符类型,数值类型或时间类型进行部分脱敏处理。

      除系统提供MASK_NONE、MASK_FULL、MASK_PARTIAL三种内置脱敏函数,也支持使用C语言、PL/PGSQL语言创建的用户自定义脱敏函数,函数规格,请参考数据脱敏函数

示例

对指定用户创建脱敏策略。

  1. 创建用户alice和matu:
    1
    2
    CREATE ROLE alice PASSWORD '{password}';
    CREATE ROLE matu PASSWORD '{password}';
    
  2. 用户alice创建表对象emp并插入数据:
    1
    2
    CREATE TABLE emp(id int, name varchar(20), salary NUMERIC(10,2));
    INSERT INTO emp VALUES(1, 'July', 1230.10), (2, 'David', 999.99);
    
  3. 用户alice为表对象emp创建脱敏策略mask_emp,字段salary对用户matu不可见:
    1
    CREATE REDACTION POLICY mask_emp ON emp WHEN(current_user = 'matu') ADD COLUMN salary WITH mask_full(salary);
    
  4. 用户alice授予用户matu表emp的SELECT权限:
    1
    GRANT SELECT ON emp TO matu;
    
  5. 切至用户matu:
    1
    SET ROLE matu PASSWORD '{password}';
    
  6. 查询表emp,字段salary数据已脱敏:
    1
    SELECT * FROM emp;
    

对角色创建脱敏策略。

  1. 创建角色redact_role:
    1
    CREATE ROLE redact_role PASSWORD '{password}';
    
  2. 将用户matu,alice加入角色redact_role:
    1
    GRANT redact_role to matu,alice;
    
  3. 管理员用户创建表对象emp1并插入数据:
    1
    2
    CREATE TABLE emp1(id int, name varchar(20), salary NUMERIC(10,2)); 
    INSERT INTO emp1 VALUES(3, 'Rose', 2230.20), (4, 'Jack', 899.88);  
    
  4. 管理员用户为表对象emp1创建脱敏策略mask_emp1,使字段salary对角色redact_role不可见。
    1
    CREATE REDACTION POLICY mask_emp1 ON emp1 WHEN(pg_has_role(current_user, 'redact_role', 'member')) ADD COLUMN salary WITH mask_full(salary);
    

    若不指定用户,默认为当前用户current_user:

    1
    CREATE REDACTION POLICY mask_emp1 ON emp1 WHEN (pg_has_role('redact_role', 'member')) ADD COLUMN salary WITH mask_full(salary);
    
  5. 管理员用户授予用户matu表emp1的SELECT权限:
    1
    GRANT SELECT ON emp1 TO matu;
    
  6. 切换至用户matu:
    1
    SET ROLE matu PASSWORD '{password}';
    
  7. 查询表emp,字段salary数据已脱敏。
    1
    SELECT * FROM emp1;