服务器端身份验证插件 mysql_no_login
防止所有客户端连接到任何使用它的帐户。使用案例包括:
-
需要执行存储程序和视图的帐户,具有提升的权限,但不将这些权限暴露给普通用户。
-
代理帐户,永远不允许直接登录,但旨在仅通过代理帐户访问。
以下表格显示插件和库文件名。文件名后缀可能因系统而异。文件必须位于由 plugin_dir
系统变量命名的目录中。
表 8.26 无登录身份验证插件和库文件名
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
。文件名后缀因平台而异(例如,Unix 和 Unix-like 系统上的 .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 客户端程序连接到服务器。假设服务器正在运行无登录插件,按照 安装无登录可插拔身份验证 中所述。
要在 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
值所需的权限。
无登录插件也适用于代理场景。(有关代理概念的讨论,请参阅 第 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
本身不能用于连接。
有关防止代理帐户直接登录的替代方法,请参阅 防止代理帐户直接登录。