mysql原生不支持google authenticator或短信类mfa,必须通过插件组合实现:8.0.27+启用authentication_policy框架并安装authentication_pam或authentication_fido插件,前者结合pam+totp(如pam_google_authenticator.so),后者仅支持fido2安全密钥,二者均需外部校验且不兼容手机app。

MySQL 原生不支持 Google Authenticator 或短信类 MFA,所谓“配置 MFA”本质是组合两个认证环节:一个走 MySQL 内部(如 mysql_native_password),另一个交由外部系统(如 Linux PAM 或 FIDO2 安全密钥)完成校验。没有插件配合,REQUIRE MULTIFACTOR 会直接报错或静默失效。
确认 MySQL 版本与插件可用性
MySQL 8.0.27+ 才提供 authentication_policy 框架和 REQUIRE MULTIFACTOR 语法;低于此版本无法启用多因素策略编排。
- 运行
SELECT VERSION();确认版本 ≥ 8.0.27 - 执行
SHOW PLUGINS;查看authentication_policy是否状态为ACTIVE - 若未加载,需手动安装:
INSTALL PLUGIN authentication_policy SONAME 'authentication_policy.so';(Linux)或.dll(Windows) -
authentication_policy本身不校验任何令牌,只强制用户绑定多个认证方法——它是个“调度器”,不是“验证器”
用 PAM 实现 TOTP 类 MFA(Google Authenticator)
这是目前社区最可行、兼容性最好的方案,依赖操作系统级 PAM 模块(如 pam_google_authenticator.so),MySQL 仅做请求转发。
- 确保系统已安装
libpam-dev和pam-google-authenticator(Debian/Ubuntu)或pam-devel+google-authenticator(RHEL/CentOS) - 安装 MySQL PAM 插件:
INSTALL PLUGIN authentication_pam SONAME 'auth_pam.so';(注意:部分发行版插件名为authentication_pam.so,路径需匹配plugin_dir) - 创建 PAM 配置文件
/etc/pam.d/mysql,内容示例:auth [success=ok default=bad] pam_unix.so auth [success=ok default=bad] pam_google_authenticator.so secret=/var/lib/mysql-pam/%u.google_authenticator
- 创建用户时指定 PAM service 名:
CREATE USER 'mfa_user'@'%' IDENTIFIED WITH authentication_pam AS 'mysql';(此处'mysql'必须与 PAM 文件名一致) - 客户端连接需启用明文插件:
mysql -u mfa_user -p --default-auth=mysql_clear_password,否则握手失败
FIDO2 安全密钥方案(不兼容手机 App)
MySQL 官方 authentication_fido 插件只支持物理安全密钥(YubiKey、Titan Key),走 WebAuthn/FIDO2 协议,和 Google Authenticator 的 TOTP 协议完全无关。
- 启用插件:
INSTALL PLUGIN authentication_fido SONAME 'auth_fido.so'; - 创建用户:
CREATE USER 'fido_user'@'%' IDENTIFIED WITH authentication_fido; - 绑定设备必须通过 MySQL Shell 的
util.fidoRegister()完成,CLI 客户端不支持交互式注册 - 登录时需插入密钥并触发生物识别或按钮确认——无法用二维码、6 位数字替代
- 错误提示常为
Access denied for user,而非明确的 FIDO 失败,排查需查error.log和 USB 设备日志
容易被忽略的关键点
部署 MFA 后最常卡住的地方,往往不在 MySQL 配置本身:
- PAM 配置文件权限必须是
644,且属主为root:root;否则 mysqld 启动时静默跳过加载 - SELinux 若启用,需放行 mysqld 访问 PAM 模块和 Google Authenticator 秘钥文件(
setsebool -P mysqld_can_network_connect_db 1不够,还需mysqld_read_pam_config) -
authentication_policy的策略规则写在CREATE USER的REQUIRE MULTIFACTOR子句里,但不会自动校验第二因子是否就绪——插件没装、PAM 文件路径错、秘钥格式非法,都会导致登录直接拒绝,无中间态提示 - 审计日志中
general_log只记录 “Connect” 和 “Quit”,MFA 交互细节全部落在系统日志(/var/log/secure或journalctl -u mysqld)里,不查这里等于盲调











