本文目录导读:

SSH服务安全加固:彻底禁用密码登录的完整指南
目录导读
为什么必须禁用密码登录?
在服务器安全运维中,SSH(Secure Shell)服务是最核心的远程管理通道。密码登录是黑客暴力破解的首要目标,根据多个安全机构统计,针对公网服务器的SSH暴力破解攻击平均每台每天超过1000次,禁用密码登录后,攻击者即使拥有密码也无法直接访问,极大降低了被“撞库”或“弱口令爆破”的风险。
关键威胁场景:
- 弱口令爆破:常见密码如“123456”“password”可在数秒内被破解。
- 凭证泄露:若数据库或日志泄露,密码可能被窃取。
- 中间人攻击:密码传输过程若未加密(虽SSH已加密,但密钥更安全),仍存在风险。
核心原则:密钥认证优于密码认证——密钥对不易被猜测,且支持强加密算法(如Ed25519)。
准备工作:确认SSH版本与备份配置
在修改任何配置前,请先完成以下检查:
确认SSH服务状态
ssh -V # 查看OpenSSH版本(建议≥7.0) systemctl status sshd # 检查服务运行状态
备份原始配置文件
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%Y%m%d)
此备份允许你在意外锁定时恢复文件(例如通过VNC或云控制台)。
确保当前已有密钥认证
若从未设置过密钥,请先完成密钥生成与部署(详见下一节),否则禁用密码后你将无法登录。
步骤详解:禁用密码登录的核心操作
修改sshd_config文件
使用编辑工具(如nano或vim)打开配置文件:
sudo vim /etc/ssh/sshd_config
需要修改或确认以下参数:
# 禁用密码认证 PasswordAuthentication no # 禁用空密码(即使密码认证已禁用,也建议关闭) PermitEmptyPasswords no # 仅允许密钥认证(可选但推荐) PubkeyAuthentication yes # 禁用挑战应答认证(避免通过其他方式输入密码) ChallengeResponseAuthentication no # 禁用GSSAPI认证(非必要场景) GSSAPIAuthentication no # 确保允许root通过密钥登录(若需要) PermitRootLogin prohibit-password # 或改为 'without-password' # 限制登录用户(可选) AllowUsers your_username
重启SSH服务
sudo systemctl restart sshd
注意:重启前建议开启第二个SSH会话,以防当前连接断开后无法重连。
密钥认证替代方案:从生成到部署
步骤1:生成密钥对(客户端执行)
推荐使用更安全的Ed25519算法:
ssh-keygen -t ed25519 -C "your_email@example.com"
若需兼容旧系统,可使用RSA(4096位):
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
步骤2:复制公钥到服务器
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@your-server-ip
或手动追加:
cat ~/.ssh/id_ed25519.pub | ssh user@your-server-ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
步骤3:设置密钥权限(重要)
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
常见问题与问答
Q1:禁用密码后,我还能通过控制台(如云服务商VNC)登录吗?
答:可以。sshd_config只影响SSH服务,物理机控制台或云厂商的“远程连接”(如阿里云管理终端、腾讯云VNC)仍支持密码认证,作为紧急备用。
Q2:如果误操作导致无法登录,如何恢复?
答:通过云控制台或带外管理(如IPMI)进入系统,恢复到备份文件:
sudo cp /etc/ssh/sshd_config.bak.20250101 /etc/ssh/sshd_config sudo systemctl restart sshd
Q3:是否必须同时禁用所有密码认证相关选项?
答:建议同时禁用PasswordAuthentication和ChallengeResponseAuthentication,后者常被用于PAM模块的密码验证,若只禁前者,攻击者可能通过挑战-响应机制绕过。
Q4:能否对特定用户启用密码登录?
答:可以,使用Match User块:
Match User insecure_user
PasswordAuthentication yes
但该做法会降低整体安全性,仅建议用于临时调试。
最终验证与安全建议
完整测试流程
# 测试密钥登录(成功) ssh -i ~/.ssh/id_ed25519 user@server # 测试密码登录(应被拒绝) ssh -o PreferredAuthentications=password user@server # 输出:Permission denied (publickey).
附加安全措施
- 更改SSH默认端口(非22):减少扫描攻击。
- 启用Fail2ban:自动封禁多次失败尝试的IP。
- 关闭公网SSH端口:若仅需内网管理,通过VPN或堡垒机访问。
- 定期轮换密钥:至少每6个月生成新密钥。
日志监控
查看攻击记录:
sudo journalctl -u sshd | grep 'Failed password'
若发现大量失败尝试,说明你的服务器正被扫描,此时禁用密码登录已刻不容缓。
通过以上步骤,你的SSH服务将彻底摆脱密码认证漏洞。密钥是钥匙,密码是弱点——将服务器从“被动防御”转向“主动免疫”,是所有运维人员的第一步安全必修课。