联 系 我 们
售前咨询
售后咨询
微信关注:星环科技服务号
更多联系方式 >
6.7.2.1 动态脱敏使用指南
更新时间:9/26/2024, 9:14:38 AM

为进一步加强数据安全,防止数据泄露,ArgoDB 提供了基于先进的血缘分析技术的动态脱敏查询处理能力,可对敏感数据即时脱敏,确保在各种数据使用场景中隐私数据的安全。

背景介绍

面对日益严峻的数据安全风险,尤其是在个人信息保护和数据安全法律法规日趋完善的背景下,企业在处理敏感信息时的法律责任和社会责任愈发重要。在日常的开发测试、审计监管等场景中,使用未经处理的真实数据,极易发生数据泄露事件,不仅给企业带来经济损失,更可能严重影响企业的信誉。

data desensitization overview

ArgoDB 提供的动态数据脱敏方案,通过对 SQL 语句的实时解析和改写,动态地在数据访问层面实施脱敏操作,从而保障敏感数据在使用之前就已经被有效处理,极大地降低了数据泄露的风险,与传统方案相比,优势如下:

  • 即时保护:在数据被访问时实时进行脱敏并返回给客户端,有效防止敏感信息在传输等过程中的发生泄露。

  • 灵活配置:内置 50 多种脱敏算法,支持灵活的脱敏策略配置(如用户/字段级策略),此外,还支持对第三方数据库执行动态脱敏。

  • 性能优化:基于数据血缘解析 SQL 语句,有效避免大数据集场景下对系统性能的损耗,同时保持数据一致性和有效性。

使用指引

ArgoDB 动态脱敏技术支持两种模式:

表 14. 使用指引
模式 说明 适用场景

Server 模式

脱敏操作由 ArgoDB 内部直接完成,数据的查询、计算和脱敏均无需外部代理或中间件,确保处理过程的高效性和安全性。

  • 针对 ArgoDB 存储的数据进行脱敏

  • 跨数据源联邦计算后的数据脱敏

Gateway 模式

通过词法和血缘分析预处理 SQL,如标记脱敏列及规则,将原始 SQL 下推至外部数据源执行计算,再根据预设规则对结果集进行脱敏改写,降低传输开销,提升脱敏效率。

第三方关系型数据库的数据脱敏

除直接通过命令行创建脱敏规则外,推荐与 Defensor 产品联合使用,可通过可视化界面配置、敏感数据识别、分类分级规则管理,提升运维效率,便捷管理企业隐私数据。

Server 模式

动态脱敏 Server 模式可用于对 ArgoDB 存储的数据或跨数据源联邦计算后的数据执行脱敏,该模式下,数据的查询计算和脱敏操作均由 ArgoDB 服务内部完成,无需通过外部代理或中间件,保障数据处理过程的高效性和安全性,使用示例如下:

  1. 连接 ArgoDB 数据库。

  2. 执行下述命令开启动态脱敏,设置其为 Servrer 模式。

    SET argodb.sql.desensitize.enabled = true;
    SET argodb.sql.desensitize.mode = server;
    复制

    上述设置为会话级生效,如需全局生效以应对更严格的脱敏场景,即对所有会话连接生效,您可以在 Transwarp Manager 平台上,以添加自定义参数的方式来为 Quark 服务设置上述参数的值。

  3. (可选)根据业务需求选择是否设置下述参数。

    表 15. 可选参数设置说明
    参数 默认值 说明

    argodb.file.desensitize.export.enabled

    false

    是否在写入文件时执行脱敏,例如通过 INSERT OVERWRITE LOCAL DIRECTORY …​ SELECT …​ 将查询结果写入到文件的场景下,启用该参数后写入的即为脱敏后的数据。

    argodb.sql.desensitize.udf.whitelist

    UDF 函数脱敏处理白名单,多个函数之间用英文逗号(,)分隔。某些场景下需要在执行 UDF 函数时,无需为处理后的数据应用脱敏规则,例如希望通过 COUNT 来统计字段值的数量,此时可将其加入至白名单中。

  4. 参照下述语法,为列创建脱敏策略。

    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****     |
      +------+--------+-----------+
      复制
  5. (可选)执行下述命令创建一个默认的脱敏规则,脱敏类型为“拒绝(DENY)”。

    该规则将作为保护敏感数据的基线策略,确保在没有明确指定脱敏规则的情况下,对敏感数据的访问请求被默认拒绝。

    CREATE DEFAULT MASKING POLICY USING DENY;
    复制
  6. 执行下述格式的命令,查看列的脱敏规则。

    SHOW MASKING POLICY ON COLUMN <database>.<table>.<column>;
    复制

    使用示例:

    SHOW MASKING POLICY on column demodata.customer.username;
    复制
  7. (可选)如不再需要某个脱敏规则,可执行下述格式的命令将其删除。

    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,并完成动态脱敏的规则设置。

  1. 登录 Transwarp Manager 平台,完成全局参数预设。

    1. 集群页面,单击 Quark 服务卡片。

    2. 配置页签,单击添加自定义参数,设置 argodb.sql.desensitize.enabled 的值为 true,配置文件为 hive-site.xml,单击确定以开启动态脱敏功能。

      enable desensitization
      图 27. 开启动态脱敏功能
    3. 参考上一步,选择设置下述参数:

      表 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 执行计划时自动替换表名以避免查不到表数据。

    4. 单击页面右上角的配置服务,然后在业务低峰期重启 Quark 即可全局生效。

  2. 连接 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 和外表的详细语法介绍,见联邦查询

  3. 参照下述语法,为列创建脱敏策略。

    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                |
      +-----------------+----------------+-----------------+---------------------+
      复制
  4. (可选)执行下述命令创建一个默认的脱敏规则,脱敏类型为“拒绝(DENY)”。

    该规则将作为保护敏感数据的基线策略,确保在没有明确指定脱敏规则的情况下,对敏感数据的访问请求被默认拒绝。

    CREATE DEFAULT MASKING POLICY USING DENY;
    复制
  5. 执行下述格式的命令,查看列的脱敏规则。

    SHOW MASKING POLICY ON COLUMN <database>.<table>.<column>;
    复制

    使用示例:

    SHOW MASKING POLICY on column demodata.ex_customer_transactions.account_number;
    复制
  6. (可选)如不再需要某个脱敏规则,可执行下述格式的命令将其删除。

    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;
    复制