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

8.4.1.8 Kerberos 可插拔驗證

注意

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

MySQL 企業版支援一種驗證方法,讓使用者可以使用 Kerberos 來驗證 MySQL 伺服器,前提是具備或可以取得適當的 Kerberos 票證。

此驗證方法在 MySQL 8.4 中適用於 Linux 上的 MySQL 伺服器和用戶端。在應用程式可以存取預設已啟用 Kerberos 的 Microsoft Active Directory 的 Linux 環境中,此方法非常有用。用戶端外掛程式也支援 Windows。伺服器端外掛程式仍然僅支援 Linux。

Kerberos 可插拔驗證提供以下功能

  • 外部驗證:Kerberos 驗證讓 MySQL 伺服器可以接受來自 MySQL 授權表外部的已取得正確 Kerberos 票證的使用者的連線。

  • 安全性:Kerberos 使用票證和對稱金鑰加密,在不透過網路傳送密碼的情況下進行驗證。Kerberos 驗證支援無使用者和無密碼案例。

下表顯示外掛程式和程式庫檔案名稱。您的系統上的檔案名稱後綴可能會有所不同。該檔案必須位於 plugin_dir 系統變數指定的目錄中。如需安裝資訊,請參閱安裝 Kerberos 可插拔驗證

表 8.24 Kerberos 驗證的外掛程式和程式庫名稱

外掛程式或檔案 外掛程式或檔案名稱
伺服器端外掛程式 authentication_kerberos
用戶端外掛程式 authentication_kerberos_client
程式庫檔案 authentication_kerberos.soauthentication_kerberos_client.so

伺服器端的 Kerberos 身份驗證外掛程式僅包含在 MySQL Enterprise Edition 中。MySQL 社群發行版不包含此功能。用戶端外掛程式則包含在所有發行版中,包括社群發行版。這讓任何發行版的用戶端都能連線到已載入伺服器端外掛程式的伺服器。

以下章節提供有關 Kerberos 可插拔身份驗證的特定安裝和使用資訊

關於 MySQL 中可插拔身份驗證的一般資訊,請參閱第 8.2.17 節「可插拔身份驗證」

Kerberos 可插拔身份驗證的先決條件

若要對 MySQL 使用 Kerberos 可插拔身份驗證,必須滿足以下先決條件

  • 必須提供 Kerberos 服務,供 Kerberos 身份驗證外掛程式進行通訊。

  • 每個要由 MySQL 驗證的 Kerberos 使用者(主體)都必須存在於 KDC 伺服器管理的資料庫中。

  • 在使用伺服器端或用戶端 Kerberos 身份驗證外掛程式的系統上,必須提供 Kerberos 用戶端程式庫。此外,GSSAPI 作為存取 Kerberos 身份驗證的介面,因此必須提供 GSSAPI 程式庫。

MySQL 使用者 Kerberos 身份驗證的運作方式

本節概述 MySQL 和 Kerberos 如何協同運作以驗證 MySQL 使用者。如需顯示如何設定 MySQL 帳戶以使用 Kerberos 身份驗證外掛程式的範例,請參閱使用 Kerberos 可插拔身份驗證

這裡假設您已熟悉 Kerberos 的概念和運作方式。以下列表簡要定義了幾個常見的 Kerberos 術語。您也可以參考RFC 4120 的詞彙表章節。

  • 主體:具名的實體,例如使用者或伺服器。在本討論中,某些與主體相關的術語經常出現。

    • SPN:服務主體名稱;代表服務的主體名稱。

    • UPN:使用者主體名稱;代表使用者的主體名稱。

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

    • AS:身份驗證伺服器;提供取得其他票證所需的初始票證授權票證。

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

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

  • ST:服務票證;提供對服務的存取權,例如 MySQL 伺服器提供的服務。

使用 Kerberos 進行身份驗證需要 KDC 伺服器,例如 Microsoft Active Directory 提供的伺服器。

MySQL 中的 Kerberos 身份驗證使用通用安全服務應用程式介面 (GSSAPI),這是一個安全性抽象介面。Kerberos 是可透過該抽象介面使用的特定安全性通訊協定的實例。透過使用 GSSAPI,應用程式會向 Kerberos 進行身份驗證以取得服務憑證,然後輪流使用這些憑證來啟用對其他服務的安全存取。

在 Windows 上,authentication_kerberos_client 身份驗證外掛程式支援兩種模式,用戶端使用者可以在執行階段設定,或在選項檔案中指定。

透過 Kerberos 身份驗證外掛程式,應用程式和 MySQL 伺服器能夠使用 Kerberos 身份驗證通訊協定來相互驗證使用者和 MySQL 服務。這樣一來,使用者和伺服器都能驗證彼此的身份。網路中不會傳送密碼,而 Kerberos 通訊協定訊息會受到保護,以防止竊聽和重播攻擊。

Kerberos 身份驗證遵循以下步驟,其中伺服器端和用戶端部分分別使用 authentication_kerberosauthentication_kerberos_client 身份驗證外掛程式執行。

  1. MySQL 伺服器會將其服務主體名稱傳送給用戶端應用程式。此 SPN 必須在 Kerberos 系統中註冊,並使用 authentication_kerberos_service_principal 系統變數在伺服器端設定。

  2. 用戶端應用程式使用 GSSAPI 建立 Kerberos 用戶端身份驗證工作階段,並與 Kerberos KDC 交換 Kerberos 訊息。

    • 用戶端會從身份驗證伺服器取得票證授權票證。

    • 用戶端使用 TGT 從票證授權服務取得 MySQL 的服務票證。

    如果 TGT、ST 或兩者都已在本機快取,則可以跳過或部分跳過此步驟。用戶端也可以選擇使用用戶端金鑰表檔案來取得 TGT 和 ST,而無需提供密碼。

  3. 用戶端應用程式使用 GSSAPI 將 MySQL ST 提供給 MySQL 伺服器。

  4. MySQL 伺服器使用 GSSAPI 建立 Kerberos 伺服器端身份驗證工作階段。伺服器會驗證使用者身份和使用者要求的有效性。它會使用在其服務金鑰表檔案中設定的服務金鑰來驗證 ST,以判斷身份驗證是否成功或失敗,並將身份驗證結果傳回給用戶端。

應用程式能夠使用提供的使用者名稱和密碼或使用本機快取的 TGT 或 ST 進行身份驗證(例如,使用 kinit 或類似工具建立)。因此,此設計涵蓋了從完全無使用者且無密碼的連線(從本機儲存的 Kerberos 快取取得 Kerberos 服務票證)到提供使用者名稱和密碼並用於從 KDC 取得有效的 Kerberos 服務票證,並將其傳送至 MySQL 伺服器的連線等使用案例。

如前述說明所示,MySQL Kerberos 身份驗證使用兩種金鑰表檔案

如需金鑰表檔案的相關資訊,請參閱https://web.mit.edu/kerberos/krb5-latest/doc/basic/keytab_def.html

安裝 Kerberos 可插拔身份驗證

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

注意

伺服器端外掛程式僅在 Linux 系統上支援。在 Windows 系統上,僅支援用戶端外掛程式,此程式可在 Windows 系統上用來連線到使用 Kerberos 身份驗證的 Linux 伺服器。

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

伺服器端外掛程式程式庫檔案基本名稱為 authentication_kerberos。Unix 和類 Unix 系統的檔案名稱後綴為 .so

若要在伺服器啟動時載入外掛程式,請使用 --plugin-load-add 選項來命名包含外掛程式的程式庫檔案。使用此外掛程式載入方法時,每次伺服器啟動時都必須提供選項。此外,請指定您希望設定的任何外掛程式提供的系統變數的值。外掛程式會公開這些系統變數,以啟用其操作的設定。

  • authentication_kerberos_service_principal:MySQL 服務主體名稱 (SPN)。此名稱會傳送給嘗試使用 Kerberos 進行身份驗證的用戶端。SPN 必須存在於 KDC 伺服器管理的資料庫中。預設值為 mysql/host_name@realm_name

  • authentication_kerberos_service_key_tab:用於驗證從用戶端接收的票證的金鑰表檔案。此檔案必須存在,並且包含 SPN 的有效金鑰,否則用戶端的身份驗證將會失敗。預設值為資料目錄中的 mysql.keytab

關於所有 Kerberos 身份驗證系統變數的詳細資訊,請參閱第 8.4.1.13 節「可插拔身份驗證系統變數」

若要載入外掛程式並設定它,請將如下所示的程式碼行放入您的 my.cnf 檔案中,並使用適合您安裝的系統變數值。

[mysqld]
plugin-load-add=authentication_kerberos.so
authentication_kerberos_service_principal=mysql/krbauth.example.com@MYSQL.LOCAL
authentication_kerberos_service_key_tab=/var/mysql/data/mysql.keytab

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

或者,若要在執行階段載入外掛程式,請使用此陳述式

INSTALL PLUGIN authentication_kerberos
  SONAME 'authentication_kerberos.so';

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

當您在執行階段安裝外掛程式,而未在 my.cnf 檔案中設定其系統變數時,系統變數 authentication_kerberos_service_key_tab 會設定為資料目錄中 mysql.keytab 的預設值。此系統變數的值無法在執行階段變更,因此如果您需要指定不同的檔案,您需要將設定新增至您的 my.cnf 檔案,然後重新啟動 MySQL 伺服器。例如:

[mysqld]
authentication_kerberos_service_key_tab=/var/mysql/data/mysql.keytab

如果 keytab 檔案不在正確的位置或未包含有效的 SPN 金鑰,MySQL 伺服器不會驗證此情況,但用戶端會傳回驗證錯誤,直到您解決此問題為止。

系統變數 authentication_kerberos_service_principal 可以在執行階段設定和持久化,而無需重新啟動伺服器,方法是使用 SET PERSIST 陳述式。

SET PERSIST authentication_kerberos_service_principal='mysql/krbauth.example.com@MYSQL.LOCAL';

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 = 'authentication_kerberos';
+-------------------------+---------------+
| PLUGIN_NAME             | PLUGIN_STATUS |
+-------------------------+---------------+
| authentication_kerberos | ACTIVE        |
+-------------------------+---------------+

如果外掛程式無法初始化,請檢查伺服器錯誤記錄檔以取得診斷訊息。

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

使用 Kerberos 可插拔驗證

本節說明如何讓 MySQL 帳戶能夠使用 Kerberos 可插拔驗證連線至 MySQL 伺服器。假設伺服器正在執行伺服器端外掛程式,如 安裝 Kerberos 可插拔驗證 中所述,並且用戶端外掛程式可在用戶端主機上使用。

驗證 Kerberos 可用性

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

  • Active Directory 在名為 krbauth.example.com 的主機上執行,其 IP 位址為 198.51.100.11

  • 與 MySQL 相關的 Kerberos 驗證使用 MYSQL.LOCAL 網域,並將 MYSQL.LOCAL 作為領域名稱。

  • 名為 karl@MYSQL.LOCAL 的主體已在 KDC 中註冊。(在稍後的討論中,此主體名稱會與使用 Kerberos 驗證至 MySQL 伺服器的 MySQL 帳戶建立關聯。)

在滿足這些假設條件下,請遵循此程序:

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

    [realms]
      MYSQL.LOCAL = {
        kdc = krbauth.example.com
        admin_server = krbauth.example.com
        default_domain = MYSQL.LOCAL
      }
  2. 您可能需要將伺服器主機的項目新增至 /etc/hosts

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

    1. 使用 kinit 驗證 Kerberos。

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

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

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

      $> klist
      Ticket cache: FILE:/tmp/krb5cc_244306
      Default principal: karl@MYSQL.LOCAL
      
      Valid starting       Expires              Service principal
      03/23/2021 08:18:33  03/23/2021 18:18:33  krbtgt/MYSQL.LOCAL@MYSQL.LOCAL
建立使用 Kerberos 驗證的 MySQL 帳戶

使用 authentication_kerberos 驗證外掛程式的 MySQL 驗證是基於 Kerberos 使用者主體名稱 (UPN)。此處的指示假設名為 karl 的 MySQL 使用者使用 Kerberos 驗證至 MySQL,Kerberos 領域名為 MYSQL.LOCAL,且使用者主體名稱為 karl@MYSQL.LOCAL。此 UPN 必須在多個位置註冊:

  • Kerberos 管理員應將使用者名稱註冊為 Kerberos 主體。此名稱包含領域名稱。用戶端使用主體名稱和密碼向 Kerberos 驗證,並取得票證授予票證 (TGT)。

  • MySQL DBA 應建立與 Kerberos 主體名稱對應的帳戶,並使用 Kerberos 外掛程式進行驗證。

假設 Kerberos 使用者主體名稱已由適當的服務管理員註冊,並且如先前在 安裝 Kerberos 可插拔驗證 中所述,MySQL 伺服器已使用伺服器端 Kerberos 外掛程式的適當組態設定啟動。若要建立與 user@realm_name 的 Kerberos UPN 對應的 MySQL 帳戶,MySQL DBA 會使用類似以下的陳述式:

CREATE USER user
  IDENTIFIED WITH authentication_kerberos
  BY 'realm_name';

user 命名的帳戶可以包含或省略主機名稱部分。如果省略主機名稱,則會像平常一樣預設為 %realm_name 會儲存為 mysql.user 系統表格中該帳戶的 authentication_string 值。

若要建立與 UPN karl@MYSQL.LOCAL 對應的 MySQL 帳戶,請使用此陳述式:

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

如果 MySQL 必須建構此帳戶的 UPN,例如,取得或驗證票證(TGT 或 ST),它會藉由結合帳戶名稱(忽略任何主機名稱部分)和領域名稱來執行此操作。例如,前述 CREATE USER 陳述式產生的完整帳戶名稱為 'karl'@'%'。MySQL 會從使用者名稱部分 karl(忽略主機名稱部分)和領域名稱 MYSQL.LOCAL 建構 UPN,以產生 karl@MYSQL.LOCAL

注意

請注意,當建立使用 authentication_kerberos 驗證的帳戶時,CREATE USER 陳述式不會將 UPN 領域做為使用者名稱的一部分。而是將領域(在本例中為 MYSQL.LOCAL)指定為 BY 子句中的驗證字串。這與建立使用 authentication_ldap_sasl SASL LDAP 驗證外掛程式搭配 GSSAPI/Kerberos 驗證方法的帳戶不同。對於這類帳戶,CREATE USER 陳述式的確會將 UPN 領域做為使用者名稱的一部分。請參閱 建立使用 GSSAPI/Kerberos 進行 LDAP 驗證的 MySQL 帳戶

設定帳戶後,用戶端可以使用它來連線至 MySQL 伺服器。程序取決於用戶端主機執行 Linux 還是 Windows,如下面的討論所示。

authentication_kerberos 的使用受到限制,即不支援具有相同使用者部分但領域部分不同的 UPN。例如,您無法建立與以下這兩個 UPN 對應的 MySQL 帳戶:

kate@MYSQL.LOCAL
kate@EXAMPLE.COM

這兩個 UPN 的使用者部分都是 kate,但在領域部分不同(MYSQL.LOCALEXAMPLE.COM)。這是被禁止的。

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

在設定使用 Kerberos 驗證的 MySQL 帳戶後,用戶端可以按照以下方式使用它來連線至 MySQL 伺服器:

  1. 使用使用者主體名稱 (UPN) 及其密碼驗證 Kerberos,以取得票證授予票證 (TGT)。

  2. 使用 TGT 取得 MySQL 的服務票證 (ST)。

  3. 透過出示 MySQL ST 驗證至 MySQL 伺服器。

第一步(驗證至 Kerberos)可以透過各種方式執行:

  • 在連線至 MySQL 之前:

    • 在 Linux 或 Windows 的 GSSAPI 模式下,呼叫 kinit 以取得 TGT 並將其儲存在 Kerberos 認證快取中。

    • 在 Windows 的 SSPI 模式下,驗證可能已在登入時完成,這會將已登入使用者的 TGT 儲存在 Windows 的記憶體內快取中。kinit 不會使用,且沒有 Kerberos 快取。

  • 連線至 MySQL 時,如果用戶端程式可以判斷所需的 Kerberos UPN 和密碼,它可以自行取得 TGT。

    • 該資訊可以來自命令選項或作業系統等來源。

    • 在 Linux 上,用戶端也可以使用 keytab 檔案或 /etc/krb5.conf 組態檔案。Windows 用戶端在 GSSAPI 模式下使用組態檔案。Windows 用戶端在 SSPI 模式下則不使用任何檔案。

連線至 MySQL 伺服器的用戶端命令詳細資訊在 Linux 和 Windows 上有所不同,因此會分別討論每種主機類型,但這些命令屬性無論主機類型為何都適用。

  • 每個顯示的命令都包含以下選項,但在某些情況下可以省略其中每個選項。

    • --default-auth 選項指定用戶端驗證外掛程式的名稱 (authentication_kerberos_client)。當指定 --user 選項時,可以省略此選項,因為在這種情況下,MySQL 可以從 MySQL 伺服器傳送的使用者帳戶資訊中判斷外掛程式。

    • --plugin-dir 選項會向用戶端程式指示 authentication_kerberos_client 外掛程式的位置。如果外掛程式安裝在預設(編譯時內建)位置,則可以省略此選項。

  • 命令也應包含任何其他選項,例如 --host--port,這些選項是指定要連線的 MySQL 伺服器所必需的。

  • 在單行中輸入每個命令。如果命令包含 --password 選項來請求密碼,請在出現提示時輸入與 MySQL 使用者相關聯的 Kerberos UPN 密碼。

Linux 用戶端的連線命令

在 Linux 上,連線至 MySQL 伺服器的適當用戶端命令會有所不同,具體取決於該命令是使用 Kerberos 快取中的 TGT 進行驗證,還是基於 MySQL 使用者名稱和 UPN 密碼的命令選項進行驗證。

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

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

    產生的 UPN 的 TGT 會被快取,並且可供其他可感知 Kerberos 的應用程式使用,例如使用用戶端 Kerberos 驗證外掛程式的程式。在這種情況下,請呼叫用戶端而不指定使用者名稱或密碼選項。

    mysql
      --default-auth=authentication_kerberos_client
      --plugin-dir=path/to/plugin/directory

    用戶端外掛程式會在快取中找到 TGT,使用它來取得 MySQL ST,並使用 ST 來向 MySQL 伺服器驗證。

    正如剛才所述,當 UPN 的 TGT 被快取時,用戶端命令中不需要使用者名稱和密碼選項。如果命令無論如何都包含它們,則會按如下方式處理它們。

    • 此命令包含使用者名稱選項。

      mysql
        --default-auth=authentication_kerberos_client
        --plugin-dir=path/to/plugin/directory
        --user=karl

      在這種情況下,如果選項指定的使用者名稱與 TGT 中 UPN 的使用者名稱部分不符,驗證就會失敗。

    • 此命令包含密碼選項,您會在出現提示時輸入密碼。

      mysql
        --default-auth=authentication_kerberos_client
        --plugin-dir=path/to/plugin/directory
        --password

      在這種情況下,用戶端外掛程式會忽略密碼。由於驗證基於 TGT,因此即使使用者提供的密碼不正確,驗證也可能會成功。因此,如果找到有效的 TGT 導致密碼被忽略,則外掛程式會產生警告。

  • 如果 Kerberos 快取不包含 TGT,則用戶端 Kerberos 驗證外掛程式本身可以從 KDC 取得 TGT。使用 MySQL 使用者名稱和密碼的選項呼叫用戶端,然後在出現提示時輸入 UPN 密碼。

    mysql --default-auth=authentication_kerberos_client
      --plugin-dir=path/to/plugin/directory
      --user=karl
      --password

    用戶端 Kerberos 驗證外掛程式會合併使用者名稱 (karl) 和使用者帳戶中指定的領域 (MYSQL.LOCAL) 來建構 UPN (karl@MYSQL.LOCAL)。用戶端外掛程式會使用 UPN 和密碼來取得 TGT,使用 TGT 來取得 MySQL ST,並使用 ST 來向 MySQL 伺服器驗證。

    或者,假設 Kerberos 快取不包含 TGT,並且該命令指定了密碼選項,但沒有指定使用者名稱選項。

    mysql --default-auth=authentication_kerberos_client
      --plugin-dir=path/to/plugin/directory
      --password

    用戶端 Kerberos 驗證外掛程式會使用作業系統登入名稱作為 MySQL 使用者名稱。它會合併該使用者名稱和使用者 MySQL 帳戶中的領域來建構 UPN。用戶端外掛程式會使用 UPN 和密碼來取得 TGT,使用 TGT 來取得 MySQL ST,並使用 ST 來向 MySQL 伺服器驗證。

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

注意

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

SSPI 模式中 Windows 用戶端的連線命令

在 Windows 上,使用預設的用戶端外掛程式選項 (SSPI) 時,連線至 MySQL 伺服器的適當用戶端命令會有所不同,具體取決於該命令是基於 MySQL 使用者名稱和 UPN 密碼的命令選項進行驗證,還是改為使用 Windows 記憶體快取中的 TGT。如需 Windows 上 GSSAPI 模式的詳細資訊,請參閱GSSAPI 模式中 Windows 用戶端的命令

命令可以明確指定 MySQL 使用者名稱和 UPN 密碼的選項,或者該命令可以省略這些選項。

  • 此命令包含 MySQL 使用者名稱和 UPN 密碼的選項。

    mysql --default-auth=authentication_kerberos_client
      --plugin-dir=path/to/plugin/directory
      --user=karl
      --password

    用戶端 Kerberos 驗證外掛程式會合併使用者名稱 (karl) 和使用者帳戶中指定的領域 (MYSQL.LOCAL) 來建構 UPN (karl@MYSQL.LOCAL)。用戶端外掛程式會使用 UPN 和密碼來取得 TGT,使用 TGT 來取得 MySQL ST,並使用 ST 來向 MySQL 伺服器驗證。

    Windows 記憶體快取中的任何資訊都會被忽略;使用者名稱和密碼選項值優先。

  • 此命令包含 UPN 密碼的選項,但不包含 MySQL 使用者名稱的選項。

    mysql
      --default-auth=authentication_kerberos_client
      --plugin-dir=path/to/plugin/directory
      --password

    用戶端 Kerberos 驗證外掛程式會使用登入的使用者名稱作為 MySQL 使用者名稱,並合併該使用者名稱和使用者 MySQL 帳戶中的領域來建構 UPN。用戶端外掛程式會使用 UPN 和密碼來取得 TGT,使用 TGT 來取得 MySQL ST,並使用 ST 來向 MySQL 伺服器驗證。

  • 此命令不包含 MySQL 使用者名稱或 UPN 密碼的選項。

    mysql
      --default-auth=authentication_kerberos_client
      --plugin-dir=path/to/plugin/directory

    用戶端外掛程式會從 Windows 記憶體快取取得 TGT,使用 TGT 來取得 MySQL ST,並使用 ST 來向 MySQL 伺服器驗證。

    此方法要求用戶端主機是 Windows Server Active Directory (AD) 網域的一部分。如果不是這種情況,請手動輸入 AD 伺服器和領域作為 DNS 伺服器和前置詞,以協助 MySQL 用戶端探索 AD 網域的 IP 位址。

    1. 啟動 console.exe 並選取網路和共用中心

    2. 從網路和共用中心視窗的側邊欄中,選取變更介面卡設定

    3. 在網路連線視窗中,以滑鼠右鍵按一下要設定的網路或 VPN 連線,然後選取內容

    4. 網路索引標籤中,找到並按一下網際網路通訊協定第 4 版 (TCP/IPv4),然後按一下內容

    5. 按一下網際網路通訊協定第 4 版 (TCP/IPv4) 內容對話方塊中的進階。進階 TCP/IP 設定對話方塊會開啟。

    6. DNS索引標籤中,將 Active Directory 伺服器和領域新增為 DNS 伺服器和前置詞。

  • 此命令包含 MySQL 使用者名稱的選項,但不包含 UPN 密碼的選項。

    mysql
      --default-auth=authentication_kerberos_client
      --plugin-dir=path/to/plugin/directory
      --user=karl

    用戶端 Kerberos 驗證外掛程式會將使用者名稱選項指定的名稱與登入的使用者名稱進行比較。如果名稱相同,外掛程式會使用登入的使用者 TGT 進行驗證。如果名稱不同,驗證就會失敗。

GSSAPI 模式中 Windows 用戶端的連線命令

在 Windows 上,用戶端使用者必須使用 plugin_authentication_kerberos_client_mode 外掛程式選項明確指定 GSSAPI 模式,才能透過 MIT Kerberos 程式庫啟用支援。預設模式為 SSPI (請參閱SSPI 模式中 Windows 用戶端的命令)。

可以指定 GSSAPI 模式。

  • 在選項檔案中呼叫 MySQL 用戶端程式之前。外掛程式變數名稱使用底線或破折號都有效。

    [mysql]
    plugin_authentication_kerberos_client_mode=GSSAPI

    [mysql]
    plugin-authentication-kerberos-client-mode=GSSAPI
  • 在執行時,從命令列中使用 mysqlmysqldump 用戶端程式。例如,下列命令 (帶有底線或破折號) 會導致 mysql 透過 Windows 上的 MIT Kerberos 程式庫連線至伺服器。

    mysql [connection-options] --plugin_authentication_kerberos_client_mode=GSSAPI

    mysql [connection-options] --plugin-authentication-kerberos-client-mode=GSSAPI
  • 用戶端使用者可以從 MySQL Workbench 和某些 MySQL 連接器中選取 GSSAPI 模式。在執行 Windows 的用戶端主機上,您可以覆寫預設位置。

    • 透過設定 KRB5_CONFIG 環境變數來覆寫 Kerberos 組態檔案。

    • 透過設定 KRB5CCNAME 環境變數來覆寫預設認證快取名稱 (例如,KRB5CCNAME=DIR:/mydir/)。

    如需特定的用戶端外掛程式資訊,請參閱 https://mysqldev.dev.org.tw/doc/ 上的文件。

連線至 MySQL 伺服器的適當用戶端命令會有所不同,具體取決於該命令是使用 MIT Kerberos 快取中的 TGT 進行驗證,還是基於 MySQL 使用者名稱和 UPN 密碼的命令選項進行驗證。透過 Windows 上 MIT 程式庫的 GSSAPI 支援與 Linux 上的 GSSAPI 類似 (請參閱Linux 用戶端的命令),但以下例外情況除外:

  • 票證一律會從執行 Windows 的主機上的 MIT Kerberos 快取中擷取或放入其中。

  • kinit 在 Windows 上以具有狹窄權限和特定角色的功能帳戶執行。用戶端使用者不知道 kinit 密碼。如需概觀,請參閱 https://docs.oracle.com/en/java/javase/11/tools/kinit.html

  • 如果用戶端使用者提供密碼,Windows 上的 MIT Kerberos 程式庫會決定是否使用該密碼或依賴現有的票證。

  • Kerberos 驗證的用戶端組態參數中描述的 destroy_tickets 參數不被支援,因為 Windows 上的 MIT Kerberos 程式庫不支援從組態檔讀取其值的必要 API 成員 (get_profile_boolean)。

Kerberos 驗證的用戶端組態參數

本節僅適用於執行 Linux 的用戶端主機,不適用於執行 Windows 的用戶端主機。

注意

一般而言,將 authentication_kerberos_client 用戶端 Kerberos 外掛程式設定為 GSSAPI 模式的 Windows 用戶端主機確實支援用戶端組態參數,但 Windows 上的 MIT Kerberos 程式庫不支援本節中描述的 destroy_tickets 參數。

如果 MySQL 用戶端應用程式調用時不存在有效的票證授予票證 (TGT),則應用程式本身可能會取得並快取 TGT。如果在 Kerberos 驗證過程中,用戶端應用程式導致快取 TGT,則可以在不再需要後,透過設定適當的組態參數,銷毀任何新增的 TGT。

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

[appdefaults]
  mysql = {
    destroy_tickets = true
  }

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

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

在用戶端主機上,可以使用用戶端金鑰表檔案來取得 TGT 和 TS,而無需提供密碼。有關金鑰表檔案的資訊,請參閱 https://web.mit.edu/kerberos/krb5-latest/doc/basic/keytab_def.html

Kerberos 驗證偵錯

AUTHENTICATION_KERBEROS_CLIENT_LOG 環境變數啟用或停用 Kerberos 驗證的偵錯輸出。

注意

儘管名稱 AUTHENTICATION_KERBEROS_CLIENT_LOG 中有 CLIENT,但相同的環境變數也適用於伺服器端外掛程式和用戶端外掛程式。

在伺服器端,允許的值為 0 (關閉) 和 1 (開啟)。記錄訊息會寫入伺服器錯誤記錄檔,受伺服器錯誤記錄詳細程度的限制。例如,如果您使用基於優先順序的記錄篩選,log_error_verbosity 系統變數會控制詳細程度,如第 7.4.2.5 節「基於優先順序的錯誤記錄篩選 (log_filter_internal)」中所述。

在用戶端,允許的值為 1 到 5,並且會寫入標準錯誤輸出。下表顯示每個記錄層級值的含義。

記錄層級 含義
1 或未設定 不記錄
2 錯誤訊息
3 錯誤和警告訊息
4 錯誤、警告和資訊訊息
5 錯誤、警告、資訊和偵錯訊息