使用加密技术动态屏蔽数据

本教程介绍如何在Netezza Performance Server中使用加密配置和使用动态数据屏蔽。

动态数据屏蔽可防止非特权用户未经授权访问字段或表列等数据库对象中的敏感数据。 屏蔽规则只应用于查询结果,数据库中的数据不受影响,因此其他需要访问这些数据的应用程序也可以使用。

关于本任务

本教程使用了以下示例模式:

本任务使用的模式

customer_name和 "customer_address是需要屏蔽和加密的敏感列。 在所有可以访问这些表的用户(即拥有 "SELECT权限的用户)中,只有拥有 "ACCOUNTS角色的用户才可以查看这两列敏感数据。 对于其他用户,这些值通过加密被屏蔽。

标准的方法是限制对底层表的访问,并在表上分层显示视图,视图会根据用户的角色改变值。 要做到这一点,首先要重命名底层表,然后使用表的原名创建一个视图,该视图会根据有访问权限的角色为敏感列预测加密值。

程序

  1. 定义加密密钥:

    这是一个一次性步骤。

    通过创建一个只有管理员才有权限和访问权的单独表,设置用于屏蔽的加密密钥。 作为数据库管理员:
    create table encryption_keys (key varchar(30)); 
    insert into encryption_keys values('<your key value goes here>');
  2. 重新命名基础表,为其做好准备,然后在基础表上创建屏蔽视图。
    作为数据库管理员:
    alter table customers rename to customers_table;
    create or replace view customers as
    select
    customer_id,
    case when current_role = 'ACCOUNTS' then customer_name
    else encrypt(customer_name, (select encryption_keys.key)) end as customer_name,
    case when current_role = 'ACCOUNTS' then customer_address
    else encrypt(customer_address, (select encryption_keys.key)) end as customer_address,
    customer_state,
    customer_zip
    from customers_table;
    提示:您可以使用相同的程序进行简单的屏蔽或完全隐藏数据,而不是使用加密来屏蔽数据:
    
    CREATE VIEW customers AS 
    SELECT customer_id, 
           CASE WHEN current_role = 'ACCOUNTS' THEN customer_name 
                ELSE '*****' -- this could be NULL if the column was not (VAR)CHAR
           END AS customer_name,
           CASE WHEN current_role = 'ACCOUNTS' THEN customer_address
                ELSE '*****'
           END AS customer_address,
           customer_state,
           customer_zip
    FROM "$customers_base";
    不过,使用加密掩码的好处是,如有需要,您可以将此表的加密列连接到另一个表的加密列,并仍然保持行之间的关系。 如果只是简单地屏蔽列或将列视为 NULL,则无法实现这一点。
  3. 为所选用户授予 "ACCOUNTS角色。

    在此步骤中,您允许一个用户子集拥有 "ACCOUNTS角色的权限。 例如,在由 "alice、"bob和 "clark"组成的用户组中,只有 "alice和 "bob"需要 "ACCOUNTS角色的权限。

    create role accounts;
    grant list on accounts to alice, bob;
    接下来,授予针对客户(屏蔽视图)和订单(表)运行查询的权限。
    grant select on  customers, orders  to  public, accounts;

    至此,动态屏蔽已设置完毕,随时可以使用。

结果

假设用户 "alice需要一份按州代码分列的 "order_amount总数报告:
select
sum(order_amount) as total,
customer_state
from customers inner join orders using (customer_id)
group by customer_state;
总计 客户状态
10750.01 NY
2000.00 TX
99.99 XX

Alice 可以访问 CUSTOMERS(屏蔽视图)。 customer_id列未加密,用于连接 ORDERS 表。 customer_state列未加密,用于滚动(按州)。 但 "customer_name和 "customer_address是敏感的。 如果她选择查看,这些信息将被加密:

select * from customers order by customer_id;
客户编号 客户名称 客户地址 客户状态 客户邮编
10031 &J.&#+RXV /u/%9$,1WZJ\*?<1L3- TX 90210
21451 INR0-F50_0 1U*"\(7H"V;3S%NH0]!= ['T NY 55555
43918 I_*$)VM0X0 0U+;!="XWV;#T&^Y#F#=8[ NY 98765
60844 M>6%(7Q0Y@ -T+#!9$@9T+#T6L(5L0 NY 55554
80008 H>F0*F]0Y@ 1L>B4*7<#U:WN&Z,JISI7YS< XX 0
如果 Alice 需要访问未加密的列,她已被授予 "ACCOUNTS角色权限,可以查看未加密的源数据:
set role accounts;
select * from customers order by customer_id;
客户编号 客户名称 客户地址 客户状态 客户邮编
10031 马克-F 234 主街 TX 90210
21451 克拉克 K 1 Metropolis Ave. NY 55555
43918 布鲁斯-W 1600 Gotham Lane NY 98765
60844 Peter P 500 Fifth Ave. NY 55554
80008 戴安娜-P 特米斯奇拉岛 XX 0