SSH安全加固:防止暴力破解
SSH是服务器管理的生命线。如果SSH被攻破,攻击者就获得了服务器的完全控制权。默认配置的SSH存在很多安全隐患,需要加固。本文分享SSH安全加固的完整清单。
运维与安全工作的价值,常常体现在「什么都没发生」上。「SSH安全加固:防止暴力破解」所涉及的云上安全纵深防御,正是这种隐性价值的来源:体系健全时风平浪静,体系缺失时一次小问题就可能演变成大事故。
基础加固
修改默认端口:将SSH端口从22改为随机端口(如59222)。虽然不能阻止有心的攻击者,但可以大幅减少自动化扫描的攻击量。修改 /etc/ssh/sshd_config 中的 Port 指令。
禁止root登录:PermitRootLogin no。使用普通用户登录后再sudo提权。这样攻击者需要同时猜对用户名和密码才能登录。
使用密钥认证:PasswordAuthentication no。禁用密码登录,只允许SSH密钥认证。密钥比密码安全得多——2048位RSA密钥的暴力破解在可预见的未来是不可能的。
限制登录用户:AllowUsers deploy admin。只允许特定用户通过SSH登录。
高级加固
Fail2ban:自动检测SSH登录失败并临时封禁攻击者IP。配置 [sshd] jail,设置maxretry=3、bantime=3600(封禁1小时)。可以大幅减少暴力破解的尝试。
双因素认证(2FA):使用Google Authenticator PAM模块,SSH登录时需要输入密码+动态验证码。即使密码泄露,没有手机上的验证码也无法登录。
限制来源IP:通过iptables或TCP Wrappers限制SSH只允许特定IP段访问。iptables -A INPUT -p tcp --dport 22 -s 1.2.3.0/24 -j ACCEPT。
审计和监控
开启SSH登录日志:LogLevel VERBOSE。使用 last 和 lastb 查看成功和失败的登录记录。配置SSH登录告警——每次有人SSH登录时发送通知(通过PAM模块 + 脚本实现)。定期检查 authorized_keys 文件,确保没有未知的公钥。
一份可执行的日常清单
- 暴露面盘点:定期梳理对外端口与服务,关闭不必要的开放。
- 权限最小化:账号与密钥按最小权限分配,定期回收闲置权限。
- 告警治理:清理长期无人响应的告警,保证留下的告警都值得处理。
- 预案演练:对高频故障场景准备处置预案并定期演练。
清单不复杂,难在坚持;而云上安全纵深防御的差距,恰恰体现在坚持上。
云上安全纵深防御的体系化思路
与其追求单点工具的极致配置,不如先保证覆盖面:关键资产是否都在监控之内、重要操作是否都有审计、对外暴露面是否都经过评估。覆盖面完整之后,再谈深度优化才有意义。
体系化的另一个好处是可传承:不依赖某个人的记忆,而是依赖流程与清单,团队整体水位才会稳定提升。
