通过访问策略自动执行加密和解密

您可以通过创建访问策略来自动执行加密和解密。通过这些策略,您可以向具有特定角色的用户显示未加密的值,而不具有这些角色的用户看到的是加密的值。或者,您可以创建一个访问策略,在缺少特定角色的用户进行查询时屏蔽存储在数据库中的未加密数据。

当创建访问策略以自动加密和解密数据时,用户不会显式调用 SecureData 集成函数。但是,他们必须仍然能够访问 SecureData 函数并设置任何必要的会话变量。有关有效的访问策略所需的配置,请参阅配置对 SecureData 的访问权限授予用户对 Voltage SecureData 集成函数的访问权限。如果无权访问 SecureData 集成函数的用户使用用于调用这些函数的访问策略查询表,则查询将生成错误。

为特权用户自动解密表列

要自动解密加密列,如果用户启用了角色,请为加密列创建一个用于调用 VoltageSecureAccess 的访问策略。如果用户没有启用角色,则只返回加密的值。

下面的例子:

  1. 创建一个名为 see_ssn 的角色并将其授予名为 Alice 的用户,并授予 Alice 对客户表的访问权限。

  2. 如果用户启用了 see_ssn 角色,则在客户表的 ssn 列上创建一个用于解密该列值的访问策略。

  3. 切换到名为 Alice 的用户。

  4. 在未启用 see_ssn 角色的情况下查询客户表。

  5. 启用 see_ssn 角色并再次查询表。

=> CREATE ROLE see_ssn;
CREATE ROLE

=> GRANT see_ssn TO alice;
GRANT ROLE

=> GRANT ALL ON TABLE customers TO alice;
GRANT PRIVILEGE

=> CREATE ACCESS POLICY ON customers FOR COLUMN ssn
     CASE
         WHEN enabled_role('see_ssn') THEN VoltageSecureAccess(ssn USING PARAMETERS format='ssn',
                                                               config_dfs_path='/voltagesecure/conf')
         ELSE ssn
     END ENABLE;
CREATE ACCESS POLICY

=> \c vmart alice;
Password:
You are now connected to database "vmart" as user "alice".

=> SELECT first_name, last_name, ssn FROM customers WHERE id < 5355 ORDER BY id ASC;
 first_name | last_name |     ssn
------------+-----------+-------------
 Gil        | Reeves    | 997-92-0657
 Robert     | Moran     | 715-02-0455
 Hall       | Rice      | 938-83-0659
 Micah      | Trevino   | 495-57-0860
(4 rows)

=> SET ROLE see_ssn;
SET
=> SELECT first_name, last_name, ssn FROM customers WHERE id < 5355 ORDER BY id ASC;
 first_name | last_name |     ssn
------------+-----------+-------------
 Gil        | Reeves    | 232-28-0657
 Robert     | Moran     | 725-79-0455
 Hall       | Rice      | 285-90-0659
 Micah      | Trevino   | 853-60-0860
(4 rows)

在以上示例中,您可以将 see_ssn 角色与授予用户对 SecureData 集成函数的访问权限的角色相结合。不具有 see_ssn 角色的用户无需拥有对 SecureData 函数的访问权限即可查看加密的值。

为非特权用户自动加密列

您还可以创建用于加密值的访问策略。使用此技术可防止某些用户查看列中的特定值,这些值不够敏感,无需在数据库中进行加密,但又不能被所有用户看到。此技术与动态加密相反:在动态加密中,具有特定角色的用户从表中获取值;如果他们不具有角色,则访问策略会对该值进行加密。

下面的例子:

  1. 创建一个名为 see_dob 的角色并将其分配给用户 Alice。

  2. 在客户表的 dob 列上创建访问策略。如果用户激活了 see_dob 角色,则返回列中的值,否则将对该值进行加密。

  3. 切换到名为 Alice 的用户。

  4. 查询包含 dob 列的客户表。

  5. 设置 see_dob 角色并再次查询客户。

=> CREATE ROLE see_dob;
CREATE ROLE

=> GRANT see_dob TO alice;
GRANT ROLE

=> CREATE ACCESS POLICY ON customers FOR COLUMN dob
     CASE
         WHEN enabled_role('see_dob') THEN dob
         ELSE VoltageSecureProtect(dob::varchar USING PARAMETERS format='birthday',
                                   config_dfs_path='/voltagesecure/conf')::date
     END ENABLE;
CREATE ACCESS POLICY

=> \c vmart alice
Password:
You are now connected to database "vmart" as user "alice".

=> SELECT first_name, last_name, dob FROM customers ORDER BY id ASC LIMIT 10;
 first_name | last_name  |    dob
------------+------------+------------
 Gil        | Reeves     | 2048-08-09
 Robert     | Moran      | 1917-03-05
 Hall       | Rice       | 2022-01-07
 Micah      | Trevino    | 2018-06-01
 Kuame      | Stephenson | 2053-02-13
 Hedda      | Cooper     | 2002-03-12
 MacKenzie  | Burks      | 2061-10-30
 Anne       | Marquez    | 2078-08-02
 Dominic    | Avery      | 1940-08-10
 Alfreda    | Mcdaniel   | 1904-04-27
(10 rows)

=> SET ROLE see_dob;
SET

=> SELECT first_name, last_name, dob FROM customers ORDER BY id ASC LIMIT 10;
 first_name | last_name  |    dob
------------+------------+------------
 Gil        | Reeves     | 1955-11-04
 Robert     | Moran      | 1991-12-01
 Hall       | Rice       | 1977-07-07
 Micah      | Trevino    | 1980-12-05
 Kuame      | Stephenson | 1979-09-12
 Hedda      | Cooper     | 1987-05-02
 MacKenzie  | Burks      | 1982-11-07
 Anne       | Marquez    | 1949-07-09
 Dominic    | Avery      | 1976-12-02
 Alfreda    | Mcdaniel   | 1975-02-08
(10 rows)

在前面的示例中,未启用 see_dob 角色的用户必须具有对 SecureData 函数的访问权限才能查看屏蔽的值。如果他们不具有对 SecureData 函数的访问权限,则查询客户表时会出现错误消息。以下示例创建了一个名为 Bob 的新用户,并授予他对客户表的访问权限,但未授予其对 SecureData 函数的任何访问权限。

=> CREATE USER bob;
CREATE USER
=> GRANT ALL ON TABLE customers TO bob;
GRANT PRIVILEGE
=> \c vmart bob
You are now connected to database "vmart" as user "bob".
=> SELECT * FROM customers LIMIT 10;
ERROR 6482:  Failed to parse Access Policies for table "customers"
[Function public.VoltageSecureProtect(varchar) does not exist, or permission
is denied for public.VoltageSecureProtect(varchar)]