天天看點

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.已經被加密的表不允許修改成其它存儲引擎。