MySQL身份验证——Pluggable Authentication

Posted 戏说数据那点事

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL身份验证——Pluggable Authentication相关的知识,希望对你有一定的参考价值。

写一篇关于mysql身份验证的内容,在这一篇里主要介绍MySQL的插件验证方式。


在介绍插件验证方式之前,简要说明一下MySQL的访问控制是如何实现的。

MySQL的访问控制通过两个步骤来实现:

一、验证连接:在这个步骤里包括对帐户和密码是否正确进行验证以及账户是否被锁定。如果没有通过验证,则服务器拒绝访问,反之进入第二步。

二、请求验证:在这个步骤里,服务器对用户发出的每个操作请求进行检查,确认该账户是否有权去执行该操作。


因此,使用插件进行身份验证的过程,属于验证连接的步骤。当客户端连接到MySQL服务器时,服务器会使用客户端提供的用户名和主机名从mysql.user系统表里面查询匹配的记录,然后使用记录里面提供的验证插件对客户端进行验证:

  • 如果服务器无法找到所需验证插件,服务器拒绝客户端连接并报错。

  • 如果服务器具有该插件,插件会返回服务器一个状态,表示用户是否提供了正确的密码,是否允许其进行连接。

MySQL使用插件方式进行验证可以带来如下好处:

  • DBA可以为不同的用户选择不同的验证方式。

  • 当客户端连接服务器时,可以选择外部验证的方式。外部验证方式是指密码等凭据信息没有保存在mysql.user系统表里,MySQL的原生验证方式是将相关数据保存在该表里。

  • 使用插件式验证方式还可以允许使用代理用户,使得返回服务器的用户名与实际连接的用户名不同。


MySQL8.0目前提供如下验证插件:

  • sha256_password和caching_sha2_password:MySQL提供两种使用SHA-256哈希方法的插件,其中caching_sha2_password是MySQL8.0的默认验证插件,它与sha256_password基本相同,但是会在服务器侧使用缓存,以获取更好的性能和额外的功能。

  • mysql_native_password:该插件将密码通过哈希方法存储在系统表里,是8.0之前的默认方式。

  • mysql_clear_password:该插件是内嵌到MySQL客户端里的,允许客户端以明文的形式发送密码到服务器,可以与任何需要明文密码的服务器端插件一起使用。

  • mysql_no_login:该插件可以阻止客户端直接登录服务器,使用它,系统可以限定使用代理用户,或者具有存储程序、视图权限的用户来访问数据库,从而不会将相关操作暴露给普通用户。

  • auth_socket:通过UNIX的sockets进行本地主机登录验证。

  • test_plugin_server :MySQL包含一个用于测试的插件,检查账户凭据,并将结果写入日志。

  • authentication_pam:使用PAM(Pluggable Authentication Modules)进行外部验证的插件,并且可以支持代理用户,该插件包含在MySQL的企业版内。

  • authentication_windows:允许在Windows上执行外部验证的插件,该插件包含在MySQL企业版内。
    authentication_ldap_simple和authentication_ldap_sasl:支持使用LDAP (Lightweight Directory Access Protocol)对MySQL用户进行验证,该插件同样包含在企业版内。

通常,使用插件验证方式需要在服务器端和客户端安装相对应的插件。服务器端的插件会验证客户端的连接,客户端的插件通常会内嵌到客户端程序里。当客户端连接到服务器时,服务器会通知客户端应该使用哪个插件。用户创建账户时,需要指定服务器端适当的插件,如果使用默认的插件,则不需要指定。


服务器可以通过--default-authentication-plugin=plugin_name来设置默认的插件。当服务器和客户端同时使用默认插件时,服务器不需要和客户端进行往返的通信。mysql和mysqladmin客户端可以使用--default-auth=plugin_name选项来指定使用的插件。如果客户端程序无法找到插件的库文件,可以通过--plugin-dir=dir_name来指定插件库文件位置。


插件验证方式允许为MySQL账户灵活选择验证方法,但是,有时候客户端无法通过插件进行连接,其原因是客户端与服务器的插件不兼容。当用户使用8.0的时候,发现之前正常使用的客户端无法进行连接,原因是使用5.7.22之前版本的客户端连接MySQL8.0时,需要使用caching_sha2_password进行验证,但是5.7版本的客户端不包括该插件,该插件是MySQL8.0首次引入的。(5.7.23之后的版本可以使用)同样的原因,MySQL5.5的客户端无法连接MySQL5.6服务器,因为sha256_password是在5.6引入的。另外一点需要注意的是,使用社区版的mysql客户端,无法通过企业版的LDAP插件连接企业版服务器。


关于插件验证的内容介绍到这里,更为详细的内容可以访问“https://dev.mysql.com/doc/refman/8.0/en/pluggable-authentication.html


转文至此。


 

以下为个人公众号“一森咖记”,欢迎关注。
                       


   

近期热文
你可能也会对以下话题感兴趣。点击链接便可查看。







  • X











以上是关于MySQL身份验证——Pluggable Authentication的主要内容,如果未能解决你的问题,请参考以下文章

在 mysql 中使用加密存储密码进行摘要身份验证

auth0 401 错误,在尝试身份验证代码交换时进行身份验证

Django + Auth0 JWT 身份验证拒绝解码

Laravel 身份验证中间件“auth:api”

使用 Apigee 作为 Auth0 的身份验证存储替代品

基于策略的授权 - Auth0 身份验证 - 始终返回 Forbidden 403