文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 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 參考手冊  /  ...  /  LDAP 可插拔式身分驗證

8.4.1.6 LDAP 可插拔式身分驗證

注意

LDAP 可插拔式身分驗證是 MySQL 企業版 (商業產品) 中包含的延伸功能。若要深入了解商業產品,請參閱 https://mysql.dev.org.tw/products/

MySQL 企業版支援一種身分驗證方法,讓 MySQL 伺服器能夠使用 LDAP (輕量型目錄存取協定) 來驗證 MySQL 使用者,方法是存取 X.500 等目錄服務。MySQL 會使用 LDAP 來擷取使用者、認證和群組資訊。

LDAP 可插拔式身分驗證提供下列功能

  • 外部身分驗證:LDAP 身分驗證可讓 MySQL 伺服器接受來自在 LDAP 目錄中定義,而不是在 MySQL 授權表外部定義的使用者連線。

  • 代理使用者支援:LDAP 身分驗證可以根據外部使用者所屬的 LDAP 群組,將與用戶端程式傳遞的外部使用者名稱不同的使用者名稱傳回 MySQL。這表示 LDAP 外掛程式可以傳回定義外部 LDAP 驗證使用者應具備之權限的 MySQL 使用者。例如,如果 joe 的 LDAP 群組是 developer,則名為 joe 的 LDAP 使用者可以連線並擁有 MySQL 使用者 developer 的權限。

  • 安全性:使用 TLS,與 LDAP 伺服器的連線可以是安全的。

伺服器與用戶端外掛程式適用於簡單與以 SASL 為基礎的 LDAP 身分驗證。在 Microsoft Windows 上,不支援以 SASL 為基礎的 LDAP 身分驗證伺服器外掛程式,但支援用戶端外掛程式。

下表顯示簡單和以 SASL 為基礎的 LDAP 身分驗證的外掛程式與程式庫檔案名稱。檔案名稱後綴在您的系統上可能會有所不同。這些檔案必須位於 plugin_dir 系統變數所指定的目錄中。

表 8.20 簡單 LDAP 身分驗證的外掛程式與程式庫名稱

外掛程式或檔案 外掛程式或檔案名稱
伺服器端外掛程式名稱 authentication_ldap_simple
用戶端外掛程式名稱 mysql_clear_password
程式庫檔案名稱 authentication_ldap_simple.so

表 8.21 以 SASL 為基礎的 LDAP 身分驗證的外掛程式與程式庫名稱

外掛程式或檔案 外掛程式或檔案名稱
伺服器端外掛程式名稱 authentication_ldap_sasl
用戶端外掛程式名稱 authentication_ldap_sasl_client
程式庫檔案名稱 authentication_ldap_sasl.so, authentication_ldap_sasl_client.so

程式庫檔案僅包含 authentication_ldap_XXX 驗證外掛程式。用戶端 mysql_clear_password 外掛程式內建於 libmysqlclient 用戶端程式庫中。

每個伺服器端 LDAP 外掛程式都與特定的用戶端外掛程式搭配使用

  • 伺服器端 authentication_ldap_simple 外掛程式執行簡單的 LDAP 驗證。對於使用此外掛程式的帳戶連線,用戶端程式會使用用戶端 mysql_clear_password 外掛程式,該外掛程式會以明文形式將密碼傳送至伺服器。不使用密碼雜湊或加密,因此建議在 MySQL 用戶端和伺服器之間建立安全連線,以防止密碼洩漏。

  • 伺服器端 authentication_ldap_sasl 外掛程式執行基於 SASL 的 LDAP 驗證。對於使用此外掛程式的帳戶連線,用戶端程式會使用用戶端 authentication_ldap_sasl_client 外掛程式。用戶端和伺服器端 SASL LDAP 外掛程式使用 SASL 訊息在 LDAP 協定中安全地傳輸憑證,以避免在 MySQL 用戶端和伺服器之間傳送明文密碼。

    在 Microsoft Windows 平台上,伺服器外掛程式和用戶端外掛程式都支援基於 SASL 的 LDAP 驗證。

伺服器端 LDAP 驗證外掛程式僅包含在 MySQL Enterprise Edition 中。它們不包含在 MySQL 社群發行版本中。用戶端 SASL LDAP 外掛程式包含在所有發行版本中,包括社群發行版本,並且如先前所述,用戶端 mysql_clear_password 外掛程式內建於 libmysqlclient 用戶端程式庫中,該程式庫也包含在所有發行版本中。這使任何發行版本的用戶端都能連線到載入適當伺服器端外掛程式的伺服器。

以下章節提供特定於 LDAP 可插拔驗證的安裝和使用資訊

有關 MySQL 中可插拔驗證的一般資訊,請參閱 第 8.2.17 節「可插拔驗證」。有關 mysql_clear_password 外掛程式的資訊,請參閱 第 8.4.1.3 節「用戶端明文可插拔驗證」。有關 Proxy 使用者的資訊,請參閱 第 8.2.19 節「Proxy 使用者」

注意

如果您的系統支援 PAM 並允許 LDAP 作為 PAM 驗證方法,則使用 LDAP 進行 MySQL 使用者驗證的另一種方法是使用伺服器端 authentication_pam 外掛程式。請參閱 第 8.4.1.4 節「PAM 可插拔驗證」

LDAP 可插拔驗證的先決條件

若要使用 MySQL 的 LDAP 可插拔驗證,必須滿足這些先決條件

  • LDAP 伺服器必須可用於 LDAP 驗證外掛程式進行通訊。

  • 要由 MySQL 驗證的 LDAP 使用者必須存在於 LDAP 伺服器管理的目錄中。

  • 在使用伺服器端 authentication_ldap_saslauthentication_ldap_simple 外掛程式的系統上,必須提供 LDAP 用戶端程式庫。目前,支援的程式庫是 Windows 原生 LDAP 程式庫,或非 Windows 系統上的 OpenLDAP 程式庫。

  • 若要使用基於 SASL 的 LDAP 驗證

    • 必須將 LDAP 伺服器設定為與 SASL 伺服器通訊。

    • 在使用用戶端 authentication_ldap_sasl_client 外掛程式的系統上,必須提供 SASL 用戶端程式庫。目前,唯一支援的程式庫是 Cyrus SASL 程式庫。

    • 若要使用特定的 SASL 驗證方法,該方法所需的任何其他服務都必須可用。例如,若要使用 GSSAPI/Kerberos,則必須提供 GSSAPI 程式庫和 Kerberos 服務。

MySQL 使用者如何進行 LDAP 驗證

本節概述 MySQL 和 LDAP 如何協同工作以驗證 MySQL 使用者。如需範例,說明如何設定 MySQL 帳戶以使用特定的 LDAP 驗證外掛程式,請參閱使用 LDAP 可插拔驗證。有關 LDAP 外掛程式可用的驗證方法的資訊,請參閱LDAP 驗證方法

用戶端連線到 MySQL 伺服器,並提供 MySQL 用戶端使用者名稱和密碼

  • 對於簡單的 LDAP 驗證,用戶端和伺服器端外掛程式以明文形式傳輸密碼。建議在 MySQL 用戶端和伺服器之間建立安全連線,以防止密碼洩漏。

  • 對於基於 SASL 的 LDAP 驗證,用戶端和伺服器端外掛程式避免在 MySQL 用戶端和伺服器之間傳送明文密碼。例如,外掛程式可能會使用 SASL 訊息在 LDAP 協定中安全地傳輸憑證。對於 GSSAPI 驗證方法,用戶端和伺服器端外掛程式使用 Kerberos 安全地通訊,而無需直接使用 LDAP 訊息。

如果用戶端使用者名稱和主機名稱與任何 MySQL 帳戶都不符,則會拒絕連線。

如果存在相符的 MySQL 帳戶,則會針對 LDAP 進行驗證。LDAP 伺服器會尋找符合該使用者的項目,並根據 LDAP 密碼驗證該項目

  • 如果 MySQL 帳戶命名 LDAP 使用者識別名稱 (DN),則 LDAP 驗證會使用該值和用戶端提供的 LDAP 密碼。(若要將 LDAP 使用者 DN 與 MySQL 帳戶建立關聯,請在建立帳戶的 CREATE USER 陳述式中,包含指定驗證字串的 BY 子句。)

  • 如果 MySQL 帳戶未命名 LDAP 使用者 DN,則 LDAP 驗證會使用用戶端提供的使用者名稱和 LDAP 密碼。在這種情況下,驗證外掛程式會先使用根 DN 和密碼作為認證繫結至 LDAP 伺服器,以根據用戶端使用者名稱尋找使用者 DN,然後根據 LDAP 密碼驗證該使用者 DN。如果根 DN 和密碼設定為不正確的值,或為空(未設定)且 LDAP 伺服器不允許匿名連線,則使用根認證的此繫結會失敗。

如果 LDAP 伺服器找不到相符項目或找到多個相符項目,則驗證會失敗,且會拒絕用戶端連線。

如果 LDAP 伺服器找到單一相符項目,則 LDAP 驗證成功(假設密碼正確),LDAP 伺服器會傳回 LDAP 項目,並且驗證外掛程式會根據該項目決定已驗證使用者的名稱

  • 如果 LDAP 項目具有群組屬性(預設情況下為 cn 屬性),則外掛程式會將其值作為已驗證的使用者名稱傳回。

  • 如果 LDAP 項目沒有群組屬性,則驗證外掛程式會將用戶端使用者名稱作為已驗證的使用者名稱傳回。

MySQL 伺服器會將用戶端使用者名稱與已驗證的使用者名稱進行比較,以判斷是否對用戶端工作階段進行 Proxy

  • 如果名稱相同,則不會發生 Proxy:與用戶端使用者名稱相符的 MySQL 帳戶會用於權限檢查。

  • 如果名稱不同,則會發生 Proxy:MySQL 會尋找與已驗證的使用者名稱相符的帳戶。該帳戶會成為 Proxy 的使用者,用於權限檢查。與用戶端使用者名稱相符的 MySQL 帳戶會被視為外部 Proxy 使用者。

安裝 LDAP 可插拔驗證

本節說明如何安裝伺服器端 LDAP 驗證外掛程式。有關安裝外掛程式的一般資訊,請參閱第 7.6.1 節「安裝和解除安裝外掛程式」

若要讓伺服器可以使用,外掛程式程式庫檔案必須位於 MySQL 外掛程式目錄中(由 plugin_dir 系統變數命名的目錄)。如有必要,請在伺服器啟動時設定 plugin_dir 的值來設定外掛程式目錄位置。

伺服器端外掛程式程式庫檔案基本名稱為 authentication_ldap_simpleauthentication_ldap_sasl。檔案名稱後綴因平台而異(例如,Unix 和類 Unix 系統的 .so,Windows 的 .dll)。

注意

在 Microsoft Windows 上,不支援基於 SASL 的 LDAP 驗證的伺服器外掛程式,但支援用戶端外掛程式。在其他平台上,伺服器和用戶端外掛程式都支援。

若要在伺服器啟動時載入外掛程式,請使用 --plugin-load-add 選項來命名包含它們的程式庫檔案。使用此外掛程式載入方法,每次伺服器啟動時都必須提供選項。此外,請為您想要設定的任何外掛程式提供的系統變數指定值。

每個伺服器端 LDAP 外掛程式都會公開一組系統變數,以啟用其操作的設定。設定其中大多數是可選的,但您必須設定指定 LDAP 伺服器主機的變數(以便外掛程式知道要連線的位置)和 LDAP 繫結操作的基準識別名稱(以限制搜尋範圍並獲得更快的搜尋速度)。有關所有 LDAP 系統變數的詳細資訊,請參閱第 8.4.1.12 節「可插拔驗證系統變數」

若要載入外掛程式並設定 LDAP 伺服器主機和用於 LDAP 繫結操作的基礎識別名稱,請在您的 my.cnf 檔案中放入類似以下的行,並根據您的平台調整 .so 後綴

[mysqld]
plugin-load-add=authentication_ldap_simple.so
authentication_ldap_simple_server_host=127.0.0.1
authentication_ldap_simple_bind_base_dn="dc=example,dc=com"
plugin-load-add=authentication_ldap_sasl.so
authentication_ldap_sasl_server_host=127.0.0.1
authentication_ldap_sasl_bind_base_dn="dc=example,dc=com"

修改 my.cnf 後,重新啟動伺服器以使新設定生效。

或者,若要在執行時載入外掛程式,請使用以下陳述式,並根據您的平台調整 .so 後綴

INSTALL PLUGIN authentication_ldap_simple
  SONAME 'authentication_ldap_simple.so';
INSTALL PLUGIN authentication_ldap_sasl
  SONAME 'authentication_ldap_sasl.so';

INSTALL PLUGIN 會立即載入外掛程式,並將其註冊在 mysql.plugins 系統表格中,以使伺服器在每次後續正常啟動時載入它,而無需使用 --plugin-load-add

在執行時安裝外掛程式後,它們公開的系統變數會變成可用,您可以將這些變數的設定新增至您的 my.cnf 檔案中,以便為後續重新啟動配置外掛程式。例如

[mysqld]
authentication_ldap_simple_server_host=127.0.0.1
authentication_ldap_simple_bind_base_dn="dc=example,dc=com"
authentication_ldap_sasl_server_host=127.0.0.1
authentication_ldap_sasl_bind_base_dn="dc=example,dc=com"

修改 my.cnf 後,重新啟動伺服器以使新設定生效。

若要在執行時而非在啟動時設定並保留每個值,請使用以下陳述式

SET PERSIST authentication_ldap_simple_server_host='127.0.0.1';
SET PERSIST authentication_ldap_simple_bind_base_dn='dc=example,dc=com';
SET PERSIST authentication_ldap_sasl_server_host='127.0.0.1';
SET PERSIST authentication_ldap_sasl_bind_base_dn='dc=example,dc=com';

SET PERSIST 會為執行中的 MySQL 實例設定一個值。它也會儲存該值,使其能延續到後續的伺服器重新啟動。若要變更執行中 MySQL 實例的值,而不使其延續到後續的重新啟動,請使用 GLOBAL 關鍵字,而非 PERSIST。請參閱第 15.7.6.1 節,「設定變數的 SET 語法」

若要驗證外掛程式安裝,請檢查資訊綱要 PLUGINS 表格或使用 SHOW PLUGINS 陳述式(請參閱第 7.6.2 節,「取得伺服器外掛程式資訊」)。例如

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
       FROM INFORMATION_SCHEMA.PLUGINS
       WHERE PLUGIN_NAME LIKE '%ldap%';
+----------------------------+---------------+
| PLUGIN_NAME                | PLUGIN_STATUS |
+----------------------------+---------------+
| authentication_ldap_sasl   | ACTIVE        |
| authentication_ldap_simple | ACTIVE        |
+----------------------------+---------------+

如果外掛程式初始化失敗,請檢查伺服器錯誤日誌中是否有診斷訊息。

若要將 MySQL 帳戶與 LDAP 外掛程式建立關聯,請參閱使用 LDAP 可插拔驗證

SELinux 的其他注意事項

在執行 EL6 或已啟用 SELinux 的 EL 系統上,需要變更 SELinux 原則,才能使 MySQL LDAP 外掛程式與 LDAP 服務通訊

  1. 建立一個名為 mysqlldap.te 的檔案,其中包含以下內容

    module mysqlldap 1.0;
    
    require {
            type ldap_port_t;
            type mysqld_t;
            class tcp_socket name_connect;
    }
    
    #============= mysqld_t ==============
    
    allow mysqld_t ldap_port_t:tcp_socket name_connect;
  2. 將安全性原則模組編譯為二進位表示法

    checkmodule -M -m mysqlldap.te -o mysqlldap.mod
  3. 建立 SELinux 原則模組套件

    semodule_package -m mysqlldap.mod  -o mysqlldap.pp
  4. 安裝模組套件

    semodule -i mysqlldap.pp
  5. 變更 SELinux 原則後,重新啟動 MySQL 伺服器

    service mysqld restart
解除安裝 LDAP 可插拔驗證

解除安裝 LDAP 驗證外掛程式的方法取決於您安裝它們的方式

  • 如果您使用 --plugin-load-add 選項在伺服器啟動時安裝外掛程式,請在不使用這些選項的情況下重新啟動伺服器。

  • 如果您使用 INSTALL PLUGIN 在執行時安裝外掛程式,它們會在伺服器重新啟動後保持安裝狀態。若要解除安裝它們,請使用 UNINSTALL PLUGIN

    UNINSTALL PLUGIN authentication_ldap_simple;
    UNINSTALL PLUGIN authentication_ldap_sasl;

此外,請從您的 my.cnf 檔案中移除任何設定與 LDAP 外掛程式相關系統變數的啟動選項。如果您使用 SET PERSIST 來保留 LDAP 系統變數,請使用 RESET PERSIST 來移除這些設定。

LDAP 可插拔驗證和 ldap.conf

對於使用 OpenLDAP 的安裝,ldap.conf 檔案會為 LDAP 用戶端提供全域預設值。您可以在此檔案中設定選項,以影響 LDAP 用戶端,包括 LDAP 驗證外掛程式。OpenLDAP 會依以下優先順序使用組態選項

  • 由 LDAP 用戶端指定的組態。

  • ldap.conf 檔案中指定的組態。若要停用此檔案的使用,請設定 LDAPNOINIT 環境變數。

  • OpenLDAP 程式庫內建預設值。

如果程式庫預設值或 ldap.conf 值無法產生適當的選項值,則 LDAP 驗證外掛程式或許能夠設定相關的變數,以直接影響 LDAP 組態。例如,LDAP 外掛程式可以覆寫 ldap.conf 中的以下參數

如需有關 ldap.conf 的更多資訊,請參閱 ldap.conf(5) 手冊頁。

設定 LDAP 可插拔驗證的逾時

為了使 MySQL 帳戶使用 LDAP 可插拔驗證連線至 MySQL 伺服器,LDAP 伺服器必須可用且正常運作。MySQL 和 LDAP 伺服器之間的互動包含兩個步驟。首先,MySQL 伺服器會透過 TCP 建立與 LDAP 伺服器的連線。其次,MySQL 伺服器會透過連線將 LDAP 繫結要求傳送至 LDAP 伺服器,並等待回覆,然後驗證帳戶。如果任何一個步驟失敗,MySQL 帳戶都無法連線至 MySQL 伺服器。

依預設,會將短時間的逾時套用至連線和回應步驟,而覆蓋主機系統的逾時值。在所有情況下,如果逾時到期,帳戶使用者都會收到其嘗試連線至 MySQL 的要求遭到拒絕的通知。用戶端和伺服器端記錄可以提供其他資訊。在用戶端,請設定以下環境變數以提高詳細等級,然後重新啟動 MySQL 用戶端

AUTHENTICATION_LDAP_CLIENT_LOG=5
export AUTHENTICATION_LDAP_CLIENT_LOG

以下系統變數僅在 Linux 平台上支援基於 SASL 和簡單 LDAP 驗證的預設逾時。

表 8.22:基於 SASL 和簡單 LDAP 驗證的系統變數


LDAP 驗證的逾時值可以在伺服器啟動時和執行時調整。如果您使用其中一個變數將逾時設定為零,您實際上會取消啟用它,而 MySQL 伺服器會還原為使用主機系統的預設逾時。

注意

在以下條件組合下,authentication_ldap_sasl_connect_timeout 設定的實際等待時間會加倍,因為(在內部)伺服器必須調用 TCP 連線兩次

使用 LDAP 可插拔驗證

本節說明如何使 MySQL 帳戶能夠使用 LDAP 可插拔驗證連線至 MySQL 伺服器。假設伺服器正在執行時已啟用適當的伺服器端外掛程式,如安裝 LDAP 可插拔驗證中所述,並且在用戶端主機上提供了適當的用戶端外掛程式。

本節不說明 LDAP 組態或管理。假設您熟悉這些主題。

兩個伺服器端 LDAP 外掛程式各自與一個特定的用戶端外掛程式搭配運作

  • 伺服器端 authentication_ldap_simple 外掛程式執行簡單的 LDAP 驗證。對於使用此外掛程式的帳戶連線,用戶端程式會使用用戶端 mysql_clear_password 外掛程式,該外掛程式會以明文形式將密碼傳送至伺服器。不使用密碼雜湊或加密,因此建議在 MySQL 用戶端和伺服器之間建立安全連線,以防止密碼洩漏。

  • 伺服器端 authentication_ldap_sasl 外掛程式執行基於 SASL 的 LDAP 驗證。對於使用此外掛程式的帳戶連線,用戶端程式會使用用戶端 authentication_ldap_sasl_client 外掛程式。用戶端和伺服器端 SASL LDAP 外掛程式使用 SASL 訊息在 LDAP 協定中安全地傳輸憑證,以避免在 MySQL 用戶端和伺服器之間傳送明文密碼。

MySQL 使用者 LDAP 驗證的整體需求

  • 每個要驗證的使用者都必須有 LDAP 目錄項目。

  • 必須有一個 MySQL 使用者帳戶指定伺服器端 LDAP 驗證外掛程式,並可選擇性地命名相關的 LDAP 使用者識別名稱 (DN)。(若要將 LDAP 使用者 DN 與 MySQL 帳戶建立關聯,請在建立帳戶的 CREATE USER 陳述式中加入 BY 子句。)如果帳戶未命名任何 LDAP 字串,則 LDAP 驗證會使用用戶端指定的用戶名稱來尋找 LDAP 項目。

  • 用戶端程式會使用適用於 MySQL 帳戶所使用的伺服器端驗證外掛程式的連線方法連線。對於 LDAP 驗證,連線需要 MySQL 用戶名稱和 LDAP 密碼。此外,對於使用伺服器端 authentication_ldap_simple 外掛程式的帳戶,請使用 --enable-cleartext-plugin 選項調用用戶端程式,以啟用用戶端 mysql_clear_password 外掛程式。

此處的指示假設以下情境

  • MySQL 使用者 betsyboris 分別驗證 betsy_ldapboris_ldap 的 LDAP 項目。(MySQL 和 LDAP 使用者名稱不必不同。在本討論中使用不同的名稱有助於釐清操作環境是 MySQL 還是 LDAP。)

  • LDAP 項目使用 uid 屬性來指定使用者名稱。這可能會因 LDAP 伺服器而異。某些 LDAP 伺服器使用 cn 屬性而非 uid 作為使用者名稱。若要變更屬性,請適當地修改 authentication_ldap_simple_user_search_attrauthentication_ldap_sasl_user_search_attr 系統變數。

  • 這些 LDAP 項目可在 LDAP 伺服器管理的目錄中使用,以提供可唯一識別每個使用者的識別名稱值

    uid=betsy_ldap,ou=People,dc=example,dc=com
    uid=boris_ldap,ou=People,dc=example,dc=com
  • 建立 MySQL 帳戶的 CREATE USER 陳述式會在 BY 子句中命名 LDAP 使用者,以指示 MySQL 帳戶對哪個 LDAP 項目進行驗證。

設定使用 LDAP 驗證的帳戶的指示取決於使用的伺服器端 LDAP 外掛程式。以下各節說明幾種使用案例。

簡單 LDAP 驗證

若要為簡單 LDAP 驗證配置 MySQL 帳戶,CREATE USER 陳述式會指定 authentication_ldap_simple 外掛程式,並可選擇性地命名 LDAP 使用者識別名稱 (DN)

CREATE USER user
  IDENTIFIED WITH authentication_ldap_simple
  [BY 'LDAP user DN'];

假設 MySQL 使用者 betsy 在 LDAP 目錄中有此項目

uid=betsy_ldap,ou=People,dc=example,dc=com

然後建立 betsy 的 MySQL 帳戶的陳述式如下所示

CREATE USER 'betsy'@'localhost'
  IDENTIFIED WITH authentication_ldap_simple
  AS 'uid=betsy_ldap,ou=People,dc=example,dc=com';

BY 子句中指定的驗證字串不包含 LDAP 密碼。該密碼必須由客戶端使用者在連線時提供。

客戶端透過提供 MySQL 使用者名稱和 LDAP 密碼,並啟用客戶端 mysql_clear_password 外掛程式來連線至 MySQL 伺服器。

$> mysql --user=betsy --password --enable-cleartext-plugin
Enter password: betsy_password (betsy_ldap LDAP password)
注意

客戶端 mysql_clear_password 驗證外掛程式會保持密碼不變,因此客戶端程式會將其以明文形式傳送至 MySQL 伺服器。這使得密碼可以原樣傳遞至 LDAP 伺服器。在不使用 SASL 的情況下,必須使用明文密碼才能使用伺服器端 LDAP 程式庫,但在某些組態中可能存在安全性問題。以下措施可將風險降到最低:

驗證過程如下:

  1. 客戶端外掛程式會將 betsybetsy_password 作為客戶端使用者名稱和 LDAP 密碼傳送至 MySQL 伺服器。

  2. 連線嘗試會符合 'betsy'@'localhost' 帳戶。伺服器端 LDAP 外掛程式發現此帳戶的驗證字串為 'uid=betsy_ldap,ou=People,dc=example,dc=com',用於指定 LDAP 使用者 DN。此外掛程式會將此字串和 LDAP 密碼傳送至 LDAP 伺服器。

  3. LDAP 伺服器會找到 betsy_ldap 的 LDAP 條目,且密碼相符,因此 LDAP 驗證成功。

  4. LDAP 條目沒有群組屬性,因此伺服器端外掛程式會將客戶端使用者名稱 (betsy) 作為已驗證的使用者傳回。這與客戶端提供的使用者名稱相同,因此不會發生 Proxy,且客戶端工作階段會使用 'betsy'@'localhost' 帳戶進行權限檢查。

如果比對的 LDAP 條目包含群組屬性,則該屬性值會是已驗證的使用者名稱,且如果該值與 betsy 不同,則會發生 Proxy。如需使用群組屬性的範例,請參閱使用 Proxy 的 LDAP 驗證

如果 CREATE USER 陳述式不包含 BY 子句來指定 betsy_ldap LDAP 識別名稱,則驗證嘗試會使用客戶端提供的使用者名稱(在此例中為 betsy)。在沒有 betsy 的 LDAP 條目的情況下,驗證將會失敗。

基於 SASL 的 LDAP 驗證

若要設定用於 SASL LDAP 驗證的 MySQL 帳戶,CREATE USER 陳述式會指定 authentication_ldap_sasl 外掛程式,並選擇性地命名 LDAP 使用者的識別名稱 (DN)。

CREATE USER user
  IDENTIFIED WITH authentication_ldap_sasl
  [BY 'LDAP user DN'];

假設 MySQL 使用者 boris 在 LDAP 目錄中有這個條目:

uid=boris_ldap,ou=People,dc=example,dc=com

那麼,建立 boris 的 MySQL 帳戶的陳述式看起來像這樣:

CREATE USER 'boris'@'localhost'
  IDENTIFIED WITH authentication_ldap_sasl
  AS 'uid=boris_ldap,ou=People,dc=example,dc=com';

BY 子句中指定的驗證字串不包含 LDAP 密碼。該密碼必須由客戶端使用者在連線時提供。

客戶端透過提供 MySQL 使用者名稱和 LDAP 密碼來連線至 MySQL 伺服器。

$> mysql --user=boris --password
Enter password: boris_password (boris_ldap LDAP password)

對於伺服器端 authentication_ldap_sasl 外掛程式,客戶端會使用客戶端 authentication_ldap_sasl_client 外掛程式。如果客戶端程式找不到客戶端外掛程式,請指定 --plugin-dir 選項,以指定安裝外掛程式程式庫檔案的目錄。

boris 的驗證過程與先前描述的 betsy 使用簡單 LDAP 驗證的過程類似,只是客戶端和伺服器端 SASL LDAP 外掛程式會使用 SASL 訊息,以便在 LDAP 通訊協定內安全地傳輸認證,以避免在 MySQL 客戶端和伺服器之間傳送明文密碼。

使用 Proxy 的 LDAP 驗證

LDAP 驗證外掛程式支援 Proxy,讓使用者能夠以一個使用者身分連線至 MySQL 伺服器,但承擔不同使用者的權限。本節說明基本的 LDAP 外掛程式 Proxy 支援。LDAP 外掛程式也支援指定群組喜好設定和 Proxy 使用者對應;請參閱LDAP 驗證群組喜好設定和對應規格

此處描述的 Proxy 實作是以使用 LDAP 群組屬性值為基礎,將使用 LDAP 驗證的連線 MySQL 使用者對應到定義不同權限集的其他 MySQL 帳戶。使用者不會透過定義權限的帳戶直接連線。相反地,他們會透過使用 LDAP 驗證的預設 Proxy 帳戶連線,以便將所有外部登入對應到擁有權限的 Proxy MySQL 帳戶。使用 Proxy 帳戶連線的任何使用者都會對應到其中一個 Proxy MySQL 帳戶,其權限決定了外部使用者允許的資料庫操作。

此處的指示假設以下情境

  • LDAP 條目使用 uidcn 屬性來指定使用者名稱和群組值。若要使用不同的使用者和群組屬性名稱,請設定適當的外掛程式特定系統變數:

  • 這些 LDAP 項目可在 LDAP 伺服器管理的目錄中使用,以提供可唯一識別每個使用者的識別名稱值

    uid=basha,ou=People,dc=example,dc=com,cn=accounting
    uid=basil,ou=People,dc=example,dc=com,cn=front_office

    在連線時,群組屬性值會成為已驗證的使用者名稱,因此會命名 accountingfront_office Proxy 帳戶。

  • 範例假設使用 SASL LDAP 驗證。針對簡單 LDAP 驗證進行適當調整。

建立預設 Proxy MySQL 帳戶:

CREATE USER ''@'%'
  IDENTIFIED WITH authentication_ldap_sasl;

Proxy 帳戶定義沒有 AS 'auth_string' 子句來命名 LDAP 使用者 DN。因此:

  • 當客戶端連線時,客戶端使用者名稱會成為要搜尋的 LDAP 使用者名稱。

  • 預期比對的 LDAP 條目包含一個群組屬性,該屬性會命名定義客戶端應具有的權限的 Proxy MySQL 帳戶。

注意

如果您的 MySQL 安裝具有匿名使用者,則他們可能會與預設 Proxy 使用者衝突。如需有關此問題和處理方法的詳細資訊,請參閱預設 Proxy 使用者和匿名使用者衝突

建立 Proxy 帳戶,並授予每個帳戶應具有的權限:

CREATE USER 'accounting'@'localhost'
  IDENTIFIED WITH mysql_no_login;
CREATE USER 'front_office'@'localhost'
  IDENTIFIED WITH mysql_no_login;

GRANT ALL PRIVILEGES
  ON accountingdb.*
  TO 'accounting'@'localhost';
GRANT ALL PRIVILEGES
  ON frontdb.*
  TO 'front_office'@'localhost';

Proxy 帳戶使用 mysql_no_login 驗證外掛程式,以防止客戶端使用這些帳戶直接登入 MySQL 伺服器。相反地,使用 LDAP 驗證的使用者應使用預設的 ''@'%' Proxy 帳戶。(這假設已安裝 mysql_no_login 外掛程式。如需說明,請參閱第 8.4.1.8 節,「無登入可插拔驗證」。)如需保護 Proxy 帳戶免受直接使用的其他方法,請參閱防止直接登入 Proxy 帳戶

授予 Proxy 帳戶每個 Proxy 帳戶的 PROXY 權限:

GRANT PROXY
  ON 'accounting'@'localhost'
  TO ''@'%';
GRANT PROXY
  ON 'front_office'@'localhost'
  TO ''@'%';

使用 mysql 命令列用戶端,以 basha 身分連線至 MySQL 伺服器。

$> mysql --user=basha --password
Enter password: basha_password (basha LDAP password)

驗證過程如下:

  1. 伺服器會使用預設的 ''@'%' Proxy 帳戶(針對客戶端使用者 basha)驗證連線。

  2. 比對的 LDAP 條目為:

    uid=basha,ou=People,dc=example,dc=com,cn=accounting
  3. 比對的 LDAP 條目具有群組屬性 cn=accounting,因此 accounting 會成為已驗證的 Proxy 使用者。

  4. 已驗證的使用者與客戶端使用者名稱 basha 不同,因此 basha 會被視為 accounting 的 Proxy,並且 basha 會承擔 Proxy accounting 帳戶的權限。下列查詢會傳回如下所示的輸出:

    mysql> SELECT USER(), CURRENT_USER(), @@proxy_user;
    +-----------------+----------------------+--------------+
    | USER()          | CURRENT_USER()       | @@proxy_user |
    +-----------------+----------------------+--------------+
    | basha@localhost | accounting@localhost | ''@'%'       |
    +-----------------+----------------------+--------------+

這表示 basha 使用授予 Proxy accounting MySQL 帳戶的權限,並且透過預設 Proxy 使用者帳戶進行 Proxy。

現在以 basil 身分連線:

$> mysql --user=basil --password
Enter password: basil_password (basil LDAP password)

basil 的驗證過程與先前描述的 basha 類似:

  1. 伺服器會使用預設的 ''@'%' Proxy 帳戶(針對客戶端使用者 basil)驗證連線。

  2. 比對的 LDAP 條目為:

    uid=basil,ou=People,dc=example,dc=com,cn=front_office
  3. 比對的 LDAP 條目具有群組屬性 cn=front_office,因此 front_office 會成為已驗證的 Proxy 使用者。

  4. 已驗證的使用者與客戶端使用者名稱 basil 不同,因此 basil 會被視為 front_office 的 Proxy,並且 basil 會承擔 Proxy front_office 帳戶的權限。下列查詢會傳回如下所示的輸出:

    mysql> SELECT USER(), CURRENT_USER(), @@proxy_user;
    +-----------------+------------------------+--------------+
    | USER()          | CURRENT_USER()         | @@proxy_user |
    +-----------------+------------------------+--------------+
    | basil@localhost | front_office@localhost | ''@'%'       |
    +-----------------+------------------------+--------------+

這表示 basil 使用授予 Proxy front_office MySQL 帳戶的權限,並且透過預設 Proxy 使用者帳戶進行 Proxy。

LDAP 驗證群組喜好設定和對應規格

使用代理的 LDAP 驗證中所述,基本的 LDAP 驗證代理運作原理是外掛程式使用 LDAP 伺服器傳回的第一個群組名稱作為 MySQL 代理使用者帳戶名稱。這種簡單的功能無法指定偏好使用哪個群組名稱 (如果 LDAP 伺服器傳回多個群組名稱),或指定群組名稱以外的任何名稱作為代理使用者名稱。

對於使用 LDAP 驗證的 MySQL 帳戶,驗證字串可以指定以下資訊,以實現更大的代理彈性:

  • 依偏好順序排列的群組清單,外掛程式會使用清單中與 LDAP 伺服器傳回的群組相符的第一個群組名稱。

  • 從群組名稱到代理使用者名稱的對應,如此一來,當群組名稱相符時,可以提供指定的名稱作為代理使用者。這提供了使用群組名稱作為代理使用者的替代方案。

請考慮以下 MySQL 代理帳戶定義:

CREATE USER ''@'%'
  IDENTIFIED WITH authentication_ldap_sasl
  AS '+ou=People,dc=example,dc=com#grp1=usera,grp2,grp3=userc';

驗證字串具有使用者 DN 字尾 ou=People,dc=example,dc=com,並以 + 字元作為前綴。因此,如LDAP 驗證使用者 DN 字尾中所述,完整的使用者 DN 是由指定的使用者 DN 字尾,加上用戶端使用者名稱作為 uid 屬性所建構的。

驗證字串的其餘部分以 # 開頭,表示群組偏好和對應資訊的開始。驗證字串的這部分依序列出群組名稱 grp1grp2grp3。LDAP 外掛程式會將該清單與 LDAP 伺服器傳回的群組名稱集合進行比較,依清單順序尋找與傳回名稱相符的項目。外掛程式會使用第一個相符的項目,如果沒有相符的項目,驗證將會失敗。

假設 LDAP 伺服器傳回群組 grp3grp2grp7。LDAP 外掛程式會使用 grp2,因為它是驗證字串中第一個相符的群組,即使它不是 LDAP 伺服器傳回的第一個群組。如果 LDAP 伺服器傳回 grp4grp2grp1,外掛程式會使用 grp1,即使 grp2 也符合。 grp1 的優先順序高於 grp2,因為它在驗證字串中列在較早的位置。

假設外掛程式找到群組名稱的相符項,它會執行從該群組名稱到 MySQL 代理使用者名稱的對應 (如果有的話)。對於範例代理帳戶,對應方式如下:

  • 如果相符的群組名稱是 grp1grp3,它們在驗證字串中分別與使用者名稱 userauserc 相關聯。外掛程式會使用對應的相關聯使用者名稱作為代理使用者名稱。

  • 如果相符的群組名稱是 grp2,則驗證字串中沒有相關聯的使用者名稱。外掛程式會使用 grp2 作為代理使用者名稱。

如果 LDAP 伺服器傳回 DN 格式的群組,LDAP 外掛程式會剖析群組 DN,從中提取群組名稱。

若要指定 LDAP 群組偏好和對應資訊,這些原則適用:

  • # 前綴字元開始驗證字串的群組偏好和對應部分。

  • 群組偏好和對應規範是一個或多個項目的清單,以逗號分隔。每個項目都有 group_name=user_namegroup_name 的形式。項目應依群組名稱偏好順序排列。對於外掛程式從 LDAP 伺服器傳回的群組名稱集中選擇的群組名稱相符項,這兩種語法的效果如下:

    • 對於指定為 group_name=user_name (具有使用者名稱) 的項目,群組名稱會對應到使用者名稱,並將其用作 MySQL 代理使用者名稱。

    • 對於指定為 group_name (沒有使用者名稱) 的項目,群組名稱會用作 MySQL 代理使用者名稱。

  • 若要引用包含特殊字元 (例如空格) 的群組或使用者名稱,請用雙引號 (") 字元將其括起來。例如,如果項目的群組和使用者名稱分別為 my group namemy user name,則必須使用引號以群組對應方式寫入:

    "my group name"="my user name"

    如果項目的群組和使用者名稱分別為 my_group_namemy_user_name (不包含特殊字元),則可以使用引號 (但不是必須)。以下任何一種寫法都是有效的:

    my_group_name=my_user_name
    my_group_name="my_user_name"
    "my_group_name"=my_user_name
    "my_group_name"="my_user_name"
  • 若要逸出字元,請在其前面加上反斜線 (\)。這對於包含文字雙引號或反斜線特別有用,否則它們不會以文字形式包含。

  • 使用者 DN 不需要出現在驗證字串中,但如果出現,則必須位於群組偏好和對應部分之前。使用者 DN 可以指定為完整的使用者 DN,或以 + 前綴字元指定為使用者 DN 字尾。(請參閱 LDAP 驗證使用者 DN 字尾。)

LDAP 驗證使用者 DN 字尾

LDAP 驗證外掛程式允許提供使用者 DN 資訊的驗證字串以 + 前綴字元開頭。

  • 如果沒有 + 字元,則驗證字串值會視為未經修改的。

  • 如果驗證字串以 + 開頭,外掛程式會根據用戶端傳送的使用者名稱,以及驗證字串中指定的 DN (刪除 +),建構完整的使用者 DN 值。在建構的 DN 中,用戶端使用者名稱會變成指定 LDAP 使用者名稱的屬性值。預設值為 uid;若要變更屬性,請修改適當的系統變數 (authentication_ldap_simple_user_search_attrauthentication_ldap_sasl_user_search_attr)。驗證字串會按原樣儲存在 mysql.user 系統表中,而完整的使用者 DN 會在驗證前即時建構。

此帳戶驗證字串的開頭沒有 +,因此會被視為完整的使用者 DN:

CREATE USER 'baldwin'
  IDENTIFIED WITH authentication_ldap_simple
  AS 'uid=admin,ou=People,dc=example,dc=com';

用戶端會使用帳戶中指定的使用者名稱 (baldwin) 連線。在此情況下,不會使用該名稱,因為驗證字串沒有前綴,因此完整指定了使用者 DN。

此帳戶驗證字串的開頭確實有 +,因此它只會被視為使用者 DN 的一部分:

CREATE USER 'accounting'
  IDENTIFIED WITH authentication_ldap_simple
  AS '+ou=People,dc=example,dc=com';

用戶端會使用帳戶中指定的使用者名稱 (accounting) 連線,在此情況下,該名稱會用作 uid 屬性,並與驗證字串一起建構使用者 DN:uid=accounting,ou=People,dc=example,dc=com

在上述範例中的帳戶都具有非空的使用者名稱,因此用戶端始終使用帳戶定義中指定的相同名稱連線到 MySQL 伺服器。如果帳戶具有空的使用者名稱,例如使用代理的 LDAP 驗證中所述的預設匿名 ''@'%' 代理帳戶,則用戶端可能會使用不同的使用者名稱連線到 MySQL 伺服器。但原理是相同的:如果驗證字串以 + 開頭,外掛程式會使用用戶端傳送的使用者名稱以及驗證字串來建構使用者 DN。

LDAP 驗證方法

LDAP 驗證外掛程式使用可設定的驗證方法。適當的系統變數和可用的方法選擇是外掛程式專有的。

請參閱系統變數描述,以取得有關每個允許方法的資訊。此外,根據不同的方法,可能需要額外的設定,如下列各節所述。

GSSAPI/Kerberos 驗證方法

通用安全性服務應用程式介面 (GSSAPI) 是一種安全性抽象介面。Kerberos 是可透過該抽象介面使用的特定安全性協定的一個實例。使用 GSSAPI,應用程式會驗證 Kerberos 以取得服務認證,然後依次使用這些認證來啟用對其他服務的安全存取。

其中一項服務是 LDAP,客戶端和伺服器端 SASL LDAP 驗證外掛程式都會使用它。當 authentication_ldap_sasl_auth_method_name 系統變數設定為 GSSAPI 時,這些外掛程式會使用 GSSAPI/Kerberos 驗證方法。在這種情況下,外掛程式會使用 Kerberos 安全地通訊,而不會直接使用 LDAP 訊息。伺服器端外掛程式接著會與 LDAP 伺服器通訊,以解譯 LDAP 驗證訊息並擷取 LDAP 群組。

GSSAPI/Kerberos 支援作為 Linux 上 MySQL 伺服器和用戶端的 LDAP 驗證方法。它在應用程式可透過 Microsoft Active Directory 存取 LDAP 的 Linux 環境中很有用,Active Directory 預設已啟用 Kerberos。

以下討論提供有關使用 GSSAPI 方法的組態需求資訊。假設您已熟悉 Kerberos 的概念和運作方式。以下清單簡要定義了幾個常見的 Kerberos 術語。您也可以參考 RFC 4120 的詞彙表部分。

使用 Kerberos 的 LDAP 驗證需要 KDC 伺服器和 LDAP 伺服器。此需求可以透過不同的方式滿足。

  • Active Directory 同時包含這兩個伺服器,Active Directory LDAP 伺服器中預設已啟用 Kerberos 驗證。

  • OpenLDAP 提供 LDAP 伺服器,但可能需要單獨的 KDC 伺服器,並需要額外的 Kerberos 設定。

Kerberos 也必須在用戶端主機上可用。用戶端使用密碼聯絡 AS 以取得 TGT。然後用戶端使用 TGT 從 TGS 取得對其他服務(例如 LDAP)的存取權。

以下章節討論在 MySQL 中使用 GSSAPI/Kerberos 進行 SASL LDAP 驗證的組態步驟。

驗證 Kerberos 和 LDAP 的可用性

以下範例顯示如何測試 Active Directory 中 Kerberos 的可用性。此範例做出以下假設:

  • Active Directory 在名為 ldap_auth.example.com 的主機上執行,IP 位址為 198.51.100.10

  • 與 MySQL 相關的 Kerberos 驗證和 LDAP 查詢使用 MYSQL.LOCAL 網域。

  • 名為 bredon@MYSQL.LOCAL 的主體已在 KDC 中註冊。(在後續討論中,此主體名稱也與使用 GSSAPI/Kerberos 驗證到 MySQL 伺服器的 MySQL 帳戶相關聯。)

在滿足這些假設的情況下,請依照下列步驟操作:

  1. 驗證 Kerberos 程式庫是否已在作業系統中正確安裝和設定。例如,若要設定在 MySQL 驗證期間使用的 MYSQL.LOCAL 網域,/etc/krb5.conf Kerberos 設定檔應包含類似以下內容:

    [realms]
      MYSQL.LOCAL = {
        kdc = ldap_auth.example.com
        admin_server = ldap_auth.example.com
        default_domain = MYSQL.LOCAL
      }
  2. 您可能需要在 /etc/hosts 中為伺服器主機新增一個項目。

    198.51.100.10 ldap_auth ldap_auth.example.com
  3. 檢查 Kerberos 驗證是否正常運作。

    1. 使用 kinit 向 Kerberos 驗證。

      $> kinit bredon@MYSQL.LOCAL
      Password for bredon@MYSQL.LOCAL: (enter password here)

      此命令會針對名為 bredon@MYSQL.LOCAL 的 Kerberos 主體進行驗證。當命令提示輸入時,請輸入主體的密碼。KDC 會傳回一個 TGT,該 TGT 會快取在用戶端,供其他支援 Kerberos 的應用程式使用。

    2. 使用 klist 檢查是否正確取得 TGT。輸出應類似於以下內容:

      $> klist
      Ticket cache: FILE:/tmp/krb5cc_244306
      Default principal: bredon@MYSQL.LOCAL
      
      Valid starting       Expires              Service principal
      03/23/2021 08:18:33  03/23/2021 18:18:33  krbtgt/MYSQL.LOCAL@MYSQL.LOCAL
  4. 使用此命令檢查 ldapsearch 是否使用 Kerberos TGT 運作,此命令會搜尋 MYSQL.LOCAL 網域中的使用者。

    ldapsearch -h 198.51.100.10 -Y GSSAPI -b "dc=MYSQL,dc=LOCAL"
設定伺服器端 SASL LDAP 驗證外掛程式以使用 GSSAPI/Kerberos

假設 LDAP 伺服器如前述透過 Kerberos 存取,請設定伺服器端 SASL LDAP 驗證外掛程式以使用 GSSAPI/Kerberos 驗證方法。(如需一般 LDAP 外掛程式安裝資訊,請參閱安裝 LDAP 外掛程式驗證。)以下是伺服器 my.cnf 檔案可能包含的外掛程式相關設定範例:

[mysqld]
plugin-load-add=authentication_ldap_sasl.so
authentication_ldap_sasl_auth_method_name="GSSAPI"
authentication_ldap_sasl_server_host=198.51.100.10
authentication_ldap_sasl_server_port=389
authentication_ldap_sasl_bind_root_dn="cn=admin,cn=users,dc=MYSQL,dc=LOCAL"
authentication_ldap_sasl_bind_root_pwd="password"
authentication_ldap_sasl_bind_base_dn="cn=users,dc=MYSQL,dc=LOCAL"
authentication_ldap_sasl_user_search_attr="sAMAccountName"

這些選項檔案設定會將 SASL LDAP 外掛程式設定如下:

建立使用 GSSAPI/Kerberos 進行 LDAP 驗證的 MySQL 帳戶

使用具有 GSSAPI/Kerberos 方法的 SASL LDAP 驗證外掛程式進行 MySQL 驗證,是根據一個身為 Kerberos 主體的使用者。以下討論使用名為 bredon@MYSQL.LOCAL 的主體作為此使用者,該使用者必須在多個地方註冊。

  • Kerberos 管理員應將使用者名稱註冊為 Kerberos 主體。此名稱應包含網域名稱。用戶端會使用主體名稱和密碼向 Kerberos 驗證並取得 TGT。

  • LDAP 管理員應在 LDAP 項目中註冊使用者名稱。例如:

    uid=bredon,dc=MYSQL,dc=LOCAL
    注意

    在 Active Directory(使用 Kerberos 作為預設驗證方法)中,建立使用者會同時建立 Kerberos 主體和 LDAP 項目。

  • MySQL DBA 應建立一個以 Kerberos 主體名稱作為使用者名稱,且使用 SASL LDAP 外掛程式進行驗證的帳戶。

假設 Kerberos 主體和 LDAP 項目已由適當的服務管理員註冊,並且如先前在 安裝 LDAP 外掛程式驗證設定伺服器端 SASL LDAP 驗證外掛程式以使用 GSSAPI/Kerberos 中所述,MySQL 伺服器已使用適用於伺服器端 SASL LDAP 外掛程式的適當組態設定啟動。然後 MySQL DBA 會建立一個對應於 Kerberos 主體名稱(包含網域名稱)的 MySQL 帳戶。

注意

SASL LDAP 外掛程式針對 Kerberos 驗證使用常數使用者 DN,並忽略從 MySQL 設定的任何使用者 DN。這具有某些含義:

  • 對於任何使用 GSSAPI/Kerberos 驗證的 MySQL 帳戶,CREATE USERALTER USER 陳述式中的驗證字串應不包含使用者 DN,因為它無效。

  • 由於驗證字串不包含使用者 DN,因此應包含群組對應資訊,以啟用使用者作為代理使用者來處理,該使用者會對應到所需的受代理使用者。如需有關使用 LDAP 驗證外掛程式進行代理的資訊,請參閱 使用代理進行 LDAP 驗證

以下陳述式會建立一個名為 bredon@MYSQL.LOCAL 的代理使用者,該使用者會承擔名為 proxied_krb_usr 的受代理使用者的權限。同樣地,其他應具有相同權限的 GSSAPI/Kerberos 使用者可以建立為同一個受代理使用者的代理使用者。

-- create proxy account
CREATE USER 'bredon@MYSQL.LOCAL'
  IDENTIFIED WITH authentication_ldap_sasl
  BY '#krb_grp=proxied_krb_user';

-- create proxied account and grant its privileges;
-- use mysql_no_login plugin to prevent direct login
CREATE USER 'proxied_krb_user'
  IDENTIFIED WITH mysql_no_login;
GRANT ALL
  ON krb_user_db.*
  TO 'proxied_krb_user';

-- grant to proxy account the
-- PROXY privilege for proxied account
GRANT PROXY
  ON 'proxied_krb_user'
  TO 'bredon@MYSQL.LOCAL';

請仔細觀察第一個 CREATE USER 陳述式和 GRANT PROXY 陳述式中代理帳戶名稱的引號。

  • 對於大多數 MySQL 帳戶,使用者和主機是帳戶名稱的獨立部分,因此會分別以 'user_name'@'host_name' 加上引號。

  • 對於 LDAP Kerberos 驗證,帳戶名稱的使用者部分包含主體網域,因此 'bredon@MYSQL.LOCAL' 會以單一值加上引號。由於未提供主機部分,完整的 MySQL 帳戶名稱會使用 '%' 作為預設的主機部分:'bredon@MYSQL.LOCAL'@'%'

注意

當建立使用 authentication_ldap_sasl SASL LDAP 驗證外掛程式及 GSSAPI/Kerberos 驗證方法進行驗證的帳戶時,CREATE USER 陳述式會在使用者名稱中包含網域。這與建立使用 authentication_kerberos Kerberos 外掛程式的帳戶不同。對於此類帳戶,CREATE USER 陳述式不會在使用者名稱中包含網域。相反地,請在 BY 子句中將網域指定為驗證字串。請參閱 建立使用 Kerberos 驗證的 MySQL 帳戶

被代理的帳戶使用 mysql_no_login 驗證外掛程式,以防止用戶直接使用該帳戶登入 MySQL 伺服器。相反地,預期使用 LDAP 驗證的使用者會使用 bredon@MYSQL.LOCAL 代理帳戶。(這假設已安裝 mysql_no_login 外掛程式。有關說明,請參閱第 8.4.1.8 節,「無登入可插拔驗證」。) 如需保護被代理帳戶免受直接使用的其他方法,請參閱防止直接登入被代理帳戶

使用 MySQL 帳戶連線至 MySQL 伺服器

在設定好使用 GSSAPI/Kerberos 驗證的 MySQL 帳戶後,用戶端可以使用該帳戶連線至 MySQL 伺服器。Kerberos 驗證可以在 MySQL 用戶端程式啟動之前或啟動時進行

  • 在調用 MySQL 用戶端程式之前,用戶端使用者可以獨立於 MySQL 從 KDC 取得 TGT。例如,用戶端使用者可以使用 kinit 提供 Kerberos 主體名稱和主體密碼來驗證 Kerberos

    $> kinit bredon@MYSQL.LOCAL
    Password for bredon@MYSQL.LOCAL: (enter password here)

    產生的 TGT 會被快取,並且可供其他支援 Kerberos 的應用程式使用,例如使用用戶端 SASL LDAP 驗證外掛程式的程式。在這種情況下,MySQL 用戶端程式使用 TGT 向 MySQL 伺服器進行驗證,因此在調用用戶端時無需指定使用者名稱或密碼

    mysql --default-auth=authentication_ldap_sasl_client

    如剛剛所述,當 TGT 被快取時,用戶端命令中不需要使用者名稱和密碼選項。如果命令仍然包含它們,則會按以下方式處理

    • 如果命令包含使用者名稱,則如果該名稱與 TGT 中的主體名稱不符,驗證會失敗。

    • 如果命令包含密碼,則用戶端外掛程式會忽略它。由於驗證是基於 TGT,即使使用者提供的密碼不正確,驗證也可以成功。因此,如果找到有效的 TGT 導致密碼被忽略,外掛程式會產生警告。

  • 如果 Kerberos 快取中沒有 TGT,則用戶端 SASL LDAP 驗證外掛程式本身可以從 KDC 取得 TGT。調用用戶端時,請使用與 MySQL 帳戶相關聯的 Kerberos 主體名稱和密碼選項(在單行輸入命令,然後在出現提示時輸入主體密碼)

    mysql --default-auth=authentication_ldap_sasl_client
      --user=bredon@MYSQL.LOCAL
      --password
  • 如果 Kerberos 快取中沒有 TGT,並且用戶端命令沒有指定主體名稱作為使用者名稱,則驗證會失敗。

如果您不確定是否存在 TGT,可以使用 klist 來檢查。

驗證過程如下:

  1. 用戶端使用 TGT 來使用 Kerberos 驗證。

  2. 伺服器會找到該主體的 LDAP 項目,並使用它來驗證 bredon@MYSQL.LOCAL MySQL 代理帳戶的連線。

  3. 代理帳戶驗證字串中的群組對應資訊 ('#krb_grp=proxied_krb_user') 表示經過驗證的被代理使用者應為 proxied_krb_user

  4. bredon@MYSQL.LOCAL 會被視為 proxied_krb_user 的代理,並且以下查詢會返回如下所示的輸出

    mysql> SELECT USER(), CURRENT_USER(), @@proxy_user;
    +------------------------------+--------------------+--------------------------+
    | USER()                       | CURRENT_USER()     | @@proxy_user             |
    +------------------------------+--------------------+--------------------------+
    | bredon@MYSQL.LOCAL@localhost | proxied_krb_user@% | 'bredon@MYSQL.LOCAL'@'%' |
    +------------------------------+--------------------+--------------------------+

    USER() 值表示用於用戶端命令的使用者名稱 (bredon@MYSQL.LOCAL) 和用戶端連線的主機 (localhost)。

    CURRENT_USER() 值是被代理使用者帳戶的完整名稱,由 proxied_krb_user 使用者部分和 % 主機部分組成。

    @@proxy_user 值表示用於連線至 MySQL 伺服器的帳戶的完整名稱,由 bredon@MYSQL.LOCAL 使用者部分和 % 主機部分組成。

    這示範了代理是透過 bredon@MYSQL.LOCAL 代理使用者帳戶進行的,並且 bredon@MYSQL.LOCAL 擁有授予 proxied_krb_user 被代理使用者帳戶的權限。

TGT 一旦取得就會在用戶端快取,並且可以重複使用,直到過期,而無需再次指定密碼。無論 TGT 如何取得,用戶端外掛程式都會使用它來取得服務票證,並與伺服器端外掛程式進行通訊。

注意

當用戶端驗證外掛程式本身取得 TGT 時,用戶端使用者可能不希望重複使用 TGT。如LDAP 驗證的用戶端組態參數中所述,可以使用本機 /etc/krb5.conf 檔案來使用戶端外掛程式在使用完畢後銷毀 TGT。

伺服器端外掛程式無法存取 TGT 本身或用於取得 TGT 的 Kerberos 密碼。

LDAP 驗證外掛程式無法控制快取機制(儲存在本機檔案、記憶體等中),但 Kerberos 公用程式 (例如 kswitch) 可能可用於此目的。

LDAP 驗證的用戶端組態參數

authentication_ldap_sasl_client 用戶端 SASL LDAP 外掛程式會讀取本機 /etc/krb5.conf 檔案。如果此檔案遺失或無法存取,則會發生錯誤。假設檔案可存取,則它可以包含一個可選的 [appdefaults] 區段,以提供外掛程式使用的資訊。將資訊放在區段的 mysql 部分內。例如

[appdefaults]
  mysql = {
    ldap_server_host = "ldap_host.example.com"
    ldap_destroy_tgt = true
  }

用戶端外掛程式會識別 mysql 區段中的這些參數

  • ldap_server_host 值指定 LDAP 伺服器主機,當該主機與 [realms] 區段中指定的 KDC 伺服器主機不同時,此值可能很有用。依預設,外掛程式會使用 KDC 伺服器主機作為 LDAP 伺服器主機。

  • ldap_destroy_tgt 值表示用戶端外掛程式是否會在取得並使用 TGT 後銷毀它。依預設,ldap_destroy_tgtfalse,但可以設定為 true 以避免 TGT 重複使用。(此設定僅適用於由用戶端外掛程式建立的 TGT,不適用於由其他外掛程式建立或在 MySQL 外部建立的 TGT。)

LDAP 搜尋轉介

可以將 LDAP 伺服器設定為將 LDAP 搜尋委派給另一個 LDAP 伺服器,此功能稱為 LDAP 轉介。假設伺服器 a.example.com 保留 "dc=example,dc=com" 根 DN,並且想要將搜尋委派給另一個伺服器 b.example.com。為了啟用此功能,a.example.com 將設定為具有這些屬性的具名轉介物件

dn: dc=subtree,dc=example,dc=com
objectClass: referral
objectClass: extensibleObject
dc: subtree
ref: ldap://b.example.com/dc=subtree,dc=example,dc=com

啟用 LDAP 轉介的一個問題是,當搜尋基本 DN 是根 DN 且未設定轉介物件時,搜尋可能會因 LDAP 作業錯誤而失敗。即使 LDAP 轉介可能在 ldap.conf 組態檔案中全域設定,MySQL DBA 也可能希望避免 LDAP 驗證外掛程式發生此類轉介錯誤。若要針對外掛程式特定地組態 LDAP 伺服器在與每個外掛程式通訊時是否應使用 LDAP 轉介,請設定 authentication_ldap_simple_referralauthentication_ldap_sasl_referral 系統變數。將任一變數設定為 ONOFF 會導致對應的 LDAP 驗證外掛程式告知 LDAP 伺服器在 MySQL 驗證期間是否使用轉介。每個變數都有外掛程式特定的效果,並且不會影響與 LDAP 伺服器通訊的其他應用程式。預設情況下,兩個變數都為 OFF