本文中含有需要您注意的重要提示信息,忽略該信息可能對您的業務造成影響,請務必仔細閱讀。
RDS MySQL全密態數據庫能夠對數據庫查詢結果中的數據進行加密和脫敏保護,任何非授權人員均無法查看被保護數據明文內容。本文介紹如何通過全密態客戶端驅動EncJDBC快速使用并驗證RDS MySQL全密態數據庫功能。
前提條件
RDS MySQL實例的大版本為MySQL 5.7,且內核小版本必須大于或等于20231215。
升級內核小版,請參見升級內核小版本。
注意事項
請妥善保存您設置的主密鑰
MEK
。Java版本需要在1.8及以上。
說明本文中使用的Maven版本為
3.9.5
,使用的開發工具為IntelliJ IDEA Community Edition 2023.2.4
。
操作步驟
步驟一: 創建實例、數據庫及賬號
購買符合本文前提條件的RDS MySQL實例,創建方法請參見創建RDS MySQL實例、RDS MySQL標準版(原X86)主實例規格列表、RDS MySQL經濟版(原ARM)主實例規格列表。
說明如果您已購實例已滿足本文前提條件中的要求,則無需新購實例。
創建數據庫高權限賬號,創建方法請參見創建賬號。
創建數據庫,詳情請參見管理數據庫。
步驟二: 開啟全密態功能
訪問RDS實例列表,在上方選擇地域,單擊剛剛創建的實例ID。
開通全密態功能。
警告開通全密態功能會導致實例重啟,請在業務低峰期操作。
在左側導航欄,單擊參數設置,在可修改參數頁簽,搜索loose_encdb,將該參數值設置為ON,選擇生效時間后,單擊確定。
步驟三: 配置數據保護規則
開通全密態功能以及配置數據保護規則的賬號必須是高權限賬號。應用數據庫角色建議設為普通權限,不具備管理員權限,且不建議賦予應用數據庫角色高權限。
確定被保護字段
用戶基于業務實際需要,確定哪些數據屬于被保護數據。本文示例中,將通訊錄中的部門名稱(
department.name
)、員工姓名(users.name
)和ID(users.id
)確定為被保護數據。數據庫表結構如下:說明建表之前需要先執行
CREATE DATABASE contact;
創建contact數據庫。-- 部門表 CREATE TABLE department (id INTEGER PRIMARY KEY AUTO_INCREMENT, dept_id BIGINT, name TEXT, parentId BIGINT, createDeptGroup BOOL, autoAddUser BOOL, UNIQUE(dept_id)); -- 用戶表 CREATE TABLE users (id varchar(255) PRIMARY KEY, dept_id BIGINT, name TEXT, avatar TEXT); -- 寫入測試數據 INSERT INTO department(dept_id, name, parentId, createDeptGroup, autoAddUser) VALUES (202301,'dept1',202301,true,true), (202302,'dept2',202301,true,true), (202303,'dept3',202301,true,false); INSERT INTO users VALUES ('110110181103233433', 202301, 'user1', 'director'), ('350110180103038669', 202302, 'user2', 'dept2_user'), ('220110182203032387', 202302, 'user3', 'dept2_user'), ('410110182209237752', 202303, 'user4', 'dept3_user'), ('310140181210228325', 202303, 'user5', 'dept3_user');
配置規則
基于選定的被保護數據,按照數據保護規則格式,編輯規則內容,并通過SQL UDF下發規則。更多規則格式介紹請參見數據保護規則簡介。
SELECT encdb_rule_op('add', '[{ "name": "rule-for-contact-name", "enabled": true, "meta": { "databases": ["contact"], "tables": ["department","users"], "columns": ["name"] } }, { "name": "rule-for-contact-id", "enabled": true, "meta": { "databases": ["contact"], "tables": ["users"], "columns": ["id"] } }]');
其中,
rule-for-contact-name
同時標記了部門名稱(department.name
)以及員工姓名(users.name
),rule-for-contact-id
標記了員工ID(users.id
)。授權用戶訪問
若希望數據庫用戶在應用客戶端側能夠訪問解密后的明文結果,需要為其授予受限訪問權限(
restrictedAccess
)。更多授權信息,請參見配置數據保護規則。執行如下命令,授權應用數據庫角色受限訪問權限:
SELECT encdb_rule_op('grant','{"restrictedAccess": ["appuser"]}');
說明appuser
為應用數據庫角色。
步驟四: 客戶端接入改造
全密態數據庫提供了配套的數據庫連接驅動,無需修改業務代碼,應用客戶端側僅需進行如下兩步配置,就能夠無感訪問全密態數據庫。本步驟以EncJDBC
接入為例進行說明:
將數據庫連接驅動替換成
EncJDBC
。更新數據庫連接URL,指定用戶密鑰
MEK
以及加密算法ENC_ALGO
。
以Java語言為例,僅需如下兩處配置修改即可:
// 準備好域名(hostname)、端口(port)、數據庫實例名(dbname)、用戶名(username)、密碼(password)等連接信息
// ...
String mek="00112233445566778899aabbccddeeff";
String encAlgo="SM4_128_CTR";
// 1. 將數據庫連接驅動替換成EncJDBC
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");
// 2. 更新數據庫連接URL,指定用戶密鑰MEK以及加密算法ENC_ALGO
String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s?MEK=%s&ENC_ALGO=%s", hostname, port, dbname, mek, encAlgo);
java.sql.Connection connection = java.sql.DriverManager.getConnection(dbUrl, username, password);
// ... 發起查詢 ...
更多客戶端EncJDBC
接入配置請參見EncJDBC。
步驟五: 功能驗證
可以在命令行工具或者DMS控制臺上,執行SQL命令驗證數據是否被加密保護:
執行如下命令查詢通訊錄指定的部門信息:
SELECT * FROM contact.department WHERE dept_id = 202302;
查詢結果如下:
執行如下命令查詢通訊錄指定部門的員工信息:
SELECT * FROM contact.users WHERE dept_id = 202302;
查詢結果如下:
執行如下命令模糊查詢通訊錄員工信息:
SELECT * FROM contact.users WHERE name LIKE '%1';
查詢結果如下:
從全密態數據庫中查詢的結果顯示,所有被保護數據均被加密保護。