生产环境下,最稳妥的做法是在保留当前 SSH 会话的同时,先测试密钥登录成功,再修改配置禁用密码认证。
先说结论:禁用密码登录能有效防止暴力破解,但操作前必须确保密钥登录可用,否则会导致无法远程连接。
- 先判断:确认当前服务器已生成并配置好 SSH 密钥对,且能成功免密登录。
- 优先做:备份配置文件,在 sshd_config 中将 PasswordAuthentication 设为 no,并通过语法检查。
- 再验证:新开终端窗口测试密钥登录是否正常,同时确认密码登录已被拒绝。
操作前准备
1. 备份配置:修改前务必备份原配置,以便出错时快速回滚。
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%F)
2. 确认密钥可用:在本地新开一个终端窗口,测试能否免密登录。切勿在当前唯一会话中直接修改配置。
ssh user@server_ip
修改配置
编辑 /etc/ssh/sshd_config 文件。建议使用 vim 等编辑器手动修改,以避免 sed 命令因缩进或格式差异导致匹配失败。
sudo vim /etc/ssh/sshd_config
找到或添加以下配置项(注意不要有多余空格或拼写错误):
PubkeyAuthentication yes
PasswordAuthentication no
PermitRootLogin without-password # 根据安全基线调整,建议禁止 root 密码登录
若必须使用命令修改,请确保备份后执行,并注意配置项前的缩进:
sudo sed -i 's/^#*PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo sed -i 's/^#*PasswordAuthentication no/PasswordAuthentication no/' /etc/ssh/sshd_config
语法检查与服务重启
1. 语法检查:重启前必须检查配置语法,防止因配置错误导致 SSH 服务无法启动。
sudo sshd -t
若无输出则表示配置正确;若有报错,请根据提示修正。
2. 重启服务:确认语法无误后重启 SSH 服务。
sudo systemctl restart sshd
怎么验证是否生效
1. 正向验证:使用密钥登录,应成功且无需输入密码。
2. 反向验证:尝试强制使用密码登录,应被拒绝。
ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no user@server_ip
3. 查看日志:检查 /var/log/auth.log 或 /var/log/secure,确认密码认证尝试被拒绝。
紧急恢复预案
若修改配置后无法连接,且没有保留会话:
1. 控制台访问:通过云厂商提供的 VNC 或控制台登录服务器。
2. 恢复配置:将备份的配置文件还原。
sudo cp /etc/ssh/sshd_config.bak.* /etc/ssh/sshd_config
sudo systemctl restart sshd
常见坑
1. 把自己锁在门外:修改配置后直接关闭当前会话,一旦密钥配置有误,将无法恢复。务必保留一个已登录的会话直到新窗口测试成功。
2. SELinux 权限:如果开启了 SELinux,authorized_keys 文件权限不对会导致密钥登录失败。确保 ~/.ssh 目录权限为 700,文件为 600。
3. Root 登录限制:如果禁止了 root 登录,请确保普通用户有 sudo 权限,否则无法提权管理。