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 用。

SSH 服务端加固知识体系 SSH 服务端加固 配置文件详解 端口修改 + 协议限制 登录限制 Fail2Ban 集成 sshd_config 语法检查 关键参数调优 修改 Port + 防火墙放行 Protocol 2 强制 禁止 root + 密钥认证 AllowUsers / AllowGroups jail.local 配置 封禁策略 + 手动解封 目标:减少暴露面 + 限制登录 + 防爆破 三层防御,缺一不可

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。新开一个终端窗口测试连接,确认没问题再关掉当前会话。别问我为什么强调这个——说多了都是泪。