MySQL Shell 8.4  /  ...  /  使用 LDAP 和 Kerberos 身份驗證

4.3.5 使用 LDAP 和 Kerberos 身份驗證

MySQL 企業版支援身份驗證方法,讓 MySQL 伺服器可以使用 LDAP (輕量型目錄存取協定)、具有 Kerberos 的 LDAP 或原生 Kerberos 來驗證 MySQL 使用者。MySQL Shell 支援經典 MySQL 協定連線的 LDAP 和 Kerberos 身份驗證。X 協定連線不支援此功能。

以下章節說明如何使用 LDAP 和 Kerberos 身份驗證啟用與 MySQL 伺服器的連線。假設伺服器在啟用伺服器端外掛程式的情況下執行,且用戶端外掛程式在用戶端主機上可用。

簡易 LDAP 身份驗證

MySQL 和 LDAP 協同運作以擷取使用者、憑證和群組資訊。如需簡易 LDAP 身份驗證流程的概觀,請參閱MySQL 使用者如何進行 LDAP 身份驗證。若要搭配 MySQL Shell 使用簡易 LDAP 身份驗證,必須符合下列條件

  • 必須在 MySQL 伺服器上建立使用者帳戶,該帳戶設定為與 LDAP 伺服器通訊。MySQL 使用者必須使用 authentication_ldap_simple 伺服器端外掛程式和 LDAP 使用者辨識名稱 (DN) (選擇性)。例如

    CREATE USER 'admin'@'localhost'
       IDENTIFIED WITH authentication_ldap_simple 
       BY 'uid=admin,ou=People,dc=my-domain,dc=com';

    此範例中的 BY 子句表示 MySQL 帳戶驗證的 LDAP 項目。DN 的特定屬性可能會因 LDAP 伺服器而異。

  • MySQL Shell 使用用戶端 mysql_clear_password 外掛程式,該外掛程式會以明文將密碼傳送至伺服器。不使用密碼雜湊或加密,因此必須在 MySQL Shell 和伺服器之間建立安全連線 (使用 SSL 或 Socket)。如需更多資訊,請參閱第 4.3.4 節「使用加密連線」第 4.3.3 節「使用 Unix Socket 和 Windows 具名管道連線」

  • 為了將安全風險降至最低,必須透過將 --auth-method 命令列選項的值設定為安全連線上的 clear_text_password,明確啟用 mysql_clear_password 外掛程式。例如,下列命令可讓您為先前範例中建立的使用者建立全域會話

    $> mysqlsh admin@localhost:3308 --auth-method=clear_text_password
    Please provide the password for 'admin@localhost:3308': admin_password (admin LDAP password)
    注意

    您也可以設定環境變數 LIBMYSQL_ENABLE_CLEARTEXT_PLUGIN,並為所有用戶端連線啟用 mysql_clear_password 外掛程式。不過,此方法本質上是不安全的,不建議在測試以外的任何情境中使用。如需更多資訊,請參閱用戶端明文可外掛身份驗證

基於 SASL 的 LDAP 身份驗證

MySQL 伺服器能夠接受來自 LDAP 目錄中 MySQL 授與資料表之外定義的使用者的連線。用戶端和伺服器端 SASL LDAP 外掛程式使用 SASL 訊息在 LDAP 協定中安全傳輸憑證 (請參閱使用 LDAP 可外掛身份驗證)。

對於基於 SASL 的身份驗證,MySQL 使用者必須使用 authentication_ldap_sasl 伺服器端外掛程式以及 MySQL 帳戶驗證的 LDAP 項目 (選擇性) 來識別。例如

CREATE USER 'sammy'@'localhost' 
   IDENTIFIED WITH authentication_ldap_sasl
   BY 'uid=sammy_ldap,ou=People,dc=my-domain,dc=com';

用戶端 authentication_ldap_sasl_client 外掛程式隨附於 MySQL 伺服器套件,而非內建於 libmysqlclient 用戶端程式庫中。MySQL Shell 提供持續性連線選項 shell.options.mysqlPluginDir,讓您可以定義所需外掛程式的位置。或者,您可以藉由使用非持續性命令列選項 --mysql-plugin-dir 指定路徑來覆寫持續性設定。例如,下列命令可讓您為先前範例中建立的使用者在 Linux 主機上建立全域會話

$> mysqlsh sammy@localhost:3308 --mysql-plugin-dir="/usr/local/mysql/lib/plugin"
Please provide the password for 'sammy@localhost:3308': sammy_password (sammy_ldap LDAP password)

如需其他使用範例,請參閱具有 Proxy 的 LDAP 身份驗證LDAP 身份驗證群組偏好和對應規格

透過 LDAP SASL 的 GSSAPI/Kerberos 身份驗證

MySQL Shell 也支援透過 LDAP SASL 的 Kerberos 身份驗證。使用通用安全服務應用程式程式設計介面 (GSSAPI) 安全抽象介面,此類型的連線會向 Kerberos 驗證以取得服務憑證,然後使用這些憑證來啟用對其他服務的安全存取。GSSAPI/Kerberos 僅在 Linux 上受 MySQL 伺服器和 MySQL Shell 支援作為 LDAP 身份驗證方法。

GSSAPI 程式庫和 Kerberos 服務必須可供 MySQL 伺服器使用,連線才能成功。如需伺服器端設定資訊,請參閱GSSAPI/Kerberos 身份驗證方法

下列一般範例會建立名為 lucy@MYSQL.LOCAL 的 Proxy 使用者,該使用者會承擔名為 proxied_krb_usr 的 Proxy 使用者的權限。假設領域網域 MYSQL.LOCAL 設定在 /etc/krb5.conf Kerberos 設定檔中。

注意

帳戶名稱的使用者部分包含主體網域,因此 'lucy@MYSQL.LOCAL' 會被引號括住作為 LDAP Kerberos 身份驗證的單一值。

CREATE USER 'lucy@MYSQL.LOCAL' 
   IDENTIFIED WITH authentication_ldap_sasl 
   BY '#krb_grp=proxied_krb_user';
CREATE USER 'proxied_krb_user';
GRANT ALL PRIVILEGES ON my_db.* TO 'proxied_krb_user';
GRANT PROXY on 'proxied_krb_user' TO 'lucy@MYSQL.LOCAL';

下列命令可讓您為先前範例中建立的使用者在 Linux 主機上建立全域會話。您必須指定伺服器的外掛程式目錄的位置,作為持續性 shell.options.mysqlPluginDir 連線選項或作為非持續性命令選項,例如

$> mysqlsh lucy%40MYSQL.LOCAL:password@localhost:3308/my_db 
--mysql-plugin-dir="/usr/local/mysql/lib/plugin"

在此範例中,百分比編碼 (%40) 會取代主體名稱中保留的 @ 字元,而 password 是為 MySQL 伺服器變數 authentication_ldap_sasl_bind_root_pwd 設定的值。如需與透過 LDAP SASL 進行 Kerberos 身份驗證相關的伺服器變數清單,請參閱設定用於 GSSAPI/Kerberos 的伺服器端 SASL LDAP 身份驗證外掛程式

在叫用 MySQL Shell 之前,您可以獨立於 MySQL 取得並快取來自金鑰發佈中心的票證授與票證。在此情況下,請在不指定使用者名稱或密碼選項的情況下叫用 MySQL Shell

$> mysqlsh localhost:3308/my_db --auth-method=authentication_ldap_sasl_client 
--mysql-plugin-dir="/usr/local/mysql/lib/plugin"

省略使用者憑證時,指定 --auth-method=authentication_ldap_sasl_client 選項是強制性的。

Kerberos 身份驗證

MySQL Shell 能夠為使用 authentication_kerberos 伺服器端身份驗證外掛程式的帳戶建立連線,前提是必須可從 Kerberos 取得正確的 Kerberos 票證。從 MySQL 企業版 8.0.27 開始,該功能可在執行 Linux 和 Windows 的主機上使用 (版本 8.0.26 僅支援 Linux)。如需詳細的設定資訊,請參閱Kerberos 可外掛身份驗證

Kerberos 身份驗證可以結合使用者名稱 (例如,lucy) 和使用者帳戶中指定的領域網域 (例如,MYSQL.LOCAL) 來建構使用者主體名稱 (UPN),例如 lucy@MYSQL.LOCAL。若要建立對應於 UPN lucy@MYSQL.LOCAL 的 MySQL 帳戶,請使用此陳述式

CREATE USER 'lucy' 
   IDENTIFIED WITH authentication_kerberos 
   BY 'MYSQL.LOCAL';

用戶端外掛程式會使用 UPN 和密碼來取得票證授與票證 (TGT),使用 TGT 來取得 MySQL 服務票證 (ST),並使用 ST 向 MySQL 伺服器進行身份驗證。

下列命令可讓您為先前範例中建立的使用者在 Linux 主機上建立全域會話。您必須指定伺服器的外掛程式目錄的位置,作為持續性 shell.options.mysqlPluginDir 連線選項或作為非持續性命令選項,例如

$> mysqlsh lucy:3308 --mysql-plugin-dir="/usr/local/mysql/lib/plugin"
Please provide the password for 'lucy@localhost:3308': UPN_password

在呼叫 MySQL Shell 之前,您可以獨立於 MySQL 從金鑰分發中心取得並快取 TGT。在這種情況下,呼叫 MySQL Shell 時無需指定使用者名稱或密碼選項。

$> mysqlsh localhost:3308 --auth-method=authentication_kerberos_client
--mysql-plugin-dir="/usr/local/mysql/lib/plugin"

當省略使用者憑證時,必須指定 --auth-method=authentication_kerberos_client 選項。

在 Microsoft Windows 平台上,您可以使用 plugin-authentication-kerberos-client-mode 連線選項來定義 Kerberos 用戶端模式,SSPIGSSAPI。此選項可使用以下格式:

  • 命令列選項:--plugin-authentication-kerberos-client-mode=SSPI | GSSAPI

  • 連線查詢選項:user@host:port?plugin-authentication-kerberos-client-mode=SSPI | GSSAPI

  • URI 字典選項:plugin-authentication-kerberos-client-mode': 'SSPI' | 'GSSAPI',例如

     shell.connect({'user': 'mysql', 'auth-method':'authentication_kerberos_client', 'host': '127.0.0.1', 
                    'password': 'mysqlpa$$w0rd', 'plugin-authentication-kerberos-client-mode': 'GSSAPI', 
                    'scheme': 'mysql'});

您也可以在設定檔中指定 plugin-authentication-kerberos-client-mode。如果設定檔中存在此選項,則會將其用作預設值。

如果未定義 plugin-authentication-kerberos-client-mode,則預設使用 SSPI

當使用 Kerberos 驗證連線到 MySQL 伺服器時,驗證模式具有以下行為:

  • GSSAPI:

    • 如果未提供密碼,則會從 MIT Kerberos 快取中擷取驗證票證。如果找不到有效的票證,連線將會失敗。

    • 如果提供密碼,則會從 Kerberos 伺服器擷取驗證票證,並將其儲存在 MIT Kerberos 快取中。

    • 如果未提供帳戶名稱,則會將 Windows 使用者名稱用作 MySQL 帳戶名稱。

  • SSPI:

    • 如果未提供密碼,則會使用 Windows 單一登入票證。

    • 如果提供密碼,則驗證票證會儲存在暫時的記憶體儲存空間中。