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
连接时。