SSH 安全加固与 Fail2Ban

前言

前两天帮朋友排查服务器问题,结果一看登录日志,好家伙,密密麻麻的暴力破解尝试,一天下来好几万条记录。还好他密码设置得比较复杂,不然早就被人端了。这事儿让我觉得有必要聊聊 SSH 安全加固,毕竟这是服务器的第一道防线,稍微注意点就能挡住绝大多数攻击。

为什么要加固 SSH

SSH 默认端口是 22,全世界都知道。各种扫描脚本、暴力破解工具天天盯着 22 端口扫,如果你还用弱密码或者直接用 root 登录,那跟把钥匙挂在门上没啥区别。我见过太多服务器因为 SSH 被攻破而被用来挖矿或者发垃圾邮件的案例了。加固 SSH 其实很简单,花不了几分钟,但能省很多麻烦。

基础加固:从密码到密钥

首先第一件事,就是把密码登录关掉,改用密钥对。这是最有效的防护手段,没有之一。

生成密钥对很简单,在本地执行:

ssh-keygen -t ed25519 -C "[email protected]"

然后把公钥传到服务器上:

ssh-copy-id user@your_server_ip

确认能正常登录后,修改服务器的 SSH 配置:

sudo nano /etc/ssh/sshd_config

这几个选项一定要改:

PasswordAuthentication no

PermitRootLogin no

PubkeyAuthentication yes

改完保存,重启 SSH 服务:

sudo systemctl restart sshd

这样一来,就算有人拿到密码也进不去了,因为登录必须要有对应的私钥。我建议私钥再设个 passphrase,相当于又加了一层保护。

另外,把默认端口改掉也能减少很多骚扰。把 Port 22 改成其他端口,比如 22022,记得在防火墙和云控制台的安全组里放行新端口。

Fail2Ban:自动封禁坏蛋

密钥登录搞定之后,我们还可以更进一步。虽说暴力破解进不来了,但那些扫描和尝试还是很烦人,而且万一有人拿到你的私钥呢?这时 Fail2Ban 就派上用场了。

Fail2Ban 的原理很简单:监控日志,发现多次登录失败就自动封掉那个 IP 一段时间。你可以理解为是一个自动保安,发现有人在撬锁就把门锁住让他进不来。

安装非常简单,Ubuntu/Debian 直接:

sudo apt update

sudo apt install fail2ban

CentOS/RHEL 可以用 epel 源:

sudo yum install epel-release

sudo yum install fail2ban

装好之后,Fail2Ban 会自带一个默认配置,但我们一般会自己写一个局部配置,覆盖默认设置。创建 /etc/fail2ban/jail.local

[sshd]

enabled = true

port = 22022

filter = sshd

logpath = /var/log/auth.log

maxretry = 3

findtime = 600

bantime = 3600

解释一下这些参数:maxretry 是允许失败的次数,findtime 是时间窗口(600 秒内失败 3 次就封),bantime 是封禁时长(3600 秒 = 1 小时)。你可以根据自己的需求调整,我一般把 bantime 设长一点,第一次封 1 小时,屡次犯事的可以更长。

启动并设置开机自启:

sudo systemctl start fail2ban

sudo systemctl enable fail2ban

想看看有没有生效,可以运行:

sudo fail2ban-client status

会显示当前被封的 IP 列表。如果你用的是非默认 SSH 端口,记得把配置文件里的 port 改成对应的端口号。

进阶防护:双重验证

如果你觉得密钥还不够保险,可以加上两步验证。Google Authenticator 是个不错的选择。

先装依赖:

sudo apt install libpam-google-authenticator

然后运行:

google-authenticator

按照提示扫描二维码,把密钥保存好。修改 PAM 配置 /etc/pam.d/sshd,加一行:

auth required pam_google_authenticator.so

再修改 /etc/ssh/sshd_config

ChallengeResponseAuthentication yes

重启 SSH 服务。这样登录时除了密钥,还需要输入动态验证码,安全性又提升了一个等级。不过提醒一下,手机一定要保管好,密钥和验证码都丢了的话神仙也救不回来。

其他小技巧

再说几个平时需要注意的点:

- 定期查看登录日志:sudo lastlog 或者 sudo tail -f /var/log/auth.log

- 用 ufw 或者 iptables 限制只能从特定 IP 访问 SSH

- 云服务器一定要在安全组里限制来源 IP

- 尽量不要用 root 用户登录,创建普通用户,用 sudo 提权

总结

SSH 安全加固其实门槛很低,主要就是:密钥登录 + 改端口 + Fail2Ban 防护。三步走完,安全性能提升一大截,基本告别暴力破解的骚扰。后续再根据需要加上两步验证、IP 白名单啥的,基本就稳了。安全这件事,防患于未然总是没错的,别等到被人攻进来了才后悔莫及。