文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

8.4.1.7 LDAP 可插拔驗證

注意

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

MySQL 企業版支援一種驗證方法,可讓 MySQL 伺服器使用 LDAP (輕量型目錄存取通訊協定) 透過存取 X.500 等目錄服務來驗證 MySQL 使用者。MySQL 使用 LDAP 來擷取使用者、憑證和群組資訊。

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

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

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

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

伺服器和用戶端外掛程式可用於簡單和基於 SASL 的 LDAP 驗證。在 Microsoft Windows 上,不支援基於 SASL 的 LDAP 驗證的伺服器外掛程式,但支援用戶端外掛程式。

下表顯示簡單和基於 SASL 的 LDAP 驗證的外掛程式和程式庫檔案名稱。您系統上的檔案名稱後綴可能不同。這些檔案必須位於 plugin_dir 系統變數所命名的目錄中。

表 8.21 簡單 LDAP 驗證的外掛程式和程式庫名稱

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

表 8.22 基於 SASL 的 LDAP 驗證的外掛程式和程式庫名稱

外掛程式或檔案 外掛程式或檔案名稱
伺服器端外掛程式名稱 authentication_ldap_sasl
用戶端外掛程式名稱 authentication_ldap_sasl_client
程式庫檔案名稱 authentication_ldap_sasl.soauthentication_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.4 節「用戶端明文可插拔驗證」。有關 Proxy 使用者資訊,請參閱 第 8.2.19 節「Proxy 使用者」

注意

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

LDAP 可插拔驗證的先決條件

若要將 LDAP 可插拔驗證用於 MySQL,必須滿足以下先決條件:

  • 必須提供 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.13 節「可插拔驗證系統變數」

若要載入外掛程式並設定 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 變數賦值的語法」

若要驗證外掛程式的安裝,請檢查 Information Schema 的 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.23 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 驗證

若要設定 MySQL 帳戶以進行簡單 LDAP 驗證,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 陳述式未包含指定 betsy_ldap LDAP 識別名稱的 BY 子句,則驗證嘗試會使用用戶端提供的使用者名稱(在此情況下為 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.9 節,「無登入可插拔驗證」。)如需保護 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 驗證群組偏好設定和對應規格

使用 Proxy 的 LDAP 驗證中所述,基本 LDAP 驗證 Proxy 的運作原理是外掛程式會使用 LDAP 伺服器傳回的第一個群組名稱作為 MySQL Proxy 使用者帳戶名稱。此簡單的功能無法指定在 LDAP 伺服器傳回多個群組名稱時要使用哪個群組名稱的任何偏好設定,也無法指定 Proxy 使用者名稱不是群組名稱的任何名稱。

對於使用 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 驗證插件會使用 LDAP。當 authentication_ldap_sasl_auth_method_name 系統變數設定為 GSSAPI 時,這些插件會使用 GSSAPI/Kerberos 驗證方法。在這種情況下,插件會使用 Kerberos 安全地進行通訊,而不會直接使用 LDAP 訊息。然後,伺服器端插件會與 LDAP 伺服器通訊,以解譯 LDAP 驗證訊息並擷取 LDAP 群組。

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

以下討論提供了有關使用 GSSAPI 方法的設定需求資訊。假設您熟悉 Kerberos 概念和操作。以下列表簡要定義了幾個常見的 Kerberos 術語。您也可以在 RFC 4120 的詞彙表中找到有用的資訊。

  • 主體:一個具名的實體,例如使用者或伺服器。

  • KDC:金鑰分配中心,包括 AS 和 TGS。

    • AS:驗證伺服器;提供取得額外票證所需的初始票證授與票證。

    • TGS:票證授予伺服器;為擁有有效 TGT 的 Kerberos 用戶端提供額外的票證。

  • TGT:票證授予票證;提交給 TGS 以取得服務存取的服務票證。

使用 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"
為 GSSAPI/Kerberos 設定伺服器端 SASL LDAP 驗證外掛程式

假設 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 可插拔驗證為 GSSAPI/Kerberos 設定伺服器端 SASL LDAP 驗證外掛程式中所述,MySQL 伺服器已使用伺服器端 SASL LDAP 外掛程式的適當設定啟動。然後,MySQL DBA 會建立一個對應於 Kerberos 主體名稱(包括網域名稱)的 MySQL 帳戶。

注意

SASL LDAP 外掛程式使用常數使用者 DN 進行 Kerberos 驗證,並忽略從 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.9 節「無登入可插拔驗證」。)如需保護代理帳戶免受直接使用的替代方法,請參閱防止直接登入代理帳戶

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

在設定好使用 GSSAPI/Kerberos 驗證的 MySQL 帳戶後,用戶端可以使用它來連線至 MySQL 伺服器。Kerberos 驗證可以在 MySQL 用戶端程式叫用之前或當時發生。

  • 在叫用 MySQL 用戶端程式之前,用戶端使用者可以從 KDC 獨立於 MySQL 取得 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 操作錯誤而失敗。MySQL DBA 可能希望避免 LDAP 驗證外掛程式出現此類轉介錯誤,即使 LDAP 轉介可能是在 ldap.conf 組態檔中全域設定。若要針對每個外掛程式設定 LDAP 伺服器在與每個外掛程式通訊時是否應使用 LDAP 轉介,請設定 authentication_ldap_simple_referralauthentication_ldap_sasl_referral 系統變數。將任一變數設定為 ONOFF 會導致對應的 LDAP 驗證外掛程式告知 LDAP 伺服器在 MySQL 驗證期間是否使用轉介。每個變數都有一個外掛程式特定效果,不會影響與 LDAP 伺服器通訊的其他應用程式。兩個變數依預設都是 OFF