文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  无登录可插拔身份验证

8.4.1.8 无登录可插拔身份验证

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

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

  • 不应该允许直接登录但旨在仅通过代理帐户访问的代理帐户。

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

表 8.24 无登录身份验证的插件和库名称

插件或文件 插件或文件名
服务器端插件 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 本身不能用于连接。

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