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 白名单啥的,基本就稳了。安全这件事,防患于未然总是没错的,别等到被人攻进来了才后悔莫及。
SSH 安全加固与 Fail2Ban
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法