MySQL8认证插件—Windows Pluggable Authentication

MySQL Enterprise Edition for Windows支持在Windows上执行外部身份验证的身份验证方法,使MySQL Server能够使用本机Windows服务来验证客户端连接。登录到Windows的用户可以根据其环境中的信息从MySQL客户端程序连接到服务器,而无需指定额外的密码。

客户端和服务器在身份验证握手中交换数据包。作为此交换的结果,服务器创建一个安全上下文对象,该对象表示Windows操作系统中客户端的标识。此标识包括客户端帐户的名称。Windows可插拔身份验证使用客户端的标识来检查它是给定帐户还是组的成员。默认情况下,协商使用Kerberos进行身份验证,如果Kerberos不可用,则使用NTLM进行身份验证。

Windows可插拔身份验证提供了以下功能:

● 外部身份验证:Windows身份验证使MySQL Server能够接受来自MySQL授权表之外定义的已登录Windows的用户的连接。

● 代理用户支持:Windows身份验证可以向MySQL返回与客户端程序传递的外部用户名不同的用户名。这意味着插件可以返回MySQL用户,该用户定义了外部Windows认证用户应该拥有的权限。例如,一个名为joe的Windows用户可以进行连接,并具有MySQL用户developer的权限。

插件和库名称

插件或文件

插件或文件名称

Server-side plugin

authentication_windows

Client-side plugin

authentication_windows_client

Library file

authentication_windows.dll

库文件仅包括服务器端插件。客户端插件内置在libmysqlclient客户端库中。

服务器端Windows身份验证插件仅包含在MySQL Enterprise Edition中。MySQL社区发行版中没有包含它。客户端插件包含在所有发行版中,包括社区发行版。这使得来自任何分发版的客户端都可以连接到加载了服务器端插件的服务器。

安装Windows可插入身份验证

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

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

[mysqld]
plugin-load-add=authentication_windows.dll

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

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

INSTALL PLUGIN authentication_windows SONAME 'authentication_windows.dll';

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

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

SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%windows%';
+------------------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+------------------------+---------------+
| authentication_windows | ACTIVE |
+------------------------+---------------+

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

卸载Windows可插入身份验证

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

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

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

UNINSTALL PLUGIN authentication_windows;

此外,删除任何设置Windows插件相关系统变量的启动选项。

使用Windows可插入身份验证

Windows身份验证插件支持使用MySQL帐户,这样登录到Windows的用户就可以连接到MySQL服务器,而无需指定额外的密码。假设服务器运行时启用了服务器端插件,

创建一个名为 sql_admin 的MySQL帐户,该帐户使用Windows插件进行身份验证:

CREATE USER sql_admin IDENTIFIED WITH authentication_windows AS 'Rafal, Tasha, Administrators, "Power Users"';

插件名称为 authentication_windows。AS关键字后面的字符串是身份验证字符串。它指定允许名为 Rafal 或 Tasha 的Windows用户作为MySQL用户 sql_admin 向服务器进行身份验证,Administrators或Power users组中的任何Windows用户也是如此。后一个组名称包含一个空格,因此必须用双引号字符引起来。

创建sql_admin帐户后,登录到Windows的用户可以尝试使用该帐户连接到服务器:

mysql --user=sql_admin

此处不需要密码。authentication_windows插件使用windows安全API检查正在连接的windows用户。如果该用户名为Rafal或Tasha,或者是Administrators或Power Users组的成员,则服务器将授予访问权限,客户端将被验证为sql_admin,并具有授予sql_admin帐户的任何权限。否则,服务器将拒绝访问。

Windows身份验证插件的身份验证字符串语法遵循以下规则:

● 该字符串由一个或多个用逗号分隔的用户映射组成。

● 每个用户映射都将Windows用户或组名与MySQL用户名相关联:

win_user_or_group_name=mysql_user_name
win_user_or_group_name

对于后一种语法,在没有给定mysql_user_name值的情况下,隐式值是CREATE user语句创建的mysql用户。因此,这些陈述是等效的:

CREATE USER sql_admin IDENTIFIED WITH authentication_windows AS 'Rafal, Tasha, Administrators, "Power Users"';
CREATE USER sql_admin IDENTIFIED WITH authentication_windows AS 'Rafal=sql_admin, Tasha=sql_admin, Administrators=sql_admin, "Power Users"=sql_admin';

● 值中的每个反斜杠字符(\)都必须加倍,因为反斜杠是MySQL字符串中的转义符。

● 不在双引号内的前导空格和尾随空格将被忽略。

● 未加引号的 win_user_or_group_name 和 mysql_user_name 值可以包含除等号、逗号或空格之外的任何内容。

● 如果 win_user_or_group_name 和/或 mysql_user_name 值用双引号引用,则引号之间的所有内容都是该值的一部分。例如,如果名称包含空格字符,则这是必要的。除双引号和反斜杠外,双引号内的所有字符都是合法的。若要包含双引号和反斜杠,请使用反斜杠对其进行转义。

● win_user_or_group_name 值对Windows主体使用传统语法,无论是本地的还是域中的。示例(注意反斜杠的加倍):

domain\\user
.\\user
domain\\group
.\\group
BUILTIN\\WellKnownGroup

当服务器调用插件对客户端进行身份验证时,插件会从左到右扫描身份验证字符串,查找与Windows用户匹配的用户或组。如果匹配,插件会将相应的 mysql_user_name 返回到mysql服务器。如果不匹配,则身份验证失败。

用户名匹配优先于组名匹配。假设名为win_user的Windows用户是win_group的成员,身份验证字符串如下所示:

'win_group = sql_user1, win_user = sql_user2'

当win_user连接到MySQL服务器时,win_group和win_user都匹配。插件将用户身份验证为sql_user2,因为更具体的用户匹配优先于组匹配,即使组在身份验证字符串中列在第一位。

Windows身份验证始终适用于来自运行服务器的同一台计算机的连接。对于跨计算机连接,两台计算机都必须在Microsoft Active Directory中注册。如果它们在同一个Windows域中,则无需指定域名。也可以允许来自不同域的连接,如本例所示:

CREATE USER sql_accounting IDENTIFIED WITH authentication_windows AS 'SomeDomain\\Accounting';

这里的SomeDomain是另一个域的名称。反斜杠字符是加倍的,因为它是字符串中的MySQL转义字符。

MySQL支持代理用户的概念,即客户端可以使用一个帐户连接并验证MySQL服务器,但在连接时拥有另一个帐户的权限。假设您希望Windows用户使用单个用户名进行连接,但根据其Windows用户和组名映射到特定的MySQL帐户,如下所示:

● local_user 和 MyDomain\domain_user 本地和域Windows用户应该映射到 local_wlad MySQL帐户。

● MyDomain\Developers 域组中的用户应映射到 local_dev MySQL帐户。

● 本地计算机管理员应映射到 local_admin MySQL帐户。

要进行设置,请为Windows用户创建一个要连接的代理帐户,并配置此帐户,以便用户和组映射到相应的MySQL帐户(local_wlad、local_dev、local_admin)。此外,授予MySQL帐户适当的权限,以执行他们需要执行的操作。以下说明使用win_proxy作为代理帐户,使用local_wlad、local_dev和local_admin作为代理帐户。

1. 创建代理MySQL帐户:

CREATE USER win_proxy IDENTIFIED WITH authentication_windows AS 'local_user = local_wlad, MyDomain\\domain_user = local_wlad, MyDomain\\Developers = local_dev, BUILTIN\\Administrators = local_admin';

2. 要使代理工作,代理的帐户必须存在,因此请创建它们:

CREATE USER local_wlad IDENTIFIED WITH mysql_no_login;
CREATE USER local_dev IDENTIFIED WITH mysql_no_login;
CREATE USER local_admin IDENTIFIED WITH mysql_no_login;
代理帐户使用 mysql_no_login 身份验证插件来防止客户端使用这些帐户直接登录mysql服务器。相反,使用Windows进行身份验证的用户应该使用 win_proxy 代理帐户。

为每个代理帐户授予MySQL访问所需的权限(此处未演示)。

3. 为代理帐户授予每个代理帐户的代理权限:

GRANT PROXY ON local_wlad TO win_proxy;
GRANT PROXY ON local_dev TO win_proxy;
GRANT PROXY ON local_admin TO win_proxy;

现在,Windows用户 local_user 和 MyDomain\domain_user 可以作为 win_proxy 连接到 MySQL服务器,并且在进行身份验证时,具有身份验证字符串中给定的帐户的权限(在本例中为 local_wlad)。MyDomain\Developers 组中以 win_proxy 身份连接的用户具有 local_dev 帐户的权限。BUILTIN\Administrators 组中的用户具有 local_admin 帐户的权限。

要配置身份验证,使所有没有自己MySQL帐户的Windows用户都通过代理帐户,请在前面的说明中将默认代理帐户 (''@'') 替换 win_proxy。

说明: 如果MySQL安装有匿名用户,他们可能与默认代理用户冲突。

猜你喜欢

转载自blog.csdn.net/weixin_44496870/article/details/131380545