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 可插拔驗證」。
若要使用 MySQL 的 LDAP 可插拔驗證,必須滿足這些先決條件
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.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 可插拔驗證。
在執行 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 外掛程式。以下各節說明幾種使用案例。
若要為簡單 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 程式庫,但在某些組態中可能存在安全性問題。以下措施可將風險降到最低:
為了降低不慎使用
mysql_clear_password
外掛程式的可能性,MySQL 客戶端必須明確啟用它(例如,使用--enable-cleartext-plugin
選項)。請參閱第 8.4.1.3 節,「客戶端明文可插拔驗證」。為了避免在啟用
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
陳述式不包含 BY
子句來指定 betsy_ldap
LDAP 識別名稱,則驗證嘗試會使用客戶端提供的使用者名稱(在此例中為 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.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)
驗證過程如下:
伺服器會使用預設的
''@'%'
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。
如使用代理的 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
屬性所建構的。
驗證字串的其餘部分以 #
開頭,表示群組偏好和對應資訊的開始。驗證字串的這部分依序列出群組名稱 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 驗證外掛程式都會使用它。當 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 的詞彙表部分。
主體 (Principal):一個具名的實體,例如使用者或伺服器。
金鑰分配中心 (KDC):金鑰分配中心,包含 AS 和 TGS。
驗證伺服器 (AS):驗證伺服器;提供取得其他票證所需的初始票證授權票證 (TGT)。
票證授權伺服器 (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 帳戶相關聯。)
在滿足這些假設的情況下,請依照下列步驟操作:
驗證 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"
設定伺服器端 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 外掛程式設定如下:
--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 外掛程式驗證和 設定伺服器端 SASL LDAP 驗證外掛程式以使用 GSSAPI/Kerberos 中所述,MySQL 伺服器已使用適用於伺服器端 SASL LDAP 外掛程式的適當組態設定啟動。然後 MySQL DBA 會建立一個對應於 Kerberos 主體名稱(包含網域名稱)的 MySQL 帳戶。
SASL LDAP 外掛程式針對 Kerberos 驗證使用常數使用者 DN,並忽略從 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.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 來檢查。
驗證過程如下:
用戶端使用 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 作業錯誤而失敗。即使 LDAP 轉介可能在 ldap.conf
組態檔案中全域設定,MySQL DBA 也可能希望避免 LDAP 驗證外掛程式發生此類轉介錯誤。若要針對外掛程式特定地組態 LDAP 伺服器在與每個外掛程式通訊時是否應使用 LDAP 轉介,請設定 authentication_ldap_simple_referral
和 authentication_ldap_sasl_referral
系統變數。將任一變數設定為 ON
或 OFF
會導致對應的 LDAP 驗證外掛程式告知 LDAP 伺服器在 MySQL 驗證期間是否使用轉介。每個變數都有外掛程式特定的效果,並且不會影響與 LDAP 伺服器通訊的其他應用程式。預設情況下,兩個變數都為 OFF
。