6.4.1.10 无登录可插入身份验证

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

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

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

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

table6.17 无登录身份验证的插件和库名称

插件或文件插件或文件名
Server-side pluginmysql_no_login
Client-side pluginNone
Library filemysql_no_login.so

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

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

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

本节介绍如何安装无登录身份验证插件。有关安装插件的一般信息,请参见第 5.5.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系统 table 中,以使服务器为每次后续的正常启动加载该插件,而无需--plugin-load-add

要验证插件安装,请检查INFORMATION_SCHEMA.PLUGINStable 或使用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;
使用无登录可插入身份验证

本节介绍如何使用无登录身份验证插件来防止帐户用于将 MySQLClient 端程序连接到服务器。如安装无登录可插入身份验证所述,假定服务器在启用了无登录插件的情况下运行。

要在CREATE USER语句的IDENTIFIED WITH子句中引用无登录身份验证插件,请使用名称mysql_no_login

使用mysql_no_login进行身份验证的帐户可用作存储的程序和视图对象的DEFINER。如果此类对象定义还包含SQL SECURITY DEFINER,则它将使用该帐户的特权执行。 DBA 可以使用此行为来提供对仅通过严格控制的界面公开的机密或敏感数据的访问。

以下示例说明了这些原理。它定义了一个不允许 Client 端连接的帐户,并与该帐户关联一个仅公开mysql.user系统 table 中某些列的视图:

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帐户,因此必须由root或具有创建对象和设置DEFINER值所需特权的类似帐户执行设置其使用的对象所需的操作。

mysql_no_login插件在代理方案中也很有用。 (有关代理相关概念的讨论,请参阅第 6.2.14 节“代理用户”。)使用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';

这使 Client 端可以通过代理帐户(proxy_user)访问 MySQL,但不能通过直接作为代理用户(proxied_user)连接来绕过代理机制。使用proxy_user帐户进行连接的 Client 端具有proxied_user帐户的特权,但是proxied_user本身不能用于连接。

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