mysql_no_login
伺服器端驗證外掛程式會阻止所有用戶端連線至任何使用它的帳戶。此外掛程式的使用案例包括
必須能夠執行具有提升權限的預存程式與檢視,而不會將這些權限暴露給一般使用者的帳戶。
永遠不應允許直接登入,但僅限透過代理帳戶存取的代理帳戶。
下表顯示外掛程式與程式庫檔案名稱。檔案名稱尾碼在您的系統上可能不同。檔案必須位於 plugin_dir
系統變數所命名的目錄中。
表格 8.25 無登入驗證的外掛程式與程式庫名稱
外掛程式或檔案 | 外掛程式或檔案名稱 |
---|---|
伺服器端外掛程式 | mysql_no_login |
用戶端外掛程式 | 無 |
程式庫檔案 | mysql_no_login.so |
以下章節提供特定於無登入可插拔驗證的安裝與使用資訊
如需有關 MySQL 中可插拔驗證的一般資訊,請參閱第 8.2.17 節「可插拔驗證」。如需代理使用者資訊,請參閱第 8.2.19 節「代理使用者」。
本節說明如何安裝無登入驗證外掛程式。有關安裝外掛程式的一般資訊,請參閱第 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 帳戶與無登入外掛程式建立關聯,請參閱使用無登入可插拔驗證。
解除安裝無登入驗證外掛程式的方法取決於您安裝它的方式。
如果您在伺服器啟動時使用
--plugin-load-add
選項安裝此外掛程式,請重新啟動伺服器,而不要使用此選項。如果您在執行階段使用
INSTALL PLUGIN
陳述式安裝此外掛程式,則它會在伺服器重新啟動後仍然保持安裝狀態。若要解除安裝它,請使用UNINSTALL PLUGIN
。UNINSTALL PLUGIN mysql_no_login;
本節說明如何使用無登入驗證外掛程式來防止帳戶被用於從 MySQL 用戶端程式連線到伺服器。假設伺服器已啟用無登入外掛程式,如安裝無登入可插拔驗證中所述。
若要在 CREATE USER
陳述式的 IDENTIFIED WITH
子句中參照無登入驗證外掛程式,請使用名稱 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
帳戶無法直接使用,因此設定它使用的物件所需的操作必須由 root
或類似的帳戶執行,該帳戶具有建立物件和設定 DEFINER
值所需的權限。
mysql_no_login
外掛程式在代理案例中也很有用。(有關代理中涉及的概念的討論,請參閱第 8.2.19 節,「代理使用者」。)使用 mysql_no_login
驗證的帳戶可用作代理帳戶的代理使用者。
-- 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_user
) 存取 MySQL,但不會透過直接以被代理使用者 (proxied_user
) 的身分連線來繞過代理機制。使用 proxy_user
帳戶連線的用戶端具有 proxied_user
帳戶的權限,但 proxied_user
本身不能用於連線。
有關保護代理帳戶免受直接使用的其他方法,請參閱防止直接登入代理帳戶。