mysql表空間加密 keyring encryption


從5.7.11開始,mysql開始支持物理表空間的加密,它使用兩層加密架構。
包括:master key 和 tablespace key

master key用於加密tablespace key,加密后的結果存儲在tablespace的header中。tablespace key用於加密數據
當用戶想訪問加密的表時,innoDB會先用master key對之前存儲在header中的加密信息進行解密,得到tablespace key。再用tablespace key解密數據信息。tablespace key是不會被改變的(除非進行alter table t1 encrytion=NO, alter table t1 encrytion=YES)。而master key可以隨時改變(ALTER INSTANCE ROTATE INNODB MASTER KEY;)

InnoDB表空間加密依賴於keyring插件。總共有四個插件

keyring插件 開始版本 類型
keyring_file  5.7.11 社區版
keyring_encrypted_file  5.7.21 企業版
keyring_okv  5.7.12 企業版
keyring_aws  5.7.19 企業版

由於上面四種類型的加密后三種都只有在企業版本有,所以接下來的介紹主要以社區版本的keyring_file為例進行說明。


安裝:


1.配置文件中加入如下參數:
[mysqld]
early-plugin-load=keyring_file.so
keyring_file_data=/usr/local/mysql/mysql-keyring/keyring

 

2.查看所加插件是否生效:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'keyring%';
+--------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+--------------+---------------+
| keyring_file | ACTIVE |
+--------------+---------------+

3.查看 innodb_file_per_table參數是否已經為開(default:ON)


4.創建加密表空間
CREATE TABLE t1 (c1 INT) ENCRYPTION='Y';
ALTER TABLE t1 ENCRYPTION='Y';

5.取消加密表空間:
ALTER TABLE t1 ENCRYPTION='N';


master key需周期性地改變,增強安全性,master key rotation是原子的、實例級別的操作。輪換時,所有的tablespace key都會被重新用新master key加密並存儲到相關的tablespace header中。
更換master key只會改變master key和重新加密tablespace key,不會解密及重加密表空間數據。
更換語句:ALTER INSTANCE ROTATE INNODB MASTER KEY;
更換時,能夠進行並發地DML操作,但是不能和CREATE TABLE ... ENCRYPTED 或 ALTER TABLE ... ENCRYPTED 並行。

當在進行master key 更換時,實例掛掉。那在實例重啟時會繼續此操作。
在重啟過程中,keyring插件將優先於innoDB初始化執行,因為innoDB需要keyring插件來解密相關的數據,這也是為什么需要用early-plugin-load參數的原因(用--plugin-load 或 --plugin-load-add 加載的插件是在InnoDB初始化后才加載的。用 INSTALL PLUGIN加載的插件是注冊在mysql.plugin表中,但它也是一個innodb表,里面注冊的插件也是在innodb初始化后才執行的)。同時,mysql會去掃描所有的加密表空間文件。對於依舊使用舊master key的文件,innodb會先用old master key來解密tablespace key,再用new master key加密tablespace key后重寫回tablespace header中。

當導出一個加密的表時,InnoDB生成一個transfer key用來加密tablespace key,加密的tablespace key及transfer key存儲在tablespace_name.cfp文件中。當導入時,InnoDB會使用transfer key來解密tablespace key。


執行ALTER INSTANCE ROTATE INNODB MASTER KEY時,主從實例必須都得支持表空間加密才行
ALTER INSTANCE ROTATE INNODB MASTER KEY執行成功后會被記錄在binlog中。

 

找出加密的表空間:
SELECT TABLE_SCHEMA, TABLE_NAME, CREATE_OPTIONS FROM INFORMATION_SCHEMA.TABLES WHERE CREATE_OPTIONS LIKE '%ENCRYPTION="Y"%';
+--------------+------------+----------------+
| TABLE_SCHEMA | TABLE_NAME | CREATE_OPTIONS |
+--------------+------------+----------------+
| test | t1 | ENCRYPTION="Y" |
+--------------+------------+----------------+

 

注意:
1.不能一次使用多個加密插件。
2.確保master key的安全性,如果丟失,就會造成數據文件的不可用。在初次建立表空間加密及master key rotation時,建議備份
3.ALTER TABLE ... ENCRYPTION 操作用 ALGORITHM=COPY重建表,不支持ALGORITHM=INPLACE
4.如果實例退出,建立用同樣的加密配置啟動實例。
5.第一個新的或存在的表加密時,會自動生成master key
6.輪換Master key時只是重新加密tablespace key,並沒有改變tablespace key,要改變tablespace key,需要用 ALTER TABLE tbl_name ENCRYPTION先禁用加密再重新加密,它使用ALGORITHM=COPY來重建表。
7.如果一個表創建時使用compression及encryption選項,compression會在encryption前執行。
8.如果keyring 數據文件(keyring_file_data變量)是空的或不存在,第一次執行 ALTER INSTANCE ROTATE INNODB MASTER KEY 會生成master key.
9.卸載keyring_file 插件時並不會刪除keyring 數據文件。
10.不建議把keyring數據文件和tablespace表放在同一個目錄中。
11.在運行或重啟時修改 keyring_file_data 變量會使之前加密的表不可訪問,造成數據丟失


限制:
1.AES是唯一支持的加密算法。在InnodB表空間中,tablespace key使用Electronic Codebook (ECB)塊加密模式,data使用Cipher Block Chaining (CBC)塊加密模式.
2.改變一個有的ENCRYPTION屬性使用的是ALGORITHM=COPY,不支持ALGORITHM=INPLACE
3.只支持加密存儲在file-per-table的表,general tablespaces, system tablespace, undo log tablespaces,temporary tablespace不支持加密。
4.不能把一個加密的表空間移到一個不支持的表空間類型。
5.表空間加密只加密表空間中的數據,在redo log,undo log,binary log中的數據是不加密的。
6.已經被加密的表不允許修改成其它存儲引擎。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM