扩展 MySQL 8.0  / 第 4 章 MySQL 插件 API  / 4.4 编写插件  / 4.4.9 编写认证插件  /  6.4.1.10 无登录可插入认证

6.4.1.10 无登录可插入认证

mysql_no_login服务器端身份验证插件会阻止所有客户端连接到使用它的任何帐户 。此插件的用例包括:

  • 必须能够以提升的权限执行存储的程序和视图的帐户,而不会将这些权限暴露给普通用户。

  • 永远不允许直接登录但只能通过代理帐户访问的代理帐户。

下表显示了插件和库文件名。文件名后缀在您的系统上可能不同。该文件必须位于 plugin_dir系统变量命名的目录中。

表 6.17 用于无登录身份验证的插件和库名称

插件或文件 插件或文件名
服务器端插件 mysql_no_login
客户端插件 没有任何
库文件 mysql_no_login.so

以下部分提供特定于无登录可插入身份验证的安装和使用信息:

有关 MySQL 中可插入身份验证的一般信息,请参阅第 6.2.13 节,“可插入身份验证”。有关代理用户信息,请参阅第 6.2.14 节,“代理用户”

安装无登录可插拔身份验证

本节介绍如何安装免登录认证插件。有关安装插件的一般信息,请参阅第 5.5.1 节,“安装和卸载插件”

为了被服务器使用,插件库文件必须位于MySQL插件目录(由plugin_dir系统变量命名的目录)中。plugin_dir如有必要,通过在服务器启动时 设置值来配置插件目录位置 。

插件库文件的基本名称是 mysql_no_login. 文件名后缀因平台而异(例如,.so 对于 Unix 和类 Unix 系统,.dll对于 Windows)。

要在服务器启动时加载插件,请使用 --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 语句(请参阅 第 5.5.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 客户端程序连接到服务器。假定服务器在启用无登录插件的情况下运行,如 安装无登录可插入身份验证中所述。

IDENTIFIED WITH要在语句的子句中 引用无登录身份验证插件 CREATE USER,请使用名称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

The mysql_no_login plugin is also useful in proxying scenarios. (For a discussion of concepts involved in proxying, see Section 6.2.14, “Proxy Users”.) An account that authenticates using mysql_no_login may be used as a proxied user for proxy accounts:

-- 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';

This enables clients to access MySQL through the proxy account (proxy_user) but not to bypass the proxy mechanism by connecting directly as the proxied user (proxied_user). A client who connects using the proxy_user account has the privileges of the proxied_user account, but proxied_user itself cannot be used to connect.

有关保护代理帐户不被直接使用的替代方法,请参阅 防止直接登录到代理帐户