3 层加固 SSH 安全:从暴力破解到零信任,运维人必做的 6 件事


目录:

痛点:你的 SSH 端口正在被扫描

打开任何一台云服务器的 /var/log/auth.log,你大概率会看到这样的记录:

Apr 18 03:14:22 web01 sshd[12847]: Failed password for root from 185.234.xx.xx port 44832 ssh2
Apr 18 03:14:25 web01 sshd[12849]: Failed password for admin from 185.234.xx.xx port 44836 ssh2
Apr 18 03:14:28 web01 sshd[12851]: Invalid user oracle from 103.78.xx.xx port 38412

全球每天有数百万次 SSH 暴力破解尝试。一台新开的云服务器,平均 15 分钟内 就会收到第一次扫描。密码弱一点、端口没改、root 没禁 —— 沦陷只是时间问题。

本文按 3 层递进 的思路,给出 6 个可立即执行的加固方案。

方案总览

层级 措施 防御目标
第 1 层:减少暴露面 改端口 + 禁 root 登录 降低被扫描和暴力破解概率
第 2 层:强认证 密钥登录 + 关闭密码认证 彻底消灭密码猜测攻击
第 3 层:主动防御 Fail2Ban + 网络层限制 自动封禁 + 最小化网络入口

实操步骤

第 1 层:减少暴露面

① 修改默认端口

编辑 /etc/ssh/sshd_config

# 改为非标准端口(选 1024-65535 之间)
Port 22122

# 修改后重启
sudo systemctl restart sshd

⚠️ 改端口前务必先在安全组/防火墙放行新端口,否则你会把自己锁在外面。

② 禁止 root 直接登录

# /etc/ssh/sshd_config
PermitRootLogin no

# 确保你有一个 sudo 用户再改这个!
sudo systemctl restart sshd

第 2 层:强认证

③ 配置密钥登录

在本地生成密钥对(推荐 Ed25519 算法):

# 本地执行
ssh-keygen -t ed25519 -C "devops@company" -f ~/.ssh/id_ed25519_prod

# 把公钥传到服务器
ssh-copy-id -i ~/.ssh/id_ed25519_prod.pub -p 22122 user@your-server

④ 关闭密码认证

确认密钥能正常登录后,再关密码:

# /etc/ssh/sshd_config
PasswordAuthentication no
PubkeyAuthentication yes
ChallengeResponseAuthentication no

sudo systemctl restart sshd

这一步做完,暴力破解就彻底失效了 —— 没有密钥,连认证窗口都不会弹出。

第 3 层:主动防御

⑤ 部署 Fail2Ban 自动封禁

sudo apt install fail2ban -y

# 创建自定义配置
sudo tee /etc/fail2ban/jail.local << 'EOF'
[sshd]
enabled = true
port = 22122
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
findtime = 300
bantime = 3600
banaction = iptables-multiport
EOF

sudo systemctl enable --now fail2ban

# 查看封禁状态
sudo fail2ban-client status sshd

这个配置的意思是:5 分钟内失败 3 次,封 IP 1 小时。生产环境可以把 bantime 调到 86400(24 小时)甚至 -1(永久)。

⑥ 安全组/防火墙限制来源 IP

这是最有效的一招 —— 直接在网络层拦截:

# AWS 安全组:只允许办公 IP 段
aws ec2 authorize-security-group-ingress \
  --group-id sg-xxxxxx \
  --protocol tcp --port 22122 \
  --cidr 203.0.113.0/24

# 或者用 iptables
sudo iptables -A INPUT -p tcp --dport 22122 -s 203.0.113.0/24 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22122 -j DROP

如果团队成员 IP 不固定,可以结合 Tailscale / WireGuard 等 VPN 方案,只允许内网 IP 访问 SSH。

3 个常见坑

坑 1:改端口后把自己锁外面

改 SSH 端口时,先在另一个终端保持旧连接不要断。新端口测试通过后再关旧终端。云服务器还可以通过 VNC 控制台救急。

坑 2:密钥权限不对导致登录失败

SSH 对文件权限要求非常严格:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/id_ed25519_prod

看到 Permission denied (publickey) 时,先检查权限再排查别的。

坑 3:Fail2Ban 封了自己的 IP

/etc/fail2ban/jail.local 中添加白名单:

[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 203.0.113.0/24

把办公网段加进去,避免因为输错几次密码就被自己的服务器拉黑。

加固后的验证清单

做完上述 6 步后,用以下命令验证:

# 检查 SSH 配置
sudo sshd -T | grep -E "port|permitrootlogin|passwordauthentication|pubkeyauthentication"

# 预期输出
# port 22122
# permitrootlogin no
# passwordauthentication no
# pubkeyauthentication yes

# 检查 Fail2Ban 状态
sudo fail2ban-client status sshd

总结

SSH 安全加固不需要高深技术,核心就三件事:缩小攻击面、用强认证、加主动防御。6 个步骤按顺序做完,花不了 20 分钟,但能挡住 99% 的自动化攻击。

记住一个原则:安全是层层叠加的。单独改个端口没用,单独上密钥也不够 —— 组合起来才是真正的纵深防御。