mysql表空間加密 keyring encryption

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

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;)mysql

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

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

因爲上面四種類型的加密後三種都只有在企業版本有,因此接下來的介紹主要以社區版本的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)spa


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=INPLACE3.只支持加密存儲在file-per-table的表,general tablespaces, system tablespace, undo log tablespaces,temporary tablespace不支持加密。4.不能把一個加密的表空間移到一個不支持的表空間類型。5.表空間加密只加密表空間中的數據,在redo log,undo log,binary log中的數據是不加密的。6.已經被加密的表不容許修改爲其它存儲引擎。

相關文章
相關標籤/搜索