MySQL8 中文参考(二十八)(1)https://developer.aliyun.com/article/1566112
8.4.1.12 测试可插拔认证
MySQL 包含一个测试插件,用于检查帐户凭据并将成功或失败记录到服务器错误日志中。这是一个可加载的插件(非内置),必须在使用之前安装。
测试插件源代码与服务器源代码分开,不同于内置的本机插件,因此可以作为一个相对简单的示例来演示如何编写可加载的认证插件。
注意
此插件旨在用于测试和开发目的,不适用于生产环境或暴露在公共网络上的服务器。
以下表格显示了插件和库文件的名称。文件名后缀可能在您的系统上有所不同。文件必须位于由plugin_dir
系统变量命名的目录中。
表 8.28 测试认证的插件和库名称
插件或文件 | 插件或文件名 |
服务器端插件 | test_plugin_server |
客户端插件 | auth_test_plugin |
库文件 | auth_test_plugin.so |
以下各节提供了特定于测试可插拔认证的安装和使用信息:
- 安装测试可插拔认证
- 卸载测试可插拔认证
- 使用测试可插拔认证
有关 MySQL 中可插拔认证的一般信息,请参见第 8.2.17 节,“可插拔认证”。
安装测试可插拔认证
本节描述了如何安装服务器端测试认证插件。有关安装插件的一般信息,请参见第 7.6.1 节,“安装和卸载插件”。
要被服务器使用,插件库文件必须位于 MySQL 插件目录中(由plugin_dir
系统变量命名的目录)。如有必要,在服务器启动时通过设置plugin_dir
的值来配置插件目录位置。
要在服务器启动时加载插件,请使用--plugin-load-add
选项命名包含插件的库文件。使用此插件加载方法,每次服务器启动时都必须提供该选项。例如,将这些行放入服务器的my.cnf
文件中,根据需要调整.so
后缀以适应您的平台:
[mysqld] plugin-load-add=auth_test_plugin.so
修改my.cnf
后,重新启动服务器以使新设置生效。
或者,要在运行时加载插件,请使用此语句,根据需要调整.so
后缀以适应您的平台:
INSTALL PLUGIN test_plugin_server SONAME 'auth_test_plugin.so';
INSTALL PLUGIN
立即加载插件,并在mysql.plugins
系统表中注册它,以使服务器在每次后续正常启动时加载它,而无需--plugin-load-add
。
要验证插件安装,请检查 Information Schema PLUGINS
表或使用SHOW PLUGINS
语句(参见 Section 7.6.2, “Obtaining Server Plugin Information”)。例如:
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%test_plugin%'; +--------------------+---------------+ | PLUGIN_NAME | PLUGIN_STATUS | +--------------------+---------------+ | test_plugin_server | ACTIVE | +--------------------+---------------+
如果插件初始化失败,请检查服务器错误日志以获取诊断消息。
要将 MySQL 帐户与测试插件关联,请参阅 Using Test Pluggable Authentication。
卸载测试可插拔认证
用于卸载测试认证插件的方法取决于您安装它的方式:
- 如果您在服务器启动时使用
--plugin-load-add
选项安装了插件,请在不带该选项的情况下重新启动服务器。 - 如果您使用
INSTALL PLUGIN
语句在运行时安装插件,则它将在服务器重新启动时保持安装状态。要卸载它,请使用UNINSTALL PLUGIN
:
UNINSTALL PLUGIN test_plugin_server;
使用测试可插拔认证
要使用测试认证插件,请创建一个帐户并在IDENTIFIED WITH
子句中命名该插件:
CREATE USER 'testuser'@'localhost' IDENTIFIED WITH test_plugin_server BY '*testpassword*';
测试认证插件还需要创建代理用户,如下所示:
CREATE USER testpassword@localhost; GRANT PROXY ON testpassword@localhost TO testuser@localhost;
然后在连接到服务器时为该帐户提供--user
和--password
选项。例如:
$> mysql --user=testuser --password Enter password: *testpassword*
该插件从客户端接收的密码并将其与存储在mysql.user
系统表中帐户行的authentication_string
列中的值进行比较。如果两个值匹配,插件将authentication_string
值作为新的有效用户 ID 返回。
你可以查看服务器错误日志,查看是否有关于身份验证成功的消息(注意密码被报告为“user”):
[Note] Plugin test_plugin_server reported: 'successfully authenticated user *testpassword*'
原文:
dev.mysql.com/doc/refman/8.0/en/pluggable-authentication-system-variables.html
8.4.1.13 可插拔认证系统变量
除非安装了适当的服务器端插件,否则这些变量不可用:
authentication_ldap_sasl
用于形式为authentication_ldap_sasl_*
xxx*
的系统变量authentication_ldap_simple
用于形式为authentication_ldap_simple_*
xxx*
的系统变量
表 8.29 认证插件系统变量摘要
authentication_fido_rp_id
命令行格式 | --authentication-fido-rp-id=value |
引入版本 | 8.0.27 |
弃用 | 8.0.35 |
系统变量 | authentication_fido_rp_id |
范围 | 全局 |
动态 | 是 |
SET_VAR Hint Applies |
否 |
类型 | 字符串 |
默认值 | MySQL |
- 此变量指定用于 FIDO 设备注册和 FIDO 认证的依赖方 ID。如果尝试进行 FIDO 认证且此值与 FIDO 设备预期的值不符,则设备会认为自己未与正确的服务器通信,从而导致错误。最大值长度为 255 个字符。
注意
截至 MySQL 8.0.35 版本,此插件变量已被弃用,并可能在未来的 MySQL 版本中移除。 authentication_kerberos_service_key_tab
命令行格式 | --authentication-kerberos-service-key-tab=file_name |
引入版本 | 8.0.26 |
系统变量 | authentication_kerberos_service_key_tab |
范围 | 全局 |
动态 | 否 |
SET_VAR Hint Applies |
否 |
类型 | 文件名 |
默认值 | datadir/mysql.keytab |
- 包含用于认证从客户端接收的 MySQL 服务票据的 Kerberos 服务密钥的服务器端密钥表(“keytab”)文件的名称。文件名应给出为绝对路径名。如果未设置此变量,则默认值为数据目录中的
mysql.keytab
。
文件必须存在并包含服务主体名称(SPN)的有效密钥,否则客户端的身份验证将失败。 (SPN 和相同密钥也必须在 Kerberos 服务器中创建。) 该文件可能包含多个服务主体名称及其相应的密钥组合。
文件必须由 Kerberos 服务器管理员生成,并复制到 MySQL 服务器可访问的位置。 可以使用以下命令验证文件是否正确并已正确复制:
klist -k *file_name*
- 有关 keytab 文件的信息,请参阅
web.mit.edu/kerberos/krb5-latest/doc/basic/keytab_def.html
。 authentication_kerberos_service_principal
命令行格式 | --authentication-kerberos-service-principal=name |
引入 | 8.0.26 |
系统变量 | authentication_kerberos_service_principal |
范围 | 全局 |
动态 | 是 |
SET_VAR 提示适用 |
否 |
类型 | 字符串 |
默认值 | mysql/host_name@realm_name |
- MySQL 服务器发送给客户端的 Kerberos 服务主体名称(SPN)。
该值由服务名称(mysql
)、主机名和领域名组成。 默认值为mysql/*
host_name*@*
realm_name*
。 服务主体名称中的领域使得可以检索到确切的服务密钥。
要使用非默认值,请使用相同格式设置该值。 例如,要使用主机名为krbauth.example.com
和领域为MYSQL.LOCAL
,请将authentication_kerberos_service_principal
设置为mysql/krbauth.example.com@MYSQL.LOCAL
。
服务主体名称和服务密钥必须已经存在于由 KDC 服务器管理的数据库中。
可能存在仅由领域名称不同的服务主体名称。 authentication_ldap_sasl_auth_method_name
命令行格式 | --authentication-ldap-sasl-auth-method-name=value |
系统变量 | authentication_ldap_sasl_auth_method_name |
范围 | 全局 |
动态 | 是 |
SET_VAR 提示适用 |
否 |
类型 | 字符串 |
默认值 | SCRAM-SHA-1 |
有效值(≥ 8.0.23) | SCRAM-SHA-1``SCRAM-SHA-256``GSSAPI |
有效值(≥ 8.0.20, ≤ 8.0.22) | SCRAM-SHA-1``GSSAPI |
有效值(≤ 8.0.19) | SCRAM-SHA-1 |
- 对于 SASL LDAP 身份验证,这是身份验证方法的名称。身份验证插件与 LDAP 服务器之间的通信根据这种身份验证方法进行,以确保密码安全。允许这些身份验证方法值:
SCRAM-SHA-1
:使用 SASL 挑战-响应机制。
客户端端的authentication_ldap_sasl_client
插件与 SASL 服务器通信,使用密码创建挑战并获取 SASL 请求缓冲区,然后将此缓冲区传递给服务器端的authentication_ldap_sasl
插件。客户端端和服务器端的 SASL LDAP 插件使用 SASL 消息来安全传输凭据,以避免在 MySQL 客户端和服务器之间发送明文密码。SCRAM-SHA-256
:使用 SASL 挑战-响应机制。
这种方法类似于SCRAM-SHA-1
,但更安全。它在 MySQL 8.0.23 及更高版本中可用。它需要使用 Cyrus SASL 2.1.27 或更高版本构建的 OpenLDAP 服务器。GSSAPI
:使用 Kerberos,一种无密码且基于票据的协议。
GSSAPI/Kerberos 是 MySQL 客户端和服务器仅在 Linux 上支持的身份验证方法。在 Linux 环境中,应用程序使用默认启用 Kerberos 的 Microsoft Active Directory 访问 LDAP 时,这是非常有用的。
客户端端的authentication_ldap_sasl_client
插件使用来自 Kerberos 的票据授予票据(TGT)获取服务票据,但不直接使用 LDAP 服务。服务器端的authentication_ldap_sasl
插件在客户端插件和 LDAP 服务器之间路由 Kerberos 消息。然后,服务器端插件使用获取的凭据与 LDAP 服务器通信,解释 LDAP 身份验证消息并检索 LDAP 组。
authentication_ldap_sasl_bind_base_dn
命令行格式 | --authentication-ldap-sasl-bind-base-dn=value |
系统变量 | authentication_ldap_sasl_bind_base_dn |
范围 | 全局 |
动态 | 是 |
SET_VAR 提示适用 |
否 |
类型 | 字符串 |
默认值 | NULL |
- 对于 SASL LDAP 身份验证,基本区分名称(DN)。此变量可用于通过在搜索树中的特定位置(“基本”)锚定它们来限制搜索范围。假设一组 LDAP 用户条目的成员具有以下形式:
uid=*user_name*,ou=People,dc=example,dc=com
- 另一组 LDAP 用户条目的成员具有以下形式:
uid=*user_name*,ou=Admin,dc=example,dc=com
- 然后根据不同的基本 DN 值进行搜索:
- 如果基本 DN 是
ou=People,dc=example,dc=com
:搜索仅在第一组中找到用户条目。 - 如果基本 DN 是
ou=Admin,dc=example,dc=com
:搜索仅在第二组中找到用户条目。 - 如果基本 DN 是
ou=dc=example,dc=com
:搜索会在第一组或第二组中找到用户条目。
- 一般来说,更具体的基本 DN 值会导致更快的搜索,因为它们限制了搜索范围。
authentication_ldap_sasl_bind_root_dn
命令行格式 | --authentication-ldap-sasl-bind-root-dn=value |
系统变量 | authentication_ldap_sasl_bind_root_dn |
范围 | 全局 |
动态 | 是 |
SET_VAR 提示适用 |
否 |
类型 | 字符串 |
默认值 | NULL |
- 对于 SASL LDAP 认证,根区分名称(DN)。此变量与
authentication_ldap_sasl_bind_root_pwd
一起用作用于执行搜索的目的的 LDAP 服务器进行身份验证的凭据。身份验证使用一个或两个 LDAP 绑定操作,具体取决于 MySQL 帐户是否指定了 LDAP 用户 DN:
- 如果帐户没有指定用户 DN:
authentication_ldap_sasl
使用authentication_ldap_sasl_bind_root_dn
和authentication_ldap_sasl_bind_root_pwd
执行初始 LDAP 绑定。(这两个默认为空,所以如果它们没有设置,LDAP 服务器必须允许匿名连接。)生成的绑定 LDAP 句柄用于根据客户端用户名搜索用户 DN。authentication_ldap_sasl
使用用户 DN 和客户端提供的密码执行第二次绑定。 - 如果帐户没有指定用户 DN:在这种情况下,第一个绑定操作是不必要的。
authentication_ldap_sasl
使用用户 DN 和客户端提供的密码执行单个绑定。这比如果 MySQL 帐户没有指定 LDAP 用户 DN 要快。
authentication_ldap_sasl_bind_root_pwd
命令行格式 | --authentication-ldap-sasl-bind-root-pwd=value |
系统变量 | authentication_ldap_sasl_bind_root_pwd |
范围 | 全局 |
动态 | 是 |
SET_VAR 提示适用 |
否 |
类型 | 字符串 |
默认值 | NULL |
- 对于 SASL LDAP 认证,根分隔名的密码。此变量与
authentication_ldap_sasl_bind_root_dn
一起使用。请参阅该变量的描述。 authentication_ldap_sasl_ca_path
命令行格式 | --authentication-ldap-sasl-ca-path=value |
系统变量 | authentication_ldap_sasl_ca_path |
作用范围 | 全局 |
动态 | 是 |
SET_VAR 提示适用 |
否 |
类型 | 字符串 |
默认值 | NULL |
- 对于 SASL LDAP 认证,证书颁发机构文件的绝对路径。如果希望认证插件执行 LDAP 服务器证书的验证,则指定此文件。
注意
除了将authentication_ldap_sasl_ca_path
变量设置为文件名外,还必须将适当的证书颁发机构证书添加到文件中,并启用authentication_ldap_sasl_tls
系统变量。这些变量可以设置以覆盖默认的 OpenLDAP TLS 配置;请参阅 LDAP Pluggable Authentication and ldap.conf authentication_ldap_sasl_group_search_attr
命令行格式 | --authentication-ldap-sasl-group-search-attr=value |
系统变量 | authentication_ldap_sasl_group_search_attr |
作用范围 | 全局 |
动态 | 是 |
SET_VAR 提示适用 |
否 |
类型 | 字符串 |
默认值 | cn |
- 对于 SASL LDAP 认证,指定 LDAP 目录条目中指定组名的属性名称。如果
authentication_ldap_sasl_group_search_attr
具有默认值cn
,则搜索将返回cn
值作为组名。例如,如果具有uid
值为user1
的 LDAP 条目具有cn
属性为mygroup
,则搜索user1
将返回mygroup
作为组名。
如果您不想进行组或代理认证,则此变量应为空字符串。
如果组搜索属性是isMemberOf
,LDAP 认证直接检索用户属性isMemberOf
的值,并将其分配为组信息。如果组搜索属性不是isMemberOf
,LDAP 认证将搜索用户是成员的所有组。(后者是默认行为。)此行为基于 LDAP 组信息可以以两种方式存储:1)组条目可以具有名为memberUid
或member
的属性,其值为用户名;2)用户条目可以具有名为isMemberOf
的属性,其值为组名。 authentication_ldap_sasl_group_search_filter
命令行格式 | --authentication-ldap-sasl-group-search-filter=value |
系统变量 | authentication_ldap_sasl_group_search_filter |
范围 | 全局 |
动态 | 是 |
SET_VAR 提示适用 |
否 |
类型 | 字符串 |
默认值 | (|(&(objectClass=posixGroup)(memberUid=%s))(&(objectClass=group)(member=%s))) |
- 对于 SASL LDAP 认证,自定义组搜索过滤器。
搜索过滤器值可以包含{UA}
和{UD}
符号,分别表示用户名和完整用户 DN。例如,{UA}
会被替换为用户名,比如"admin"
,而{UD}
会被替换为完整 DN,比如"uid=admin,ou=People,dc=example,dc=com"
。以下是默认值,支持 OpenLDAP 和 Active Directory:
(|(&(objectClass=posixGroup)(memberUid={UA})) (&(objectClass=group)(member={UD})))
- 在某些情况下,对于用户场景,
memberOf
是一个简单的用户属性,不包含任何组信息。为了增加灵活性,可以在组搜索属性前使用可选的{GA}
前缀。任何带有{GA}
前缀的组属性都被视为具有组名的用户属性。例如,对于值{GA}MemberOf
,如果组值是 DN,则从组 DN 中返回第一个属性值作为组名。 authentication_ldap_sasl_init_pool_size
命令行格式 | --authentication-ldap-sasl-init-pool-size=# |
系统变量 | authentication_ldap_sasl_init_pool_size |
范围 | 全局 |
动态 | 是 |
SET_VAR 提示适用 |
否 |
类型 | 整数 |
默认值 | 10 |
最小值 | 0 |
最大值 | 32767 |
单位 | 连接 |
- 对于 SASL LDAP 认证,连接到 LDAP 服务器的连接池的初始大小。根据对 LDAP 服务器的平均并发认证请求数量选择此变量的值。插件使用
authentication_ldap_sasl_init_pool_size
和authentication_ldap_sasl_max_pool_size
一起进行连接池管理:
- 当认证插件初始化时,它会创建
authentication_ldap_sasl_init_pool_size
个连接,除非authentication_ldap_sasl_max_pool_size=0
以禁用连接池。 - 如果插件在当前连接池中没有空闲连接时收到认证请求,插件可以创建一个新连接,最多达到
authentication_ldap_sasl_max_pool_size
所指定的最大连接池大小。 - 如果插件在连接池已经达到最大值且没有空闲连接时收到请求,认证将失败。
- 当插件卸载时,它会关闭所有连接池中的连接。
- 对插件系统变量设置的更改可能不会对已经在池中的连接产生影响。例如,修改 LDAP 服务器主机、端口或 TLS 设置不会影响现有连接。但是,如果原始变量值无效且连接池无法初始化,则插件会尝试为下一个 LDAP 请求重新初始化池。在这种情况下,新的系统变量值将用于重新初始化尝试。
如果authentication_ldap_sasl_max_pool_size=0
以禁用连接池,插件打开的每个 LDAP 连接都使用那时系统变量的值。 authentication_ldap_sasl_log_status
命令行格式 | --authentication-ldap-sasl-log-status=# |
系统变量 | authentication_ldap_sasl_log_status |
范围 | 全局 |
动态 | 是 |
SET_VAR 提示适用 |
否 |
类型 | 整数 |
默认值 | 1 |
最小值 | 1 |
最大值(≥ 8.0.18) | 6 |
最大值(≤ 8.0.17) | 5 |
- 对于 SASL LDAP 认证,写入错误日志的消息的日志级别。以下表显示了允许的级别值及其含义。
表 8.30 authentication_ldap_sasl_log_status 的日志级别
选项值 | 记录的消息类型 |
1 |
没有消息 |
2 |
错误消息 |
3 |
错误和警告消息 |
4 |
错误、警告和信息消息 |
5 |
与前一级别相同,加上来自 MySQL 的调试消息 |
6 |
与前一级别相同,加上来自 LDAP 库的调试消息 |
- 从 MySQL 8.0.18 开始提供日志级别 6。
在客户端端,可以通过设置AUTHENTICATION_LDAP_CLIENT_LOG
环境变量将消息记录到标准输出。允许的默认值与authentication_ldap_sasl_log_status
相同。AUTHENTICATION_LDAP_CLIENT_LOG
环境变量仅适用于 SASL LDAP 认证。对于简单 LDAP 认证,它不起作用,因为在这种情况下,客户端插件是mysql_clear_password
,它对 LDAP 操作一无所知。 authentication_ldap_sasl_max_pool_size
命令行格式 | --authentication-ldap-sasl-max-pool-size=# |
系统变量 | authentication_ldap_sasl_max_pool_size |
作用域 | 全局 |
动态 | 是 |
SET_VAR 提示适用 |
否 |
类型 | 整数 |
默认值 | 1000 |
最小值 | 0 |
最大值 | 32767 |
单位 | 连接 |
MySQL8 中文参考(二十八)(3)https://developer.aliyun.com/article/1566114