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.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.4 節「用戶端明文可插拔驗證」。有關 Proxy 使用者資訊,請參閱 第 8.2.19 節「Proxy 使用者」。
如果您的系統支援 PAM 並允許 LDAP 作為 PAM 驗證方法,則另一種將 LDAP 用於 MySQL 使用者驗證的方法是使用伺服器端 authentication_pam
外掛程式。請參閱 第 8.4.1.5 節「PAM 可插拔驗證」。
若要將 LDAP 可插拔驗證用於 MySQL,必須滿足以下先決條件:
必須提供 LDAP 伺服器,以供 LDAP 驗證外掛程式進行通訊。
要由 MySQL 驗證的 LDAP 使用者必須存在於 LDAP 伺服器管理的目錄中。
在使用伺服器端
authentication_ldap_sasl
或authentication_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 使用者。如需顯示如何設定 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 驗證外掛程式。有關安裝外掛程式的一般資訊,請參閱 第 7.6.1 節「安裝和解除安裝外掛程式」。
若要讓伺服器使用,外掛程式程式庫檔案必須位於 MySQL 外掛程式目錄中(由 plugin_dir
系統變數指定的目錄)。如有必要,請在伺服器啟動時設定 plugin_dir
的值來設定外掛程式目錄位置。
伺服器端外掛程式程式庫檔案的基準名稱為 authentication_ldap_simple
和 authentication_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 可插拔驗證。
在執行 EL6 或已啟用 SELinux 的 EL 系統上,需要變更 SELinux 原則才能使 MySQL LDAP 外掛程式與 LDAP 服務通訊。
建立一個名為
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;
將安全性原則模組編譯為二進位表示法
checkmodule -M -m mysqlldap.te -o mysqlldap.mod
建立一個 SELinux 原則模組套件
semodule_package -m mysqlldap.mod -o mysqlldap.pp
安裝模組套件
semodule -i mysqlldap.pp
完成 SELinux 原則變更後,請重新啟動 MySQL 伺服器。
service mysqld restart
解除安裝 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
來移除這些設定。
對於使用 OpenLDAP 的安裝,ldap.conf
檔案會為 LDAP 用戶端提供全域預設值。可以在此檔案中設定選項來影響 LDAP 用戶端,包括 LDAP 驗證外掛程式。OpenLDAP 會按照以下優先順序使用設定選項:
如果程式庫預設值或 ldap.conf
值沒有產生適當的選項值,則 LDAP 驗證外掛程式或許可以直接設定相關變數來影響 LDAP 設定。例如,LDAP 外掛程式可以覆寫 ldap.conf
的以下參數:
TLS 設定:系統變數可用於啟用 TLS 並控制 CA 設定,例如簡單 LDAP 驗證的
authentication_ldap_simple_tls
和authentication_ldap_simple_ca_path
,以及 SASL LDAP 驗證的authentication_ldap_sasl_tls
和authentication_ldap_sasl_ca_path
。LDAP 參照。請參閱 LDAP 搜尋參照。
如需有關 ldap.conf
的詳細資訊,請參閱 ldap.conf(5)
手冊頁。
若要讓 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 驗證的預設逾時。
LDAP 驗證的逾時值可以在伺服器啟動時和執行階段調整。如果您使用這些變數之一將逾時設定為零,則您實際上會停用它,並且 MySQL 伺服器會還原為使用主機系統的預設逾時。
在以下條件組合下,authentication_ldap_sasl_connect_timeout
設定的實際等待時間會加倍,因為 (內部) 伺服器必須呼叫 TCP 連線兩次:
LDAP 伺服器離線。
正在使用連線集區 (特別是,
authentication_ldap_sasl_max_pool_size
系統變數的值大於零,這會啟用集區)。
本節說明如何啟用 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 使用者
betsy
和boris
分別驗證到betsy_ldap
和boris_ldap
的 LDAP 項目。(MySQL 和 LDAP 使用者名稱不一定要不同。在此討論中使用不同的名稱有助於釐清操作內容是 MySQL 還是 LDAP。)LDAP 項目使用
uid
屬性來指定使用者名稱。這可能會因 LDAP 伺服器而異。某些 LDAP 伺服器使用cn
屬性而非uid
作為使用者名稱。若要變更屬性,請適當修改authentication_ldap_simple_user_search_attr
或authentication_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 外掛程式。以下各節說明數種使用情境。
若要設定 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 函式庫,則需要明文密碼,但在某些配置中,這可能是一個安全問題。這些措施可以將風險降到最低。
為了降低不經意使用
mysql_clear_password
外掛程式的可能性,MySQL 用戶端必須明確啟用它(例如,使用--enable-cleartext-plugin
選項)。請參閱第 8.4.1.4 節,「用戶端明文可插拔驗證」。為了避免在使用
mysql_clear_password
外掛程式時洩漏密碼,MySQL 用戶端應使用加密連線連接到 MySQL 伺服器。請參閱第 8.3.1 節,「設定 MySQL 使用加密連線」。
驗證過程如下:
用戶端外掛程式會將
betsy
和betsy_password
作為用戶端使用者名稱和 LDAP 密碼傳送至 MySQL 伺服器。連線嘗試會與
'betsy'@'localhost'
帳戶相符。伺服器端 LDAP 外掛程式會發現此帳戶的驗證字串為'uid=betsy_ldap,ou=People,dc=example,dc=com'
,以命名 LDAP 使用者 DN。此外掛程式會將此字串和 LDAP 密碼傳送至 LDAP 伺服器。LDAP 伺服器會找到
betsy_ldap
的 LDAP 項目,且密碼相符,因此 LDAP 驗證成功。LDAP 項目沒有群組屬性,因此伺服器端外掛程式會傳回用戶端使用者名稱 (
betsy
) 作為已驗證的使用者。這與用戶端提供的使用者名稱相同,因此不會發生 Proxy,且用戶端工作階段會使用'betsy'@'localhost'
帳戶進行權限檢查。
如果相符的 LDAP 項目包含群組屬性,則該屬性值將會是已驗證的使用者名稱,且如果該值與 betsy
不同,則會發生 Proxy。如需使用群組屬性的範例,請參閱使用 Proxy 的 LDAP 驗證。
如果 CREATE USER
陳述式未包含指定 betsy_ldap
LDAP 識別名稱的 BY
子句,則驗證嘗試會使用用戶端提供的使用者名稱(在此情況下為 betsy
)。如果沒有 betsy
的 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 用戶端和伺服器之間傳送明文密碼。
LDAP 驗證外掛程式支援 Proxy,讓使用者可以以一個使用者的身分連線到 MySQL 伺服器,但同時假設另一個使用者的權限。本節說明基本的 LDAP 外掛程式 Proxy 支援。LDAP 外掛程式也支援指定群組偏好設定和 Proxy 使用者對應;請參閱LDAP 驗證群組偏好設定和對應規格。
此處所述的 Proxy 實作基於使用 LDAP 群組屬性值,以將使用 LDAP 驗證的連線 MySQL 使用者對應至其他定義不同權限集的 MySQL 帳戶。使用者不會直接透過定義權限的帳戶連線。相反地,他們會透過使用 LDAP 驗證的預設 Proxy 帳戶連線,以便將所有外部登入對應至持有權限的 Proxy MySQL 帳戶。使用 Proxy 帳戶連線的任何使用者都會對應至其中一個 Proxy MySQL 帳戶,其權限會決定允許外部使用者執行的資料庫作業。
此處的指示假設以下情境:
LDAP 項目使用
uid
和cn
屬性分別指定使用者名稱和群組值。若要使用不同的使用者和群組屬性名稱,請設定適當的外掛程式特定系統變數。對於
authentication_ldap_simple
外掛程式:設定authentication_ldap_simple_user_search_attr
和authentication_ldap_simple_group_search_attr
。對於
authentication_ldap_sasl
外掛程式:設定authentication_ldap_sasl_user_search_attr
和authentication_ldap_sasl_group_search_attr
。
這些 LDAP 項目在 LDAP 伺服器管理的目錄中可用,以提供可唯一識別每個使用者的辨別名稱值:
uid=basha,ou=People,dc=example,dc=com,cn=accounting uid=basil,ou=People,dc=example,dc=com,cn=front_office
在連線時,群組屬性值會成為已驗證的使用者名稱,因此它們會命名
accounting
和front_office
Proxy 帳戶。這些範例假設使用 SASL LDAP 驗證。針對簡易 LDAP 驗證進行適當的調整。
建立預設 Proxy MySQL 帳戶
CREATE USER ''@'%'
IDENTIFIED WITH authentication_ldap_sasl;
Proxy 帳戶定義沒有 AS '
子句來命名 LDAP 使用者 DN。因此:auth_string
'
當用戶端連線時,用戶端使用者名稱會成為要搜尋的 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)
驗證過程如下:
伺服器使用預設
''@'%'
Proxy 帳戶,驗證用戶端使用者basha
的連線。相符的 LDAP 項目為:
uid=basha,ou=People,dc=example,dc=com,cn=accounting
相符的 LDAP 項目具有群組屬性
cn=accounting
,因此accounting
會成為已驗證的 Proxy 使用者。已驗證的使用者與用戶端使用者名稱
basha
不同,因此會將basha
視為accounting
的 Proxy,且basha
會假設 Proxyaccounting
帳戶的權限。以下查詢會傳回如下所示的輸出。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
所述的過程類似。
伺服器使用預設
''@'%'
Proxy 帳戶,驗證用戶端使用者basil
的連線。相符的 LDAP 項目為:
uid=basil,ou=People,dc=example,dc=com,cn=front_office
相符的 LDAP 項目具有群組屬性
cn=front_office
,因此front_office
會成為已驗證的 Proxy 使用者。已驗證的使用者與用戶端使用者名稱
basil
不同,因此會將basil
視為front_office
的 Proxy,且basil
會假設 Proxyfront_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 使用者帳戶發生。
如使用 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
屬性所構成。
驗證字串的其餘部分以 #
開頭,表示群組偏好和映射資訊的開始。驗證字串的這部分依序列出群組名稱 grp1
、grp2
、grp3
。LDAP 插件會將此列表與 LDAP 伺服器傳回的群組名稱集合進行比較,並依列表順序查找與傳回名稱的匹配項。插件會使用第一個匹配項,如果沒有匹配項,則驗證失敗。
假設 LDAP 伺服器傳回群組 grp3
、grp2
和 grp7
。LDAP 插件會使用 grp2
,因為它是驗證字串中第一個匹配的群組,即使它不是 LDAP 伺服器傳回的第一個群組。如果 LDAP 伺服器傳回 grp4
、grp2
和 grp1
,插件會使用 grp1
,即使 grp2
也匹配。grp1
的優先順序高於 grp2
,因為它在驗證字串中較早列出。
假設插件找到群組名稱匹配項,它會執行從該群組名稱到 MySQL 代理使用者名稱的映射(如果有的話)。對於範例代理帳戶,映射如下:
如果匹配的群組名稱是
grp1
或grp3
,它們在驗證字串中分別與使用者名稱usera
和userc
相關聯。插件會使用對應的關聯使用者名稱作為代理使用者名稱。如果匹配的群組名稱是
grp2
,則驗證字串中沒有關聯的使用者名稱。插件會使用grp2
作為代理使用者名稱。
如果 LDAP 伺服器傳回 DN 格式的群組,LDAP 插件會解析群組 DN 以從中提取群組名稱。
要指定 LDAP 群組偏好和映射資訊,請套用以下原則:
驗證字串的群組偏好和映射部分以
#
前綴字元開始。群組偏好和映射規範是一個或多個項目的列表,以逗號分隔。每個項目都具有
或group_name
=user_name
group_name
的形式。項目應按群組名稱的偏好順序排列。對於插件從 LDAP 伺服器傳回的群組名稱集合中選定的群組名稱,這兩種語法的效果如下:對於指定為
的項目(帶有使用者名稱),群組名稱會映射到使用者名稱,該使用者名稱會用作 MySQL 代理使用者名稱。group_name
=user_name
對於指定為
group_name
的項目(不帶使用者名稱),群組名稱會用作 MySQL 代理使用者名稱。
要引用包含空格等特殊字元的群組或使用者名稱,請用雙引號 (
"
) 字元將其括起來。例如,如果一個項目的群組和使用者名稱分別為my group name
和my 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" "my_group_name"=my_user_name "my_group_name"="my_user_name"
要跳脫字元,請在其前面加上反斜線 (
\
)。這在特別包含原義雙引號或反斜線時很有用,否則它們不會以原義包含在內。使用者 DN 不必存在於驗證字串中,但如果存在,則它必須位於群組偏好和映射部分之前。使用者 DN 可以給定為完整使用者 DN,或帶有
+
前綴字元的使用者 DN 後綴。(請參閱LDAP 驗證使用者 DN 後綴。)
LDAP 驗證插件允許提供使用者 DN 資訊的驗證字串以 +
前綴字元開頭:
如果沒有
+
字元,則驗證字串的值會被視為原樣,不會修改。如果驗證字串以
+
開頭,插件會根據用戶端傳送的使用者名稱,以及驗證字串中指定的 DN(移除+
)來建構完整的使用者 DN 值。在建構的 DN 中,用戶端使用者名稱會成為指定 LDAP 使用者名稱的屬性的值。預設情況下,這是uid
;要變更屬性,請修改適當的系統變數 (authentication_ldap_simple_user_search_attr
或authentication_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 驗證插件使用可設定的驗證方法。適當的系統變數和可用的方法選擇是插件特定的。
對於
authentication_ldap_simple
插件:設定authentication_ldap_simple_auth_method_name
系統變數來設定方法。允許的選擇是SIMPLE
和AD-FOREST
。對於
authentication_ldap_sasl
插件:設定authentication_ldap_sasl_auth_method_name
系統變數來設定方法。允許的選擇是SCRAM-SHA-1
、SCRAM-SHA-256
和GSSAPI
。(要判斷主機系統上實際可用的 SASL LDAP 方法,請檢查Authentication_ldap_sasl_supported_methods
狀態變數的值。)
有關每個允許方法的資訊,請參閱系統變數描述。此外,根據方法的不同,可能需要額外的設定,如下節所述。
通用安全服務應用程式介面 (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 的詞彙表中找到有用的資訊。
使用 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 帳戶相關聯。)
在滿足這些假設的情況下,請依照以下步驟進行:
驗證 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 }
您可能需要在伺服器主機的
/etc/hosts
中新增一個項目。198.51.100.10 ldap_auth ldap_auth.example.com
檢查 Kerberos 驗證是否正常運作。
使用 kinit 向 Kerberos 驗證。
$> kinit bredon@MYSQL.LOCAL Password for bredon@MYSQL.LOCAL: (enter password here)
此命令會向名為
bredon@MYSQL.LOCAL
的 Kerberos 主體進行驗證。當命令提示時,請輸入主體的密碼。KDC 會傳回一個 TGT,此 TGT 會快取在用戶端以供其他支援 Kerberos 的應用程式使用。使用 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
使用此命令檢查 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 外掛程式設定如下:
--plugin-load-add
選項會載入外掛程式(請根據您的平台調整.so
字尾)。如果您先前使用INSTALL PLUGIN
陳述式載入過外掛程式,則此選項為非必要。authentication_ldap_sasl_auth_method_name
必須設定為GSSAPI
,才能使用 GSSAPI/Kerberos 作為 SASL LDAP 驗證方法。authentication_ldap_sasl_server_host
和authentication_ldap_sasl_server_port
指出 Active Directory 伺服器主機的 IP 位址和連接埠號碼以進行驗證。authentication_ldap_sasl_bind_root_dn
和authentication_ldap_sasl_bind_root_pwd
設定群組搜尋功能的根 DN 和密碼。此功能是必要的,但使用者可能沒有搜尋的權限。在這種情況下,有必要提供根 DN 資訊。在 DN 選項值中,
admin
應該是具有執行使用者搜尋權限的管理 LDAP 帳戶名稱。在密碼選項值中,
password
應該是admin
帳戶密碼。
authentication_ldap_sasl_bind_base_dn
指出使用者 DN 基本路徑,以便搜尋MYSQL.LOCAL
網域中的使用者。authentication_ldap_sasl_user_search_attr
指定標準的 Active Directory 搜尋屬性sAMAccountName
。此屬性用於搜尋以比對登入名稱;屬性值與使用者 DN 值不相同。
建立使用 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 USER
或ALTER 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 來檢查。
驗證過程如下:
用戶端使用 TGT 來使用 Kerberos 進行驗證。
伺服器會找到主體的 LDAP 條目,並使用它來驗證
bredon@MYSQL.LOCAL
MySQL 代理帳戶的連線。代理帳戶驗證字串中的群組對應資訊 (
'#krb_grp=proxied_krb_user'
) 表示已驗證的代理使用者應為proxied_krb_user
。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_tgt
為false
,但可以設定為true
,以避免重複使用 TGT。(此設定僅適用於用戶端外掛程式建立的 TGT,不適用於其他外掛程式或 MySQL 外部建立的 TGT。)
可以將 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_referral
和 authentication_ldap_sasl_referral
系統變數。將任一變數設定為 ON
或 OFF
會導致對應的 LDAP 驗證外掛程式告知 LDAP 伺服器在 MySQL 驗證期間是否使用轉介。每個變數都有一個外掛程式特定效果,不會影響與 LDAP 伺服器通訊的其他應用程式。兩個變數依預設都是 OFF
。