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

柔光的暖阳◎ 2024-03-17 15:58 144阅读 0赞

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后缀:

  1. [mysqld]
  2. plugin-load-add=mysql_no_login.so

修改my.cnf后,重新启动服务器以使新设置生效。

或者,要在运行时加载插件,请使用以下语句,根据需要调整平台的.so后缀:

  1. INSTALL PLUGIN mysql_no_login SONAME 'mysql_no_login.so';

INSTALL PLUGIN立即加载插件,并将其注册在mysql.plugins系统表中,以使服务器在每次后续正常启动时加载它,而不需要 —plugin-load-add

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

  1. mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%login%';
  2. +----------------+---------------+
  3. | PLUGIN_NAME | PLUGIN_STATUS |
  4. +----------------+---------------+
  5. | mysql_no_login | ACTIVE |
  6. +----------------+---------------+

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

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

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

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

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

  1. UNINSTALL PLUGIN mysql_no_login;

使用无登录可插拔身份验证

使用 mysql_no_login 进行身份验证的账户可以用作存储程序和视图对象的 DEFINER。如果这样的对象定义还包括 SQL SECURITY DEFINER,那么它将使用该账户的权限执行。DBA可以使用这种行为来提供对机密或敏感数据的访问,这些数据只能通过控制良好的接口公开。

以下示例说明了这些原则。它定义了一个不允许客户端连接的账户,并将一个只公开 mysql.user 系统表的某些列的视图与之关联:

  1. CREATE DATABASE nologindb;
  2. CREATE USER 'nologin'@'localhost' IDENTIFIED WITH mysql_no_login;
  3. GRANT ALL ON nologindb.* TO 'nologin'@'localhost';
  4. GRANT SELECT ON mysql.user TO 'nologin'@'localhost';
  5. CREATE DEFINER = 'nologin'@'localhost'
  6. SQL SECURITY DEFINER
  7. VIEW nologindb.myview
  8. AS SELECT User, Host FROM mysql.user;

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

  1. GRANT SELECT ON nologindb.myview TO 'ordinaryuser'@'localhost';

现在,普通用户可以使用该视图访问它所显示的有限信息:

  1. SELECT * FROM nologindb.myview;

用户试图访问视图公开的列以外的列会导致错误,未被授予访问权限的用户试图从视图中进行选择也会导致错误。

说明: 因为nologin账户不能直接使用,所以设置它使用的对象所需的操作必须由root或类似账户执行,该账户具有创建对象和设置DEFINER值所需的权限。

mysql_no_login插件在代理场景中也很有用。使用mysql_no_login进行身份验证的账户可以用作代理账户的代理用户:

  1. -- create proxied account
  2. CREATE USER 'proxied_user'@'localhost' IDENTIFIED WITH mysql_no_login;
  3. -- grant privileges to proxied account
  4. GRANT ... ON ... TO 'proxied_user'@'localhost';
  5. -- permit proxy_user to be a proxy account for proxied account
  6. GRANT PROXY ON 'proxied_user'@'localhost' TO 'proxy_user'@'localhost';

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

发表评论

表情:
评论列表 (有 0 条评论,144人围观)

还没有评论,来说两句吧...

相关阅读