文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  Kerberos 可插拔式身份驗證

8.4.1.7 Kerberos 可插拔式身份驗證

注意

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

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

此身份驗證方法適用於 Linux 上 MySQL 伺服器與用戶端的 MySQL 9.0。它在應用程式可存取 Microsoft Active Directory (預設已啟用 Kerberos) 的 Linux 環境中很有用。用戶端外掛程式也支援 Windows。伺服器端外掛程式仍僅支援 Linux。

Kerberos 可插拔式身份驗證提供這些功能

  • 外部身份驗證:Kerberos 身份驗證可讓 MySQL 伺服器接受來自 MySQL 授權表格之外定義的使用者的連線,這些使用者已取得正確的 Kerberos 票證。

  • 安全性:Kerberos 使用票證與對稱金鑰密碼編譯,可在不透過網路傳送密碼的情況下啟用身份驗證。Kerberos 身份驗證支援無使用者和無密碼的情境。

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

表 8.23 Kerberos 身份驗證的外掛程式與程式庫名稱

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

伺服器端 Kerberos 身份驗證外掛程式僅包含在 MySQL 企業版中。它不包含在 MySQL 社群發行版本中。用戶端外掛程式包含在所有發行版本中,包括社群發行版本。這可讓任何發行版本的用戶端連線到已載入伺服器端外掛程式的伺服器。

以下章節提供 Kerberos 可插拔式身份驗證專用的安裝與使用資訊

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

Kerberos 可插拔式身份驗證的必要條件

若要將 Kerberos 可插拔式身份驗證用於 MySQL,必須符合以下必要條件

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

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

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

Kerberos 驗證 MySQL 使用者的方式

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

此處假設您熟悉 Kerberos 的概念和操作。以下列表簡要定義了幾個常見的 Kerberos 術語。您可能也會發現 RFC 4120 的詞彙表章節很有幫助。

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

    • SPN:服務主體名稱 (Service principal name);代表服務的主體名稱。

    • UPN:使用者主體名稱 (User principal name);代表使用者的主體名稱。

  • KDC:金鑰發布中心 (key distribution center),包含 AS 和 TGS

    • AS:驗證伺服器 (authentication server);提供取得額外票證所需的初始票證授權票證。

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

  • TGT:票證授權票證 (ticket-granting ticket);呈現給 TGS 以取得服務存取的服務票證。

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

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

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

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

  • SSPI 模式:安全性支援提供者介面 (Security Support Provider Interface, SSPI) 實作 GSSAPI(請參閱SSPI 模式下 Windows 用戶端的命令)。SSPI 在連線層級與 GSSAPI 相容,但僅支援 Windows 單一登入情境,且特別指已登入的使用者。SSPI 是大多數 Windows 用戶端的預設模式。

  • GSSAPI 模式:透過 Windows 上的 MIT Kerberos 程式庫支援 GSSAPI(請參閱GSSAPI 模式下 Windows 用戶端的命令)。

使用 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. 使用 GSSAPI,MySQL 伺服器會建立 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.12 節「可插拔驗證系統變數」

若要載入外掛程式並設定它,請將以下行放入您的 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

如果金鑰表檔案不在正確的位置或不包含有效的 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,以供其他可感知 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 外掛程式的適當設定啟動。若要建立與 UPN 為 user@realm_name 的 Kerberos 對應的 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 上或在 GSSAPI 模式下的 Windows 上,呼叫 kinit 以取得 TGT 並將其儲存到 Kerberos 憑證快取中。

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

  • 在連線到 MySQL 時,如果用戶端程式可以判斷所需的 Kerberos UPN 和密碼,則該程式本身可以取得 TGT

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

    • 在 Linux 上,用戶端也可以使用金鑰索引標籤檔案或 /etc/krb5.conf 設定檔。GSSAPI 模式下的 Windows 用戶端使用設定檔。SSPI 模式下的 Windows 用戶端都不使用。

用於連線到 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 的用戶端主機上,您可以覆寫預設位置。

    • Kerberos 組態檔,方法是設定 KRB5_CONFIG 環境變數。

    • 使用 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,而不適用於其他外掛程式或在 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 錯誤、警告、資訊和偵錯訊息