mysql 8.0.27+ 社区版支持mfa,需加载authentication_fido、authentication_pam或authentication_ldap_sasl等插件,并通过create user ... require multifactor显式启用双因子认证。

MySQL 8.0+ 如何启用 MFA(多因素认证)
MySQL 原生支持多因素认证,但仅限于企业版(MySQL Enterprise Edition)或 MySQL 8.0.27+ 社区版(需配合插件和外部认证服务)。社区版默认不内置 TOTP 或 SMS 支持,必须通过 authentication_fido 或 authentication_ldap_sasl 等插件间接实现,且依赖操作系统级 PAM 或 LDAP 服务。
- 确认版本:
SELECT VERSION();—— 必须 ≥ 8.0.27 才支持CREATE USER ... REQUIRE MULTIFACTOR - 加载插件(以 FIDO 为例):
INSTALL PLUGIN authentication_fido SONAME 'authentication_fido.so';(Linux 下路径可能为plugin_dir中的authentication_fido.so) - 创建 MFA 用户时需显式指定两个认证方法:
CREATE USER 'alice'@'%' IDENTIFIED WITH mysql_native_password BY 'p1' REQUIRE MULTIFACTOR AUTHENTICATION USING 'authentication_fido' AS 'second_factor'; - 注意:第一个因子(如密码)仍走本地验证,第二个因子必须由对应插件处理;若插件未启用或配置错误,用户将无法登录,且错误提示常为
Access denied for user,而非明确的 MFA 失败
用 PAM 实现 MySQL 多因素认证(Linux 系统级方案)
社区版最可行的 MFA 落地方式是通过 PAM 桥接,让 MySQL 将第二因子验证委托给系统 PAM 模块(如 pam_google_authenticator),适合已有 Linux 运维体系的场景。
- 先安装并配置 PAM TOTP(例如在 Ubuntu 上:
apt install libpam-google-authenticator,然后为 MySQL 运行用户(通常是mysql)生成密钥) - 编辑
/etc/pam.d/mysqld(若不存在则新建),添加一行:auth [success=ok default=bad] pam_google_authenticator.so secret=/var/lib/mysql-pam/${USER}.google_authenticator - 创建用户时使用:
CREATE USER 'bob'@'%' IDENTIFIED WITH authentication_pam AS 'mysqld';—— 此处mysqld对应 PAM service 名 - 风险点:PAM 配置错误会导致所有 PAM 认证用户被锁死;建议先用测试用户验证,且保留一个
mysql_native_password的管理员账号用于应急
为什么不能直接用 MySQL 内置密码策略替代 MFA
MySQL 的 validate_password 插件只约束密码强度(长度、字符类型等),它不解决「凭证泄露后仍可单次登录」的问题。MFA 的核心价值在于增加动态因子(时间令牌、生物特征、硬件密钥),而密码策略仍是静态凭证管理。
-
SET GLOBAL validate_password.policy = STRONG;不等于启用 MFA,只是让ALTER USER ... IDENTIFIED BY拒绝弱密码 - 即使开启
password_history和password_reuse_interval,攻击者拿到当前有效密码仍可登录 - 真正需要 MFA 的场景(如远程 DBA 接入、云数据库公网访问),必须叠加第二验证通道,而非仅靠更复杂的密码
LDAP + MySQL 的 MFA 变通方案(适用于已有 AD/LDAP 环境)
如果组织已部署 Active Directory 或 OpenLDAP,并启用了 LDAP 多因素(如 Microsoft Azure MFA 或 Duo LDAP Proxy),可让 MySQL 通过 authentication_ldap_sasl 插件把认证请求转发过去,由 LDAP 服务完成双因子校验。
- 需启用插件:
INSTALL PLUGIN authentication_ldap_sasl SONAME 'authentication_ldap_sasl.so'; - 用户创建语句中指定 LDAP base DN 和 bind user:
CREATE USER 'carol'@'%' IDENTIFIED WITH authentication_ldap_sasl BY 'CN=carol,OU=Users,DC=example,DC=com'; - 关键限制:MySQL 本身不参与第二因子交互,全程由 LDAP server 控制流程;若 LDAP server 未启用 MFA,该方案退化为单因子 LDAP 认证
- 调试时常见错误:
Authentication plugin 'authentication_ldap_sasl' cannot be loaded—— 多因插件未编译进二进制或缺少 SASL 库依赖(如libsasl2-modules)
CREATE USER ... REQUIRE MULTIFACTOR 会静默失败或报错不明确。务必在配置文件中设置 plugin_load_add = authentication_fido.so 并检查 SHOW PLUGINS; 输出状态。










