當主機系統上提供支援的 OpenSSL 程式庫和 FIPS 物件模組時,MySQL 支援 FIPS 模式。
伺服器端的 FIPS 模式適用於伺服器執行的密碼編譯作業。這包括在伺服器內執行的複寫(來源/複本和群組複寫)和 X 外掛程式。FIPS 模式也適用於用戶端嘗試連線至伺服器的情況。
以下章節說明 FIPS 模式以及如何在 MySQL 中利用它
聯邦資訊處理標準 140-2 (FIPS 140-2) 說明一種安全性標準,聯邦(美國政府)機構可能會要求使用此標準,以保護敏感或有價值的資訊。若要被視為可接受此類聯邦用途,密碼編譯模組必須通過 FIPS 140-2 認證。如果旨在保護敏感資料的系統缺少適當的 FIPS 140-2 憑證,則聯邦機構無法購買該系統。
OpenSSL 等產品可以在 FIPS 模式下使用,儘管 OpenSSL 程式庫本身未通過 FIPS 驗證。相反地,OpenSSL 程式庫會與 OpenSSL FIPS 物件模組一起使用,使基於 OpenSSL 的應用程式能夠在 FIPS 模式下運作。
如需有關 FIPS 及其在 OpenSSL 中實作的一般資訊,這些參考資料可能有所幫助
FIPS 模式會對密碼編譯作業施加條件,例如限制可接受的加密演算法或對較長金鑰長度的要求。對於 OpenSSL,確切的 FIPS 行為取決於 OpenSSL 版本。
為了使 MySQL 支援 FIPS 模式,必須滿足以下系統需求
MySQL 必須使用通過 FIPS 認證的 OpenSSL 版本進行編譯。OpenSSL 1.0.2 和 OpenSSL 3.0 已通過認證,但 OpenSSL 1.1.1 並未通過。 近期版本的 MySQL 二進制發行版在某些平台上是使用 OpenSSL 3.0 編譯的,這表示它們未通過 FIPS 認證。這意味著您有以下選項,具體取決於系統和 MySQL 配置:
使用具有 OpenSSL 3.0 和所需 FIPS 物件模組的系統。在這種情況下,如果您使用以 OpenSSL 3.0 編譯的二進制發行版,或者從原始碼使用 OpenSSL 3.0 編譯 MySQL,則可以啟用 MySQL 的 FIPS 模式。
有關升級至 OpenSSL 3.0 的一般資訊,請參閱 OpenSSL 3.0 遷移指南。
使用具有 OpenSSL 1.1.1 或更高版本的系統。在這種情況下,您可以使用二進制套件安裝 MySQL,並且除了其他已支援的 TLS 協定外,還可以使用 TLS v1.3 協定和加密套件。但是,您無法啟用 MySQL 的 FIPS 模式。
使用具有 OpenSSL 1.0.2 和所需 FIPS 物件模組的系統。在這種情況下,如果您使用以 OpenSSL 1.0.2 編譯的二進制發行版,或者從原始碼使用 OpenSSL 1.0.2 編譯 MySQL,則可以啟用 MySQL 的 FIPS 模式。在這種情況下,您無法使用需要 OpenSSL 1.1.1 或 3.0 的 TLS v1.3 協定或加密套件。此外,您應該注意 OpenSSL 1.0.2 已於 2019 年終止支援,而所有嵌入 OpenSSL 1.1.1 的作業平台將於 2024 年終止支援。
在執行階段,OpenSSL 程式庫和 OpenSSL FIPS 物件模組必須以共享 (動態連結) 物件的形式提供。
若要判斷 MySQL 是否在啟用 FIPS 模式的系統上執行,請使用 SQL 陳述式 (例如 SHOW VARIABLES LIKE '%fips%'
或 SELECT @@ssl_fips_mode
) 檢查 ssl_fips_mode
伺服器系統變數的值。如果此變數的值為 1 (ON
) 或 2 (STRICT
),則表示已啟用 OpenSSL 的 FIPS 模式;如果為 0 (OFF
),則表示 FIPS 模式不可用。
一般而言,STRICT
比 ON
施加更多的限制,但 MySQL 本身除了指定 FIPS 模式值給 OpenSSL 之外,沒有其他 FIPS 特定程式碼。ON
或 STRICT
的 FIPS 模式的確切行為取決於 OpenSSL 版本。如需詳細資訊,請參閱 fips_module
手冊頁(請參閱 FIPS 概述)。
伺服器端的 FIPS 模式適用於伺服器執行的加密操作,包括 MySQL 複寫 (包括群組複寫) 和在伺服器內執行的 X Plugin 所執行的加密操作。
FIPS 模式也適用於用戶端嘗試連線至伺服器的情況。啟用後,無論在用戶端或伺服器端啟用,都會限制可選用的受支援加密密碼。然而,啟用 FIPS 模式並不表示必須使用加密連線,或必須加密使用者憑證。例如,如果啟用 FIPS 模式,則需要更強大的加密演算法。特別是,MD5 受到限制,因此嘗試使用 RC4-MD5
等加密密碼建立加密連線將無法運作。但是,FIPS 模式不會阻止建立未加密的連線。(若要執行此操作,您可以對特定使用者帳戶使用 CREATE USER
或 ALTER USER
的 REQUIRE
子句,或設定 require_secure_transport
系統變數以影響所有帳戶。)
如果需要 FIPS 模式,建議使用包含它的作業平台;如果您的作業平台包含 FIPS,您就可以 (也應該) 使用它。如果您的平台未包含 FIPS,您有兩個選項:
移轉到具有 FIPS OpenSSL 支援的平台。
使用
fips_module
手冊頁中的說明,從原始碼建置 OpenSSL 程式庫和 FIPS 物件模組(請參閱 FIPS 概述)。
如果 OpenSSL FIPS 物件模組不可用,則 ssl_fips_mode
和 --ssl-fips-mode
的唯一允許值為 OFF
。嘗試將 FIPS 模式設定為不同的值時會發生錯誤。
如果需要 FIPS 模式,建議使用包含它的作業平台;如果您的作業平台包含 FIPS,您就可以 (也應該) 使用它。如果您的平台未包含 FIPS,您有兩個選項:
移轉到具有 FIPS OpenSSL 支援的平台。
使用
fips_module
手冊頁中的說明,從原始碼建置 OpenSSL 程式庫和 FIPS 物件模組(請參閱 FIPS 概述)。