AnalyticDB for MySQL Apache Spark全密態計算引擎基礎版可以加密敏感性資料,並將資料以密文的形式傳輸和儲存,只有密鑰擁有者才能解密資料,避免資料泄露。本文以雲資料庫RDS MySQL例,介紹使用Apache Spark全密態計算引擎基礎版加密資料,計算和分析密態資料,解密計算結果的完整過程。
前提條件
叢集的產品系列為企業版、基礎版或湖倉版。
已建立資料庫帳號。
如果是通過阿里雲帳號訪問,只需建立高許可權帳號。
如果是通過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 Apache 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_namePostgreSQL資料庫:
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_namePostgreSQL資料庫:
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 | +--------+----------+----------+----------+