mysql_no_login
伺服器端驗證外掛程式會阻止所有用戶端連線到任何使用它的帳戶。此外掛程式的使用案例包括:
必須能夠執行具有提升權限的儲存程式和檢視,而不會將這些權限暴露給一般使用者的帳戶。
不應允許直接登入,但僅能透過 Proxy 帳戶存取的 Proxy 帳戶。
下表顯示外掛程式和程式庫檔案名稱。檔案名稱字尾在您的系統上可能有所不同。檔案必須位於 plugin_dir
系統變數所命名的目錄中。
以下各節提供特定於無登入可插拔式驗證的安裝和使用資訊
如需 MySQL 中可插拔式驗證的一般資訊,請參閱第 8.2.17 節,「可插拔式驗證」。如需 Proxy 使用者資訊,請參閱第 8.2.19 節,「Proxy 使用者」。
本節說明如何安裝無登入驗證外掛程式。如需安裝外掛程式的一般資訊,請參閱第 7.6.1 節,「安裝和解除安裝外掛程式」。
為了讓伺服器可以使用,外掛程式程式庫檔案必須位於 MySQL 外掛程式目錄中(由 plugin_dir
系統變數命名的目錄)。如有必要,請在伺服器啟動時設定 plugin_dir
的值來設定外掛程式目錄位置。
外掛程式程式庫檔案基本名稱為 mysql_no_login
。檔案名稱字尾依平台而異(例如,Unix 和類似 Unix 的系統為 .so
,Windows 為 .dll
)。
若要在伺服器啟動時載入外掛程式,請使用 --plugin-load-add
選項來命名包含該外掛程式的程式庫檔案。使用此外掛程式載入方法,每次啟動伺服器時都必須提供此選項。例如,將這些行放入伺服器 my.cnf
檔案中,並根據您的平台需要調整 .so
字尾
[mysqld]
plugin-load-add=mysql_no_login.so
修改 my.cnf
之後,請重新啟動伺服器,使新設定生效。
或者,若要在執行階段載入外掛程式,請使用此陳述式,並根據您的平台需要調整 .so
後綴。
INSTALL PLUGIN mysql_no_login SONAME 'mysql_no_login.so';
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 '%login%';
+----------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+----------------+---------------+
| mysql_no_login | ACTIVE |
+----------------+---------------+
如果外掛程式初始化失敗,請檢查伺服器錯誤日誌以取得診斷訊息。
若要將 MySQL 帳戶與 no-login 外掛程式建立關聯,請參閱使用 No-Login 可插拔驗證。
解除安裝 no-login 驗證外掛程式的方法取決於您安裝它的方式。
如果您在伺服器啟動時使用
--plugin-load-add
選項安裝外掛程式,請重新啟動伺服器而不使用該選項。如果您在執行階段使用
INSTALL PLUGIN
陳述式安裝外掛程式,它會在伺服器重新啟動後仍然保持安裝狀態。若要解除安裝它,請使用UNINSTALL PLUGIN
。UNINSTALL PLUGIN mysql_no_login;
本節說明如何使用 no-login 驗證外掛程式,以防止帳戶被用於從 MySQL 用戶端程式連線至伺服器。假設伺服器已啟用 no-login 外掛程式,如安裝 No-Login 可插拔驗證中所述。
若要在 CREATE USER
陳述式的 IDENTIFIED WITH
子句中參照 no-login 驗證外掛程式,請使用名稱 mysql_no_login
。
使用 mysql_no_login
驗證的帳戶可以用作儲存程式和檢視物件的 DEFINER
。如果此類物件定義也包括 SQL SECURITY DEFINER
,則它會以該帳戶的權限執行。DBA 可以使用此行為來提供對機密或敏感資料的存取,這些資料僅透過良好控制的介面公開。
以下範例說明這些原則。它定義了一個不允許用戶端連線的帳戶,並將其與一個僅公開 mysql.user
系統資料表特定欄位的檢視建立關聯。
CREATE DATABASE nologindb;
CREATE USER 'nologin'@'localhost'
IDENTIFIED WITH mysql_no_login;
GRANT ALL ON nologindb.*
TO 'nologin'@'localhost';
GRANT SELECT ON mysql.user
TO 'nologin'@'localhost';
CREATE DEFINER = 'nologin'@'localhost'
SQL SECURITY DEFINER
VIEW nologindb.myview
AS SELECT User, Host FROM mysql.user;
若要向一般使用者提供受保護的檢視存取權,請執行此操作:
GRANT SELECT ON nologindb.myview
TO 'ordinaryuser'@'localhost';
現在,一般使用者可以使用該檢視來存取它所呈現的有限資訊。
SELECT * FROM nologindb.myview;
使用者嘗試存取該檢視未公開的其他欄位會導致錯誤,未被授予存取檢視權限的使用者嘗試從檢視中選擇也會導致錯誤。
由於 nologin
帳戶無法直接使用,因此設定它所使用物件所需的操作必須由具有建立物件和設定 DEFINER
值所需權限的 root
或類似帳戶執行。
mysql_no_login
外掛程式在 Proxy 情境中也很有用。(有關 Proxy 涉及的概念討論,請參閱第 8.2.19 節「Proxy 使用者」。)使用 mysql_no_login
驗證的帳戶可以用作 Proxy 帳戶的 Proxy 使用者。
-- create proxied account
CREATE USER 'proxied_user'@'localhost'
IDENTIFIED WITH mysql_no_login;
-- grant privileges to proxied account
GRANT ...
ON ...
TO 'proxied_user'@'localhost';
-- permit proxy_user to be a proxy account for proxied account
GRANT PROXY
ON 'proxied_user'@'localhost'
TO 'proxy_user'@'localhost';
這讓用戶端能夠透過 Proxy 帳戶(proxy_user
)存取 MySQL,但不能透過直接以被 Proxy 使用者(proxied_user
)身分連線來繞過 Proxy 機制。使用 proxy_user
帳戶連線的用戶端具有 proxied_user
帳戶的權限,但 proxied_user
本身不能用於連線。
有關保護被 Proxy 帳戶免受直接使用的其他方法,請參閱防止直接登入被 Proxy 帳戶。