InnoDB 支援 每個資料表一個檔案 表空間、一般 表空間、mysql 系統表空間、重做日誌和復原日誌的靜態資料加密。
您可以為綱要和一般表空間設定加密預設值;這允許 DBA 控制在這些綱要和表空間中建立的資料表是否加密。
InnoDB 靜態資料加密功能和能力在本節的以下主題中說明。
InnoDB 使用兩層加密金鑰架構,由主加密金鑰和表空間金鑰組成。當表空間加密時,表空間金鑰會加密並儲存在表空間標頭中。當應用程式或已驗證的使用者想要存取加密的表空間資料時,InnoDB 使用主加密金鑰來解密表空間金鑰。表空間金鑰的解密版本永遠不會變更,但主加密金鑰可以根據需要變更。此動作稱為 主金鑰輪換。
靜態資料加密功能依賴金鑰環元件或外掛程式來進行主加密金鑰管理。
所有 MySQL 版本都提供 component_keyring_file 元件,該元件將金鑰環資料儲存在伺服器主機的本機檔案中。
MySQL 企業版提供額外的金鑰環元件和外掛程式
component_keyring_encrypted_file:將金鑰環資料儲存在伺服器主機的本機加密、受密碼保護的檔案中。keyring_okv:用於 KMIP 相容後端金鑰環儲存產品的 KMIP 1.1 外掛程式。支援的 KMIP 相容產品包括集中式金鑰管理解決方案,例如 Oracle Key Vault、Gemalto KeySecure、Thales Vormetric 金鑰管理伺服器和 Fornetix Key Orchestration。keyring_aws:與 Amazon Web Services Key Management Service (AWS KMS) 通訊,作為金鑰產生的後端,並使用本機檔案進行金鑰儲存。keyring_hashicorp:與 HashiCorp Vault 通訊以進行後端儲存。
對於加密金鑰管理,component_keyring_file 和 component_keyring_encrypted_file 元件不打算作為法規遵循解決方案。PCI、FIPS 和其他安全標準要求使用金鑰管理系統來保護、管理和保護金鑰庫或硬體安全模組 (HSM) 中的加密金鑰。
安全且穩健的加密金鑰管理解決方案對於安全性和符合各種安全標準至關重要。當靜態資料加密功能使用集中式金鑰管理解決方案時,該功能稱為 “MySQL 企業版透明資料加密 (TDE)”。
靜態資料加密功能支援進階加密標準 (AES) 基於區塊的加密演算法。它對表空間金鑰加密使用電子密碼本 (ECB) 區塊加密模式,對資料加密使用密碼區塊鏈結 (CBC) 區塊加密模式。
有關靜態資料加密功能的常見問題,請參閱第 A.17 節,「MySQL 9.0 FAQ:InnoDB 靜態資料加密」。
在啟動時必須安裝並設定金鑰環元件或外掛程式。提早載入可確保元件或外掛程式在
InnoDB儲存引擎初始化之前可用。如需金鑰環安裝和設定說明,請參閱第 8.4.4 節「MySQL 金鑰環」。這些說明會示範如何確保所選的元件或外掛程式處於啟用狀態。一次只能啟用一個金鑰環元件或外掛程式。不支援啟用多個金鑰環元件或外掛程式,且結果可能不如預期。
重要事項在 MySQL 執行個體中建立加密表空間後,在建立加密表空間時載入的金鑰環元件或外掛程式必須在啟動時繼續載入。如果沒有這麼做,在啟動伺服器和
InnoDB復原期間會發生錯誤。當加密生產資料時,請務必採取步驟防止主加密金鑰遺失。如果主加密金鑰遺失,則儲存在加密表空間檔案中的資料將無法復原。如果您使用
component_keyring_file或component_keyring_encrypted_file元件,請在建立第一個加密表空間後、在主金鑰輪換之前以及在主金鑰輪換之後,立即建立金鑰環資料檔案的備份。對於每個元件,其組態檔案會指示資料檔案的位置。如果您使用keyring_okv或keyring_aws外掛程式,請確保您已執行必要的組態。如需說明,請參閱第 8.4.4 節「MySQL 金鑰環」。
default_table_encryption 系統變數定義結構描述和一般表空間的預設加密設定。CREATE TABLESPACE 和 CREATE SCHEMA 作業會在未明確指定 ENCRYPTION 子句時套用 default_table_encryption 設定。
ALTER SCHEMA 和 ALTER TABLESPACE 作業不會套用 default_table_encryption 設定。必須明確指定 ENCRYPTION 子句,才能變更現有結構描述或一般表空間的加密。
可以使用 SET 語法為個別用戶端連線或全域設定 default_table_encryption 變數。例如,以下陳述式會全域啟用預設結構描述和表空間加密
mysql> SET GLOBAL default_table_encryption=ON;當建立或變更結構描述時,也可以使用 DEFAULT ENCRYPTION 子句定義結構描述的預設加密設定,如下範例所示
mysql> CREATE SCHEMA test DEFAULT ENCRYPTION = 'Y';如果建立結構描述時未指定 DEFAULT ENCRYPTION 子句,則會套用 default_table_encryption 設定。必須指定 DEFAULT ENCRYPTION 子句,才能變更現有結構描述的預設加密設定。否則,結構描述會保留其目前的加密設定。
依預設,資料表會繼承其建立所在結構描述或一般表空間的加密設定。例如,在啟用加密的結構描述中建立的資料表預設會加密。此行為讓 DBA 可以透過定義和強制執行結構描述和一般表空間的預設加密,來控制資料表加密的使用方式。
啟用 table_encryption_privilege_check 系統變數會強制執行預設加密。當啟用 table_encryption_privilege_check 時,在建立或變更結構描述或一般表空間時,如果加密設定與 default_table_encryption 設定不同,或者在建立或變更資料表時,如果加密設定與預設結構描述加密不同,則會發生權限檢查。當停用 table_encryption_privilege_check 時 (預設),不會發生權限檢查,且先前提及的作業允許在出現警告的情況下繼續進行。
當啟用 table_encryption_privilege_check 時,需要 TABLE_ENCRYPTION_ADMIN 權限才能覆寫預設加密設定。DBA 可以授予此權限,讓使用者在建立或變更結構描述或一般表空間時,可以偏離 default_table_encryption 設定,或者在建立或變更資料表時,可以偏離預設結構描述加密。此權限不允許在建立或變更資料表時偏離一般表空間的加密。資料表必須具有與其所在的一般表空間相同的加密設定。
除非在 CREATE TABLE 陳述式中明確指定 ENCRYPTION 子句,否則每個資料表的表空間會繼承建立資料表所在結構描述的預設加密。
mysql> CREATE TABLE t1 (c1 INT) ENCRYPTION = 'Y';若要變更現有每個資料表表空間的加密,必須指定 ENCRYPTION 子句。
mysql> ALTER TABLE t1 ENCRYPTION = 'Y';
如果啟用 table_encryption_privilege_check,則指定 ENCRYPTION 子句的設定如果與預設結構描述加密不同,則需要 TABLE_ENCRYPTION_ADMIN 權限。請參閱定義結構描述和一般表空間的預設加密。
除非在 CREATE TABLESPACE 陳述式中明確指定 ENCRYPTION 子句,否則 default_table_encryption 變數會決定新建立的一般表空間的加密設定。
mysql> CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' ENCRYPTION = 'Y' Engine=InnoDB;若要變更現有一般表空間的加密,必須指定 ENCRYPTION 子句。
mysql> ALTER TABLESPACE ts1 ENCRYPTION = 'Y';如果啟用 table_encryption_privilege_check,則指定 ENCRYPTION 子句的設定如果與 default_table_encryption 設定不同,則需要 TABLE_ENCRYPTION_ADMIN 權限。請參閱定義結構描述和一般表空間的預設加密。
在 MySQL 9.0 中,InnoDB 會自動加密屬於加密表空間的雙寫檔案頁面。不需要採取任何動作。雙寫檔案頁面會使用關聯表空間的加密金鑰進行加密。寫入至表空間資料檔案的相同加密頁面也會寫入至雙寫檔案。屬於未加密表空間的雙寫檔案頁面保持未加密。
在復原期間,加密的雙寫檔案頁面會解除加密並檢查是否有損毀。
mysql 系統表空間包含 mysql 系統資料庫和 MySQL 資料字典資料表。它預設為未加密。若要啟用 mysql 系統表空間的加密,請在 ALTER TABLESPACE 陳述式中指定表空間名稱和 ENCRYPTION 選項。
mysql> ALTER TABLESPACE mysql ENCRYPTION = 'Y';若要停用 mysql 系統表空間的加密,請使用 ALTER TABLESPACE 陳述式設定 ENCRYPTION = 'N'。
mysql> ALTER TABLESPACE mysql ENCRYPTION = 'N';為 mysql 系統表空間啟用或停用加密需要執行個體中所有資料表的 CREATE TABLESPACE 權限 (CREATE TABLESPACE on *.*))。
使用 innodb_redo_log_encrypt 組態選項啟用重做記錄資料加密。預設會停用重做記錄加密。
如同表空間資料,當重做記錄資料寫入磁碟時,會發生重做記錄資料加密;當從磁碟讀取重做記錄資料時,會發生解密。一旦將重做記錄資料讀入記憶體,其格式會是未加密的。重做記錄資料會使用表空間加密金鑰進行加密和解密。
當啟用 innodb_redo_log_encrypt 時,磁碟上存在的未加密重做記錄頁面會保持未加密,而新的重做記錄頁面會以加密格式寫入磁碟。同樣地,當停用 innodb_redo_log_encrypt 時,磁碟上存在的加密重做記錄頁面會保持加密,而新的重做記錄頁面會以未加密格式寫入磁碟。
重做記錄加密中繼資料 (包括表空間加密金鑰) 會儲存在具有最新檢查點 LSN 的重做記錄檔案標頭中。如果移除具有加密中繼資料的重做記錄檔案,則會停用重做記錄加密。
一旦啟用重做記錄加密,如果沒有金鑰環元件或外掛程式或加密金鑰,則無法正常重新啟動,因為 InnoDB 在啟動期間必須能夠掃描重做頁面,如果重做記錄頁面已加密,則無法執行此操作。如果沒有金鑰環元件或外掛程式或加密金鑰,則只能強制在沒有重做記錄的情況下啟動 (SRV_FORCE_NO_LOG_REDO)。請參閱第 17.20.3 節「強制 InnoDB 復原」。
使用 innodb_undo_log_encrypt 組態選項啟用復原記錄資料加密。復原記錄加密會套用至位於復原表空間中的復原記錄。請參閱第 17.6.3.4 節「復原表空間」。預設會停用復原記錄資料加密。
如同表空間資料,當復原記錄資料寫入磁碟時,會發生復原記錄資料加密;當從磁碟讀取復原記錄資料時,會發生解密。一旦將復原記錄資料讀入記憶體,其格式會是未加密的。復原記錄資料會使用表空間加密金鑰進行加密和解密。
當啟用 innodb_undo_log_encrypt 時,磁碟上未加密的回溯日誌頁面將保持未加密狀態,而新的回溯日誌頁面將以加密形式寫入磁碟。同樣地,當停用 innodb_undo_log_encrypt 時,磁碟上已加密的回溯日誌頁面將保持加密狀態,而新的回溯日誌頁面將以未加密形式寫入磁碟。
回溯日誌加密中繼資料,包括表空間加密金鑰,都儲存在回溯日誌檔案的標頭中。
當回溯日誌加密停用時,伺服器會繼續需要用於加密回溯日誌資料的金鑰環元件或外掛程式,直到包含加密回溯日誌資料的回溯表空間被截斷為止。(只有在回溯表空間被截斷時,才會從回溯表空間中移除加密標頭。)有關截斷回溯表空間的資訊,請參閱截斷回溯表空間。
主加密金鑰應定期輪換,並且在懷疑金鑰已洩漏時進行輪換。
主金鑰輪換是一個原子級的實例層級操作。每次輪換主加密金鑰時,MySQL 實例中的所有表空間金鑰都會被重新加密並儲存回各自的表空間標頭中。作為原子操作,一旦啟動輪換操作,所有表空間金鑰的重新加密必須成功。如果主金鑰輪換因伺服器故障而中斷,InnoDB 會在伺服器重新啟動時向前滾動操作。如需更多資訊,請參閱加密與復原。
輪換主加密金鑰只會變更主加密金鑰並重新加密表空間金鑰。它不會解密或重新加密相關的表空間資料。
輪換主加密金鑰需要 ENCRYPTION_KEY_ADMIN 權限(或已棄用的 SUPER 權限)。
要輪換主加密金鑰,請執行
mysql> ALTER INSTANCE ROTATE INNODB MASTER KEY;
ALTER INSTANCE ROTATE INNODB MASTER KEY 支援並行的 DML。但是,它不能與表空間加密操作並行執行,並且會取得鎖定以防止並行執行可能發生的衝突。如果 ALTER INSTANCE ROTATE INNODB MASTER KEY 操作正在執行,則必須在表空間加密操作可以繼續之前完成,反之亦然。
如果在加密操作期間發生伺服器故障,則當伺服器重新啟動時,該操作會向前滾動。對於一般表空間,加密操作會從上次處理的頁面在背景執行緒中恢復。
如果在主金鑰輪換期間發生伺服器故障,InnoDB 會在伺服器重新啟動時繼續該操作。
金鑰環元件或外掛程式必須在儲存引擎初始化之前載入,以便在 InnoDB 初始化和復原活動存取表空間資料之前,可以從表空間標頭中檢索解密表空間資料頁面所需的資訊。(請參閱加密先決條件。)
當 InnoDB 初始化和復原開始時,主金鑰輪換操作會恢復。由於伺服器故障,某些表空間金鑰可能已經使用新的主加密金鑰加密。InnoDB 會從每個表空間標頭讀取加密資料,如果資料指出表空間金鑰是使用舊的主加密金鑰加密的,則 InnoDB 會從金鑰環中檢索舊金鑰並使用它來解密表空間金鑰。InnoDB 然後使用新的主加密金鑰重新加密表空間金鑰,並將重新加密的表空間金鑰儲存回表空間標頭。
表空間匯出僅支援每個表單獨檔案的表空間。
當匯出加密表空間時,InnoDB 會產生一個 傳輸金鑰,用於加密表空間金鑰。加密的表空間金鑰和傳輸金鑰儲存在 檔案中。此檔案與加密的表空間檔案一起是執行匯入操作所必需的。匯入時,tablespace_name.cfpInnoDB 會使用傳輸金鑰解密 檔案中的表空間金鑰。有關相關資訊,請參閱第 17.6.1.3 節,「匯入 InnoDB 表」。tablespace_name.cfp
ALTER INSTANCE ROTATE INNODB MASTER KEY陳述式僅在來源和複本執行支援表空間加密的 MySQL 版本之複寫環境中支援。成功的
ALTER INSTANCE ROTATE INNODB MASTER KEY陳述式會寫入二進制日誌,以便在複本上進行複寫。如果
ALTER INSTANCE ROTATE INNODB MASTER KEY陳述式失敗,則不會記錄到二進制日誌中,也不會在複本上複寫。如果金鑰環元件或外掛程式安裝在來源上,但未安裝在複本上,則
ALTER INSTANCE ROTATE INNODB MASTER KEY操作的複寫會失敗。
資訊結構描述 INNODB_TABLESPACES 表包含一個 ENCRYPTION 欄,可用於識別加密表空間。
mysql> SELECT SPACE, NAME, SPACE_TYPE, ENCRYPTION FROM INFORMATION_SCHEMA.INNODB_TABLESPACES
WHERE ENCRYPTION='Y'\G
*************************** 1. row ***************************
SPACE: 4294967294
NAME: mysql
SPACE_TYPE: General
ENCRYPTION: Y
*************************** 2. row ***************************
SPACE: 2
NAME: test/t1
SPACE_TYPE: Single
ENCRYPTION: Y
*************************** 3. row ***************************
SPACE: 3
NAME: ts1
SPACE_TYPE: General
ENCRYPTION: Y當在 CREATE TABLE 或 ALTER TABLE 陳述式中指定 ENCRYPTION 選項時,它會記錄在 INFORMATION_SCHEMA.TABLES 的 CREATE_OPTIONS 欄中。可以查詢此欄以識別駐留在每個表單獨檔案的加密表空間中的表。
mysql> SELECT TABLE_SCHEMA, TABLE_NAME, CREATE_OPTIONS FROM INFORMATION_SCHEMA.TABLES
WHERE CREATE_OPTIONS LIKE '%ENCRYPTION%';
+--------------+------------+----------------+
| TABLE_SCHEMA | TABLE_NAME | CREATE_OPTIONS |
+--------------+------------+----------------+
| test | t1 | ENCRYPTION="Y" |
+--------------+------------+----------------+查詢資訊結構描述 INNODB_TABLESPACES 表以檢索與特定結構描述和表關聯的表空間資訊。
mysql> SELECT SPACE, NAME, SPACE_TYPE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE NAME='test/t1';
+-------+---------+------------+
| SPACE | NAME | SPACE_TYPE |
+-------+---------+------------+
| 3 | test/t1 | Single |
+-------+---------+------------+您可以透過查詢資訊結構描述 SCHEMATA 表來識別已啟用加密的結構描述。
mysql> SELECT SCHEMA_NAME, DEFAULT_ENCRYPTION FROM INFORMATION_SCHEMA.SCHEMATA
WHERE DEFAULT_ENCRYPTION='YES';
+-------------+--------------------+
| SCHEMA_NAME | DEFAULT_ENCRYPTION |
+-------------+--------------------+
| test | YES |
+-------------+--------------------+
SHOW CREATE SCHEMA 也會顯示 DEFAULT ENCRYPTION 子句。
您可以使用 Performance Schema 來監控一般表空間和 mysql 系統表空間的加密進度。
stage/innodb/alter tablespace (encryption) 階段事件工具報告一般表空間加密操作的 WORK_ESTIMATED 和 WORK_COMPLETED 資訊。
以下範例示範如何啟用 stage/innodb/alter tablespace (encryption) 階段事件工具和相關的取用者表,以監控一般表空間或 mysql 系統表空間的加密進度。有關 Performance Schema 階段事件工具和相關取用者的資訊,請參閱第 29.12.5 節,「Performance Schema 階段事件表」。
啟用
stage/innodb/alter tablespace (encryption)工具mysql> USE performance_schema; mysql> UPDATE setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE 'stage/innodb/alter tablespace (encryption)';啟用階段事件取用者表,其中包括
events_stages_current、events_stages_history和events_stages_history_long。mysql> UPDATE setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE '%stages%';執行表空間加密操作。在此範例中,會加密名為
ts1的一般表空間。mysql> ALTER TABLESPACE ts1 ENCRYPTION = 'Y';透過查詢 Performance Schema
events_stages_current表來檢查加密操作的進度。WORK_ESTIMATED報告表空間中的總頁數。WORK_COMPLETED報告處理的頁數。mysql> SELECT EVENT_NAME, WORK_ESTIMATED, WORK_COMPLETED FROM events_stages_current; +--------------------------------------------+----------------+----------------+ | EVENT_NAME | WORK_COMPLETED | WORK_ESTIMATED | +--------------------------------------------+----------------+----------------+ | stage/innodb/alter tablespace (encryption) | 1056 | 1407 | +--------------------------------------------+----------------+----------------+如果加密操作已完成,則
events_stages_current表會傳回空集合。在這種情況下,您可以檢查events_stages_history表,以檢視已完成操作的事件資料。例如mysql> SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED FROM events_stages_history; +--------------------------------------------+----------------+----------------+ | EVENT_NAME | WORK_COMPLETED | WORK_ESTIMATED | +--------------------------------------------+----------------+----------------+ | stage/innodb/alter tablespace (encryption) | 1407 | 1407 | +--------------------------------------------+----------------+----------------+
使用
ENCRYPTION選項修改現有每個表單獨檔案的表空間時,請適當規劃。駐留在每個表單獨檔案的表空間中的表是使用COPY演算法重建的。當修改一般表空間或mysql系統表空間的ENCRYPTION屬性時,會使用INPLACE演算法。INPLACE演算法允許在駐留在一般表空間中的表上進行並行的 DML。並行的 DDL 會被封鎖。當加密一般表空間或
mysql系統表空間時,駐留在表空間中的所有表都會被加密。同樣地,在加密表空間中建立的表也會被加密。如果伺服器在正常操作期間結束或停止,建議使用先前設定的相同加密設定重新啟動伺服器。
第一個主加密金鑰是在加密第一個新的或現有表空間時產生的。
主金鑰輪換會重新加密表空間金鑰,但不會變更表空間金鑰本身。若要變更表空間金鑰,您必須停用並重新啟用加密。對於每個表單獨檔案的表空間,重新加密表空間是一個
ALGORITHM=COPY操作,它會重建表。對於一般表空間和mysql系統表空間,它是一個ALGORITHM=INPLACE操作,不需要重建駐留在表空間中的表。如果使用
COMPRESSION和ENCRYPTION選項建立表,則會在加密表空間資料之前執行壓縮。解除安裝
component_keyring_file或component_keyring_encrypted_file元件不會移除現有的金鑰環資料檔案。建議您不要將金鑰環資料檔案放置在與表空間資料檔案相同的目錄下。
當新增
FULLTEXT索引時,隱式建立的InnoDBFULLTEXT索引表支援加密。相關資訊,請參閱InnoDB 全文索引表。
僅支援進階加密標準 (AES) 加密演算法。
InnoDB表空間加密針對表空間金鑰加密使用電子密碼本 (ECB) 區塊加密模式,針對資料加密使用密碼區塊鏈結 (CBC) 區塊加密模式。CBC 區塊加密模式不使用填充。相反地,InnoDB確保要加密的文字是區塊大小的倍數。僅支援單表檔案表空間、一般表空間,以及
mysql系統表空間的加密。其他表空間類型 (包含InnoDB系統表空間) 不支援加密。您無法將表格從已加密的表空間移動或複製到未加密的表空間。但是,允許將表格從未加密的表空間移動到已加密的表空間。例如,您可以將表格從未加密的單表檔案或一般表空間移動或複製到已加密的一般表空間。
預設情況下,表空間加密僅適用於表空間中的資料。可以透過啟用
innodb_redo_log_encrypt和innodb_undo_log_encrypt來加密重做日誌和復原日誌資料。請參閱重做日誌加密和復原日誌加密。如需二進位日誌檔案和中繼日誌檔案加密的相關資訊,請參閱章節 19.3.2,「加密二進位日誌檔案和中繼日誌檔案」。不允許變更位於或先前位於已加密表空間中的表格的儲存引擎。