Skip to content

如何防范 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 save

3.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 ACCEPT

4. 效果验证

安全指标

  • 攻击阻断率: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 (正常访问)

Released under the MIT License.