當用戶端連線到 MySQL 伺服器時,伺服器會使用用戶端提供的使用者名稱和用戶端主機,從 mysql.user
系統表格中選取適當的帳戶列。然後,伺服器會驗證用戶端,並從帳戶列判斷哪個身份驗證外掛程式適用於用戶端
如果伺服器找不到外掛程式,則會發生錯誤,並且連線嘗試會被拒絕。
否則,伺服器會調用該外掛程式以驗證使用者,並且外掛程式會向伺服器傳回狀態,指出使用者是否提供了正確的密碼並獲准連線。
可插拔身份驗證啟用以下重要功能
身份驗證方法的選擇。 可插拔身份驗證使 DBA 能夠輕鬆選擇和變更個別 MySQL 帳戶使用的身份驗證方法。
外部身份驗證。 可插拔身份驗證使客戶端可以使用適用於將認證儲存在
mysql.user
系統表格之外的其他地方的身份驗證方法之認證連線到 MySQL 伺服器。例如,可以建立外掛程式以使用外部身份驗證方法,例如 PAM、Windows 登入 ID、LDAP 或 Kerberos。代理使用者:如果允許某個使用者連線,驗證外掛程式可以向伺服器返回與連線使用者名稱不同的使用者名稱,以表示連線使用者是另一個使用者(被代理的使用者)的代理人。在連線持續期間,為了存取控制,該代理使用者會被視為具有被代理使用者的權限。實際上,一個使用者會冒充另一個使用者。如需更多資訊,請參閱第 8.2.19 節「代理使用者」。
如果您使用 --skip-grant-tables
選項啟動伺服器,即使已載入,也不會使用驗證外掛程式,因為伺服器不執行任何用戶端驗證,並允許任何用戶端連線。由於這是不安全的,如果伺服器使用 --skip-grant-tables
選項啟動,它也會啟用 skip_networking
來停用遠端連線。
MySQL 8.4 提供以下驗證外掛程式
一種執行原生驗證的外掛程式;也就是說,根據 MySQL 中導入可插入式驗證之前使用的密碼雜湊方法進行驗證。
mysql_native_password
外掛程式使用此原生密碼雜湊方法實作驗證。請參閱第 8.4.1.1 節「原生可插入式驗證」。注意mysql_native_password
驗證外掛程式已過時,並可能在未來版本的 MySQL 中移除。使用 SHA-256 密碼雜湊執行驗證的外掛程式。這比原生驗證提供的加密更強。請參閱第 8.4.1.2 節「快取 SHA-2 可插入式驗證」和第 8.4.1.3 節「SHA-256 可插入式驗證」。
一種用戶端外掛程式,它將密碼發送到伺服器,而不進行雜湊或加密。此外掛程式與需要存取用戶端使用者所提供密碼的伺服器端外掛程式一起使用。請參閱第 8.4.1.4 節「用戶端純文字可插入式驗證」。
一種使用 PAM (可插入式驗證模組) 執行外部驗證的外掛程式,使 MySQL Server 能夠使用 PAM 來驗證 MySQL 使用者。此外掛程式也支援代理使用者。請參閱第 8.4.1.5 節「PAM 可插入式驗證」。
一種在 Windows 上執行外部驗證的外掛程式,使 MySQL Server 能夠使用原生 Windows 服務來驗證用戶端連線。已登入 Windows 的使用者可以根據其環境中的資訊,從 MySQL 用戶端程式連線到伺服器,而無需指定額外的密碼。此外掛程式也支援代理使用者。請參閱第 8.4.1.6 節「Windows 可插入式驗證」。
使用 LDAP (輕量型目錄存取協定) 執行驗證的外掛程式,透過存取 X.500 等目錄服務來驗證 MySQL 使用者。此外掛程式也支援代理使用者。請參閱第 8.4.1.7 節「LDAP 可插入式驗證」。
一種使用 Kerberos 執行驗證的外掛程式,用於驗證對應於 Kerberos 主體的 MySQL 使用者。請參閱第 8.4.1.8 節「Kerberos 可插入式驗證」。
一種防止所有用戶端連線到使用此外掛程式的任何帳戶的外掛程式。此外掛程式的使用案例包括永遠不應允許直接登入但只能透過代理帳戶存取的代理帳戶,以及必須能夠執行具有提升權限的儲存程式和檢視,而不會將這些權限暴露給一般使用者的帳戶。請參閱第 8.4.1.9 節「無登入可插入式驗證」。
一種驗證從本機主機透過 Unix Socket 檔案連線的用戶端的外掛程式。請參閱第 8.4.1.10 節「Socket 對等認證可插入式驗證」。
一種使用 FIDO/FIDO2 裝置,以 WebAuthn 格式驗證使用者登入 MySQL Server 的外掛程式。請參閱第 8.4.1.11 節「WebAuthn 可插入式驗證」。
一種測試外掛程式,用於檢查帳戶憑證,並將成功或失敗記錄到伺服器錯誤日誌。此外掛程式旨在用於測試和開發目的,並作為如何撰寫驗證外掛程式的範例。請參閱第 8.4.1.12 節「測試可插入式驗證」。
如需有關目前使用可插入式驗證的限制的資訊,包括哪些連接器支援哪些外掛程式,請參閱可插入式驗證的限制。
第三方連接器開發人員應閱讀該章節,以判斷連接器可以在多大程度上利用可插入式驗證功能,以及採取哪些步驟以變得更相容。
如果您有興趣撰寫自己的驗證外掛程式,請參閱撰寫驗證外掛程式。
本節提供安裝和使用驗證外掛程式的一般說明。如需特定於給定外掛程式的說明,請參閱 第 8.4.1 節「驗證外掛程式」中描述該外掛程式的章節。
一般來說,可插入式驗證在伺服器端和用戶端使用一對相應的外掛程式,因此您可以這樣使用給定的驗證方法
如有必要,請安裝包含適當外掛程式的外掛程式程式庫。在伺服器主機上,安裝包含伺服器端外掛程式的程式庫,以便伺服器可以使用它來驗證用戶端連線。同樣地,在每個用戶端主機上,安裝包含用戶端程式所使用之用戶端外掛程式的程式庫。內建的驗證外掛程式無需安裝。
對於您建立的每個 MySQL 帳戶,請指定要用於驗證的適當伺服器端外掛程式。如果帳戶要使用預設驗證外掛程式,則帳戶建立陳述式無需明確指定外掛程式。伺服器會指派預設驗證外掛程式,如預設驗證外掛程式中所述判斷。
當用戶端連線時,伺服器端外掛程式會告知用戶端程式要使用哪個用戶端外掛程式進行驗證。
如果帳戶使用的驗證方法是伺服器和用戶端程式的預設方法,則伺服器無需將要使用的用戶端外掛程式傳達給用戶端,並且可以避免在用戶端/伺服器交涉中的往返。
對於標準 MySQL 用戶端(例如 mysql 和 mysqladmin),可以在命令列上指定 --default-auth=
選項,作為程式預期使用哪個用戶端外掛程式的提示,但如果與使用者帳戶關聯的伺服器端外掛程式需要不同的用戶端外掛程式,則伺服器會覆寫此選項。plugin_name
如果用戶端程式找不到用戶端外掛程式程式庫檔案,請指定 --plugin-dir=
選項,以指示外掛程式程式庫目錄位置。dir_name
可插入式驗證使 MySQL 帳戶的驗證方法選擇具有彈性,但在某些情況下,由於用戶端和伺服器之間的驗證外掛程式不相容,因此無法建立用戶端連線。
在給定伺服器上成功連線到給定帳戶的一般相容性原則是,用戶端和伺服器都必須支援該帳戶所需的驗證方法。由於驗證方法由驗證外掛程式實作,因此用戶端和伺服器都必須支援該帳戶所需的驗證外掛程式。
驗證外掛程式不相容可能會以各種方式發生。範例
使用 5.7.22 或更低版本的 MySQL 5.7 用戶端連線到使用
caching_sha2_password
驗證的 MySQL 8.4 伺服器帳戶。這會失敗,因為 5.7 用戶端無法識別此外掛程式。(此問題在 MySQL 5.7 中已於 5.7.23 開始解決,當時caching_sha2_password
用戶端支援已新增至 MySQL 用戶端程式庫和用戶端程式。)使用 MySQL 5.7 用戶端連線到使用
mysql_old_password
驗證的 5.7 之前的伺服器帳戶。這會因多種原因而失敗。首先,此類連線需要--secure-auth=0
,這已不再是支援的選項。即使支援,5.7 用戶端也無法識別此外掛程式,因為它已在 MySQL 5.7 中移除。使用來自 Community 發行版本的 MySQL 5.7 用戶端連線到使用其中一個僅限 Enterprise 的 LDAP 驗證外掛程式驗證的 MySQL 5.7 Enterprise 伺服器帳戶。這會失敗,因為 Community 用戶端無法存取 Enterprise 外掛程式。
一般來說,當在同一個 MySQL 發行版本中的用戶端和伺服器之間建立連線時,不會出現這些相容性問題。當在不同 MySQL 系列的用戶端和伺服器之間建立連線時,可能會出現問題。當 MySQL 引入新的驗證外掛程式或移除舊的驗證外掛程式時,這些問題是開發過程中固有的。為了盡量減少不相容的可能性,請定期及時升級伺服器、用戶端和連接器。
存在各種 MySQL 用戶端/伺服器通訊協定的實作。libmysqlclient
C API 用戶端程式庫是一種實作。某些 MySQL 連接器(通常不是以 C 撰寫的)提供自己的實作。但是,並非所有通訊協定實作都以相同的方式處理外掛程式驗證。本節描述通訊協定實作者應考量的一個驗證問題。
在用戶端/伺服器通訊協定中,伺服器會告知連線的用戶端,它認為哪個驗證外掛程式是預設的。如果用戶端使用的通訊協定實作嘗試載入預設外掛程式,而該外掛程式在用戶端不存在,則載入作業會失敗。如果預設外掛程式不是用戶端嘗試連線的帳戶實際需要的外掛程式,這是一個不必要的失敗。
如果用戶端/伺服器通訊協定實作沒有自己的預設驗證外掛程式概念,並且總是嘗試載入伺服器指定的預設外掛程式,則如果該外掛程式不可用,它會失敗並出現錯誤。
為了避免這個問題,用戶端使用的協定實作應該有自己的預設外掛程式,並且應該將其作為第一選擇(或者,在無法載入伺服器指定的預設外掛程式時,退回使用此預設外掛程式)。範例:
在 MySQL 5.7 中,
libmysqlclient
會將mysql_native_password
或透過mysql_options()
的MYSQL_DEFAULT_AUTH
選項指定的外掛程式作為預設選擇。當 5.7 用戶端嘗試連線到 8.4 伺服器時,伺服器會指定
caching_sha2_password
作為其預設驗證外掛程式,但用戶端仍然會依照mysql_native_password
或透過MYSQL_DEFAULT_AUTH
指定的內容傳送認證詳細資訊。用戶端載入伺服器指定的外掛程式的唯一時機是變更外掛程式請求,但在這種情況下,它可以是任何外掛程式,具體取決於使用者帳戶。在這種情況下,用戶端必須嘗試載入外掛程式,如果該外掛程式不可用,則錯誤是不可選的。
本節的第一部分描述了在第 8.2.17 節 「可插拔驗證」中所述的可插拔驗證框架的適用性的一般限制。第二部分描述了第三方連接器開發人員如何確定連接器利用可插拔驗證功能的程度,以及為了更符合規範而應採取的步驟。
這裡使用的術語「原生驗證」是指針對儲存在 mysql.user
系統資料表中的密碼進行驗證。這與在實作可插拔驗證之前,較舊的 MySQL 伺服器提供的驗證方法相同。「Windows 原生驗證」是指使用已經登入 Windows 的使用者憑證進行驗證,這是由 Windows 原生驗證外掛程式實作的(簡稱「Windows 外掛程式」)。
可插拔驗證的一般限制
Connector/C++:使用此連接器的用戶端只能透過使用原生驗證的帳戶連線到伺服器。
例外情況:如果連接器是透過動態連結
libmysqlclient
(而不是靜態連結) 建置的,並且在安裝了當前版本libmysqlclient
時會載入該版本,或者如果連接器從原始碼重新編譯以連結到當前libmysqlclient
,則該連接器支援可插拔驗證。有關編寫連接器以處理來自伺服器的關於預設伺服器端驗證外掛程式資訊的詳細資訊,請參閱驗證外掛程式連接器編寫注意事項。
Connector/NET:使用 Connector/NET 的用戶端可以透過使用原生驗證或 Windows 原生驗證的帳戶連線到伺服器。
Connector/PHP:使用此連接器的用戶端只能透過使用 PHP 的 MySQL 原生驅動程式 (
mysqlnd
) 編譯時使用原生驗證的帳戶連線到伺服器。Windows 原生驗證:透過使用 Windows 外掛程式的帳戶連線需要設定 Windows 網域。如果沒有設定,則會使用 NTLM 驗證,而且只有本機連線才有可能;也就是說,用戶端和伺服器必須在同一台電腦上執行。
Proxy 使用者:Proxy 使用者支援可在用戶端透過使用實作 Proxy 使用者功能的外掛程式進行驗證的帳戶連線時使用(也就是說,可以傳回與連線使用者不同的使用者名稱的外掛程式)。例如,PAM 和 Windows 外掛程式支援 Proxy 使用者。
mysql_native_password
(已棄用)和sha256_password
(已棄用)驗證外掛程式預設不支援 Proxy 使用者,但可以設定為支援;請參閱Proxy 使用者對應的伺服器支援。複製:複本不僅可以使用原生驗證的複製使用者帳戶,還可以透過使用非原生驗證的複製使用者帳戶連線,前提是所需的用戶端外掛程式可用。如果外掛程式建置到
libmysqlclient
中,則預設情況下可以使用。否則,必須將外掛程式安裝在複本端,位於複本的plugin_dir
系統變數命名的目錄中。
可插拔驗證和第三方連接器
第三方連接器開發人員可以使用以下準則來確定連接器是否準備好利用可插拔驗證功能,以及為了更符合規範而應採取的步驟
現有未經任何變更的連接器會使用原生驗證,並且使用該連接器的用戶端只能透過使用原生驗證的帳戶連線到伺服器。但是,您應該針對最新版本的伺服器測試該連接器,以驗證此類連線是否仍然可以正常運作。
例外情況:如果連接器是動態連結
libmysqlclient
(而不是靜態連結),並且在安裝了當前版本libmysqlclient
時會載入該版本,則該連接器可能在未經任何變更的情況下使用可插拔驗證。為了利用可插拔驗證功能,基於
libmysqlclient
的連接器應重新連結到當前版本的libmysqlclient
。這會使連接器能夠支援透過需要用戶端外掛程式的帳戶進行連線,這些外掛程式現在已建置到libmysqlclient
中(例如,PAM 驗證所需的明文外掛程式和 Windows 原生驗證所需的 Windows 外掛程式)。使用目前的libmysqlclient
連結還可以讓連接器存取安裝在預設 MySQL 外掛程式目錄中的用戶端外掛程式(通常是當地伺服器的plugin_dir
系統變數的預設值命名的目錄)。如果連接器動態連結到
libmysqlclient
,則必須確保用戶端主機上安裝了較新版本的libmysqlclient
,並且連接器在執行階段載入它。連接器支援給定驗證方法的另一種方式是在用戶端/伺服器協定中直接實作它。Connector/NET 使用此方法來提供對 Windows 原生驗證的支援。
如果連接器應該能夠從與預設外掛程式目錄不同的目錄載入用戶端外掛程式,則必須實作某種方法讓用戶端使用者指定該目錄。可行的選項包括命令行選項或環境變數,連接器可以從其中取得目錄名稱。標準 MySQL 用戶端程式(例如 mysql 和 mysqladmin)實作了
--plugin-dir
選項。另請參閱 C API 用戶端外掛程式介面。如本節先前所述,連接器的 Proxy 使用者支援取決於其支援的驗證方法是否允許 Proxy 使用者。