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) 实际部署中最容易被忽略的是插件加载顺序与权限隔离:MySQL 启动时若插件加载失败,不会中断服务,但后续
CREATE USER ... REQUIRE MULTIFACTOR会静默失败或报错不明确。务必在配置文件中设置
plugin_load_add = authentication_fido.so并检查
SHOW PLUGINS;输出状态。
