点击上方“IT那活儿”公众号--专注于企业全栈运维技术分享,不管IT什么活儿,干就完了!!!
概 述
Oracle Data Redaction 是一项强大的安全功能,允许在不改变数据库中实际存储数据的情况下,根据用户角色或访问条件动态屏蔽敏感数据。这为企业提供了一种有效的方式来防止未经授权的用户在查询结果中查看机密信息。
通过定义策略,可以根据应用场景选择不同的屏蔽方式,如完全屏蔽、部分屏蔽或随机屏蔽。
本文将通过一个具体的实施案例,展示如何在 Oracle 数据库中配置数据编辑策略。
创建策略表达式
策略表达式定义了特定的条件,只有当这些条件为真时,才会应用编辑策略。在本例中,我们使用 SYS_CONTEXT('USERENV', 'MODULE') 函数来确定用户模块,如果模块是 "PL/SQL Developer" 或 "SQL*Plus",则应用策略。
BEGIN
dbms_redact.create_policy_expression(policy_expression_name => 'plsql_sqlplus',
expression => 'SYS_CONTEXT(''USERENV'',''MODULE'') in (''PL/SQL Developer'',''SQLPlus'')',
policy_expression_description => 'PL/SQL Developer & SQLPlus');
END;
/复制
创建策略
接下来,为 ORDERS 表创建编辑策略,初始表达式为 1 = 0,这意味着默认不应用任何策略,除非后续定义了具体列的编辑规则。
BEGIN
dbms_redact.add_policy(object_schema => 'USER01',
object_name => 'ORDERS',
policy_name => 'REDACT_POLICY_ORDERS',
expression => '1 = 0');
END;
/复制
更新策略 - 部分列编辑
对于 ORDERS 表的特定列,可以应用部分编辑。
在本例中,我们选择了 CONTACTID、INVOICETITLE、CONSIGNEE、CONSIGNPHN 和 ADDRESS 列,并定义了详细的部分编辑规则。
编辑规则使用了以下字段描述:
输入格式 'V' 表示可能需要编辑的值,'F' 表示格式字符,忽略。 输出格式 'V' 表示输出编辑值,其他字符作为格式字符处理。 编辑字符 用于替换实际值的字符,例如 '*' 或 'x'。 起始位置 指定开始编辑的字符位置,起始位置为 1,格式字符不计入位置。 结束位置 指定结束编辑的字符位置。
以下是为各列添加编辑规则的 SQL 语句:
BEGIN
dbms_redact.alter_policy(object_schema => 'USER01',
object_name => 'ORDERS',
policy_name => 'REDACT_POLICY_ORDERS',
action => dbms_redact.add_column,
column_name => 'CONTACTID',
function_type => dbms_redact.partial,
function_parameters => 'VVVVVVVV,VVVVVVVV,*,3,6');
END;
/
BEGIN
dbms_redact.alter_policy(object_schema => 'USER01',
object_name => 'ORDERS',
policy_name => 'REDACT_POLICY_ORDERS',
action => dbms_redact.add_column,
column_name => 'INVOICETITLE',
function_type => dbms_redact.partial,
function_parameters => 'VVVV,VVVV,*,2,4');
END;
/
BEGIN
dbms_redact.alter_policy(object_schema => 'USER01',
object_name => 'ORDERS',
policy_name => 'REDACT_POLICY_ORDERS',
action => dbms_redact.add_column,
column_name => 'CONSIGNEE',
function_type => dbms_redact.partial,
function_parameters => 'VVVV,VVVV,*,2,4');
END;
/
BEGIN
dbms_redact.alter_policy(object_schema => 'USER01',
object_name => 'ORDERS',
policy_name => 'REDACT_POLICY_ORDERS',
action => dbms_redact.add_column,
column_name => 'CONSIGNPHN',
function_type => dbms_redact.partial,
function_parameters => 'VVVVVVVVVVV,VVVVVVVVVVV,*,4,11');
END;
/
BEGIN
dbms_redact.alter_policy(object_schema => 'USER01',
object_name => 'ORDERS',
policy_name => 'REDACT_POLICY_ORDERS',
action => dbms_redact.add_column,
column_name => 'ADDRESS',
function_type => dbms_redact.partial,
function_parameters => 'VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV,VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV,*,8,33');
END;
/复制
应用策略表达式
为了将特定的策略表达式应用于各列,我们需要为每个列绑定表达式。
在本例中,CONTACTID、INVOICETITLE、CONSIGNEE、CONSIGNPHN 和 ADDRESS 列都应用了 plsql_sqlplus 策略表达式。
BEGIN
dbms_redact.apply_policy_expr_to_col(object_schema => 'USER01',
object_name => 'ORDERS',
column_name => 'CONTACTID',
policy_expression_name => 'plsql_sqlplus');
END;
/
BEGIN
dbms_redact.apply_policy_expr_to_col(object_schema => 'USER01',
object_name => 'ORDERS',
column_name => 'INVOICETITLE',
policy_expression_name => 'plsql_sqlplus');
END;
/
BEGIN
dbms_redact.apply_policy_expr_to_col(object_schema => 'USER01',
object_name => 'ORDERS',
column_name => 'CONSIGNEE',
policy_expression_name => 'plsql_sqlplus');
END;
/
BEGIN
dbms_redact.apply_policy_expr_to_col(object_schema => 'USER01',
object_name => 'ORDERS',
column_name => 'CONSIGNPHN',
policy_expression_name => 'plsql_sqlplus');
END;
/
BEGIN
dbms_redact.apply_policy_expr_to_col(object_schema => 'USER01',
object_name => 'ORDERS',
column_name => 'ADDRESS',
policy_expression_name => 'plsql_sqlplus');
END;
/复制
演示验证
在应用完编辑策略后,我们可以通过不同的用户访问工具(如 PL/SQL Developer 和 SQL*Plus)进行验证。
以下是验证步骤的简要说明:


结论
通过以上步骤,Oracle Data Redaction 功能可以根据用户访问的模块自动屏蔽敏感信息。
对于需要对外提供数据而又不希望泄露敏感内容的场景,数据编辑提供了灵活且高效的解决方案。
通过精确定义编辑策略和编辑规则,可以有效地保护数据的安全性,确保只有授权的用户才能访问完整的敏感信息。

本文作者:智 源(上海新炬中北团队)
本文来源:“IT那活儿”公众号
