如何防范 SSH 连接攻击
1. 项目背景
生产环境中的腾讯云服务器遭受大规模分布式 SSH 暴力破解攻击,需要在保证业务正常运行的前提下,快速识别威胁并实施安全加固。
2. 问题发现
攻击现象
bash
# 登录时发现的异常日志
Last failed login: Thu Aug 7 16:55:04 CST 2025 from 107.175.70.80 on ssh:notty
There were 258 failed login attempts since the last successful login.
Last login: Thu Aug 7 14:30:48 2025 from 103.63.155.223
# 攻击频率分析
时间窗口:14:30:48 - 16:55:00 (约2.4小时)
失败尝试:258次
攻击频率:平均 1.8次/分钟威胁评估
- 攻击类型:分布式 SSH 暴力破解攻击
- 攻击规模:短期内 258 次失败尝试,持续攻击
- 攻击来源:多个 IP 地址(107.175.70.80、114.113.84.71、92.27.101.99等)
- 攻击特点:24/7 持续攻击,自动化程度高
- 风险等级:高危(可能导致系统被入侵)
3. 实施方案
3.1. 应急响应
bash
# 封禁已知攻击 IP
iptables -A INPUT -s 92.27.101.99 -j DROP
iptables -A INPUT -s 34.101.240.144 -j DROP
iptables -A INPUT -s 202.51.214.99 -j DROP
service iptables save3.2. SSH 服务安全加固
bash
# 核心安全配置 /etc/ssh/sshd_config
Port 2333 # 更改默认端口,减少扫描
PermitRootLogin no # 禁止 root 直接登录
PasswordAuthentication no # 禁用密码认证
PubkeyAuthentication yes # 强制密钥认证
MaxAuthTries 3 # 限制认证尝试次数创建新管理员用户
bash# 创建新用户 useradd -m -s /bin/bash [你的用户名] # 设置密码 passwd [你的密码] # 添加到 sudo 组(获得管理员权限) usermod -aG sudo [你的用户名] # Ubuntu/Debian # 或者 usermod -aG wheel [你的用户名] # CentOS/RHEL新用户配置密钥认证
bash# 切换到新用户 su - [你的用户名] # 创建 .ssh 目录 mkdir -p ~/.ssh chmod 700 ~/.ssh # 创建 authorized_keys 文件 touch ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys # 将你的公钥内容复制到这个文件 # 可以从 root 用户的 authorized_keys 复制,或者重新上传测试新用户登录
bash# 在另一个终端测试新用户登录 ssh [你的用户名]@[你的服务器IP] # 测试 sudo 权限 sudo whoami # 应该输出:root确认新用户正常后,再修改 SSH 配置
bash# 编辑 SSH 配置 sudo vim /etc/ssh/sshd_config # 修改配置(渐进式修改) Port 2333 # 先改端口 PermitRootLogin yes # 暂时保留 root 登录 PasswordAuthentication yes # 暂时保留密码认证 PubkeyAuthentication yes # 启用密钥认证 MaxAuthTries 3 # 限制尝试次数 # 重启服务 sudo systemctl restart sshd测试新端口和新用户
bash# 测试新端口的新用户登录 ssh -p 2333 [你的用户名]@[你的服务器IP] # 确认一切正常后,再逐步加严配置最终安全配置
bash# 确认新用户登录正常后,再禁用 root sudo vim /etc/ssh/sshd_config # 最终配置 Port 2333 PermitRootLogin no # 现在可以安全禁用 PasswordAuthentication no # 禁用密码认证 PubkeyAuthentication yes MaxAuthTries 3 # 重启服务 sudo systemctl restart sshd验证
bash# 尝试 root 登录(应该被拒绝) ssh -p 2333 root@[你的服务器IP] # 应该提示:Permission denied (publickey) # 尝试使用密码登录(应该不会提示输入密码) ssh -p 2333 -o PreferredAuthentications=password [你的用户名]@[你的服务器IP] # 应该直接被拒绝,不会提示输入密码 # 测试默认 22 端口(应该连接失败) ssh root@[你的服务器IP] # 应该提示:Connection refused 或超时 # 检查端口监听 sudo netstat -tlnp | grep :2333 # 应该看到 sshd 在监听 2333 端口 # 确认网站仍然可以正常访问 curl -I http://[你的服务器IP] curl -I http://1px.club # 应该返回正常的 HTTP 响应用户权限问题处理
bash# 原因:Docker 守护进程需要 root 用户权限 # 1. 将 [你的用户名] 用户添加到 docker 组 sudo usermod -aG docker [你的用户名] # 2. 重新登录或刷新组权限 newgrp docker # 3. 验证权限 docker ps docker-compose --version docker run hello-world # 配置免密 sudo # 1. 编辑 sudoers 文件 sudo visudo # 2. 在文件末尾添加以下行: [你的用户名] ALL=(ALL) NOPASSWD: ALL
3.3. 自动化防护
bash
# 部署 Fail2Ban 自动封禁系统
yum install epel-release fail2ban -y
# 配置策略
[sshd]
enabled = true
bantime = 86400 # 24小时封禁
maxretry = 3 # 3次失败触发
findtime = 600 # 10分钟检测窗口3.4. 精确防火墙策略
bash
# 区分管理端口和业务端口
# SSH:仅管理员 IP
iptables -A INPUT -p tcp -s 103.63.154.116 --dport 2333 -j ACCEPT
iptables -A INPUT -p tcp --dport 2333 -j DROP
# Web服务:全网开放
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT4. 效果验证
安全指标
- 攻击阻断率:100%(后续无成功入侵)
- 误封率:0%(正常用户访问不受影响)
监控验证
bash
# 实时监控
tail -f /var/log/secure | grep "Failed password"
# 自动封禁效果
fail2ban-client status sshd
# Banned IP list: 15 IPs currently banned
# 业务可用性
curl -I https://1px.club
# HTTP/1.1 200 OK (正常访问)