上周那篇《VPS 被入侵后的紧急排查》发出去后,很多读者问:"怎么预防被入侵?" 答案很简单:先把 SSH 这个最大的攻击面封死。据统计,互联网上有超过 60% 的 VPS 入侵是通过弱密码 SSH 暴力破解进来的。今天分享 7 个 SSH 加固步骤,按顺序做完,暴力破解基本没戏。
一、改默认端口(基础但有效)
22 端口是扫描器的重点照顾对象,改成高位端口能减少 90% 的无效扫描:
sudo vim /etc/ssh/sshd_config
修改:
Port 52222 # 选一个 10000-65535 之间的端口
然后重启 SSH:
sudo systemctl restart sshd
注意: 改端口前先确认防火墙放行了新端口,否则把自己锁在外面。建议先开两个 SSH 窗口测试。
二、禁用 Root 密码登录(最关键)
这是最重要的一步。Root + 密码的组合是暴力破解的最爱:
sudo vim /etc/ssh/sshd_config
修改以下三项:
PermitRootLogin no # 禁止 Root 登录
PasswordAuthentication no # 禁止密码登录,只用密钥
PubkeyAuthentication yes # 启用密钥登录
重启 SSH 生效。
密钥登录配置方法:
- 本地生成密钥对(如果还没有):
ssh-keygen -t ed25519 -C "your_email@example.com"
- 把公钥复制到服务器:
ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 52222 user@your_server_ip
- 测试密钥登录成功后,再禁用密码登录
三、使用 Ed25519 密钥(比 RSA 更安全更快)
不要用默认的 RSA 了,Ed25519 更安全、密钥更短、性能更好:
# 生成 Ed25519 密钥
ssh-keygen -t ed25519 -a 100
# 如果你必须用 RSA,至少 4096 位
ssh-keygen -t rsa -b 4096
四、配置 Fail2ban 自动封禁
即使改了端口 + 禁用密码,还是会有扫描器尝试。Fail2ban 能自动封禁暴力破解 IP:
# Debian/Ubuntu
sudo apt install fail2ban
# CentOS
sudo yum install fail2ban
创建自定义配置:
sudo vim /etc/fail2ban/jail.local
写入:
[DEFAULT]
bantime = 3600 # 封禁 1 小时
findtime = 600 # # 10 分钟内
maxretry = 3 # 失败 3 次就封禁
backend = systemd
[sshd]
enabled = true
port = 52222 # 改成你的 SSH 端口
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
启动并启用:
sudo systemctl start fail2ban
sudo systemctl enable fail2ban
# 查看封禁状态
sudo fail2ban-client status sshd
sudo fail2ban-client status sshd | grep "Banned IP list"
五、设置登录告警
每次有人 SSH 登录,发邮件或微信通知你:
sudo vim /etc/ssh/sshrc
写入:
#!/bin/bash
IP=$(echo $SSH_CONNECTION | awk '{print $1}')
HOSTNAME=$(hostname)
DATE=$(date +"%Y-%m-%d %H:%M:%S")
echo "[$DATE] SSH 登录告警:用户 $USER 从 $IP 登录到 $HOSTNAME" | mail -s "SSH Login Alert" your_email@example.com
或者用 webhook 发到企业微信/钉钉:
curl -s -X POST "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY" \
-H "Content-Type: application/json" \
-d "{\"msgtype\":\"text\",\"text\":{\"content\":\"SSH 登录:$USER@$HOSTNAME from $IP at $DATE\"}}"
六、限制登录用户和 IP
只允许特定用户登录,且只能从特定 IP(如果你有固定 IP):
sudo vim /etc/ssh/sshd_config
添加:
AllowUsers deploy@192.168.1.* admin@10.0.0.* # 只允许这些用户从这些 IP 登录
DenyUsers root test guest # 明确拒绝这些用户
七、启用双因素认证(2FA)
如果你管理的是生产服务器,建议上 2FA:
# 安装 Google Authenticator
sudo apt install libpam-google-authenticator
# 用户执行初始化
google-authenticator
按提示操作,会生成二维码,用 Google Authenticator App 扫描。
然后配置 PAM:
sudo vim /etc/pam.d/sshd
在 @include common-auth 上面添加:
auth required pam_google_authenticator.so
修改 SSH 配置:
sudo vim /etc/ssh/sshd_config
确保:
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive
重启 SSH:
sudo systemctl restart sshd
加固清单速查表
步骤 配置项 风险降低
改端口 Port 52222 减少 90% 扫描
禁用 Root PermitRootLogin no 消除最高权限入口
禁用密码 PasswordAuthentication no 暴力破解彻底失效
用 Ed25519 ssh-keygen -t ed25519 提升密钥安全性
Fail2ban 自动封禁 IP 拦截残余攻击
登录告警 sshrc 脚本 实时感知异常
限制用户/IP AllowUsers 最小权限原则
2FA Google Authenticator 即使密钥泄露也安全
写在最后
SSH 加固不是一次性任务,建议每季度检查一次配置:
# 快速审计脚本
echo "=== SSH 配置检查 ==="
grep -E "^(Port|PermitRootLogin|PasswordAuthentication|PubkeyAuthentication|AllowUsers)" /etc/ssh/sshd_config
echo ""
echo "=== 最近登录失败记录 ==="
grep "Failed password" /var/log/auth.log | tail -5
echo ""
echo "=== Fail2ban 状态 ==="
sudo fail2ban-client status sshd 2>/dev/null || echo "Fail2ban 未运行" 




