Windows 可插拔驗證是包含在 MySQL 企業版中的擴充功能,這是一項商業產品。若要深入瞭解商業產品,請參閱 https://mysql.dev.org.tw/products/。
適用於 Windows 的 MySQL 企業版支援一種驗證方法,該方法在 Windows 上執行外部驗證,使 MySQL 伺服器能夠使用原生 Windows 服務來驗證用戶端連線。已登入 Windows 的使用者可以根據其環境中的資訊,從 MySQL 用戶端程式連線至伺服器,而無需指定其他密碼。
用戶端和伺服器在驗證交握中交換資料封包。交換的結果是,伺服器會建立一個安全內容物件,該物件代表 Windows OS 中用戶端的身份。此身分包含用戶端帳戶的名稱。Windows 可插拔驗證使用用戶端的身份來檢查其是否為給定的帳戶或群組的成員。預設情況下,協商使用 Kerberos 進行驗證,如果 Kerberos 無法使用,則使用 NTLM。
Windows 可插拔驗證提供以下功能
外部驗證:Windows 驗證使 MySQL 伺服器能夠接受來自在 MySQL 授權表之外定義、已登入 Windows 的使用者的連線。
Proxy 使用者支援:Windows 驗證可以將與用戶端程式傳遞的外部使用者名稱不同的使用者名稱傳回給 MySQL。這表示外掛程式可以傳回定義外部 Windows 驗證使用者應具有的權限的 MySQL 使用者。例如,名為
joe
的 Windows 使用者可以連線並具有名為developer
的 MySQL 使用者的權限。
下表顯示外掛程式和程式庫檔案名稱。該檔案必須位於 plugin_dir
系統變數所指定的目錄中。
表 8.19 Windows 驗證的外掛程式和程式庫名稱
外掛程式或檔案 | 外掛程式或檔案名稱 |
---|---|
伺服器端外掛程式 | authentication_windows |
用戶端外掛程式 | authentication_windows_client |
程式庫檔案 | authentication_windows.dll |
該程式庫檔案僅包含伺服器端外掛程式。用戶端外掛程式已建置在 libmysqlclient
用戶端程式庫中。
伺服器端 Windows 驗證外掛程式僅包含在 MySQL Enterprise Edition 中。它不包含在 MySQL 社群發行版本中。用戶端外掛程式包含在所有發行版本中,包括社群發行版本。這使得任何發行版本的用戶端都可以連線到已載入伺服器端外掛程式的伺服器。
以下章節提供特定於 Windows 可插拔驗證的安裝和使用資訊
如需 MySQL 中可插拔驗證的一般資訊,請參閱第 8.2.17 節「可插拔驗證」。如需 Proxy 使用者資訊,請參閱第 8.2.19 節「Proxy 使用者」。
本節說明如何安裝伺服器端 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 使用者,以及 Administrators
或 Power Users
群組中的任何 Windows 使用者,都允許以 MySQL 使用者 sql_admin
的身分驗證伺服器。後者群組名稱包含空格,因此必須使用雙引號字元括住。
在您建立 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;
被代理的帳戶使用
mysql_no_login
身份驗證外掛程式,以防止用戶使用這些帳戶直接登入 MySQL 伺服器。相反地,使用 Windows 身份驗證的使用者應該使用win_proxy
代理帳戶。(這假設該外掛程式已安裝。有關說明,請參閱 第 8.4.1.8 節,「No-Login 可插拔身份驗證」。)有關保護被代理帳戶免於直接使用的替代方法,請參閱防止直接登入被代理的帳戶。您也應該執行
GRANT
陳述式(未顯示),這些陳述式會授予每個被代理的帳戶 MySQL 存取所需的權限。授予代理帳戶每個被代理帳戶的
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 9.0 和更高版本中使用 Windows 身份驗證外掛程式與 Connector/NET 連接字串,請參閱 Connector/NET 身份驗證。