4、SSH服务端加固:配置文件详解、端口修改、协议版本限制、登录限制、Fail2Ban集成
SSH 服务,说白了就是远程服务器的「大门钥匙」。我见过太多团队,服务器被入侵都是从 SSH 爆破开始的。嗯,这章咱们就把这扇门彻底焊死。
核心思路:减少暴露面 + 限制登录方式 + 暴力破解防御。三者缺一不可。
4.1 SSH 配置文件详解
主配置文件在 /etc/ssh/sshd_config。我习惯每次改完都先做语法检查:
sudo sshd -t
# 没输出就是没问题,有错会直接告诉你哪行写错了
下面是我个人最常用的几个配置项,直接贴出来:
| 配置项 | 推荐值 | 说明 |
|---|---|---|
Port |
2222(或其他高位端口) | 避开默认 22,减少扫描命中率 |
Protocol |
2 | 只允许 SSHv2,v1 有严重漏洞 |
PermitRootLogin |
no | 禁止 root 直接登录 |
PasswordAuthentication |
no | 关闭密码登录,只用密钥 |
PubkeyAuthentication |
yes | 开启公钥认证 |
MaxAuthTries |
3 | 最大认证尝试次数 |
ClientAliveInterval |
300 | 每 300 秒检查一次客户端存活 |
ClientAliveCountMax |
2 | 连续 2 次无响应就断开 |
我的习惯:改完配置先开一个新终端窗口测试连接,确认没问题再退出当前会话。否则一旦配错把自己锁在外面,那就尴尬了。
4.2 修改 SSH 端口
改端口不是万能的,但能过滤掉 99% 的脚本小子扫描。我曾在项目里遇到过,改完端口后日志里的爆破记录直接清零。
# 编辑配置文件
sudo vim /etc/ssh/sshd_config
# 找到这行,改成你想要的端口
Port 2222
# 重启服务
sudo systemctl restart sshd
# 别忘了防火墙放行新端口
sudo ufw allow 2222/tcp
注意:如果你在云服务器上,记得先去安全组放行新端口,再重启 SSH 服务。我曾经手快先重启了服务,结果端口没放行,只能通过 VNC 连进去救场。
4.3 协议版本限制
SSHv1 早就该淘汰了。它存在设计缺陷,容易被中间人攻击。我检查过的服务器里,居然还有几台老机器默认开着 v1。
# 在 sshd_config 中明确指定
Protocol 2
# 验证当前支持的协议版本
sudo sshd -T | grep protocol
输出应该是 protocol 2。如果看到 2,1,说明 v1 还开着,赶紧改掉。
4.4 登录限制
这部分我做得比较狠。除了禁止 root 登录,我还会限制允许登录的用户和 IP。
# 只允许特定用户登录
AllowUsers alice bob
# 或者只允许特定组
AllowGroups sshusers
# 限制来源 IP(在 /etc/hosts.allow 中)
sshd: 192.168.1.0/24, 10.0.0.0/8
为什么要这么做?你想想看,如果公司内部只有 10 个人需要 SSH,那其他人连尝试的机会都不该有。
避坑指南:我曾经在配置 AllowUsers 时手滑写错了用户名,结果自己也被拦在外面。后来我学乖了——先写个测试用户,确认没问题再批量加。
4.5 Fail2Ban 集成
Fail2Ban 是防爆破的利器。它的原理很简单:监控日志,发现多次失败就临时封 IP。
安装很简单:
sudo apt install fail2ban
配置在 /etc/fail2ban/jail.local,我一般这样写:
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600
解释一下这几个参数:
- maxretry = 3:失败 3 次就封
- bantime = 3600:封 1 小时
- findtime = 600:10 分钟内连续失败才算
我的经验:bantime 别设太短,脚本小子会反复试。我一般设 86400(24 小时),对内部误操作可以手动解封:sudo fail2ban-client set sshd unbanip 192.168.1.100
启动并检查状态:
sudo systemctl start fail2ban
sudo fail2ban-client status sshd
能看到被封的 IP 列表,心里踏实多了。
4.6 知识体系总览
下面这张图把 SSH 加固的四个层面串起来了,我建议你保存下来当 checklist 用。
4.7 完整配置示例
最后,把我个人生产环境用的配置贴出来,你直接复制改改就能用:
# /etc/ssh/sshd_config
Port 2222
Protocol 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
UsePrivilegeSeparation yes
KeyRegenerationInterval 3600
ServerKeyBits 2048
SyslogFacility AUTH
LogLevel INFO
LoginGraceTime 60
PermitRootLogin no
StrictModes yes
MaxAuthTries 3
MaxSessions 5
PubkeyAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication no
UsePAM yes
X11Forwarding no
PrintMotd no
AcceptEnv LANG LC_*
Subsystem sftp /usr/lib/openssh/sftp-server
AllowUsers alice bob
ClientAliveInterval 300
ClientAliveCountMax 2
最后提醒:改完配置一定要 sudo sshd -t 检查语法,然后 sudo systemctl restart sshd。新开一个终端窗口测试连接,确认没问题再关掉当前会话。别问我为什么强调这个——说多了都是泪。