Part01-基础概念与理论知识
1.1 数据编辑的概念
数据编辑(Data Redaction)是Oracle数据库中一种数据安全特性,它可以在查询时动态修改敏感数据的显示,而不需要修改实际存储的数据。数据编辑可以帮助保护敏感数据,如信用卡号、身份证号、电话号码等,防止未授权访问。
学习交流加群风哥QQ113257174
1.2 数据编辑的类型
- 全编辑:将整个数据值替换为固定值
- 部分编辑:只编辑数据值的一部分,如信用卡号的中间几位
- 随机编辑:将数据值替换为随机生成的值
- 正则表达式编辑:根据正则表达式编辑数据
- 无编辑:不编辑数据,保持原始值
风哥提示:数据编辑是一种动态的数据保护机制,只影响查询结果,不影响实际存储的数据
1.3 数据编辑的应用场景
- 保护敏感个人信息(PII)
- 符合法规要求(如GDPR、HIPAA等)
- 限制内部人员对敏感数据的访问
- 在测试环境中使用真实数据但保护敏感信息
更多视频教程www.fgedu.net.cn
Part02-生产环境规划与建议
2.1 数据编辑策略设计
- 明确敏感数据:确定需要保护的敏感数据
- 选择适当的编辑类型:根据数据类型选择合适的编辑方式
- 定义编辑规则:根据业务需求定义编辑规则
- 测试编辑效果:确保编辑后的结果符合业务需求
2.2 数据编辑性能考虑
在生产环境中,数据编辑可能会对性能产生影响,建议:
- 只对必要的列应用数据编辑
- 避免在大型表上使用复杂的编辑规则
- 定期监控数据编辑对性能的影响
- 考虑使用索引来优化查询性能
学习交流加群风哥微信: itpux-com
2.3 数据编辑安全最佳实践
- 最小权限原则:只对必要的用户应用数据编辑
- 定期审查:定期审查数据编辑策略的有效性
- 结合其他安全特性:如VPD、审计等
- 文档化:记录数据编辑策略的设计和实现
更多学习教程公众号风哥教程itpux_com
Part03-生产环境项目实施方案
风哥教程参考Oracle官方文档Security部分,我们将实施以下步骤:
- 创建测试表
- 创建数据编辑策略
- 测试数据编辑效果
- 管理数据编辑策略
- 监控数据编辑性能
from oracle:www.itpux.com
Part04-生产案例与实战讲解
4.1 创建测试表
命令:CREATE TABLE fgedu.employees (
employee_id NUMBER(6),
first_name VARCHAR2(20),
last_name VARCHAR2(25),
email VARCHAR2(25),
phone_number VARCHAR2(20),
hire_date DATE,
job_id VARCHAR2(10),
salary NUMBER(8,2),
commission_pct NUMBER(2,2),
manager_id NUMBER(6),
department_id NUMBER(4),
ssn VARCHAR2(11),
credit_card VARCHAR2(16)
);INSERT INTO fgedu.employees VALUES (100, ‘Steven’, ‘King’, ‘steven.king@fgedu.net.cn’, ‘515.123.4567’, SYSDATE-1000, ‘AD_PRES’, 24000, NULL, NULL, 90, ‘123-45-6789’, ‘1234567890123456’);INSERT INTO fgedu.employees VALUES (101, ‘Neena’, ‘Kochhar’, ‘neena.kochhar@fgedu.net.cn’, ‘515.123.4568’, SYSDATE-900, ‘AD_VP’, 17000, NULL, 100, 90, ‘234-56-7890’, ‘2345678901234567’);INSERT INTO fgedu.employees VALUES (102, ‘Lex’, ‘De Haan’, ‘lex.dehaan@fgedu.net.cn’, ‘515.123.4569’, SYSDATE-800, ‘AD_VP’, 17000, NULL, 100, 90, ‘345-67-8901’, ‘3456789012345678’);COMMIT;执行:输出日志:Table created.1 row created.1 row created.1 row created.Commit complete.
employee_id NUMBER(6),
first_name VARCHAR2(20),
last_name VARCHAR2(25),
email VARCHAR2(25),
phone_number VARCHAR2(20),
hire_date DATE,
job_id VARCHAR2(10),
salary NUMBER(8,2),
commission_pct NUMBER(2,2),
manager_id NUMBER(6),
department_id NUMBER(4),
ssn VARCHAR2(11),
credit_card VARCHAR2(16)
);INSERT INTO fgedu.employees VALUES (100, ‘Steven’, ‘King’, ‘steven.king@fgedu.net.cn’, ‘515.123.4567’, SYSDATE-1000, ‘AD_PRES’, 24000, NULL, NULL, 90, ‘123-45-6789’, ‘1234567890123456’);INSERT INTO fgedu.employees VALUES (101, ‘Neena’, ‘Kochhar’, ‘neena.kochhar@fgedu.net.cn’, ‘515.123.4568’, SYSDATE-900, ‘AD_VP’, 17000, NULL, 100, 90, ‘234-56-7890’, ‘2345678901234567’);INSERT INTO fgedu.employees VALUES (102, ‘Lex’, ‘De Haan’, ‘lex.dehaan@fgedu.net.cn’, ‘515.123.4569’, SYSDATE-800, ‘AD_VP’, 17000, NULL, 100, 90, ‘345-67-8901’, ‘3456789012345678’);COMMIT;执行:输出日志:Table created.1 row created.1 row created.1 row created.Commit complete.
4.2 创建数据编辑策略
命令:— 创建SSN数据编辑策略
BEGIN
DBMS_REDACT.ADD_POLICY(
object_schema => ‘fgedu’,
object_name => ’employees’,
policy_name => ‘fgedu_ssn_redaction’,
column_name => ‘ssn’,
function_type => DBMS_REDACT.PARTIAL,
function_parameters => ‘VVVFVV,VVVV,****,VV’,
expression => ‘1=1’ — 对所有用户应用
);END;/– 创建信用卡数据编辑策略
BEGIN
DBMS_REDACT.ADD_POLICY(
object_schema => ‘fgedu’,
object_name => ’employees’,
policy_name => ‘fgedu_credit_card_redaction’,
column_name => ‘credit_card’,
function_type => DBMS_REDACT.PARTIAL,
function_parameters => ‘VVVV,VVVV,VVVV,VVVV,1,4,12,4’,
expression => ‘1=1’ — 对所有用户应用
);END;/– 创建工资数据编辑策略
BEGIN
DBMS_REDACT.ADD_POLICY(
object_schema => ‘fgedu’,
object_name => ’employees’,
policy_name => ‘fgedu_salary_redaction’,
column_name => ‘salary’,
function_type => DBMS_REDACT.FULL,
function_parameters => ‘0’,
expression => ‘SYS_CONTEXT(”USERENV”, ”SESSION_USER”) != ”SYS”’ — 对非SYS用户应用
);END;/执行:输出日志:PL/SQL procedure successfully completed.PL/SQL procedure successfully completed.PL/SQL procedure successfully completed.
BEGIN
DBMS_REDACT.ADD_POLICY(
object_schema => ‘fgedu’,
object_name => ’employees’,
policy_name => ‘fgedu_ssn_redaction’,
column_name => ‘ssn’,
function_type => DBMS_REDACT.PARTIAL,
function_parameters => ‘VVVFVV,VVVV,****,VV’,
expression => ‘1=1’ — 对所有用户应用
);END;/– 创建信用卡数据编辑策略
BEGIN
DBMS_REDACT.ADD_POLICY(
object_schema => ‘fgedu’,
object_name => ’employees’,
policy_name => ‘fgedu_credit_card_redaction’,
column_name => ‘credit_card’,
function_type => DBMS_REDACT.PARTIAL,
function_parameters => ‘VVVV,VVVV,VVVV,VVVV,1,4,12,4’,
expression => ‘1=1’ — 对所有用户应用
);END;/– 创建工资数据编辑策略
BEGIN
DBMS_REDACT.ADD_POLICY(
object_schema => ‘fgedu’,
object_name => ’employees’,
policy_name => ‘fgedu_salary_redaction’,
column_name => ‘salary’,
function_type => DBMS_REDACT.FULL,
function_parameters => ‘0’,
expression => ‘SYS_CONTEXT(”USERENV”, ”SESSION_USER”) != ”SYS”’ — 对非SYS用户应用
);END;/执行:输出日志:PL/SQL procedure successfully completed.PL/SQL procedure successfully completed.PL/SQL procedure successfully completed.
4.3 测试数据编辑效果
命令:— 以普通用户身份查询
CONN fgedu_user/password123;SELECT employee_id, first_name, last_name, ssn, credit_card, salary FROM fgedu.employees;– 以SYS用户身份查询
CONN / AS SYSDBA;SELECT employee_id, first_name, last_name, ssn, credit_card, salary FROM fgedu.employees;执行:输出日志:Connected.EMPLOYEE_ID EMP_NAME EMP_EMP_EMP_LAST_NAME SSN CREDIT_CARD SALARY
———– ——————– ————————- ————- —————- ———- 100 Steven King XXX-XX-6789 XXXX-XXXX-XXXX-3456 0 101 Neena Kochhar XXX-XX-7890 XXXX-XXXX-XXXX-4567 0 102 Lex De Haan XXX-XX-8901 XXXX-XXXX-XXXX-5678 0Connected.EMPLOYEE_ID EMP_NAME EMP_EMP_EMP_LAST_NAME SSN CREDIT_CARD SALARY
———– ——————– ————————- ————- —————- ———- 100 Steven King 123-45-6789 1234567890123456 24000 101 Neena Kochhar 234-56-7890 2345678901234567 17000 102 Lex De Haan 345-67-8901 3456789012345678 17000
CONN fgedu_user/password123;SELECT employee_id, first_name, last_name, ssn, credit_card, salary FROM fgedu.employees;– 以SYS用户身份查询
CONN / AS SYSDBA;SELECT employee_id, first_name, last_name, ssn, credit_card, salary FROM fgedu.employees;执行:输出日志:Connected.EMPLOYEE_ID EMP_NAME EMP_EMP_EMP_LAST_NAME SSN CREDIT_CARD SALARY
———– ——————– ————————- ————- —————- ———- 100 Steven King XXX-XX-6789 XXXX-XXXX-XXXX-3456 0 101 Neena Kochhar XXX-XX-7890 XXXX-XXXX-XXXX-4567 0 102 Lex De Haan XXX-XX-8901 XXXX-XXXX-XXXX-5678 0Connected.EMPLOYEE_ID EMP_NAME EMP_EMP_EMP_LAST_NAME SSN CREDIT_CARD SALARY
———– ——————– ————————- ————- —————- ———- 100 Steven King 123-45-6789 1234567890123456 24000 101 Neena Kochhar 234-56-7890 2345678901234567 17000 102 Lex De Haan 345-67-8901 3456789012345678 17000
风哥提示:数据编辑会根据用户身份和编辑策略动态修改查询结果,保护敏感数据
4.4 管理数据编辑策略
命令:— 查看数据编辑策略
SELECT object_schema, object_name, policy_name, column_name, function_type
FROM redaction_policies
WHERE object_schema = ‘FGEDU’;– 修改数据编辑策略
BEGIN
DBMS_REDACT.ALTER_POLICY(
object_schema => ‘fgedu’,
object_name => ’employees’,
policy_name => ‘fgedu_salary_redaction’,
action => DBMS_REDACT.MODIFY_EXPRESSION,
expression => ‘SYS_CONTEXT(”USERENV”, ”SESSION_USER”) NOT IN (”SYS”, ”FGEDU_ADMIN”)’
);END;/– 禁用数据编辑策略
BEGIN
DBMS_REDACT.ALTER_POLICY(
object_schema => ‘fgedu’,
object_name => ’employees’,
policy_name => ‘fgedu_salary_redaction’,
action => DBMS_REDACT.DISABLE_POLICY
);END;/– 删除数据编辑策略
BEGIN
DBMS_REDACT.DROP_POLICY(
object_schema => ‘fgedu’,
object_name => ’employees’,
policy_name => ‘fgedu_ssn_redaction’
);END;/执行:输出日志:OBJECT_SCHEMA OBJECT_NAME POLICY_NAME COLUMN_NAME FUNCTION_TYPE
————- ————— ————————- ————— ————- FGEDU EMPLOYEES FGEDU_SSN_REDACTION SSN PARTIAL FGEDU EMPLOYEES FGEDU_CREDIT_CARD_REDACTION CREDIT_CARD PARTIAL FGEDU EMPLOYEES FGEDU_SALARY_REDACTION SALARY FULLPL/SQL procedure successfully completed.PL/SQL procedure successfully completed.PL/SQL procedure successfully completed.
SELECT object_schema, object_name, policy_name, column_name, function_type
FROM redaction_policies
WHERE object_schema = ‘FGEDU’;– 修改数据编辑策略
BEGIN
DBMS_REDACT.ALTER_POLICY(
object_schema => ‘fgedu’,
object_name => ’employees’,
policy_name => ‘fgedu_salary_redaction’,
action => DBMS_REDACT.MODIFY_EXPRESSION,
expression => ‘SYS_CONTEXT(”USERENV”, ”SESSION_USER”) NOT IN (”SYS”, ”FGEDU_ADMIN”)’
);END;/– 禁用数据编辑策略
BEGIN
DBMS_REDACT.ALTER_POLICY(
object_schema => ‘fgedu’,
object_name => ’employees’,
policy_name => ‘fgedu_salary_redaction’,
action => DBMS_REDACT.DISABLE_POLICY
);END;/– 删除数据编辑策略
BEGIN
DBMS_REDACT.DROP_POLICY(
object_schema => ‘fgedu’,
object_name => ’employees’,
policy_name => ‘fgedu_ssn_redaction’
);END;/执行:输出日志:OBJECT_SCHEMA OBJECT_NAME POLICY_NAME COLUMN_NAME FUNCTION_TYPE
————- ————— ————————- ————— ————- FGEDU EMPLOYEES FGEDU_SSN_REDACTION SSN PARTIAL FGEDU EMPLOYEES FGEDU_CREDIT_CARD_REDACTION CREDIT_CARD PARTIAL FGEDU EMPLOYEES FGEDU_SALARY_REDACTION SALARY FULLPL/SQL procedure successfully completed.PL/SQL procedure successfully completed.PL/SQL procedure successfully completed.
4.5 创建自定义数据编辑函数
命令:— 创建自定义数据编辑函数
CREATE OR REPLACE FUNCTION fgedu_custom_redaction(
p_column IN VARCHAR2,
p_redaction_context IN VARCHAR2
) RETURN VARCHAR2 IS
BEGIN
— 自定义编辑逻辑
IF LENGTH(p_column) > 8 THEN
RETURN SUBSTR(p_column, 1, 4) || ‘****’ || SUBSTR(p_column, LENGTH(p_column)-3);ELSE
RETURN ‘****’;END IF;END fgedu_custom_redaction;/– 创建使用自定义函数的数据编辑策略
BEGIN
DBMS_REDACT.ADD_POLICY(
object_schema => ‘fgedu’,
object_name => ’employees’,
policy_name => ‘fgedu_phone_redaction’,
column_name => ‘phone_number’,
function_type => DBMS_REDACT.USER_DEFINED_FUNCTION,
function_parameters => ‘fgedu.fgedu_custom_redaction’,
expression => ‘1=1’
);END;/执行:输出日志:Function created.PL/SQL procedure successfully completed.
CREATE OR REPLACE FUNCTION fgedu_custom_redaction(
p_column IN VARCHAR2,
p_redaction_context IN VARCHAR2
) RETURN VARCHAR2 IS
BEGIN
— 自定义编辑逻辑
IF LENGTH(p_column) > 8 THEN
RETURN SUBSTR(p_column, 1, 4) || ‘****’ || SUBSTR(p_column, LENGTH(p_column)-3);ELSE
RETURN ‘****’;END IF;END fgedu_custom_redaction;/– 创建使用自定义函数的数据编辑策略
BEGIN
DBMS_REDACT.ADD_POLICY(
object_schema => ‘fgedu’,
object_name => ’employees’,
policy_name => ‘fgedu_phone_redaction’,
column_name => ‘phone_number’,
function_type => DBMS_REDACT.USER_DEFINED_FUNCTION,
function_parameters => ‘fgedu.fgedu_custom_redaction’,
expression => ‘1=1’
);END;/执行:输出日志:Function created.PL/SQL procedure successfully completed.
更多视频教程www.fgedu.net.cn
Part05-风哥经验总结与分享
5.1 最佳实践
- 根据数据类型选择合适的编辑方式
- 只对必要的列应用数据编辑
- 使用适当的表达式控制编辑的应用范围
- 定期测试数据编辑效果,确保符合业务需求
5.2 常见问题与解决方案
- 问题:数据编辑影响性能
解决方案:优化编辑策略,只对必要的列应用编辑 - 问题:编辑后的结果不符合业务需求
解决方案:调整编辑参数,确保编辑结果符合要求 - 问题:某些用户需要访问原始数据
解决方案:使用表达式控制编辑的应用范围
学习交流加群风哥QQ113257174
5.3 性能优化
- 避免在大型表上使用复杂的编辑规则
- 考虑使用索引来优化查询性能
- 定期监控数据编辑对性能的影响
- 使用适当的编辑类型,避免过度复杂的编辑逻辑
更多学习教程公众号风哥教程itpux_com
5.4 安全建议
- 定期审查数据编辑策略,确保符合安全需求
- 结合其他安全特性,如VPD和审计
- 限制对数据编辑策略的修改权限
- 文档化数据编辑策略的设计和实现
from oracle:www.itpux.com
