
点击蓝字关注我们
在快速发展的数字时代,数据隐私和安全已成为各行各业组织的首要任务。保护敏感信息的需求不断增加,促使了强大的数据保护机制的开发。
EDB Postgres Advanced Server 数据脱敏
EDB Postgres Advanced Server 的数据脱敏功能提供了一种强大的方法来保护敏感数据,根据用户权限动态改变数据的呈现方式。这种机制确保了像社保号码(SSNs)或薪资明细这类敏感信息只对特权用户完全可访问,而其他用户看到的是脱敏版本。数据脱敏是通过为每个需要脱敏的特定字段创建函数来实现的。这些函数规定了数据将如何向不同用户显示,有效地限制了敏感数据的暴露,而不会改变数据库中实际存储的数据。
本文提供的示例是在 EPAS 15 上创建的。
实施数据脱敏策略
通过 CREATE REDACTION POLICY 命令,数据脱敏策略得以简化,该命令允许管理员指定表、列以及要应用的具体脱敏函数。
postgresql.conf 文件中的 edb_data_redaction 参数随后决定了是否应用数据脱敏。
默认情况下,该参数处于启用状态,因此脱敏策略是有效的。以下是发生的情况:
超级用户和表所有者绕过数据脱敏,查看原始数据。
所有其他用户应用脱敏策略,查看重新格式化的数据。
如果在会话期间将参数设置为 FALSE 以禁用该参数,那么以下情况会发生:
超级用户和表所有者绕过数据脱敏,查看原始数据。
所有其他用户会收到错误。
可以使用 ALTER REDACTION POLICY 命令更改脱敏策略,或者使用 DROP REDACTION POLICY 命令将其删除。
CREATE REDACTION POLICY 命令的参数
CREATE REDACTION POLICY 命令涉及几个参数,这些参数允许详细说明脱敏策略应如何运行:
name: 指定正在创建的数据脱敏策略的名称。至关重要的是,此名称必须是唯一的,不能与要应用脱敏策略的表的现有数据脱敏策略名称冲突。
table_name: 要应用数据脱敏策略的表的名称(可选模式限定schema-qualified)。它定义了策略在数据库中特定表的范围。
FOR (expression): 这个可选子句允许添加一个脱敏策略表达式。只有当此表达式计算结果为 true 时,才会应用数据脱敏策略。它允许基于条件地应用策略,增加了灵活性和针对性。
ADD [COLUMN]: 这种形式可以在同一命令中多次使用,允许将表的一个或多个列添加到数据脱敏策略中。每个添加的列都可以使用 USING 子句定义其特定的脱敏函数。
USING funcname_clause: ADD COLUMN 形式的一部分,USING 子句指定要应用于列数据的脱敏函数。在这里定义的函数决定了列的数据将如何被脱敏。
WITH OPTIONS ( ... ): 这个可选子句允许指定数据脱敏策略的其他选项,包括范围和异常。SCOPE 选项定义应用脱敏的查询部分,而 EXCEPTION 选项指定不应应用脱敏的条件。
脱敏策略中的 EXCEPTION 值
EXCEPTION 值可以是 none、equal 或 leakproof,每个值在决定何时以及如何脱敏数据方面都有其独特的作用:
None: 这是默认设置,不对脱敏策略进行任何例外。数据将根据定义的规则进行脱敏,没有任何豁免。
示例:
-- 创建数据库
CREATE DATABASE poc_database;
-- 切换到新创建的数据库
\c poc_database
-- 创建表 employees
CREATE TABLE employees (id SERIAL PRIMARY KEY,name VARCHAR(100),ssn VARCHAR(11),phone VARCHAR(15),birthday DATE,salary NUMERIC(10, 2),email VARCHAR(100));
-- 插入示例数据
INSERT INTO employees (name, ssn, phone, birthday, salary, email) VALUES('Sally Sample', '020-78-9345', '5081234567', '1961-02-02', 51234.34, 'sally.sample@enterprisedb.com'),('John Doe', '123-45-6789', '5551234567', '1980-01-01', 60000.00, 'john.doe@example.com'),('Jane Smith', '987-65-4321', '4445556677', '1975-05-15', 55000.50, 'jane.smith@example.com');
-- 创建脱敏函数
CREATE OR REPLACE FUNCTION redact_ssn(ssn VARCHAR) RETURNS VARCHAR AS $$BEGINRETURN 'xxx-xx-' || substring(ssn from 8 for 4);END;$$ LANGUAGE plpgsql;
-- 创建脱敏策略
CREATE REDACTION POLICY redact_policy_personal_info ON employees FOR (session_user != 'hr')ADD COLUMN ssn USING redact_ssn(ssn) WITH OPTIONS (SCOPE query, EXCEPTION none);
-- 创建一个非特权用户
CREATE USER test_user PASSWORD 'test_password';
-- 授予非特权用户对表的读取权限
GRANT SELECT ON employees TO test_user;
-- 切换到非特权用户
\c poc_database test_userpoc_database=> select * from employees where ssn = '020-78-9345;id | name | ssn | phone | birthday | salary | email----+------+-----+-------+----------+--------+-------(0 rows)----------------------------------------------------------------Seq Scan on employees (cost=0.00..57.95 rows=1 width=414) (actual time=0.056..0.062 rows=0 loops=1)Filter: ((redact_ssn(ssn))::text = '020-78-9345'::text)Rows Removed by Filter: 3Planning Time: 0.181 msExecution Time: 0.107 ms(5 rows)
Equal: 当设置为 equal 时,如果数据用于等式测试,则脱敏策略会豁免数据不进行脱敏。在特定数据需要用于比较或过滤目的但其他情况下应保持脱敏的场景中,这特别有用。
示例:
-- 新建脱敏策略,设置EXCEPTION为equal,如果上面已建,可以用ALTER REDACTION POLICY更新已有策略
-- 新建
CREATE REDACTION POLICY redact_policy_personal_info ON employees FOR (session_user != 'hr')ADD COLUMN ssn USING redact_ssn(ssn) WITH OPTIONS (SCOPE query, EXCEPTION equal);
-- 或更新策略
ALTER REDACTION POLICY redact_policy_personal_info ON employeesMODIFY COLUMN ssn WITH OPTIONS (EXCEPTION equal);poc_database=> select * from employees where ssn = '020-78-9345';id | name | ssn | phone | birthday | salary | email----+--------------+-------------+------------+--------------------+------------+-------------------------------1 | Sally Sample | xxx-xx-9345 | 5081234567 | 02-FEB-61 00:00:00 | $51,234.34 | sally.sample@enterprisedb.com(1 row)------------------------------------------------------------------------------------------------------Seq Scan on employees (cost=0.00..12.50 rows=1 width=414) (actual time=0.045..0.056 rows=1 loops=1)Filter: ((ssn)::text = '020-78-9345'::text)Rows Removed by Filter: 2Planning Time: 0.066 msExecution Time: 0.100 ms(5 rows)
Leakproof: 如果异常是 leakproof,当对列应用 leakproof 函数时,该列不会被脱敏。“leakproof” 函数保证不会通过其结果或任何其他副作用泄露其参数的信息。这一属性有助于查询规划器优化查询,特别是在行级安全或数据脱敏等安全策略存在的情况下。当一个函数被标记为 leakproof 时,它向数据库系统保证该函数的行为不会泄露其参数的任何细节。这可以允许该函数在敏感数据受到保护的上下文中执行。
结论
使用 EDB Postgres Advanced Server 实施强大的数据脱敏策略是确保数据隐私和安全的关键步骤。通过利用 CREATE REDACTION POLICY 命令的灵活性并理解 EXCEPTION 参数的细微差别,组织可以有效控制敏感数据的访问和呈现方式,确保符合数据保护法规并保护其数据资产。
关于公司
感谢您关注新智锦绣科技(北京)有限公司!作为 Elastic 的 Elite 合作伙伴及 EnterpriseDB 在国内的唯一代理和服务合作伙伴,我们始终致力于技术创新和优质服务,帮助企业客户实现数据平台的高效构建与智能化管理。无论您是关注 Elastic 生态系统,还是需要 EnterpriseDB 的支持,我们都将为您提供专业的技术支持和量身定制的解决方案。
欢迎关注我们,获取更多技术资讯和数字化转型方案,共创美好未来!
![]() | ![]() |
Elastic 微信群 | EDB 微信群 |

发现“分享”和“赞”了吗,戳我看看吧






