phpMyAdmin 原生双因子认证仅支持 5.2.0+ 版本,需配置 $cfg['TwoFactorAuth'] 并确保 pma__userconfig 等系统表存在、PHP 启用 gd/imagick;更可靠方案是在 Nginx 层通过 auth_request + Python TOTP 校验实现,须透传用户名且保障时间同步。
phpmyadmin 本身不支持原生双因子认证,所谓“启用 2fa”实际是两种互斥路径:要么用新版(≥5.2.0)内置的 $cfg['twofactorauth'] 配置 + 依赖扩展生成二维码,要么在 web 服务器层(nginx/apache)前置 totp 校验——二者不能混用,且后者才是真正可控、可审计的方案。
确认你用的是支持内置 2FA 的 phpMyAdmin 版本
低于 5.2.0 的版本(如 5.1.x 或更早)压根没有 $cfg['TwoFactorAuth'] 配置项,强行添加会被忽略。运行 SELECT VERSION(); 查 MySQL 版本没用,得看 phpMyAdmin 自己的版本号:
- 登录 phpMyAdmin 底部查看 “Version” 字样,或执行
php --info | grep "phpMyAdmin" - 官方 2FA 支持从
5.2.0开始引入,但稳定可用需至少5.2.2(修复了Google2FA与imagick扩展的兼容问题) - 若版本符合,还需确保 PHP 启用了
gd或imagick扩展;否则二维码生成会失败,报错Call to undefined method SvgImageBackEnd::getQRCodeInline()
启用内置 2FA 时必须补全配置存储表
phpMyAdmin 的 2FA 设置(密钥、启用状态)不是存在 config.inc.php 里,而是写入 MySQL 的 pma__userconfig 和 pma__tracking 等系统表中。如果这些表不存在或用户无写权限,界面点“启用”毫无反应,也不会报错。
- 进入 phpMyAdmin 安装目录,执行
sql/create_tables.sql脚本建表(注意不是create_user_tables.sql) - 确保当前登录的 MySQL 用户对
phpmyadmin数据库有SELECT, INSERT, UPDATE, DELETE权限 - 检查
$cfg['Servers'][$i]['pmadb']是否指向正确的数据库名(默认是phpmyadmin) - 若仍不生效,查 Nginx/Apache 错误日志,常见提示是
Cannot access PMA database
Nginx 层加 auth_request 是更可靠的 2FA 实现方式
绕过 phpMyAdmin 自身逻辑,在请求到达前由 Nginx 校验 TOTP 动态码,能避免所有 PHP 层兼容性问题,也便于集中管理密钥和审计日志。但必须注意环境变量透传,否则 phpMyAdmin 无法获知已认证的用户名。
- 用
pip3 install pyotp安装校验库,写一个轻量脚本/usr/local/bin/validate-2fa.py,接收token和用户密钥(建议从/etc/2fa-secrets/按用户名读取) - Nginx 配置中为
location /phpmyadmin/添加auth_request /auth-2fa;,并定义location = /auth-2fa指向该脚本的 FastCGI 或 HTTP 后端 - 关键:必须加上
fastcgi_param PHP_AUTH_USER $remote_user;(FastCGI)或proxy_set_header X-Remote-User $remote_user;(HTTP 后端),否则 phpMyAdmin 会认为未登录 - 禁用 phpMyAdmin 原有的
auth_type(设为config或临时注释掉),否则会触发双重认证弹窗
别忽略时间同步和备用验证通道
TOTP 对系统时间极其敏感,误差超过 30 秒即失效。很多线上故障不是配置错,而是服务器未启用 NTP 同步。
立即学习“PHP免费学习笔记(深入)”;
- 运行
timedatectl status确认System clock synchronized: yes - 若用 Nginx + Python 脚本方案,脚本里应加入时间容错(如 ±1 步长),但不要超过 90 秒
- 务必保留一个不经过 2FA 的应急入口,例如单独配一个仅限内网 IP 访问的
/pma-admin/location,或用 SSH 隧道直连 - 用户密钥不要硬编码在脚本里,密钥文件权限必须是
600,属主为运行 Nginx 的用户(如www-data)



















