SSH 安全加固实战:从密钥登录到 fail2ban 一次讲清


很多站长把 VPS 买回来、网站部署上线之后,就再没关心过服务器本身的安全。可实际上,只要服务器挂在公网上,每天就有成千上万的扫描脚本在扫 22 端口,弱口令爆破、撞库尝试从来没有停过。一台裸奔的 VPS 上线 24 小时,日志里往往就会出现几十上百次失败的 SSH 登录尝试。这篇文章不聊虚的,就按真实操作顺序,从创建普通用户、配置密钥登录,到改端口、上 fail2ban,把 SSH 安全加固一次讲清。

一、先看看你的服务器正被怎么攻击

随便拿一台带公网 IP 的 VPS,用 lastb 命令,或者查看 /var/log/secure(CentOS / RHEL)和 /var/log/auth.log(Ubuntu / Debian),都能看到密密麻麻的 Failed password 记录。攻击者的套路基本就两种:一是全网扫描,批量探测哪些 IP 的 22 端口开放;二是拿常见用户名(root、admin、test……)配弱口令字典暴力尝试。只要密码稍微简单一点,或者干脆用了默认密码,被爆破成功只是时间问题。所以 SSH 加固的核心原则就一句话:让密码登录变得不可能,让扫描器无利可图。

二、第一步:创建普通用户,禁止 root 直接登录

root 是爆破者最喜欢的用户名,第一步就是建一个普通用户日常使用,root 只留作应急。CentOS / RHEL 系统执行 useradd -m -G wheel sshuser 创建用户并加入 wheel 组,再用 passwd sshuser 设置密码;Ubuntu / Debian 系统把 wheel 换成 sudo,即执行 useradd -m -G sudo sshuser。

创建完成后,另开一个终端用新用户登录测试,确认能正常登录、能 sudo 提权,再继续往下走。这里特别提醒:在确认新用户能正常登录之前,千万不要关掉当前的 root 会话,否则把自己锁在门外就麻烦了。

三、第二步:配置 SSH 密钥登录

密钥登录用一对公私钥代替密码:私钥留在本地电脑,公钥放到服务器,安全性比密码高一个量级。先在本地电脑(不是在服务器上)执行 ssh-keygen -t ed25519 -C "you@example.com" 生成密钥,一路回车即可,建议给私钥设置一个口令。

然后把公钥传到服务器,最简单的方式是在本地执行 ssh-copy-id sshuser@你的服务器IP,或者手动粘贴:cat ~/.ssh/id_ed25519.pub | ssh sshuser@你的服务器IP "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"。之后用密钥登录试试,能免密进去就说明配置成功。

四、第三步:修改 SSH 配置文件

SSH 主配置文件在 /etc/ssh/sshd_config,执行 sudo vim /etc/ssh/sshd_config 打开修改。建议改动的项包括:PermitRootLogin no,禁止 root 直接登录,只保留普通用户加 sudo;PasswordAuthentication no 配合 PubkeyAuthentication yes,关闭密码登录、只允许密钥;Port 22022,换掉被扫描最频繁的默认 22 端口;AllowUsers sshuser,白名单模式,只允许指定用户登录。

注意操作顺序:先确认密钥能登录,再关密码登录;先确认新端口能连上,再重启服务。修改完成后执行 sudo systemctl restart sshd 重启 SSH 生效。

改完端口后,以后登录要带上端口参数:ssh -p 22022 sshuser@你的服务器IP。另外记得在云厂商的安全组和系统防火墙里放行新端口,把旧的 22 端口关掉。

五、第四步:安装 fail2ban 兜底

即使关了密码登录,fail2ban 依然是双保险。它会监控登录日志,发现某个 IP 反复失败就自动封禁。Ubuntu / Debian 执行 sudo apt install fail2ban -y 安装,CentOS 先执行 sudo yum install epel-release -y 再执行 sudo yum install fail2ban -y。

然后创建本地配置 /etc/fail2ban/jail.local,写入如下内容:[sshd] enabled = true port = 22022 maxretry = 3 bantime = 3600 findtime = 600,意思是 10 分钟内登录失败 3 次,封禁 1 小时。

最后执行 sudo systemctl restart fail2ban 重启服务,用 sudo fail2ban-client status sshd 查看封禁状态。

六、几个容易忽略的细节

登录告警:在 /etc/profile 末尾加一段脚本,每次登录都提示上次登录的 IP 和时间,异常登录一眼就能发现。

防火墙配合:云厂商安全组加上系统防火墙(firewalld / ufw),只放行必要端口,能少开就少开。

定期更新系统:执行 apt update && apt upgrade(或 yum update),及时给系统和软件打补丁。

空闲超时:在 sshd_config 里设置 ClientAliveInterval 300 和 ClientAliveCountMax 2,防止空闲连接长期挂着。

总结

SSH 安全加固的核心就三件事:不用 root、不用密码、不用默认端口。按顺序操作:先建普通用户,再配密钥登录,确认能进去后关掉密码登录、改掉默认端口,最后用 fail2ban 兜底。整套流程半小时左右,却能挡住绝大多数针对服务器的暴力破解,性价比极高。操作过程中有任何一步拿不准,建议先在一台测试机上演练一遍再上生产环境。


手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

-

SSH 安全加固实战:从密钥登录到 fail2ban 一次讲清

评 论