文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  可插拔驗證

8.2.17 可插拔驗證

當用戶端連線到 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 提供了以下身分驗證外掛程式:

注意

如需有關目前使用可插拔身分驗證的限制 (包括哪些連接器支援哪些外掛程式) 的資訊,請參閱可插拔身分驗證的限制

第三方連接器開發人員應閱讀該章節,以判斷連接器可以在多大程度上利用可插拔身分驗證功能,以及採取哪些步驟來變得更加相容。

如果您有興趣編寫自己的身分驗證外掛程式,請參閱編寫身分驗證外掛程式

身分驗證外掛程式用法

本節提供安裝和使用身分驗證外掛程式的一般指示。如需特定外掛程式的指示,請參閱第 8.4.1 節,「身分驗證外掛程式」下描述該外掛程式的章節。

一般而言,可插拔身分驗證會在伺服器端和用戶端使用一對相應的外掛程式,因此您會像這樣使用指定的驗證方法:

  • 如有必要,請安裝包含適當外掛程式的外掛程式庫。在伺服器主機上,安裝包含伺服器端外掛程式的程式庫,以便伺服器可以使用它來驗證用戶端連線。同樣地,在每個用戶端主機上,安裝包含用戶端程式使用的用戶端外掛程式的程式庫。內建的身分驗證外掛程式無需安裝。

  • 對於您建立的每個 MySQL 帳戶,請指定要用於驗證的適當伺服器端外掛程式。如果帳戶要使用預設的身分驗證外掛程式,則帳戶建立陳述式無需明確指定外掛程式。伺服器會指派預設的身分驗證外掛程式,其決定方式如預設身分驗證外掛程式中所述。

  • 當用戶端連線時,伺服器端外掛程式會告知用戶端程式要使用哪個用戶端外掛程式進行驗證。

如果帳戶使用伺服器和用戶端程式的預設驗證方法,則伺服器無需告知用戶端要使用哪個用戶端外掛程式,並且可以避免用戶端/伺服器協商中的來回行程。

對於標準 MySQL 用戶端,例如mysqlmysqladmin,可以在命令列上指定 --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 系統變數所指定。

  • FEDERATED 資料表: FEDERATED 資料表只能透過遠端伺服器上使用原生驗證的帳戶來存取遠端資料表。

可插拔驗證和第三方連接器

第三方連接器開發人員可以使用下列準則來判斷連接器是否已準備好利用可插拔驗證功能,以及為了更符合規範應採取哪些步驟

  • 未進行任何變更的現有連接器會使用原生驗證,且使用該連接器的用戶端只能透過使用原生驗證的帳戶連線到伺服器。 但是,您應該針對最新版本的伺服器測試連接器,以驗證此類連線是否仍能正常運作。

    例外情況:如果連接器是動態(而不是靜態)連結到 libmysqlclient,並且它會載入已安裝的目前版本 libmysqlclient,則連接器可能無需任何變更即可使用可插拔驗證。

  • 為了利用可插拔驗證功能,基於 libmysqlclient 的連接器應重新連結到目前版本的 libmysqlclient。這樣做可以使連接器支援透過需要目前內建於 libmysqlclient 的用戶端外掛程式(例如,PAM 驗證所需的明文外掛程式和 Windows 原生驗證所需的 Windows 外掛程式)的帳戶進行連線。連結到目前的 libmysqlclient 也可以使連接器存取安裝在預設 MySQL 外掛程式目錄(通常是本機伺服器的 plugin_dir 系統變數的預設值所指定的目錄)中的用戶端外掛程式。

    如果連接器是動態連結到 libmysqlclient,則必須確保在用戶端主機上安裝了較新版本的 libmysqlclient,並且連接器在執行時載入它。

  • 連接器支援特定驗證方法的另一種方式是在用戶端/伺服器協定中直接實作。Connector/NET 使用這種方法來提供 Windows 原生驗證的支援。

  • 如果連接器應能夠從與預設外掛程式目錄不同的目錄載入用戶端外掛程式,則必須實作一些方式,供用戶端使用者指定目錄。可能的選項包括命令列選項或環境變數,連接器可以從這些選項或環境變數取得目錄名稱。標準 MySQL 用戶端程式(例如 mysqlmysqladmin)會實作 --plugin-dir 選項。另請參閱C API 用戶端外掛程式介面

  • 如同本節前面所述,連接器的 Proxy 使用者支援取決於其支援的驗證方法是否允許 Proxy 使用者。