8.4.1.10 Socket Peer-Credential 插件式认证
服务器端auth_socket身份验证插件验证来自本地主机的客户端通过 Unix socket 文件连接。插件使用SO_PEERCRED socket 选项获取客户端程序运行用户的信息。因此,插件只能在支持SO_PEERCRED选项的系统上运行,例如 Linux。
插件的源代码可以作为一个相对简单的示例,演示如何编写可加载的身份验证插件。
以下表格显示了插件和库文件名。文件必须位于名为plugin_dir系统变量指定的目录中。
表8.26:Socket Peer-Credential 认证插件和库文件名
| Plugin or File | Plugin or File Name |
|---|---|
| 服务器端插件 | auth_socket |
| 客户端插件 | 无,详见讨论 |
| 库文件 | auth_socket.so |
以下部分提供了 socket 插件式认证的安装和使用信息:
关于 MySQL 中的插件式认证的总体信息,请参阅第8.2.17节,“插件式认证”。
安装 Socket 插件式认证
本节描述了如何安装 Socket 认证插件。关于安装插件的总体信息,请参阅第7.6.1节,“安装和卸载插件”。
要使插件在服务器上可用,插件库文件必须位于 MySQL 插件目录(由plugin_dir系统变量指定的目录中)。如果必要,可以通过设置plugin_dir的值来配置插件目录位置。
要在服务器启动时加载插件,请使用--plugin-load-add选项指定包含插件的库文件。使用这个插件加载方法,必须在每次启动服务器时提供该选项。例如,在服务器my.cnf文件中添加以下行:
[mysqld]
plugin-load-add=auth_socket.so
修改my.cnf文件后,重新启动服务器以使新的设置生效。
Alternatively, to load the plugin at runtime, use this statement:
INSTALL PLUGIN auth_socket SONAME 'auth_socket.so';
INSTALL PLUGIN 将插件立即加载,并将其注册到 mysql.plugins 系统表,以便在每次正常启动时加载插件,而无需使用 --plugin-load-add 选项。
要验证插件安装,请检查信息架构 PLUGINS 表或使用 SHOW PLUGINS 语句(见 第7.6.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;
使用套接字插件式认证
套接字插件检查套接字用户名称(操作系统用户名)是否与客户端程序将其传递给服务器的 MySQL 用户名称匹配。如果名称不匹配,插件检查套接字用户名称是否匹配 mysql.user 系统表中的 authentication_string 列。如果找到匹配项,插件允许连接。 authentication_string 值可以使用 IDENTIFIED ...AS take CREATE USER 或 ALTER USER。
假设 MySQL 账户为操作系统用户 valerie,该用户将通过套接字文件连接到本地主机,并使用 auth_socket 插件进行认证:
CREATE USER 'valerie'@'localhost' IDENTIFIED WITH auth_socket;
当本地主机上的用户,用户名为stefanie,使用mysql命令,使用--user=valerie选项通过套接字文件连接时,服务器使用auth_socket来验证客户端。插件确定--user选项值(valerie)与客户端用户名(stephanie)不同,并拒绝连接。如果名为valerie的用户尝试相同的操作,插件发现用户名和MySQL用户名都是valerie,允许连接。但是,插件即使是使用valerie的用户,也拒绝连接,除非使用不同的协议,如TCP/IP。
要允许valerie和stephanie操作系统用户通过套接字文件连接使用该账户,可以采取以下两种方法:
-
在账户创建时,使用
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连接时。