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;
普通用户尝试访问除了视图暴露的列之外的列,或者尝试通过没有被授予访问该视图权限的用户选择视图,都会导致错误。
由于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
本身不能直接连接。
为了了解保护代理账户免受直接使用的其他方法,请参阅防止代理账户直接登录。