在Linux系统中搭建SSH动态密码登录,通常指通过集成动态密码(如一次性密码OTP)增强SSH登录安全性,防止密码泄露或暴力破解,以下是详细搭建步骤,以Google Authenticator(基于TOTP算法)为例,实现静态密码+动态密码的双因素认证(2FA)。
安装必要软件
首先需安装Google Authenticator的PAM(Pluggable Authentication Modules)模块,该模块负责动态密码的验证逻辑,不同Linux发行版的安装命令不同:
发行版 | 安装命令 |
---|---|
Ubuntu/Debian | sudo apt update && sudo apt install libpam-google-authenticator |
CentOS/RHEL | sudo yum install google-authenticator 或 sudo dnf install google-authenticator |
安装完成后,确保系统已安装SSH服务(sudo apt install openssh-server
或 sudo yum install openssh-server
),并启动SSH服务(sudo systemctl start sshd
,并设置开机自启:sudo systemctl enable sshd
)。
为用户配置动态密码
以用户exampleuser
为例,执行以下操作:
- 切换到目标用户:
sudo su - exampleuser
- 运行
google-authenticator
命令,按提示配置:- 命令会生成一个密钥(Secret Key),并显示二维码(可通过Google Authenticator、FreeOTP等APP扫描绑定)。
- 提示是否“启用基于时间的一次性密码(TOTP)”,选择
y
。 - 提示是否“防止重用已使用过的动态密码”,选择
y
(增强安全性)。 - 提示是否“为每个用户设置独立的文件路径”,默认即可(通常在
~/.google_authenticator
)。 - 提示是否“允许紧急访问码(Recovery Codes)”,选择
y
并保存8位应急码(用于丢失动态密码时登录)。
配置完成后,用户目录下会生成.google_authenticator
文件,包含密钥和验证规则。
配置PAM模块启用动态密码验证
PAM模块通过配置文件控制认证流程,需修改/etc/pam.d/sshd
文件(SSH服务的PAM配置文件):
- 备份原配置:
sudo cp /etc/pam.d/sshd /etc/pam.d/sshd.bak
- 编辑文件:
sudo nano /etc/pam.d/sshd
- 在文件开头添加以下行(若已存在
@include common-auth
,需注释掉):auth required pam_google_authenticator.so secret=/home/exampleuser/.google_authenticator user=exampleuser
secret
:指定动态密码密钥文件路径(需根据用户调整,如/root/.google_authenticator
则用户为root
)。user
:指定目标用户名(若需对所有用户生效,可省略user
参数,但需确保每个用户都有.google_authenticator
文件)。
配置SSH服务支持密码认证
确保SSH服务允许密码认证,并禁用仅密钥认证(若需保留密钥登录,可跳过此步):
编辑/etc/ssh/sshd_config
文件:sudo nano /etc/ssh/sshd_config
找到以下配置并修改:
PasswordAuthentication yes # 启用密码认证(默认可能为no,需改为yes) ChallengeResponseAuthentication yes # 启用挑战响应认证(PAM模块依赖此选项) PubkeyAuthentication yes # 保留密钥登录(可选,默认为yes)
修改后保存,重启SSH服务:sudo systemctl restart sshd
测试动态密码登录
- 在另一台设备上使用SSH客户端连接服务器:
ssh exampleuser@服务器IP
- 输入静态密码(用户系统密码),提示输入动态密码时,打开手机上的Google Authenticator APP,输入当前6位动态密码。
- 若输入正确,则登录成功;若错误,会提示“Authentication failure”。
若应急码未配置且动态密码丢失,可使用应急码登录(输入时需在应急码前加,如#123456
)。
安全优化建议
- 禁用root直接登录:编辑
/etc/ssh/sshd_config
,设置PermitRootLogin no
,降低风险。 - 限制登录尝试:安装
fail2ban
(sudo apt install fail2ban
),配置规则防止暴力破解。 - 定期更新密钥:建议每3-6个月重新运行
google-authenticator
生成新密钥,并更新APP绑定。
相关问答FAQs
Q1:忘记动态密码且应急码丢失,无法登录服务器怎么办?
A1:需通过物理接触服务器或使用控制台(如VNC、IDRAC)登录,以root权限修改用户认证方式:
- 临时禁用PAM模块:编辑
/etc/pam.d/sshd
,注释掉添加的pam_google_authenticator.so
行(行首加)。 - 重启SSH服务:
sudo systemctl restart sshd
。 - 登录后重新生成动态密码密钥:
sudo su - exampleuser
,运行google-authenticator
按提示配置。 - 恢复PAM模块配置,重启SSH服务。
注意:此操作仅在紧急情况下使用,恢复后需立即重新配置动态密码。
Q2:如何为多个用户批量配置动态密码登录?
A2:可通过脚本批量生成密钥并配置PAM模块:
- 创建用户列表(如
users.txt
),每行一个用户名。 - 批量生成密钥:
for user in $(cat users.txt); do sudo su - $user -c "google-authenticator -t -d -f -r 3 -R 30 -w 3"; done
- 参数说明:
-t
启用TOTP,-d
禁用重用密码,-r 3
生成3个应急码,-R 30
设置密钥有效期30天,-w 3
允许3次登录失败。
- 参数说明:
- 修改PAM配置文件,添加对所有用户的动态密码验证(省略
user
参数,确保每个用户目录下有.google_authenticator
文件)。 - 重启SSH服务使配置生效。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/32878.html