你的 SSH 真的安全吗?7 个加固步骤让暴力破解彻底失效


上周那篇《VPS 被入侵后的紧急排查》发出去后,很多读者问:"怎么预防被入侵?" 答案很简单:先把 SSH 这个最大的攻击面封死。据统计,互联网上有超过 60% 的 VPS 入侵是通过弱密码 SSH 暴力破解进来的。今天分享 7 个 SSH 加固步骤,按顺序做完,暴力破解基本没戏。

img

一、改默认端口(基础但有效)

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 生效。

密钥登录配置方法:

  1. 本地生成密钥对(如果还没有):
ssh-keygen -t ed25519 -C "your_email@example.com"
  1. 把公钥复制到服务器:
ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 52222 user@your_server_ip
  1. 测试密钥登录成功后,再禁用密码登录

三、使用 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 未运行"

手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

WordPress 站点安全加固:从被挂马到坚不可摧的 10 道防线

Docker 容器内存泄漏排查:从 OOMKilled 到根因定位

评 论
更换验证码