Hologres为您提供数据脱敏功能,支持按照列级别设置脱敏。启用该功能后,如果您查询的数据涉及敏感信息,则在展示结果中,该部分数据会被脱敏展示,提高了对敏感及私密数据的保护。本文为您介绍Hologres如何开启、查询及删除数据脱敏功能。

背景信息

随着大数据时代的来临,大数据、云计算和人工智能等新技术应用不断深化,为数据的深度挖掘及分析提供了强有力的支撑,大数据中蕴含的巨大价值被逐步挖掘出来。与此同时也带来了敏感及私密信息保护方面的棘手难题。

Hologres提供的数据脱敏功能,实现了数据在高效共享、挖掘及分析的同时,使得敏感及隐私信息不被泄露,提高了对敏感及私密数据的保护。

使用限制

  • 出于安全考虑,Hologres暂不支持从设置了脱敏规则的表和列向未设置脱敏规则的表和列导入数据,相关报错信息如下。
    错误原因:ERROR: The insert table has not set SECURITY LABEL
  • 数据脱敏会一定程度的影响查询性能,影响程度和脱敏方式、数据量都有关,性能有10%~20%的下降,极端场景可能存在数倍性能下降。

使用数据脱敏

Hologres支持对目标列或目标用户设置数据脱敏。使用数据脱敏前,您需登录目标数据库开启脱敏功能。完成后可配置对应的脱敏规则,针对某一列或某个用户设置脱敏。具体操作步骤如下。

  1. 为目标数据库开启数据脱敏。
    数据脱敏功能默认不开启,需要Superuser登录至目标数据库开启该功能,开启命令及相关参数说明如下。
    • 命令:
      CREATE EXTENSION IF NOT EXISTS hg_anon; --创建hg_anon扩展函数。
      ALTER DATABASE <db_name> SET hg_anon_enable = on;  --为指定数据库开启数据脱敏功能,默认为off。
    • 示例:
      CREATE EXTENSION IF NOT EXISTS hg_anon;--创建hg_anon扩展函数。
      ALTER DATABASE test SET hg_anon_enable = on;--为数据库test开启数据脱敏功能。
    • 参数说明:
      参数 参数的相关描述
      hg_anon hg_anon是Hologres内部封装的扩展函数,您需要调用该扩展函数才能开启数据脱敏功能。
      <db_name> 需要开启数据脱敏功能的数据库名称。使用时需要替换<db_name>为实际数据库名称。
      hg_anon_enable 选择开启或关闭数据脱敏功能,取值如下:
      • on,开启数据脱敏。
      • off,关闭数据脱敏。
      默认该参数设置为off
  2. 设置脱敏列
    可由Superuser或表Owner对目标列进行脱敏,具体命令、示例、参数说明如下。
    • 命令:
      说明 对多列数据进行脱敏时,需要多次执行该语句。
      SECURITY LABEL FOR hg_anon ON COLUMN <tablename>.<col_name> IS <label_name>;
    • 示例:对holotest表的ID列按照名称脱敏。
      SECURITY LABEL FOR hg_anon ON COLUMN holotest.id IS 'name';
    • 参数说明:
      参数 描述
      hg_anon hg_anon是Hologres内部封装的扩展函数,您需要调用该扩展函数才能开启数据脱敏功能。
      <tablename> 需要脱敏的列所在的表名称。使用时需要替换<tablename>为实际表名称。
      <col_name> 需要脱敏的列名称。使用时需要替换<col_name>为实际列名称。
      label_name 系统预设的脱敏函数,您可以使用show hg_anon_labels;SQL查看当前数据库设置的label_name
      从HologresV1.1版本开始,默认的label_name如下。
      lable_name 说明 示例
      name 姓名脱敏。
      • 脱敏前:李华;脱敏后:*华。
      • 脱敏前:王小强;脱敏后:**强。
      email 邮箱地址脱敏。 脱敏前:lihuang@alibaba.com;脱敏后:lih***@alibaba.com
      ip IP地址脱敏。 脱敏前:1.2.3.4;脱敏后:1.*.*.*。
      id 身份证号码脱敏。 脱敏前:110345188812011234;脱敏后:1****************4
      phone 电话号码脱敏。 脱敏前:13900001234;脱敏后:*********34。
      bank_id 银行卡、信用卡账号脱敏。 脱敏前:2349867902834701928;脱敏后:***************1928。
      hash 使用MD5算法进行脱敏。 脱敏前:浙江省杭州市文一西路;脱敏后:dbf894b409d4a2ef17dfd9c7fdcafcd8。
      first_mask 定义了一个first_mask的规则,只显示第一个字符。 脱敏前:123456789;脱敏后:1********。
    • 脱敏结果示例:结果示例
    • 其他相关命令
      • 删除已经设置的脱敏
        SECURITY LABEL FOR hg_anon ON COLUMN test_hg_anon_demo.name is NULL;
      • 查看设置的脱敏列
        SELECT c.relname, a.attname, provider, label FROM pg_seclabel s INNER JOIN pg_catalog.pg_class c on s.objoid = c.relfilenode INNER JOIN pg_catalog.pg_attribute a on s.objoid = a.attrelid where a.attnum = objsubid;

高级技巧

  • 对不同用户设置脱敏
    默认情况下所有用户都会脱敏,可以单独设置某些用户不脱敏。
    • 命令格式如下
       SECURITY LABEL FOR hg_anon ON ROLE user_name IS 'all:unmasked';
      参数 说明
      user_name 账号ID。请通过用户信息页面获取。
    • 使用示例

      对账号ID为1365xxxxxxxxxxxx的用户不脱敏的语句如下。

      SECURITY LABEL FOR hg_anon ON ROLE "1365xxxxxxxxxxxx" IS 'all:unmasked';
    • 相关命令
      • 查看对用户设置的脱敏情况
        select usename, label from pg_shseclabel s inner join pg_catalog.pg_user u on s.objoid = u.usesysid;
      • 删除对用户设置的脱敏
        SECURITY LABEL FOR hg_anon ON ROLE "1365xxxxxxxxxxxx" IS NULL;
  • 自定义脱敏规则

    如果默认的label_name无法满足需求,您可以通过修改GUC的hg_anon_lables参数自定义脱敏规则。

    • 命令
      ALTER DATABASE <db_name> SET hg_anon_labels = '[
        {"label": <label_name1>, "method", <method1>},
        {"label": <label_name2>, "method", <method2>},
        ... 
      ]'; --label_name是您自定义的名称,method是Hologres内置的一些方法。
      说明 执行ALTER DATABASE命令后,当前链接会不生效,需要重开一个连接。您可使用如下命令查看设置是否生效。
      show hg_anon_enable;
    • 示例
      ALTER DATABASE test_db SET hg_anon_labels = '[
      {"label":"ip", "method":{"desensType":"mask", "type":"ip"}},
      {"label":"email", "method":{"desensType":"mask", "type":"email"}},
      {"label":"name", "method":{"desensType":"mask", "type":"name"}},
      {"label":"first_mask", "method":{"desensType":"mask", "type":"user_define", "before":1, "after":0}},
      {"label":"hash", "method":{"desensType":"hash", "type":"md5", "salt":""}}]';
    • 参数说明:
      脱敏项 脱敏内容描述 脱敏结果示例
      {"desensType":"mask", "type":"ip"} IP地址脱敏。 192.*.*.*
      {"desensType":"mask", "type":"email"} 邮箱地址脱敏。 abc***@example.net
      {"desensType":"mask", "type":"name"} 名称脱敏。 *五
      {"desensType":"hash", "type":"md5", "salt":""} Hash脱敏。 e086aa137fa19f67d27b39d0eca186103228f322c9c98a125554a24f875f0f7e
      {"label":"first_mask", "method":{"desensType":"mask", "type":"user_define", "before":1, "after":0}}{"label":"last_mask", "method":{"desensType":"mask", "type":"user_define", "before":0, "after":1}} 自定义内容脱敏。

使用示例

使用Hologres数据脱敏功能完整的使用示例如下。

  1. 创建数据库
    使用如下命令语句创建数据库。
    CREATE DATABASE hg_anon_demo;
  2. 创建样例数据表
    切换到创建的数据库,使用如下命令语句创建样例数据表。
    DROP TABLE IF EXISTS personal_basic_information;
    
    CREATE TABLE personal_basic_information
    (
        name TEXT
        ,email TEXT
        ,ip TEXT
        ,id TEXT
        ,phone TEXT
        ,bank_id TEXT
    )
    ;
  3. 插入样例数据
    使用如下命令语句,在personal_basic_information表中插入样例数据。
    INSERT INTO personal_basic_information(name,email,ip,id,phone,bank_id) VALUES
    ('张三','zhangsan@alibaba.com','127.0.0.1','142732199102290022','13900001234','4514610803067088'),
    ('李四','lisi@alibaba.com','127.0.0.1','510622198402308000','13900001111','6252470010027800'),
    ('李逍遥','lixiaoyao@alibaba.com','172.21.4.234','511025188812271696','13900002222','6252470010027800');
  4. 查看数据
    查看数据脱敏前的数据。
    SELECT * FROM personal_basic_information;
  5. 设置脱敏规则
    使用如下命令语句为数据设置脱敏规则。
    --创建hg_anon扩展函数。
    CREATE EXTENSION IF NOT EXISTS hg_anon;
    
    --为数据库hg_anon_demo开启数据脱敏功能。
    ALTER DATABASE hg_anon_demo SET hg_anon_enable = on;
    
    --设置每一列的脱敏规则
    SECURITY LABEL FOR hg_anon ON COLUMN personal_basic_information.name IS 'name';
    SECURITY LABEL FOR hg_anon ON COLUMN personal_basic_information.id IS 'id';
    SECURITY LABEL FOR hg_anon ON COLUMN personal_basic_information.phone IS 'phone';
    SECURITY LABEL FOR hg_anon ON COLUMN personal_basic_information.email IS 'email';
    SECURITY LABEL FOR hg_anon ON COLUMN personal_basic_information.bank_id IS 'bank_id';
    SECURITY LABEL FOR hg_anon ON COLUMN personal_basic_information.ip IS 'ip';
  6. 查看数据
    请断开数据库,重新登录数据库使用如下命令查看数据脱敏后的数据。
    SELECT * FROM personal_basic_information;
    脱敏后的数据如下所示。数据脱敏

常见问题

按照使用示例发现数据未脱敏。
  • 问题现象:按照使用示例执行后发现查询出的数据未进行脱敏。
  • 可能原因:
    • 对部分用户设置了不脱敏的规则。
    • 未设置脱敏标签。
  • 解决方法:
    • 执行如下SQL命令检查是否对于部分用户设置了不脱敏的规则。
      select
        usename
        , label
      from pg_shseclabel s
      inner join pg_catalog.pg_user u on s.objoid = u.usesysid;
      默认情况下该SQL查询结果为空,表示对所有用户均需要进行数据脱敏;若不为空,请对用户设置为脱敏,详情请参见高级技巧
    • 使用如下SQL,检查设置的脱敏标签。
      show hg_anon_labels;
      如果结果中并未包含ip等标签,请执行如下SQL命令设置脱敏标签。
      ALTER DATABASE compress_test SET hg_anon_labels = '[
      {"label":"ip", "method":{"desensType":"mask", "type":"ip"}},
      {"label":"email", "method":{"desensType":"mask", "type":"email"}},
      {"label":"name", "method":{"desensType":"mask", "type":"name"}},
      {"label":"id", "method":{"desensType":"mask", "type":"id"}},
      {"label":"phone", "method":{"desensType":"mask", "type":"phone"}},
      {"label":"bank_id", "method":{"desensType":"mask", "type":"bank_id"}},
      {"label":"hash", "method":{"desensType":"hash", "type":"md5", "salt":""}},
      {"label":"first_mask", "method":{"desensType":"mask", "type":"user_define", "before":1, "after":0}}
      ]';
      以上标签对应的规则请参见默认的label_name