You need to enable JavaScript to run this app.
导航

数据加密

最近更新时间2023.09.01 17:12:49

首次发布时间2023.03.20 19:48:45

1. 概述

针对数据安全问题,在常规的权限管控基础上,还需要防止恶意窃取硬件设备导致的数据泄漏。将数据加密存储成为必要的解决方案。
LAS 支持字段级的加解密能力,加密实现在文件格式层,加密计算发生在可信的 LAS 环境,敏感数据和密钥硬件存储层不可知。LAS 实现基于表和用户权限对应配置,实现用户无感加密/解密敏感数据,数据加密的同时也给授权用户提供了完整的文件级别能力,计算引擎在执行过程中会统一解析语句,并自动添加加解密配置,用户无需为加密能力改造原有 SQL。

2. 创建加密表

进入数据管理-表管理页面,点击创建表。
注:当前 LAS 的加密能力在创建表后不支持修改加密范围,请在创建表时谨慎选择。

创建加密表限制:

  • 外表只支持 parquet 格式的 TOS 表。

  • Array 和 Map 类型字段不支持加密。

  • 分区字段不支持加密。

2.1 可视化建表

选择 启用数据加密,目前加密算法支持 AES_GCM_CTR_V1,加密范围支持 部分列加密整表加密 两种。

选择 整表加密,所有字段默认勾选加密选项。
选择 部分列加密,需要至少勾选一列加密列。


2.2 DDL 建表/视图

加密相关表参数:
parquet.encryption.enabled:
parquet.encryption.algorithm: = 'AES_GCM_CTR_V1',
parquet.encryption.scope column
parquet.encryption.fields


选择 DDL 建表/视图 Tab。

参数参数含义是否必传默认值取值范围
parquet.encryption.enabled是否开启加密falsetrue、false
parquet.encryption.algorithm加密算法enable=true 时默认AES_GCM_CTR_V1
parquet.encryption.scope加密范围column、table
parquet.encryption.fields加密字段enable=true 且 scope=column 时必传m1,m2 “,”分隔多个字段

内表部分列加密:

CREATE TABLE IF NOT EXISTS tpcds1g.test_encryption_part_columns (m1 INT, m2 BIGINT, m3 STRING) PARTITIONED BY (dt STRING) TBLPROPERTIES (
  'parquet.encryption.enabled' = 'true',
  'parquet.encryption.algorithm' = 'AES_GCM_CTR_V1',
  'parquet.encryption.scope' = 'column',
  'parquet.encryption.fields' = 'm2,m3'
)

内表整表加密:

CREATE TABLE IF NOT EXISTS tpcds1g.test_encryption_internal_entire (m1 STRING, m2 STRING, m3 STRING) PARTITIONED BY (dt STRING) TBLPROPERTIES (
  'parquet.encryption.enabled' = 'true',
  'parquet.encryption.algorithm' = 'AES_GCM_CTR_V1',
  'parquet.encryption.scope' = 'table'
)

外表部分列加密:

CREATE EXTERNAL TABLE `tpcds1g`.`test_encryption_external_part_column`(m1 INT, m2 INT, m3 STRING) PARTITIONED BY (dt STRING) STORED AS Parquet location 'tos://aipai-test/test/AAA' TBLPROPERTIES (
  'parquet.encryption.enabled' = 'true',
  'parquet.encryption.algorithm' = 'AES_GCM_CTR_V1',
  'parquet.encryption.scope' = 'column',
  'parquet.encryption.fields' = 'm3'
)

外表整表加密:

CREATE EXTERNAL TABLE `tpcds1g`.`test_encryption_external_entire_table`(m1 BIGINT, m2 STRING, m3 STRING) PARTITIONED BY (dt STRING) STORED AS Parquet location 'tos://aipai-test/test/AAA' TBLPROPERTIES (
  'parquet.encryption.enabled' = 'true',
  'parquet.encryption.algorithm' = 'AES_GCM_CTR_V1',
  'parquet.encryption.scope' = 'table'
)

2.3 表编辑

在表编辑页面,除字段备注外,加密表不允许其他的内容变更。

3. 加密表表信息

进入 数据管理-表管理 页面,点击 表详情-表信息,会展示表加密信息。

4. 加解密权限管理

LAS 加解密权限和数据权限独立,没有继承关系。 一方面,表的创建者默认获得该表的数据权限。另一方面,表的 Admin 用户需要通过自我授权,才可获得加解密权限。最终生效范围为:用户的数据权限及解密权限的交集;当且仅当用户具备表的读权限及解密权限时,才可读取到明文。
如何操作:进入 权限管理-加解密权限 页面,用户可管理自身具备表的 Admin 角色的表,为其他用户添加或移除加解密权限。


5. 加密表数据读写示例
  • 解密权限:
    • 对于整表加密:没有解密权限,查询加密表失败,提示无 DECRYPTION 权限。

    • 对于部分列加密:没有解密权限,查询加密列提示无 DECRYPTION 权限,查询非加密列正常。

示例 1:无加解密权限
创建部分列加密内表,并对测试用户授予表 Admin 权限,未授予测试用户解密权限。

CREATE TABLE IF NOT EXISTS testyw.test_encryption_internal (m1 INT, m2 INT, m3 INT) PARTITIONED BY (dt STRING) TBLPROPERTIES (
  'ttl_enable' = 'false',
  'parquet.encryption.enabled' = 'true',
  'parquet.encryption.algorithm' = 'AES_GCM_CTR_V1',
  'parquet.encryption.scope' = 'column',
  'parquet.encryption.fields' = 'm3'
)

用户查询加密表,提示没有解密权限。

select * from testyw.test_encryption_internal where dt = '2023'


用户查询加密表的非加密字段,提示查询成功。

示例 2:有解密权限
为用户授予表解密权限后,再次测试加密表写入,结果是用户可以正常执行。

insert into testyw.test_encryption_internal(dt,m1,m2,m3) values (20230301,1,2,3);




6. 加密表数据读写限制
  • 写加密表

    • 目前仅支持 Spark SQL 写,不支持 Jar 任务写。
  • 功能限制

    • 生态连接 JDBC 暂不支持加密表。

    • Presto 暂不支持读取加密外表。