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 本身不能用於連線。
有關保護代理帳戶免受直接使用的其他方法,請參閱防止直接登入代理帳戶。