文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  無登入可插拔驗證

8.4.1.9 無登入可插拔驗證

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 本身不能用於連線。

有關保護代理帳戶免受直接使用的其他方法,請參閱防止直接登入代理帳戶