-
针对 ArgoDB 存储的数据进行脱敏
-
跨数据源联邦计算后的数据脱敏
为进一步加强数据安全,防止数据泄露,ArgoDB 提供了基于先进的血缘分析技术的动态脱敏查询处理能力,可对敏感数据即时脱敏,确保在各种数据使用场景中隐私数据的安全。
背景介绍
面对日益严峻的数据安全风险,尤其是在个人信息保护和数据安全法律法规日趋完善的背景下,企业在处理敏感信息时的法律责任和社会责任愈发重要。在日常的开发测试、审计监管等场景中,使用未经处理的真实数据,极易发生数据泄露事件,不仅给企业带来经济损失,更可能严重影响企业的信誉。
ArgoDB 提供的动态数据脱敏方案,通过对 SQL 语句的实时解析和改写,动态地在数据访问层面实施脱敏操作,从而保障敏感数据在使用之前就已经被有效处理,极大地降低了数据泄露的风险,与传统方案相比,优势如下:
-
即时保护:在数据被访问时实时进行脱敏并返回给客户端,有效防止敏感信息在传输等过程中的发生泄露。
-
灵活配置:内置 50 多种脱敏算法,支持灵活的脱敏策略配置(如用户/字段级策略),此外,还支持对第三方数据库执行动态脱敏。
-
性能优化:基于数据血缘解析 SQL 语句,有效避免大数据集场景下对系统性能的损耗,同时保持数据一致性和有效性。
使用指引
ArgoDB 动态脱敏技术支持两种模式:
模式 | 说明 | 适用场景 |
---|---|---|
脱敏操作由 ArgoDB 内部直接完成,数据的查询、计算和脱敏均无需外部代理或中间件,确保处理过程的高效性和安全性。 |
|
|
通过词法和血缘分析预处理 SQL,如标记脱敏列及规则,将原始 SQL 下推至外部数据源执行计算,再根据预设规则对结果集进行脱敏改写,降低传输开销,提升脱敏效率。 |
第三方关系型数据库的数据脱敏 |
除直接通过命令行创建脱敏规则外,推荐与 Defensor 产品联合使用,可通过可视化界面配置、敏感数据识别、分类分级规则管理,提升运维效率,便捷管理企业隐私数据。 |
Server 模式
动态脱敏 Server 模式可用于对 ArgoDB 存储的数据或跨数据源联邦计算后的数据执行脱敏,该模式下,数据的查询计算和脱敏操作均由 ArgoDB 服务内部完成,无需通过外部代理或中间件,保障数据处理过程的高效性和安全性,使用示例如下:
-
连接 ArgoDB 数据库。
-
执行下述命令开启动态脱敏,设置其为 Servrer 模式。
SET argodb.sql.desensitize.enabled = true; SET argodb.sql.desensitize.mode = server;
复制上述设置为会话级生效,如需全局生效以应对更严格的脱敏场景,即对所有会话连接生效,您可以在 Transwarp Manager 平台上,以添加自定义参数的方式来为 Quark 服务设置上述参数的值。
-
(可选)根据业务需求选择是否设置下述参数。
表 15. 可选参数设置说明 参数 默认值 说明 argodb.file.desensitize.export.enabled
false
是否在写入文件时执行脱敏,例如通过
INSERT OVERWRITE LOCAL DIRECTORY … SELECT …
将查询结果写入到文件的场景下,启用该参数后写入的即为脱敏后的数据。argodb.sql.desensitize.udf.whitelist
空
UDF 函数脱敏处理白名单,多个函数之间用英文逗号(,)分隔。某些场景下需要在执行 UDF 函数时,无需为处理后的数据应用脱敏规则,例如希望通过
COUNT
来统计字段值的数量,此时可将其加入至白名单中。 -
参照下述语法,为列创建脱敏策略。
CREATE MASKING POLICY <policy_name> ON COLUMN <database>.<table>.<column>[@<dblink_name>] USING <policy_type> [WITH <function_name>([argument,...])] [BY USER <username>,... ROLE <rolename>,... GROUP <groupname>,...] [TIME <start_timestamp> TO <end_timestamp>] [PRIORITY <level_number>]
复制表 16. 参数说明 参数 是否必选 说明 <policy_name>
是
具有业务意义的规则名称,方便后续识别。
<database>.<table>.<column>
是
对应分别为库、表、列的名称,例如
demodata.customer.username
。<dblink_name>
否
ArgoDB 支持将外部数据源的表作为脱敏对象,此场景下,您可以为外部数据源创建一个 DBLink(数据库链接),随后在此处相应填写 DBLink 名称。
<policy_type>
是
脱敏类型,取值:
DENY:拒绝,无法查看或获取标记为该脱敏类型的列数据,查询结果的返回值为
NULL
,可用于保护极度敏感的数据(如个人信息)。DIRECT_ACCESS:放行,允许用户直接访问数据,不进行任何形式的脱敏或修改。
DESENSITIZATION:脱敏,基于脱敏规则修改或隐藏敏感数据的部分信息。
<function_name>
否
脱敏的函数名称,当 <policy_type> 取值为 desensitization 时,则必须指定本参数。更多函数介绍及其使用方法,见支持的脱敏函数。
[argument]
否
脱敏函数的参数,当指定了脱敏函数时,可通过本参数指定更详细的参数设置。
<username> <rolename> <groupname>
否
分别表示脱敏规则生效的用户、角色和用户组,多个对象之间可用英文逗号(,)分隔,例如指定多个用户
dev_user1,dev_user2
。 使用该功能时,您需要开启 Guardian 插件,同时还需要在 Transwarp Manager 平台上,为 Quark 开启列级权限控制,即inceptor.security.column.authorization.enabled
设置为true
。<start_timestamp> <end_timestamp>
否
脱敏规则生效时间段的起止时间,格式为
yyyy-MM-dd HH:mm:ss
。<level_number>
否
脱敏规则的优先级,范围:1~2147483647,数值越小优先级越高。
假设我们有一个名为 demodata 数据库,希望对 customer 表设置脱敏规则,示例如下:
-
示例 1:拒绝所有用户访问 funds 列的数据
CREATE MASKING POLICY demo_policy1 ON COLUMN demodata.customer.funds USING DENY;
复制查询结果示例如下:
+------+--------+-----------+ | eid | funds | username | +------+--------+-----------+ | 001 | NULL | alice | +------+--------+-----------+
复制 -
示例 2:在上述规则的基础上,将 username 列的值进行部分遮掩(仅保留首位),且该脱敏规则仅针对 dev_user 用户生效。
CREATE MASKING POLICY demo_policy2 ON COLUMN demodata.customer.eid USING DESENSITIZATION WITH mask('*',1) by user dev_user;
复制以 dev_user 身份连接数据库,查询结果示例如下:
+------+--------+-----------+ | eid | funds | username | +------+--------+-----------+ | 001 | NULL | a**** | +------+--------+-----------+
复制
-
-
(可选)执行下述命令创建一个默认的脱敏规则,脱敏类型为“拒绝(DENY)”。
该规则将作为保护敏感数据的基线策略,确保在没有明确指定脱敏规则的情况下,对敏感数据的访问请求被默认拒绝。
CREATE DEFAULT MASKING POLICY USING DENY;
复制 -
执行下述格式的命令,查看列的脱敏规则。
SHOW MASKING POLICY ON COLUMN <database>.<table>.<column>;
复制使用示例:
SHOW MASKING POLICY on column demodata.customer.username;
复制 -
(可选)如不再需要某个脱敏规则,可执行下述格式的命令将其删除。
DROP MASKING POLICY ON COLUMN <database>.<table>[.column>];
复制使用示例:
-- 删除指定列的脱敏规则 DROP MASKING POLICY ON COLUMN demodata.customer.username; -- 删除指定表的所有列脱敏规则 DROP MASKING POLICY ON COLUMN demodata.customer;
复制
Gateway 模式
动态脱敏(Gateway 模式)提供了一种轻量级的数据安全服务,通过实时解析 SQL 并生成执行计划,下推至原始数据源并利用其计算能力进行数据处理,随后结合 ArgoDB 的少量计算完成对结果集的脱敏操作,可更好地降低性能占用。
部署建议: - 在 Gateway 模式下,由于仅需使用少量计算资源执行脱敏,为提升资源利用率,推荐为其专门部署一个 Quark 服务,且无需部署 Executor 服务。 - 一个动态脱敏网关通常只代理一个数据源,此外,对于 Oracle 数据库,同一个 Oracle 数据源可能包含多个实例,此时每个网关服务仅代理其中的一个实例。 |
功能限制
启用动态脱敏(Gateway 模式)后,只允许创建 DBLink 外表,如需建表可直接数据源中操作或将 DDL 操作下压至数据源。
支持的数据源
动态脱敏(Gateway 模式)适用于为外部数据源提供脱敏能力的场景,支持的数据源如下:
-
Hive
-
MySQL
-
Oracle
-
Teradata
SQL 执行计划说明
执行计划是对一条 SQL 查询语句在数据库中执行过程的描述。在动态脱敏(Gateway 模式)场景下,数据脱敏(脱敏函数运算)的过程由 Quark 服务来执行,其余计算任务会下推至源端数据源执行,接下来,我们以一个 SQL 查询语句来说明生产的执行计划:
假设我们的远端数据是 Oracle,脱敏规则是对字段 a 执行 mask('*',1,1)
操作,查询 SQL 如下:
SELECT a FROM oracle_t LIMIT 10;
复制
那么经过解析后,实际处理的 SQL 如下:
SELECT mask(col1, '*',1,1) FROM table { SELECT TOP 10 a FROM oracle_t };
复制
首先,由 Quark 生成 SELECT mask(col1, '*',1,1) FROM table_a
的执行计划,对 col1 进行 mask 运算,而读表数据的操作,是直接下发到源端的 Oralce 来执行的,通过这种方式实现计算任务的分离,降低 Qurak 负载的同时,提升执行效率。
启用动态脱敏
假设某金融机构在处理跨数据库联邦查询和复杂数据流转场景时,通过 ArgoDB 对接了多种数据源(例如 Oracle),希望实施统一的数据脱敏策略,从而在数据分析、报告生成等业务活动中保护客户的敏感信息。
接下来,我们以 Oracle 数据源为例,演示如何将其作为 DBLink 连接至 ArgoDB,并完成动态脱敏的规则设置。
-
登录 Transwarp Manager 平台,完成全局参数预设。
-
在集群页面,单击 Quark 服务卡片。
-
在配置页签,单击添加自定义参数,设置
argodb.sql.desensitize.enabled
的值为true
,配置文件为hive-site.xml
,单击确定以开启动态脱敏功能。图 27. 开启动态脱敏功能 -
参考上一步,选择设置下述参数:
表 17. 全局参数设置 参数 是否必须 取值及说明 argodb.sql.desensitize.mode
是
设置值为
gateway
,即动态脱敏功能采用 Gateway 模式。argodb.sql.lineage.update.enabled
是
设置值为
true
,启用脱敏规则传递。argodb.sql.desensitize.table.operation.sync
是
设置值为
true
,执行 CREATE TABLE AS(CTAS)语句同步在网关侧创建 DBLink 外表,删除 DBLink 外表时同步删除数据源表。ngmr.exec.mode
是
设置值为
local
,即 SQL 执行模式为 Local 模式,实现结果数据集直接返回给客户端,适用于低延时、高并发、参与计算数据量少的场景。ngmr.local.job.record.timeout.ms
是
设置 Local 模式下,Job 的超时时间,单位为毫秒,推荐为
36000000
。inceptor.cross.join.enabled
是
设置值为
local
,即开启 Cross Join 的支持。quark.show.hidden.materialized.table
是
设置值为
true
,执行 SHOW TABLES 时,关闭从数据源获取表的schema,从而提高其执行性能。inceptor.dblink.jdbcConnection.poolSize
否
取值为数字,例如 30,该连接池用于存储网关与数据源建立的连接,去除建立连接的损耗,从而达到加速的作用。
argodb.sql.desensitize.sql.replace.table.name
否
当创建的 DBLink 外表与源端数据库中的表名不一致时,需要将该参数设置为 true,从而在生成 SQL 执行计划时自动替换表名以避免查不到表数据。
-
单击页面右上角的配置服务,然后在业务低峰期重启 Quark 即可全局生效。
-
-
连接 ArgoDB 数据库,创建一个指向远程 Oracle 数据库的链接(DBLink),然后为要脱敏的表建立 DBLink 外表并与其关联,示例如下:
-- 为远程的 Oracle 创建名为 dblink_oracle 的数据库链接 CREATE DATABASE LINK dblink_oracle CONNECT TO demoschema IDENTIFIED BY 'Pass123456' USING 'jdbc:oracle:thin:@172.16.190.242:1521:xe'; -- 创建并进入数据库 CREATE DATABASE demodata; USE demodata; -- 建立 DBLink 外表,使其关联 Oracle 数据库中的 customer_transactions 表 -- 该表随意设置一个列即可,ArgoDB 会自动完成 Schema 信息同步 CREATE EXTERNAL TABLE ex_customer_transactions ( id string ) STORED AS DBLINK WITH DBLINK dblink_oracle tblproperties("dblink.table.name"="DEMOSCHEMA.CUSTOMER_TRANSACTIONS");
复制系统将在创建 DBLink 时检测链接有效性,此外,完成外表操作后,ArgoDB 将自动地从外部数据源同步元数据信息并完成列信息(含 COMMENT),自动调整表结构与其一致。关于 DBlink 和外表的详细语法介绍,见联邦查询。
-
参照下述语法,为列创建脱敏策略。
CREATE MASKING POLICY <policy_name> ON COLUMN <database>.<table>.<column>[@<dblink_name>] USING <policy_type> [WITH <function_name>([argument,...])] [BY USER <username>,... ROLE <rolename>,... GROUP <groupname>,...] [TIME <start_timestamp> TO <end_timestamp>] [PRIORITY <level_number>]
复制表 18. 参数说明 参数 是否必选 说明 <policy_name>
是
具有业务意义的规则名称,方便后续识别。
<database>.<table>.<column>
是
对应分别为库、表、列的名称,例如
demodata.customer.username
。<dblink_name>
否
ArgoDB 支持将外部数据源的表作为脱敏对象,如没有为其建立 DBLink 外表,您可以为外部数据源创建一个 DBLink(数据库链接),随后在此处相应填写 DBLink 名称。
<policy_type>
是
脱敏类型,取值:
DENY:拒绝,无法查看或获取标记为该脱敏类型的列数据,查询结果的返回值为
NULL
,可用于保护极度敏感的数据(如个人信息)。DIRECT_ACCESS:放行,允许用户直接访问数据,不进行任何形式的脱敏或修改。
DESENSITIZATION:脱敏,基于脱敏规则修改或隐藏敏感数据的部分信息。
<function_name>
否
脱敏的函数名称,当 <policy_type> 取值为 desensitization 时,则必须指定本参数。更多函数介绍及其使用方法,见支持的脱敏函数。
[argument]
否
脱敏函数的参数,当指定了脱敏函数时,可通过本参数指定更详细的参数设置。
<username> <rolename> <groupname>
否
分别表示脱敏规则生效的用户、角色和用户组,多个对象之间可用英文逗号(,)分隔,例如指定多个用户
dev_user1,dev_user2
。 使用该功能时,您需要开启 Guardian 插件,同时还需要在 Transwarp Manager 平台上,为 Quark 开启列级权限控制,即inceptor.security.column.authorization.enabled
设置为true
。<start_timestamp> <end_timestamp>
否
脱敏规则生效时间段的起止时间,格式为
yyyy-MM-dd HH:mm:ss
。<level_number>
否
脱敏规则的优先级,范围:1~2147483647,数值越小优先级越高。
前面我们已经为 Oracle 建立了 DBLink 外表,表名
ex_customer_transactions
,现在我们希望对该表设置脱敏规则,示例如下:-
示例 1:拒绝所有用户访问 transaction_amount 列的数据
CREATE MASKING POLICY demo_policy3 ON COLUMN demodata.ex_customer_transactions.transaction_amount USING DENY;
复制查询结果示例如下:
+-----------------+----------------+-----------------+---------------------+ | transaction_id | customer_name | account_number | transaction_amount | +-----------------+----------------+-----------------+---------------------+ | 1 | Zhang San | 1234567890 | NULL | +-----------------+----------------+-----------------+---------------------+
复制 -
示例 2:在上述规则的基础上,将 account_number 列的值进行部分遮掩(仅保留后四位),且该脱敏规则仅针对 dev_user 用户生效。
CREATE MASKING POLICY demo_policy4 ON COLUMN demodata.ex_customer_transactions.account_number USING DESENSITIZATION WITH mask('*',0,4) by user dev_user;
复制以 dev_user 身份连接数据库,查询结果示例如下:
+-----------------+----------------+-----------------+---------------------+ | transaction_id | customer_name | account_number | transaction_amount | +-----------------+----------------+-----------------+---------------------+ | 1 | Zhang San | ******7890 | NULL | +-----------------+----------------+-----------------+---------------------+
复制
-
-
(可选)执行下述命令创建一个默认的脱敏规则,脱敏类型为“拒绝(DENY)”。
该规则将作为保护敏感数据的基线策略,确保在没有明确指定脱敏规则的情况下,对敏感数据的访问请求被默认拒绝。
CREATE DEFAULT MASKING POLICY USING DENY;
复制 -
执行下述格式的命令,查看列的脱敏规则。
SHOW MASKING POLICY ON COLUMN <database>.<table>.<column>;
复制使用示例:
SHOW MASKING POLICY on column demodata.ex_customer_transactions.account_number;
复制 -
(可选)如不再需要某个脱敏规则,可执行下述格式的命令将其删除。
DROP MASKING POLICY ON COLUMN <database>.<table>[.column>];
复制使用示例:
-- 删除指定列的脱敏规则 DROP MASKING POLICY ON COLUMN demodata.ex_customer_transactions.account_number; -- 删除指定表的所有列脱敏规则 DROP MASKING POLICY ON COLUMN demodata.ex_customer_transactions;
复制