以下是在 Debian 上为 SSH 配置密钥 + MFA(Google Authenticator)双重认证的正确完整步骤,避免之前遇到的密码提示问题。
📋 步骤概览
- 安装必要软件
- 为用户生成 MFA 密钥
- 配置 PAM(禁用密码,启用 MFA 模块)
- 修改 SSH 服务端配置(启用 keyboard-interactive、设置认证方法)
- 检查语法并重载 SSH 服务
- 测试新登录流程
- 可选:防火墙、Fail2ban 等加固
🔧 详细操作
1. 安装 Google Authenticator PAM 模块
1 | sudo apt update |
2. 为您的普通用户生成 MFA 密钥
切换到要配置的用户(不要用 root):
1 | su - your_username |
按照交互提示全部选择 y(允许更新配置文件、禁止令牌重用、启用速率限制等)。
务必保存好显示的应急恢复码(每个码仅能使用一次)。
3. 配置 PAM
编辑 PAM 配置文件:
1 | sudo nano /etc/pam.d/sshd |
- 注释掉
@include common-auth这一行(禁用密码验证) - 在文件开头添加一行:
1 | auth required pam_google_authenticator.so |
保存并退出。
4. 修改 SSH 服务端配置
编辑 /etc/ssh/sshd_config:
1 | sudo nano /etc/ssh/sshd_config |
确保以下设置存在且正确:
1 | # 修改默认端口(建议高位端口,例如 23456) |
5. 检查语法并重新加载服务
1 | sudo sshd -t # 无输出表示语法正确 |
6. 测试新登录流程
保持当前终端窗口不关闭,另开一个终端测试登录:
1 | ssh -p 23456 your_username@your_server_ip |
- 若您已配置 SSH 密钥,第一步会自动验证密钥。
- 密钥验证通过后,会提示
Verification code:,输入手机 Google Authenticator 的 6 位动态码。 - 输入正确后登录成功。
如果仍然提示密码:
- 检查
/etc/ssh/sshd_config中KbdInteractiveAuthentication是否为yes。 - 检查
/etc/pam.d/sshd中是否已注释@include common-auth。 - 查看日志:
sudo journalctl -u ssh -f
7. 确认无误后彻底禁用密码认证
1 | PasswordAuthentication no |
8. 可选:防火墙与 Fail2ban 加固
1 | # 开放新 SSH 端口 |
⚠️ 重要注意事项
- 始终保留一个已登录的终端会话,以便在配置错误时回滚。
- 应急恢复码请妥善保存,丢失后若手机不可用将无法登录。
- 用户家目录的
.ssh权限应为700,authorized_keys权限应为600。 - 若您的 OpenSSH 版本低于 8.7(如 Debian 10),请使用
ChallengeResponseAuthentication yes代替KbdInteractiveAuthentication。
按照以上步骤,您将获得一个密钥 + 动态验证码双重保护的安全 SSH 环境,有效抵御密码泄露和暴力破解。