龙空技术网

MySQL8认证插件——No-Login Pluggable Authentication

贺浦力特 88

前言:

如今各位老铁们对“mysqlnoprivileges”大约比较讲究,小伙伴们都想要知道一些“mysqlnoprivileges”的相关资讯。那么小编也在网络上网罗了一些有关“mysqlnoprivileges””的相关资讯,希望各位老铁们能喜欢,大家快快来了解一下吧!

mysql_no_login服务器端身份验证插件阻止所有客户端连接到任何使用它的账户。此插件的用例包括:

● 必须能够以提升的权限执行存储的程序和视图,而不会将这些权限暴露给普通用户的账户。

● 不应允许直接登录但只能通过代理账户访问的代理账户。

插件和库名称

插件或文件

插件或文件名称

Server-side plugin

mysql_no_login

Client-side plugin

None

Library file

mysql_no_login.so

安装无登录插件身份验证

要供服务器使用,插件库文件必须位于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系统表中,以使服务器在每次后续正常启动时加载它,而不需要 --plugin-load-add

要验证插件安装,请检查Information Schema PLUGINS表或使用SHOW PLUGINS语句。例如:

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%login%';+----------------+---------------+| PLUGIN_NAME | PLUGIN_STATUS |+----------------+---------------+| mysql_no_login | ACTIVE |+----------------+---------------+

如果插件无法初始化,请查看服务器错误日志中的诊断消息。

卸载无登录可插拔身份验证

用于卸载无登录身份验证插件的方法取决于您的安装方式:

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

如果您在运行时使用 INSTALL PLUGIN 语句安装插件,那么它将在服务器重新启动时保持安装状态。要卸载它,请使用 UNINSTALL PLUGIN

UNINSTALL PLUGIN 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 DEFINERVIEW nologindb.myviewAS SELECT User, Host FROM mysql.user;

要向普通用户提供对视图的受保护访问,请执行以下操作:

GRANT SELECT ON nologindb.myview TO '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 本身不能用于连接。

标签: #mysqlnoprivileges