• 首页
  • css3教程
  • html5教程
  • vue手册
  • php手册
  • MySQL手册
  • redis手册
  • jQuery手册
  • Windows可插拔身份验证

    注意

    Windows可插入身份验证是商业产品MySQL Enterprise Edition中包含的扩展。要了解有关商业产品的更多信息,请参见https://www.mysql.com/products/。

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

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

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

    • 外部身份验证:Windows身份验证使MySQL Server可以接受来自已在Windows上的MySQL授权表之外定义的用户的连接。
    • 代理用户支持:Windows身份验证可以向MySQL返回与客户端程序传递的外部用户名不同的用户名。这意味着插件可以返回定义外部Windows身份验证用户应具有的特权的MySQL用户。例如,名为的Windows用户joe可以连接并具有名为的MySQL用户的特权developer

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

    表6.17 Windows身份验证的插件和库名称

    插件或文件插件或文件名
    服务器端插件 uthentication_windows
    客户端插件 uthentication_windows_client
    库文件 uthentication_windows.dll

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

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

    MySQL 8.0支持的任何Windows版本都支持Windows身份验证插件(请参阅 https://www.mysql.com/support/supportedplatforms/database.html)。

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

    • 安装Windows可插入身份验证
    • 卸载Windows可插入身份验证
    • 使用Windows可插入身份验证

    有关MySQL中的可插入身份验证的一般信息,有关代理用户的信息,请参见“代理用户”。

    安装Windows可插入身份验证

    本节介绍如何安装Windows身份验证插件。有关安装插件的一般信息,请参见“MySQL服务器插件”。

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

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

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

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

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

    INSTALL PLUGIN authentication_windows SONAME 'authentication_windows.dll';
    

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

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

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

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

    要将MySQL帐户与Windows身份验证插件相关联,请参见使用Windows可插入身份验证。 uthentication_windows_use_principal_name uthentication_windows_log_level系统变量提供了附加的插件控件。请参见“服务器系统变量”。

    卸载Windows可插入身份验证

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

    • 如果使用--plugin-load-add选项在服务器启动时安装了插件,请在不使用选项的情况下重新启动服务器。
    • 如果您在运行时使用一条INSTALL PLUGIN语句安装了该插件,则在服务器重新启动后,该插件将保持安装状态。要卸载它,请使用UNINSTALL PLUGIN

      UNINSTALL PLUGIN authentication_windows;
      

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

    使用Windows可插入身份验证

    Windows身份验证插件支持使用MySQL帐户,从而使登录Windows的用户可以连接到MySQL服务器,而无需指定其他密码。如安装Windows可插入身份验证中所述,假定服务器正在启用服务器端插件的情况下运行。一旦DBA启用了服务器端插件并设置了使用它的帐户,客户端就可以使用这些帐户进行连接,而无需进行其他任何设置。

    要在语句的IDENTIFIED WITH子句中引用Windows身份验证插件CREATE USER,请使用name uthentication_windows。假设应该允许Windows用户Rafal以及或组Tash 中的任何用户连接到MySQL 。要进行设置,请创建一个使用Windows插件进行身份验证的MySQL帐户:AdministratorsPower Userssql_admin

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

    插件名称为 uthentication_windowsAS关键字后面的字符串是身份验证字符串。它指定Windows用户(名为Rafal或)Tash 被允许以MySQL用户的身份向服务器进行身份验证,或组sql_admin中的任何Windows用户也是如此。后面的组名包含一个空格,因此必须用双引号引起来。AdministratorsPower Users

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

    C:\>mysql --user=sql_admin
    

    此处不需要密码。该 uthentication_windows插件使用Windows安全API来检查正在连接的Windows用户。如果该用户的名称是RafalTash ,或者是AdministratorsPower 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_namemysql_user_name值可以包含除等号,逗号或空间什么。
    • 如果a win_user_or_group_name和or mysql_user_name值用双引号引起来,则引号之间的所有内容都是该值的一部分。例如,如果名称包含空格字符,则这是必需的。除双引号和反斜杠外,双引号中的所有字符均合法。要包含两个字符,请使用反斜杠将其转义。
    • win_user_or_group_name值对Windows主体使用本地或域中的常规语法。示例(注意反斜杠加倍):

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

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

    用户名匹配优先于组名匹配。假设Windows用户名为win_userwin_group并且身份验证字符串如下所示:

    'win_group = sql_user1, win_user = sql_user2'
    

    win_user所连接到MySQL服务器,有一个匹配既win_groupwin_user。该插件将对用户进行身份验证,sql_user2因为更具体的用户匹配优先于组匹配,即使该组在身份验证字符串中列在首位也是如此。

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

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

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

    MySQL支持代理用户的概念,客户端可以使用一个帐户连接并认证到MySQL服务器,但是在连接时,客户端具有另一个帐户的特权(请参见“代理用户”)。假设您希望Windows用户使用一个用户名进行连接,但要根据Windows用户名和组名将其映射到特定的MySQL帐户,如下所示:

    • local_userMyDomain\domain_user本地和域Windows用户应该映射到local_wladMySQL账户。
    • MyDomain\Developers域组中的用户应映射到local_devMySQL帐户。
    • 本地计算机管理员应映射到local_adminMySQL帐户。

    要这样设置,创建一个代理帐户的Windows用户连接,并且配置此帐户,使用户和用户组映射到相应的MySQL账户(local_wladlocal_devlocal_admin)。另外,向MySQL帐户授予适合于他们需要执行的操作的特权。下面的说明使用win_proxy的代理帐户,和local_wladlocal_devlocal_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代理帐户。(这假定已安装了插件。有关说明,请参见“无登录可插入身份验证”。)有关防止代理帐户直接使用的替代方法,请参见防止直接登录代理帐户。

      您还应该执行GRANT语句(未显示),这些语句向每个代理帐户授予MySQL访问所需的特权。

    3. 向代理帐户PROXY授予每个代理帐户的特权:

      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可以连接到MySQL服务器win_proxy和身份验证时,必须在验证字符串给出的帐户的权限(在这种情况下,local_wlad)。以MyDomain\Developers身份连接的组中的用户win_proxy具有该local_dev帐户的特权。BUILTIN\Administrators组中的用户具有该local_admin帐户的特权。

    要配置身份验证,以便所有没有自己的MySQL帐户的Windows用户都可以通过代理帐户,请使用上述说明中的默认代理帐户(''@'')代替win_proxy。有关默认代理帐户的信息,请参见“代理用户”。

    注意

    如果您的MySQL安装中有匿名用户,则它们可能与默认代理用户冲突。有关此问题及其处理方式的更多信息,请参见默认代理用户和匿名用户冲突。

    要将Windows身份验证插件与Connector / NET 6.4.4及更高版本中的Connector / NET连接字符串一起使用,请参阅使用Windows本机身份验证插件。