本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
云原生数据仓库 AnalyticDB MySQL 版Spark全密态计算引擎基础版可以加密敏感数据,并将数据以密文的形式传输和存储,只有密钥拥有者才能解密数据,避免数据泄露。本文以云数据库RDS MySQL例,介绍使用Spark全密态计算引擎基础版加密数据,计算和分析密态数据,解密计算结果的完整过程。
前提条件
集群的产品系列为企业版、基础版或湖仓版。
已创建数据库账号。
如果是通过阿里云账号访问,只需创建高权限账号。具体操作,请参见创建高权限账号。
如果是通过RAM用户访问,需要创建高权限账号和普通账号并且将RAM用户绑定到普通账号上。具体操作,请参见创建数据库账号和绑定或解绑RAM用户与数据库账号。
已为RAM用户授予AliyunADBFullAccess、AliyunADBSparkProcessingDataRole和AnalyticDB for MySQL库表的读写权限。具体操作,请参见账号授权。
已安装Java 8开发环境,以运行客户端工具。本文以操作系统为Linux的ECS实例为例。
注意事项
adb-crypto-tool客户端工具仅支持加密或解密存储在MySQL和PostgreSQL数据库中的数据。
说明MySQL或PostgreSQL数据库可以是云数据库、自建数据库或第三方云数据库。
全密态计算引擎尚不支持Decimal数据类型(可使用Float或Double数据类型作为替代)及嵌套数据类型。
对于PostgreSQL数据库,全密态计算引擎暂不支持自动去除
Char(n)
数据类型的尾部空格,建议使用Varchar(n)
类型。
数据准备
本文示例的RDS MySQL数据库名为adb
,并在该库中创建了一张名为customer
的表,示例如下:
CREATE DATABASE IF NOT EXIST adb;
CREATE TABLE IF NOT EXISTS adb.customer(
id int,
name varchar(1023),
address varchar(1023),
age int
);
向customer
表中插入数据,示例如下:
INSERT INTO customer (id,name,address,age) VALUES('1', 'james', 'beijing', '10');
INSERT INTO customer (id,name,address,age) VALUES('2', 'bond', 'beijing', '15');
INSERT INTO customer (id,name,address,age) VALUES('3', 'jack', 'shanghai', '20');
INSERT INTO customer (id,name,address,age) VALUES('4', 'lucy', 'hangzhou', '25');
INSERT INTO customer (id,name,address,age) VALUES('5', 'tom', 'qingdao','30');
使用流程
步骤一:安装加解密客户端。下载并安装adb-crypto-tool客户端。
步骤二:加密数据并上传。通过客户端工具,将数据库明文表中的数据加密成密文数据集,并上传至OSS。
步骤三:执行密文数据的SQL计算。通过AnalyticDB for MySQL Spark全密态计算引擎的SQL窗口,执行密态数据计算,计算结果将以密文的形式存储在OSS。
步骤四:下载密文结果数据并解密。将密文计算结果下载到本地,使用客户端工具解密后自动上传至数据库明文表中。
安装加解密客户端
下载客户端工具。下载链接为adb-crypto-tool-1.0.4.zip。
解压adb-crypto-tool-1.0.4.zip压缩包。
unzip adb-crypto-tool-1.0.4.zip
解压缩会得到以下3个文件或文件夹:
cryptoTool:加解密工具的入口。
说明cryptoTool依赖bash环境,Windows系统可使用WSL等工具执行。
demo.json:示例配置文件。
dist:加解密工具的依赖包。
加密数据并上传
准备加密配置文件。您可参考demo.json新建配置文件,或直接修改demo.json配置文件的
table
、jdbcUrl
、username
和password
参数。本文示例新建配置文件encryption_config.json
。示例如下:{ "dataDir": "file:///tmp", "table": [ "customer" ], "encAlgo": "AES_128_GCM", "mek": "00112233445566778899aabbccdd****", "jdbcUrl": "jdbc:mysql://rm-bp1487t8613zz****.mysql.rds.aliyuncs.com:3306/adb", "username": "demo_user", "password": "demo_password", "saveMode": "Overwrite", "format":"EncBlocksSource" }
参数说明如下。
参数
描述
dataDir
存储密文数据集的本地路径。
table
加密的表名。本示例为customer。
encAlgo
密文的加解密算法。当前仅支持AES_128_GCM。
mek
用户主密钥(MEK)用于加密数据密钥(DEK)。详情请参见密钥介绍。
用户主密钥的格式为16字节的十六进制字符串。您可以通过OpenSSL工具生成密钥。本文示例为
00112233445566778899aabbccdd****
。警告用户主密钥是访问加密数据的根凭据,一旦丢失密钥,将无法再访问已有的数据。请妥善保管用户主密钥。
全密态计算引擎不提供用户主密钥的生成和备份服务,您需要按照密钥格式输入用户主密钥。
jdbcUrl
数据库的连接地址和数据库名称。仅支持MySQL和PostgreSQL数据库。连接地址格式为:
MySQL数据库:
jdbc:mysql://ip:port/database_name
PostgreSQL数据库:
jdbc:postgresql://ip:port/database_name
本文示例为
jdbc:mysql://rm-bp1487t8613zz****.mysql.rds.aliyuncs.com:3306/adb
。userName
数据库账号。
password
账号密码。
saveMode
如果已存在目标路径(加密后的文件存储路径),引擎在生成密文数据集时将采取的模式。支持以下模式:
Append:追加写。
ErrorIfExists:目标存在,则上报异常后退出。您可以在日志中查看具体报错信息。
Ignore:目标存在,则放弃写。您在日志中无法查看具体报错信息。
Overwrite:覆盖写。
format
密文格式。当前仅支持EncBlocksSource格式。
运行客户端工具加密指定数据库
adb
中customer
表的数据。加密后的数据集会存储在配置文件中指定的dataDir
路径下。./cryptoTool encrypt encryption_config.json
将加密后的数据集所在的文件夹
customer
上传到OSS空间。本文示例路径为oss://testBucketName/adb/Spark/customer
。具体操作,请参见简单上传。
执行密文数据的SQL计算
登录云原生数据仓库AnalyticDB MySQL控制台,在左上角选择集群所在地域。在左侧导航栏,单击集群列表,在企业版、基础版或湖仓版页签下,单击目标集群ID。
在左侧导航栏,单击作业开发>SQL开发。
在SQLConsole窗口,选择Spark引擎和Job型资源组。
执行以下语句,进行密文数据的SQL计算。
开启密态计算,设置用户的主密钥。
--开启密态计算。 set spark.adb.tee.enabled=true; --设置用户的主密钥,需要与加密配置文件中的用户主密钥MEK一致。 set spark.adb.tee.encryption.key=00112233445566778899aabbccdd****; --创建数据库,存储密文数据和密文计算结果。 CREATE DATABASE IF NOT EXISTS test_db;
使用全密态引擎创建外表
customer
。LOCATION为密文数据集文件夹所在的OSS路径。本文示例为oss://testBucketName/adb/Spark/customer
。set spark.adb.tee.enabled=true; set spark.adb.tee.encryption.key=00112233445566778899aabbccdd****; CREATE TABLE IF NOT EXISTS test_db.customer USING EncBlocksSource LOCATION 'oss://testBucketName/adb/Spark/customer';
创建外表
customer_output
,将customer
表的SQL计算结果写入customer_output
外表。customer_output
外表的数据指定存储在oss://testBucketName/adb/Spark/customer_output
。set spark.adb.tee.enabled=true; set spark.adb.tee.encryption.key=00112233445566778899aabbccdd****; CREATE TABLE IF NOT EXISTS test_db.customer_output USING EncBlocksSource LOCATION 'oss://testBucketName/adb/Spark/customer_output' AS SELECT * FROM test_db.customer WHERE id = 1;
下载密文结果并解密
从OSS路径
oss://testBucketName/adb/Spark/customer_output
下载密文计算结果到本地。具体操作,请参见下载文件。准备解密配置文件。本文示例新建配置文件
decryption_config.json
,示例如下。{ "dataDir": "file:///tmp", "table": [ "customer_output" ], "encAlgo": "AES_128_GCM", "outTblPrefix": "abc_", "mek": "00112233445566778899aabbccdd****", "jdbcUrl": "jdbc:mysql://rm-bp1487t8613zz****.mysql.rds.aliyuncs.com:3306/adb", "username": "demo_user", "password": "demo_password", "saveMode": "Overwrite", "format":"EncBlocksSource" }
参数说明如下:
参数
描述
dataDir
存储密文数据集的本地路径。
table
密文数据集的文件夹名。
encAlgo
密文的加解密算法。当前仅支持AES_128_GCM。
outTblPrefix
解密后数据库中表名的前缀(Prefix)。数据库中目标表名将由前缀和密文数据集文件夹名组成。
mek
用户主密钥(MEK)用于加密数据密钥(DEK)。详情请参见密钥介绍。
用户主密钥的格式为16字节的十六进制字符串。您可以通过OpenSSL工具生成密钥。本文示例为
00112233445566778899aabbccdd****
。警告用户主密钥是访问加密数据的根凭据,一旦丢失密钥,将无法再访问已有的数据。请妥善保管用户主密钥。
全密态计算引擎不提供用户主密钥的生成和备份服务,您需要按照密钥格式输入用户主密钥。
jdbcUrl
数据库的连接地址和数据库名称。仅支持MySQL和PostgreSQL数据库。连接地址格式为:
MySQL数据库:
jdbc:mysql://ip:port/database_name
PostgreSQL数据库:
jdbc:postgresql://ip:port/database_name
本文示例为
jdbc:mysql://rm-bp1487t8613zz****.mysql.rds.aliyuncs.com:3306/adb
。userName
数据库账号。
password
账号密码。
saveMode
如果已存在目标数据库(解密后的数据存储的数据库),引擎在生成明文数据集时将采取的模式。支持以下模式:
Append:追加写。
ErrorIfExists:目标存在,则上报异常后退出。您可以在日志中查看具体报错信息。
Ignore:目标存在,则放弃写。您在日志中无法查看具体报错信息。
Overwrite:覆盖写。
format
密文格式。当前仅支持EncBlocksSource格式。
运行客户端解密,解密后的数据会被自动插入到RDS MySQL的
adb
数据库中。写入的数据表,表名由加密数据集所在的文件夹名称和outTblePrefix参数决定。本文示例为adb_customer_output
。./cryptoTool decrypt decryption_config.json
在RDS MySQL数据库中查看解密后的数据。可看到数据明文的计算结果。
SELECT * FROM adb_customer_output;
返回结果:
+--------+----------+----------+----------+ | id | name | address | age | +--------+----------+----------+----------+ | 1 | james | beijing | 10 | +--------+----------+----------+----------+