PostgreSQL Anonymizer动态掩码失效问题求助
PostgreSQL Anonymizer动态掩码未生效的解决办法
关键问题排查与修复步骤
1. 重启后需切换到目标数据库操作
你重启PostgreSQL后直接执行CREATE EXTENSION anon等命令,默认是在postgres库而非test库中执行,等于操作未作用到目标库。必须先切换到test库再执行后续步骤:
\c test CREATE EXTENSION anon CASCADE; SELECT anon.init(); SELECT anon.start_dynamic_masking();
2. 给掩码用户补全必要权限
你未给useranonymise授予schema的使用权限和表的查询权限,权限不足会导致掩码逻辑无法触发,补上以下授权语句:
GRANT USAGE ON SCHEMA schema TO useranonymise; GRANT SELECT ON schema.personnelmedical TO useranonymise;
3. 必须使用掩码用户测试查询
你最后用超级用户账号执行查询,超级用户默认不受掩码规则限制,自然看到原始数据。需切换到useranonymise用户再查询:
\c test useranonymise -- 输入密码mdp后执行查询 SELECT * FROM schema.personnelmedical;
4. 确认动态掩码已启用
执行以下命令检查动态掩码状态,返回on才是正常启用状态:
SHOW anon.dynamic_masking;
若返回off,重新执行SELECT anon.start_dynamic_masking();
5. 验证列掩码标签配置
你的标签语法无误,但可重新执行一次确保配置生效:
SECURITY LABEL FOR anon ON COLUMN schema.personnelmedical.matricule IS 'MASKED WITH FUNCTION anon.partial(matricule,1,$$****************$$,1)';
修正后的完整操作流程
-- 以下为你已完成的步骤,可跳过 CREATE DATABASE test; CREATE SCHEMA schema; CREATE TABLE schema.personnelmedical ( id SERIAL PRIMARY KEY, nom VARCHAR(30), prenom VARCHAR(30), numeroTel VARCHAR(20), matricule VARCHAR(20) ); INSERT INTO schema.personnelmedical (nom, prenom, numeroTel, matricule) VALUES ('Dupont', 'Jean', '123-456-7890', 'M123'), ('Martin', 'Marie', '987-654-3210', 'F456'), ('Doe', 'John', '555-123-4567', 'M789'), ('Smith', 'Alice', '777-888-9999', 'F012'); -- 设置预加载库与源schema ALTER DATABASE test SET session_preload_libraries = 'anon'; ALTER DATABASE test SET anon.sourceschema TO 'schema'; -- 退出并重启PostgreSQL exit systemctl restart postgresql14.service -- 重新连接到test库 psql -d test -- 初始化掩码扩展 CREATE EXTENSION anon CASCADE; SELECT anon.init(); SELECT anon.start_dynamic_masking(); -- 配置列掩码规则 SECURITY LABEL FOR anon ON COLUMN schema.personnelmedical.matricule IS 'MASKED WITH FUNCTION anon.partial(matricule,1,$$****************$$,1)'; -- 创建掩码用户并授权 CREATE USER useranonymise WITH PASSWORD 'mdp'; SECURITY LABEL FOR anon ON ROLE useranonymise IS 'MASKED'; GRANT USAGE ON SCHEMA schema TO useranonymise; GRANT SELECT ON schema.personnelmedical TO useranonymise; -- 切换到掩码用户测试效果 \c test useranonymise SELECT * FROM schema.personnelmedical;
内容的提问来源于stack exchange,提问作者Valentin Mazabraud
相关产品推荐
相关产品推荐

