Kerberos 是一种基于票证的服务器-客户端相互身份验证协议,受 MySQL 服务器 (仅限商业版) 支持。
Connector/J 使用 GSS-API、JAAS API 和 JCA API 实现对 Kerberos 的支持;这些 API 的提供程序必须在运行使用 Kerberos 身份验证的应用程序的 Java 虚拟机上可用。使用非默认提供程序会导致意外结果。
Kerberos 身份验证工作流程
Kerberos 身份验证在 MySQL 中的主要用途是允许用户创建连接,而无需在连接字符串中指定用户名和密码。为此,Connector/J 必须使用连接属性设置 defaultAuthenticationPlugin=authentication_kerberos_client
进行配置,然后可以从与本地缓存的票证授予票证 (TGT) 关联的 Kerberos 主体中提取 MySQL 用户名。请注意,MySQL 用户名与 Kerberos 主体不同,不包含 realm 部分;因此,Connector/J 会将主体中 “@” 符号后的所有字符剪切掉,并将其用作 MySQL 用户名。
如果本地 Kerberos 缓存中没有可用的 TGT,Connector/J 会使用 OS 登录用户名作为 MySQL 用户名。在连接字符串中指定的用户名始终优先于通过任何其他方式获取的 MySQL 用户名。
然后,MySQL 用户名将发送到 MySQL 服务器进行验证。不存在的用户会导致服务器返回错误。现有用户可以继续进行身份验证过程,后续的身份验证机制取决于 MySQL 用户的创建方式。
-
对于使用身份验证插件
authentication_kerberos
创建的用户,MySQL 服务器会将相应的 Kerberos realm 发送回 Connector/J,Connector/J 会使用该 realm 来构建标识 Kerberos 服务器上用户的 Kerberos 主体。然后可能会发生以下三种情况之一:新构建的 Kerberos 主体与与本地缓存的 TGT 关联的 Kerberos 主体匹配;然后将此 TGT 发送到 Kerberos 服务器以获取所需的 MySQL 服务票证,并继续身份验证。
新构建的 Kerberos 主体与与本地缓存的 TGT 关联的 Kerberos 主体不匹配,或者没有本地 Kerberos 缓存;此 Kerberos 主体以及可能在连接字符串中指定的密码(如果未指定,则为空字符串)将发送到 Kerberos 服务器,以首先获取有效的 TGT,然后获取所需的 MySQL 服务票证;然后继续身份验证。
如果 Connector/J 无法获取正确的 Kerberos 配置,无法与 Kerberos 服务器通信,或者无法执行上述两个步骤中的任何一个,则会抛出错误。
对于使用不同于
authentication_kerberos
的插件定义的用户,服务器会要求 Connector/J 使用其他身份验证方法。
客户端 Kerberos 配置
为了与 Kerberos 服务器正常运行,Connector/J 需要系统范围的 Kerberos 配置,或者需要以下 JVM 本地系统属性设置:
-Djava.security.krb5.kdc=
[KDC 主机名]
-Djava.security.krb5.realm=
[默认 Kerberos realm]
调试信息
将 Connector/J 配置为使用 Kerberos 身份验证的过程并不总是直截了当。启用内部 Java 提供程序中的日志记录可以帮助查找潜在问题。可以通过设置以下系统属性来实现:
-Dsun.security.krb5.debug=true
-Dsun.security.jgss.debug=true