Windows 可插拔驗證是 MySQL 企業版(商業產品)中包含的擴充功能。若要深入了解商業產品,請參閱 https://mysql.dev.org.tw/products/。
適用於 Windows 的 MySQL 企業版支援在 Windows 上執行外部驗證的驗證方法,讓 MySQL 伺服器可以使用原生 Windows 服務來驗證用戶端連線。已登入 Windows 的使用者可以根據其環境中的資訊,從 MySQL 用戶端程式連線至伺服器,而無需指定額外的密碼。
用戶端和伺服器在驗證交握期間交換資料封包。在這次交換之後,伺服器會建立一個安全內容物件,代表用戶端在 Windows 作業系統中的身分。此身分包含用戶端帳戶的名稱。Windows 可插拔驗證會使用用戶端的身分來檢查其是否為給定的帳戶或群組的成員。預設情況下,協商會使用 Kerberos 進行驗證,如果 Kerberos 無法使用,則使用 NTLM。
Windows 可插拔驗證提供以下功能
外部驗證:Windows 驗證讓 MySQL 伺服器可以接受來自 MySQL 授權表之外、已登入 Windows 的使用者連線。
代理使用者支援:Windows 驗證可以傳回給 MySQL 與用戶端程式傳遞的外部使用者名稱不同的使用者名稱。這表示外掛程式可以傳回定義外部 Windows 驗證使用者應具備的權限的 MySQL 使用者。例如,名為
joe
的 Windows 使用者可以連線,並擁有名為developer
的 MySQL 使用者的權限。
下表顯示外掛程式和程式庫檔案名稱。檔案必須位於 plugin_dir
系統變數所命名的目錄中。
表 8.20 Windows 驗證的外掛程式和程式庫名稱
外掛程式或檔案 | 外掛程式或檔案名稱 |
---|---|
伺服器端外掛程式 | authentication_windows |
用戶端外掛程式 | authentication_windows_client |
程式庫檔案 | authentication_windows.dll |
程式庫檔案僅包含伺服器端外掛程式。用戶端外掛程式內建於 libmysqlclient
用戶端程式庫中。
伺服器端 Windows 驗證外掛程式僅包含在 MySQL 企業版中。它未包含在 MySQL 社群發行版中。用戶端外掛程式包含在所有發行版中,包括社群發行版。這讓任何發行版的用戶端都能連線到已載入伺服器端外掛程式的伺服器。
以下章節提供特定於 Windows 可插拔驗證的安裝和使用資訊
若要了解關於 MySQL 中可插拔驗證的一般資訊,請參閱第 8.2.17 節,「可插拔驗證」。若要了解關於代理使用者的資訊,請參閱第 8.2.19 節,「代理使用者」。
本節說明如何安裝伺服器端 Windows 驗證外掛程式。若要了解關於安裝外掛程式的一般資訊,請參閱第 7.6.1 節,「安裝和解除安裝外掛程式」。
為了讓伺服器可以使用外掛程式,外掛程式庫檔案必須位於 MySQL 外掛程式目錄中(由 plugin_dir
系統變數指定的目錄)。如有必要,請在伺服器啟動時設定 plugin_dir
的值,以設定外掛程式目錄的位置。
若要在伺服器啟動時載入外掛程式,請使用 --plugin-load-add
選項來指定包含該外掛程式的程式庫檔案名稱。使用此外掛程式載入方法,每次伺服器啟動時都必須提供此選項。例如,將以下幾行放入伺服器 my.cnf
檔案中
[mysqld]
plugin-load-add=authentication_windows.dll
修改 my.cnf
後,重新啟動伺服器以使新的設定生效。
或者,若要在執行階段載入外掛程式,請使用此語句
INSTALL PLUGIN authentication_windows SONAME 'authentication_windows.dll';
INSTALL PLUGIN
會立即載入外掛程式,並將其註冊到 mysql.plugins
系統表中,使伺服器在每次後續正常啟動時都能載入它,而無需使用 --plugin-load-add
。
若要驗證外掛程式是否已安裝,請檢查 Information Schema PLUGINS
資料表,或使用 SHOW PLUGINS
語句(請參閱 第 7.6.2 節,「取得伺服器外掛程式資訊」)。例如
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME LIKE '%windows%';
+------------------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+------------------------+---------------+
| authentication_windows | ACTIVE |
+------------------------+---------------+
如果外掛程式無法初始化,請檢查伺服器錯誤日誌以尋找診斷訊息。
若要將 MySQL 帳戶與 Windows 驗證外掛程式相關聯,請參閱使用 Windows 可插拔驗證。其他外掛程式控制由 authentication_windows_use_principal_name
和 authentication_windows_log_level
系統變數提供。請參閱 第 7.1.8 節,「伺服器系統變數」。
解除安裝 Windows 驗證外掛程式的方法取決於您安裝它的方式
如果您在伺服器啟動時使用
--plugin-load-add
選項安裝外掛程式,請在沒有該選項的情況下重新啟動伺服器。如果您在執行階段使用
INSTALL PLUGIN
語句安裝外掛程式,則它在伺服器重新啟動後仍會保持安裝狀態。若要解除安裝它,請使用UNINSTALL PLUGIN
UNINSTALL PLUGIN authentication_windows;
此外,請移除任何設定 Windows 外掛程式相關系統變數的啟動選項。
Windows 驗證外掛程式支援使用 MySQL 帳戶,以便已登入 Windows 的使用者可以連線到 MySQL 伺服器,而無需指定額外的密碼。假設伺服器正在執行伺服器端外掛程式,如安裝 Windows 可插拔驗證中所述。一旦 DBA 啟用伺服器端外掛程式並設定帳戶以使用它,用戶端就可以使用這些帳戶連線,而無需在其端進行其他設定。
若要在 CREATE USER
語句的 IDENTIFIED WITH
子句中參照 Windows 驗證外掛程式,請使用名稱 authentication_windows
。假設 Windows 使用者 Rafal
和 Tasha
應被允許連線到 MySQL,以及 Administrators
或 Power Users
群組中的任何使用者。若要進行此設定,請建立名為 sql_admin
的 MySQL 帳戶,該帳戶使用 Windows 外掛程式進行驗證
CREATE USER sql_admin
IDENTIFIED WITH authentication_windows
AS 'Rafal, Tasha, Administrators, "Power Users"';
外掛程式名稱為 authentication_windows
。AS
關鍵字後面的字串是驗證字串。它指定名為 Rafal
或 Tasha
的 Windows 使用者被允許以 MySQL 使用者 sql_admin
的身分驗證到伺服器,如同 Administrators
或 Power Users
群組中的任何 Windows 使用者一樣。後一個群組名稱包含空格,因此必須使用雙引號括起來。
在您建立 sql_admin
帳戶後,已登入 Windows 的使用者可以嘗試使用該帳戶連線到伺服器
C:\> mysql --user=sql_admin
此處不需要密碼。authentication_windows
外掛程式使用 Windows 安全性 API 來檢查哪個 Windows 使用者正在連線。如果該使用者名為 Rafal
或 Tasha
,或為 Administrators
或 Power Users
群組的成員,則伺服器會授予存取權限,並且用戶端會以 sql_admin
的身分進行驗證,並具有授予 sql_admin
帳戶的任何權限。否則,伺服器會拒絕存取。
Windows 驗證外掛程式的驗證字串語法遵循以下規則
字串由一個或多個以逗號分隔的使用者對應組成。
每個使用者對應將 Windows 使用者或群組名稱與 MySQL 使用者名稱關聯起來
win_user_or_group_name=mysql_user_name win_user_or_group_name
對於後者語法,如果未提供
mysql_user_name
值,則隱含值是由CREATE USER
語句建立的 MySQL 使用者。因此,這些語句是等效的CREATE USER sql_admin IDENTIFIED WITH authentication_windows AS 'Rafal, Tasha, Administrators, "Power Users"'; CREATE USER sql_admin IDENTIFIED WITH authentication_windows AS 'Rafal=sql_admin, Tasha=sql_admin, Administrators=sql_admin, "Power Users"=sql_admin';
值中的每個反斜線字元 (
\
) 都必須加倍,因為反斜線是 MySQL 字串中的跳脫字元。未在雙引號內的開頭和結尾空格會被忽略。
未加引號的
win_user_or_group_name
和mysql_user_name
值可以包含除等號、逗號或空格之外的任何內容。如果以雙引號引號括起
win_user_or_group_name
和/或mysql_user_name
值,則引號之間的任何內容都是值的一部分。例如,如果名稱包含空格字元,則這是必要的。雙引號內的所有字元都是合法的,但雙引號和反斜線除外。若要包含任一字元,請使用反斜線跳脫它。win_user_or_group_name
值使用 Windows 主體的傳統語法,無論是本機還是網域中的。範例(請注意反斜線的加倍)domain\\user .\\user domain\\group .\\group BUILTIN\\WellKnownGroup
當伺服器叫用外掛程式以驗證用戶端時,外掛程式會從左到右掃描驗證字串,以尋找與 Windows 使用者的使用者或群組相符的項目。如果有符合的項目,外掛程式會將對應的 mysql_user_name
返回給 MySQL 伺服器。如果沒有符合的項目,驗證將失敗。
使用者名稱比對優先於群組名稱比對。假設名為 win_user
的 Windows 使用者是 win_group
的成員,且驗證字串如下所示
'win_group = sql_user1, win_user = sql_user2'
當 win_user
連線到 MySQL 伺服器時,win_group
和 win_user
都有符合的項目。外掛程式會將使用者驗證為 sql_user2
,因為更特定的使用者比對優先於群組比對,即使群組列在驗證字串的第一個位置。
Windows 驗證始終適用於從執行伺服器的同一部電腦連線。對於跨電腦連線,兩部電腦都必須在 Microsoft Active Directory 中註冊。如果它們位於同一個 Windows 網域中,則無需指定網域名稱。也可以允許從其他網域連線,如以下範例所示
CREATE USER sql_accounting
IDENTIFIED WITH authentication_windows
AS 'SomeDomain\\Accounting';
此處,SomeDomain
是另一個網域的名稱。反斜線字元加倍,因為它是字串中的 MySQL 跳脫字元。
MySQL 支援 Proxy 使用者的概念,藉此用戶端可以使用一個帳戶連線並驗證到 MySQL 伺服器,但在連線時具有另一個帳戶的權限(請參閱第 8.2.19 節,「Proxy 使用者」)。假設您希望 Windows 使用者使用單一使用者名稱連線,但根據其 Windows 使用者和群組名稱對應到特定的 MySQL 帳戶,如下所示
local_user
和MyDomain\domain_user
本機和網域 Windows 使用者應對應到local_wlad
MySQL 帳戶。MyDomain\Developers
網域群組中的使用者應對應到local_dev
MySQL 帳戶。本機電腦管理員應對應到
local_admin
MySQL 帳戶。
若要進行此設定,請為 Windows 使用者建立 Proxy 帳戶以進行連線,並設定此帳戶,以便使用者和群組對應到適當的 MySQL 帳戶(local_wlad
、local_dev
、local_admin
)。此外,請授予 MySQL 帳戶執行其所需操作的適當權限。以下指示將使用 win_proxy
作為 Proxy 帳戶,並使用 local_wlad
、local_dev
和 local_admin
作為 Proxy 帳戶。
建立 Proxy MySQL 帳戶
CREATE USER win_proxy IDENTIFIED WITH authentication_windows AS 'local_user = local_wlad, MyDomain\\domain_user = local_wlad, MyDomain\\Developers = local_dev, BUILTIN\\Administrators = local_admin';
為了使 Proxy 能夠運作,Proxy 帳戶必須存在,因此請建立它們
CREATE USER local_wlad IDENTIFIED WITH mysql_no_login; CREATE USER local_dev IDENTIFIED WITH mysql_no_login; CREATE USER local_admin IDENTIFIED WITH mysql_no_login;
Proxy 帳戶使用
mysql_no_login
驗證外掛程式,以防止用戶端使用帳戶直接登入 MySQL 伺服器。相反,使用 Windows 進行驗證的使用者應使用win_proxy
Proxy 帳戶。(這假設已安裝該外掛程式。如需指示,請參閱 第 8.4.1.9 節,「無登入可插拔驗證」。)如需保護 Proxy 帳戶免受直接使用的其他方法,請參閱 防止直接登入 Proxy 帳戶。您也應該執行
GRANT
語句(未顯示),授予每個 Proxy 帳戶所需的 MySQL 存取權限。將每個 Proxy 帳戶的
PROXY
權限授予 Proxy 帳戶GRANT PROXY ON local_wlad TO win_proxy; GRANT PROXY ON local_dev TO win_proxy; GRANT PROXY ON local_admin TO win_proxy;
現在,Windows 使用者 local_user
和 MyDomain\domain_user
可以作為 win_proxy
連接到 MySQL 伺服器,並且在驗證後擁有驗證字串中指定帳戶的權限(在此例中為 local_wlad
)。屬於 MyDomain\Developers
群組的使用者以 win_proxy
連接時,將擁有 local_dev
帳戶的權限。屬於 BUILTIN\Administrators
群組的使用者則擁有 local_admin
帳戶的權限。
若要設定驗證,讓所有沒有自己 MySQL 帳戶的 Windows 使用者都透過代理帳戶進行連線,請將預設代理帳戶 (''@''
) 替換為上述指示中的 win_proxy
。有關預設代理帳戶的資訊,請參閱第 8.2.19 節,「代理使用者」。
如果您的 MySQL 安裝中有匿名使用者,他們可能會與預設代理使用者發生衝突。有關此問題以及解決方法的更多資訊,請參閱預設代理使用者和匿名使用者衝突。
若要在 Connector/NET 8.4 或更高版本中使用 Windows 驗證外掛程式,請參閱 Connector/NET 驗證。