6.4.1.11 套接字对等证书可插入身份验证

服务器端auth_socket身份验证插件对通过 Unix 套接字文件从 localhost 连接的 Client 端进行身份验证。插件使用SO_PEERCRED socket 选项获取有关运行 Client 端程序的用户的信息。因此,该插件只能在支持SO_PEERCRED选项的系统上使用,例如 Linux。

可以将这个插件的源代码作为一个相对简单的示例进行检查,以演示如何编写可加载的身份验证插件。

下 table 显示了插件和库文件名。该文件必须位于plugin_dir系统变量命名的目录中。

table6.18 套接字对等身份验证的插件和库名称

插件或文件插件或文件名
Server-side pluginauth_socket
Client-side plugin无,请参见讨论
Library fileauth_socket.so

以下各节提供特定于套接字可插入身份验证的安装和使用信息:

有关 MySQL 中可插拔身份验证的一般信息,请参见第 6.2.13 节“可插入身份验证”

安装套接字可插入身份验证

本节介绍如何安装套接字认证插件。有关安装插件的一般信息,请参见第 5.5.1 节“安装和卸载插件”

要由服务器使用,插件库文件必须位于 MySQL 插件目录(由plugin_dir系统变量命名的目录)中。如有必要,通过在服务器启动时设置plugin_dir的值来配置插件目录位置。

要在服务器启动时加载插件,请使用--plugin-load-add选项命名包含该插件的库文件。使用这种插件加载方法,每次服务器启动时都必须给出该选项。例如,将这些行放在服务器my.cnf文件中:

[mysqld]
plugin-load-add=auth_socket.so

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

或者,要在运行时加载插件,请使用以下语句:

INSTALL PLUGIN auth_socket SONAME 'auth_socket.so';

INSTALL PLUGIN立即加载该插件,并将其注册在mysql.plugins系统 table 中,以使服务器为每次后续的正常启动加载该插件,而无需--plugin-load-add

要验证插件安装,请检查INFORMATION_SCHEMA.PLUGINStable 或使用SHOW PLUGINS语句(请参见第 5.5.2 节“获取服务器插件信息”)。例如:

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

如果插件未能初始化,请检查服务器错误日志以获取诊断消息。

要将 MySQL 帐户与套接字插件关联,请参见使用套接字可插入身份验证

卸载套接字可插入身份验证

用于卸载套接字身份验证插件的方法取决于安装方式:

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

  • 如果您在运行时使用INSTALL PLUGIN语句安装了插件,则在服务器重新启动后仍会安装该插件。要卸载它,请使用UNINSTALL PLUGIN

UNINSTALL PLUGIN auth_socket;
使用套接字可插入身份验证

套接字插件检查套接字用户名(os 用户名)是否与 Client 端程序向服务器指定的 MySQL 用户名匹配。如果名称不匹配,则插件将检查套接字用户名是否与mysql.user系统 table 行的authentication_string列中指定的名称匹配。如果找到匹配项,则插件允许连接。可以使用带有CREATE USERALTER USERIDENTIFIED ...AS子句来指定authentication_string值。

假设为名为valerie的 os 用户创建了一个 MySQL 帐户,该用户将由auth_socket插件进行身份验证,以通过套接字文件从 localhost 进行连接:

CREATE USER 'valerie'@'localhost' IDENTIFIED WITH auth_socket;

如果 localhost 上具有登录名stefanie的用户使用选项--user=valerie调用mysql以通过套接字文件进行连接,则服务器将使用auth_socket来认证 Client 端。插件确定--user选项值(valerie)与 Client 端用户名(stephanie)不同,并拒绝连接。如果名为valerie的用户尝试相同的操作,则插件会发现该用户名和 MySQL 用户名均为valerie并允许连接。但是,即使使用valerie连接也是使用其他协议(例如 TCP/IP)构建的,该插件也拒绝连接。

要允许valeriestephanieos 用户通过使用该帐户的套接字文件连接访问 MySQL,可以通过以下两种方式进行:

  • 在帐户创建时为两个用户命名,一个在CREATE USER之后,另一个在身份验证字符串中:
CREATE USER 'valerie'@'localhost' IDENTIFIED WITH auth_socket AS 'stephanie';
  • 如果您已经使用CREATE USER为单个用户创建帐户,请使用ALTER USER添加第二个用户:
CREATE USER 'valerie'@'localhost' IDENTIFIED WITH auth_socket;
ALTER USER 'valerie'@'localhost' IDENTIFIED WITH auth_socket AS 'stephanie';

要访问该帐户,valeriestephanie都在连接时指定--user=valerie