Spark全密態計算引擎基礎版使用示例
本文中含有需要您注意的重要提示信息,忽略該信息可能對您的業務造成影響,請務必仔細閱讀。
云原生數據倉庫 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 | +--------+----------+----------+----------+