MySQL 8.0+ 原生不支持双重身份验证(2FA),所谓“MySQL 双重身份验证”需通过 LDAP 委托、SSH 隧道或外部网关实现,validate_password 插件仅校验密码强度,非真正 2FA。
MySQL 服务端本身没有内置 TOTP、
短信或硬件密钥类的双重验证机制。所谓“MySQL 双重身份验证”,实际是通过插件或外部网关实现的折中方案,不是在 mysql.user 表里加个字段就能启用的。直接执行 ALTER USER ... REQUIRE SSL AND ... 或设置 authentication_policy 都不能触发第二因子校验。
如果你已有 LDAP(如 FreeIPA、Active Directory)并启用了其双因素认证(例如 Google Authenticator 绑定到 AD 用户),可让 MySQL 通过 authentication_ldap_sasl 插件委托认证。此时 MySQL 仅负责转发凭证,真正的“密码 + TOTP”校验由 LDAP 服务完成。
authentication_ldap_sasl 插件:INSTALL PLUGIN authentication_ldap_sasl SONAME 'authentication_ldap_sasl.so';
CREATE USER 'alice'@'%' IDENTIFIED WITH authentication_ldap_sasl BY 'uid=alice,cn=users,cn=accounts,dc=example,dc=com';
success 响应多数生产环境采用分层防护:用 SSH 密钥登录跳板机(已配好 google-authenticator),再从该机器连接 MySQL。这样第二因子落在操作系统层,MySQL 本身只需专注账号隔离与权限控制。
iptables -A INPUT -p tcp --dport 3306 -s 192.168.10.0/24 -j ACCEPT(仅放行内网段)
CREATE USER 'app'@'localhost' IDENTIFIED WITH caching_sha2_password REQUIRE X509;
有人误把 validate_password 插件当 2FA——它只检查密码强度(长度、字符集等),和第二因子完全无关。启用后仍只需一个密码即可登录,攻击者爆破成功一次就全盘沦陷。
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'validate_password';
ACTIVE,说明只是密码策略生效,不代表有 2FA