當用戶端連線到 MySQL 伺服器時,伺服器會使用用戶端提供的使用者名稱和用戶端主機,從 mysql.user
系統表格中選取適當的帳戶列。然後,伺服器會驗證用戶端,並從帳戶列判斷哪個驗證外掛程式適用於該用戶端
如果伺服器找不到外掛程式,就會發生錯誤,並且拒絕連線嘗試。
否則,伺服器會叫用該外掛程式來驗證使用者,而外掛程式會將狀態傳回伺服器,指出使用者是否提供了正確的密碼並且允許連線。
可插拔驗證啟用這些重要功能
驗證方法的選擇。 可插拔驗證讓 DBA 可以輕鬆地選擇和變更個別 MySQL 帳戶使用的驗證方法。
外部驗證。 可插拔驗證讓用戶端可以使用適用於驗證方法的憑證來連線到 MySQL 伺服器,這些方法會將憑證儲存在
mysql.user
系統表格以外的地方。例如,可以建立外掛程式來使用外部驗證方法,例如 PAM、Windows 登入 ID、LDAP 或 Kerberos。Proxy 使用者: 如果允許使用者連線,驗證外掛程式可以將與連線使用者名稱不同的使用者名稱傳回伺服器,以指示連線使用者是另一個使用者 (代理使用者) 的 Proxy。在連線持續期間,代理使用者在存取控制方面會被視為具有代理使用者的權限。實際上,一個使用者會模擬另一個使用者。如需詳細資訊,請參閱第 8.2.19 節,「Proxy 使用者」。
如果您使用 --skip-grant-tables
選項啟動伺服器,即使已載入驗證外掛程式,也不會使用這些外掛程式,因為伺服器不會執行任何用戶端驗證,並且允許任何用戶端連線。由於這樣做不安全,如果伺服器使用 --skip-grant-tables
選項啟動,它也會透過啟用 skip_networking
來停用遠端連線。
MySQL 9.0 提供了以下身分驗證外掛程式:
使用 SHA-256 密碼雜湊進行身分驗證的外掛程式。這比原生身分驗證提供的加密更強。請參閱第 8.4.1.1 節,「快取 SHA-2 可插拔身分驗證」和第 8.4.1.2 節,「SHA-256 可插拔身分驗證」。
一個用戶端外掛程式,可將密碼傳送到伺服器,而無需雜湊或加密。此外掛程式與伺服器端外掛程式結合使用,這些外掛程式需要存取用戶端使用者提供的確切密碼。請參閱第 8.4.1.3 節,「用戶端明文可插拔身分驗證」。
一個使用 PAM (可插拔身分驗證模組) 執行外部身分驗證的外掛程式,使 MySQL 伺服器可以使用 PAM 來驗證 MySQL 使用者。此外掛程式也支援代理使用者。請參閱第 8.4.1.4 節,「PAM 可插拔身分驗證」。
一個在 Windows 上執行外部身分驗證的外掛程式,使 MySQL 伺服器可以使用原生 Windows 服務來驗證用戶端連線。已登入 Windows 的使用者可以根據其環境中的資訊從 MySQL 用戶端程式連線到伺服器,而無需指定額外的密碼。此外掛程式也支援代理使用者。請參閱第 8.4.1.5 節,「Windows 可插拔身分驗證」。
使用 LDAP (輕量型目錄存取協定) 執行身分驗證的外掛程式,透過存取 X.500 等目錄服務來驗證 MySQL 使用者。這些外掛程式也支援代理使用者。請參閱第 8.4.1.6 節,「LDAP 可插拔身分驗證」。
一個使用 Kerberos 執行身分驗證的外掛程式,以驗證對應於 Kerberos 主體的 MySQL 使用者。請參閱第 8.4.1.7 節,「Kerberos 可插拔身分驗證」。
一個防止所有用戶端連線到任何使用此外掛程式之帳戶的外掛程式。此外掛程式的使用案例包括永遠不應允許直接登入,但只能透過代理帳戶存取的代理帳戶,以及必須能夠執行具有提升權限的儲存程式和檢視,而不會將這些權限暴露給一般使用者的帳戶。請參閱第 8.4.1.8 節,「無登入可插拔身分驗證」。
一個透過 Unix socket 檔案驗證從本機主機連線之用戶端的外掛程式。請參閱第 8.4.1.9 節,「Socket 對等認證可插拔身分驗證」。
一個使用 FIDO/FIDO2 裝置以 WebAuthn 格式驗證 MySQL 伺服器使用者的外掛程式。請參閱第 8.4.1.10 節,「WebAuthn 可插拔身分驗證」。
一個測試外掛程式,可檢查帳戶憑證並將成功或失敗記錄到伺服器錯誤記錄檔。此外掛程式旨在用於測試和開發目的,並作為如何編寫身分驗證外掛程式的範例。請參閱第 8.4.1.11 節,「測試可插拔身分驗證」。
如需有關目前使用可插拔身分驗證的限制 (包括哪些連接器支援哪些外掛程式) 的資訊,請參閱可插拔身分驗證的限制。
第三方連接器開發人員應閱讀該章節,以判斷連接器可以在多大程度上利用可插拔身分驗證功能,以及採取哪些步驟來變得更加相容。
如果您有興趣編寫自己的身分驗證外掛程式,請參閱編寫身分驗證外掛程式。
本節提供安裝和使用身分驗證外掛程式的一般指示。如需特定外掛程式的指示,請參閱第 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 9.0 伺服器帳戶。這會失敗,因為 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 用戶端嘗試連線到 9.0 伺服器時,伺服器會將
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 使用者。
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 使用者。