无登录可插入身份验证
在mysql_no_login
服务器端认证插件阻止所有客户端连接到任何帐户使用它。该插件的用例包括:
- 必须能够以提升的特权执行存储的程序和视图的帐户,而这些特权不会暴露给普通用户。
- 不能允许直接登录但只能通过代理帐户访问的代理帐户。
下表显示了插件和库文件名。文件名后缀在您的系统上可能有所不同。该文件必须位于plugin_dir
系统变量命名的目录中。
表6.20无登录身份验证的插件和库名称
插件或文件 | 插件或文件名 |
---|---|
服务器端插件 | mysql_no_login |
客户端插件 | 没有 |
库文件 | mysql_no_login.so |
以下各节提供特定于无登录可插入身份验证的安装和使用信息:
- 安装无登录可插入身份验证
- 卸载无登录可插入身份验证
- 使用无登录可插入身份验证
有关MySQL中的可插入身份验证的一般信息,有关代理用户的信息,请参见“代理用户”。
安装无登录可插入身份验证
本节介绍如何安装无登录身份验证插件。有关安装插件的一般信息,请参见“MySQL服务器插件”。
要由服务器使用,插件库文件必须位于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
修改之后my.cnf
,重新启动服务器以使新设置生效。
或者,要在运行时加载插件,请使用以下语句(.so
根据需要调整平台的后缀):
INSTALL PLUGIN mysql_no_loginSONAME 'mysql_no_login.so';
INSTALL PLUGIN
立即加载该插件,并将其注册到mysql.plugins
系统表中,以使服务器为每次后续的正常启动加载该插件,而无需--plugin-load-add
。
要验证插件安装,请检查INFORMATION_SCHEMA.PLUGINS
表或使用以下SHOW PLUGINS
语句(请参见“获取服务器插件信息”)。例如:
mysql>SELECT PLUGIN_NAME, PLUGIN_STATUSFROM 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
子句中引用无登录身份验证插件CREATE USER
,请使用name 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.myviewAS SELECT User ,Host FROM mysql.user ;
要向普通用户提供对视图的受保护访问,请执行以下操作:
GRANT SELECT ON nologindb.myviewTO 'ordinaryuser'@'localhost';
现在普通用户可以使用该视图访问它提供的有限信息:
SELECT *FROM nologindb.myview;
用户尝试访问除视图所公开的列以外的其他列会导致错误,未授权访问该视图的用户尝试从视图中进行选择也会导致错误。
注意由于
nologin
无法直接使用该帐户,因此必须由root
具有创建对象和设置DEFINER
值所需特权的帐户或类似帐户执行设置其使用的对象所需的操作。
该mysql_no_login
插件在代理方案中也很有用。(有关代理相关概念的讨论,请参见“代理用户”。)进行身份验证的帐户mysql_no_login
可以用作代理帐户的代理用户:
-- create proxied accountCREATE USER 'proxied_user'@'localhost'IDENTIFIED WITH mysql_no_login; -- grant privileges to proxied accountGRANT ...ON ...TO 'proxied_user'@'localhost'; -- permit proxy_user to be a proxy account for proxied accountGRANT PROXY ON 'proxied_user'@'localhost'TO 'proxy_user'@'localhost';
这样,客户端就可以通过代理帐户(proxy_user
)访问MySQL,但不能通过直接作为代理用户(proxied_user
)连接来绕过代理机制。使用该proxy_user
帐户进行连接的客户端具有该帐户的特权proxied_user
,但是proxied_user
不能使用其本身进行连接。
有关防止代理帐户直接使用的替代方法,请参阅防止直接登录代理帐户。