Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  No-Login Pluggable Authentication

8.4.1.9 无登录插件式认证

MySQL无登录服务器端认证插件(mysql_ no_login)会阻止任何尝试连接到使用该插件的帐户。该插件的用例包括:

  • 需要执行具有提升权限的存储程序和视图,但不想将这些权限暴露给普通用户的账户。

  • 代理账户,应该永远不会直接登录,只能通过代理账户访问。

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

表8.25 无登录认证插件和库文件名

Plugin or File Plugin or File Name
服务器端插件 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。文件名后缀根据平台不同(例如,.so用于Unix和类Unix系统,.dll用于Windows)而有所不同。

要在服务器启动时加载插件,请使用--plugin-load-add选项来指定包含它的库文件。使用此类插件加载方法,每次启动服务器时都必须给出该选项。例如,在服务器my. cnf文件中放置以下行,根据您的平台调整.so后缀为必要:

[mysqld]
plugin-load-add=mysql_no_login.so

重启服务器以使新设置生效。

或者,要在运行时加载插件,请使用以下语句,根据您的平台调整.so后缀为必要:

INSTALL PLUGIN mysql_no_login SONAME 'mysql_no_login.so';

INSTALL PLUGIN立即加载插件,并将其注册到mysql.plugins系统表中,以便服务器在没有--plugin-load-add的情况下也能在正常启动时加载它。

要验证插件安装,请检查信息架构的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帐户与无登录插件关联,请参阅使用无登录插件式认证

卸载No-Login插件式认证

卸载无登录认证插件的方法取决于您是如何安装它的:

  • 如果您在服务器启动时使用--plugin-load-add选项安装了插件,请不带该选项重启服务器。

  • 如果您在运行时使用INSTALL PLUGIN语句安装了插件,该插件将会跨越服务器重启保持安装状态。要卸载它,请使用UNINSTALL PLUGIN

    UNINSTALL PLUGIN mysql_no_login;
使用No-Login插件式认证

本节描述了如何使用无登录认证插件来防止MySQL客户端程序连接到服务器。假设服务器正在运行,并且启用了无登录插件,正如安装No-Login可插拔认证中所述。

CREATE USER语句的IDENTIFIED WITH子句中引用无登录认证插件,请使用名称mysql_no_login

使用mysql_no_login进行身份验证的账户可以作为存储程序和视图对象的定义器。如果这样的对象定义还包含了SQL SECURITY DEFINER,那么它将以该账户的权限执行。数据库管理员可以利用这种行为来提供对敏感或保密数据的访问,这些数据只有通过受控接口才能暴露出来。

以下示例说明了这些原则。它定义了一个不允许客户端连接的账户,并将其与只暴露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;

普通用户尝试访问除了视图暴露的列之外的列,或者尝试通过没有被授予访问该视图权限的用户选择视图,都会导致错误。

Note

由于nologin账户不能直接使用,因此必须由具有创建对象和设置DEFINER值所需特权的root或类似账户执行设置对象所必需的操作。

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本身不能直接连接。

为了了解保护代理账户免受直接使用的其他方法,请参阅防止代理账户直接登录