真正有效的SSH加固是构建多层防御机制:1.禁用密码登录、强制密钥认证并设私钥口令;2.禁止root远程登录,创建专用sudo用户;3.通过AllowUsers、MaxAuthTries等限制访问来源与行为;4.配合Fail2ban和防火墙实现动态封禁。

SSH 是服务器最常被攻击的入口,单纯改端口或设密码远远不够。真正有效的加固,是构建多层防御机制,让攻击者即使突破某一层,也无法获得系统控制权。
禁用密码登录,强制密钥认证
密码认证是暴力破解的主攻方向,而密钥认证几乎无法被离线爆破。操作前务必确认密钥已正确部署并能无密码登录,否则可能被锁死。
- 编辑 /etc/ssh/sshd_config,设置 PasswordAuthentication no 和 PubkeyAuthentication yes
- 确保 AuthorizedKeysFile .ssh/authorized_keys 未被注释且路径正确
- 私钥必须设置强密码保护(passphrase),并禁止在客户端明文存储
- 重启服务前,保留一个本地终端或带控制台的备用连接
彻底关闭 root 远程登录
root 用户名固定、权限最高,是自动化攻击的首选目标。禁用其 SSH 登录可大幅抬高攻击门槛。
- 配置 PermitRootLogin no(不是 prohibit-password)
- 创建专用管理用户(如 admin 或 ops),并加入 sudo 组
- 通过 sudoers 文件精细化授权,避免直接授予 ALL=(ALL) NOPASSWD
- 如需临时提权,统一使用 sudo -i 或 sudo su -,而非长期保持 root shell
精细控制访问来源与行为
不依赖“隐蔽即安全”,而是主动收缩攻击面:谁、从哪、何时、能做什么,全部可管可控。
- 用 AllowUsers 或 AllowGroups 明确限定可登录的用户或组,例如 AllowUsers admin@192.168.10.0/24 ops@203.0.113.5
- 限制单次会话最大认证尝试次数:MaxAuthTries 3
- 设置空闲超时:ClientAliveInterval 300 + ClientAliveCountMax 3(约15分钟无交互自动断开)
- 日志级别调为 VERBOSE,便于后续审计异常登录和命令执行
配合 Fail2ban 与防火墙形成动态响应
静态规则只能防扫描,动态封禁才能应对真实攻击。Fail2ban 应与底层防火墙协同工作,而非替代它。
- 安装 Fail2ban 后,启用 sshd jail,并根据实际端口修改 port = 2222(若已改端口)
- 设置合理阈值:maxretry = 3,bantime = 1h(首次可设短些,稳定后延长)
- 防火墙(iptables/firewalld/ufw)仅放行可信 IP 段的 SSH 端口,其余一律 DROP
- Fail2ban 封禁动作应调用 iptables 或 nftables,确保封禁即时生效且持久










