6.4.1.11 套接字对等证书可插入身份验证
服务器端auth_socket
身份验证插件对通过 Unix 套接字文件从 localhost 连接的 Client 端进行身份验证。插件使用SO_PEERCRED
socket 选项获取有关运行 Client 端程序的用户的信息。因此,该插件只能在支持SO_PEERCRED
选项的系统上使用,例如 Linux。
可以将这个插件的源代码作为一个相对简单的示例进行检查,以演示如何编写可加载的身份验证插件。
下 table 显示了插件和库文件名。该文件必须位于plugin_dir系统变量命名的目录中。
table6.18 套接字对等身份验证的插件和库名称
插件或文件 | 插件或文件名 |
---|---|
Server-side plugin | auth_socket |
Client-side plugin | 无,请参见讨论 |
Library file | auth_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 USER或ALTER USER的IDENTIFIED ...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)构建的,该插件也拒绝连接。
要允许valerie
和stephanie
os 用户通过使用该帐户的套接字文件连接访问 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';
要访问该帐户,valerie
和stephanie
都在连接时指定--user=valerie
。