Skip to content

ssh 防爆破配置

约 2006 字大约 7 分钟

安全

2025-12-23

最近我的一台小水管被ssh爆破 并感染挖矿⛏病毒 特此记录ssh 相关一些安全配置


Fail2Ban

Fail2Ban 是一个通过监控日志文件来更新防火墙规则的工具。发现“密码错误”或“用户不存在”的记录达到一定次数后,直接在系统防火墙层面(iptables/firewalld)封锁该 IP。


1. 安装 Fail2ban

Ubuntu/Debian:

sudo apt update
sudo apt install fail2ban -y

CentOS/RHEL (需要先安装 EPEL 源):

sudo yum install epel-release -y
sudo yum install fail2ban -y

2. 配置 Fail2ban

Fail2ban 的默认配置文件是 /etc/fail2ban/jail.conf不要直接修改这个文件,因为软件包更新时它会被覆盖。你应该创建一个 .local 副本进行配置。

创建配置文件

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

编辑配置文件

使用编辑器(如 nano 或 vim)打开:

sudo nano /etc/fail2ban/jail.local

找到 [sshd] 部分,修改下面内容:


3. 启动并启用服务

配置完成后,启动 Fail2ban 并设置开机自启:

# 启动服务
sudo systemctl start fail2ban

# 设置开机自启
sudo systemctl enable fail2ban

# 重新加载配置
sudo fail2ban-client reload

4. 常用管理命令

配置好后,你需要知道如何查看状态以及如何解封 IP。

  • 查看 Fail2ban 运行状态:

    sudo fail2ban-client status
  • 查看 SSH 防护的具体情况(查看被封禁的 IP):

    sudo fail2ban-client status sshd
  • 手动解封某个 IP:

    sudo fail2ban-client set sshd unbanip <IP地>
  • 手动封禁某个 IP:

    sudo fail2ban-client set sshd banip <IP地>

2FA(双因素认证)

第一步:安装 Google Authenticator 相关库

Ubuntu/Debian:

sudo apt update
sudo apt install libpam-google-authenticator -y

CentOS/RHEL:

sudo yum install epel-release -y
sudo yum install google-authenticator -y

第二步:生成 2FA 密钥

在终端中以你要登录的用户身份(不要只用 root,除非你平时只用 root 登录)运行以下命令:

# 这里屏幕太小显示不全二维码 可以 ctrl - 缩小终端字符

google-authenticator

程序会问你几个问题,建议如下选择:

  1. Do you want authentication tokens to be time-based? (y/n)
    • 输入 y(基于时间的动态口令)。
  2. 出现二维码和密钥:
    • 重要: 用手机 APP(Google Authenticator, Microsoft Authenticator 或 Bitwarden)扫描二维码。
    • 务必保存好下方的 "emergency scratch codes"(紧急备用码),万一手机丢了,这是你唯一的登录手段。
  3. Do you want me to update your "/home/user/.google_authenticator" file?
    • 输入 y
  4. 是否禁止多人共用同一个动态码?
    • 输入 y
  5. 是否延长有效时间容错(解决手机与服务器时间微小差异)?
    • 输入 y(允许约 4 分钟的误差)。
  6. 是否开启频率限制(每 30 秒最多尝试 3 次)?
    • 输入 y

第三步:配置 PAM 模块

我们需要告诉 Linux 系统在 SSH 登录时调用 Google Authenticator。

  1. 编辑 PAM 配置文件:

    sudo nano /etc/pam.d/sshd
  2. 在文件末尾(或合适位置)添加这一行:

    auth required pam_google_authenticator.so

    注意:如果你希望即使没有配置 2FA 的用户也能登录(过渡期),可以写成 auth [success=done default=ignore] pam_google_authenticator.so nullok

  3. (可选) 找到 @include common-auth,如果你想先输验证码再输密码,把上面那行放在它前面;如果你想先输密码再输验证码,放在它后面。


第四步:配置 SSH 服务

  1. 编辑 SSH 配置文件:

    sudo nano /etc/ssh/sshd_config
  2. 查找并修改以下参数(确保它们为 yes):

    KbdInteractiveAuthentication yes
    UsePAM yes

    (注:在旧版本 SSH 中,该参数可能叫 ChallengeResponseAuthentication yes)


第五步:重启并测试

在重启服务前,请务必保持当前的 SSH 连接不要断开! 防止配置错误导致无法登录。

  1. 重启 SSH:

    sudo systemctl restart ssh
  2. 打开一个新的终端窗口尝试登录。

  3. 默认先输入密码器 再输入密码


被爆破反思

分析原因

1. 云服务商防护墙设置不够完善

  • 这里没有限制22端口范围,设置所有ip都能访问,这里设置自己几个ip或者仅境内ip 云服务 防火墙配置
  • 云服务商防火墙,不支持禁止同内网段ip访问
  • ssh异地登陆没有提示,这个云服务商不支持
  • 这台服务器上面没有放任何有价值数据 所以还好损失较小 后面重装后 除了web版防火墙在操作系统里面也开启防火墙

2. 密码一致可能被撞库

  • 懒得记那么多密码,所以不重要平台我都是使用一样密码,这也导致被撞库成功。

3. 偷懒使用默认root用户

  • 这个问题也比较严重,默认应该关闭root用户直接登陆。这样即使撞库难度成本也增加不少。

如何发现病毒

  1. 首先是网络卡顿敲命令不跟手

  2. 分析top占用,发现有未知redis服务(到这一步还未怀疑是病毒,病毒伪装redis服务)

    htop
  3. 历史命令查找不到很干净(感到奇怪但是还是未怀疑中病毒)

    # 病毒定时清空历史记录
    history
  4. 查看ssh登陆记录很少,只用我最近登陆成功记录

    # 查看谁正在使用登陆成功使用终端
    w
    # 查看ssh,登陆失败记录,病毒删除自己登陆记录
    sudo grep "Failed password" /var/log/auth.log
  5. 查看网络流量,查看流量大ip是否是自己属性的(这一步发现好几个境外ip,感到不对劲了)

    sudo iftop -n -N -P
  6. 查询是否配置免密登陆(这里才发现被入侵了,发现未知public key)

     # 这一步发现
     cat ~/.ssh/authorized_keys
     # 尝试删除失败 设置只读
     rm -f ~/.ssh/authorized_keys
  7. 查询定时任务(发现病毒脚本定时任务,确定中挖矿病毒)

    #这里发现上述未知redis任务
     crontab -l
    #根据任务脚本路径去查看对应脚本内容,这一步重装系统没记录下了
    #这里可能无法直接查看脚本内容,因为是编译加密过的。但是还是可以看到部分设置public key一些操作

    相关信息

    病毒会每秒检查自己是否存活,删除历史执行记录,加入自己public key 设置仅读权限 这也是为什么我无法删除~/.ssh/authorized_keys原因

正确做法

  1. 修改ssh默认端口,禁止root用户远程登陆(或使用public key登陆)
  2. 设置第三方安全验证(Fail2Ban+2FA)
  3. 防火墙非必要不放行,服务不放在常用默认端口

现在虽然22端口还是放行,但是加上上面操作,已经比以前安全很多 无异地登陆成功记录 云服务 防火墙配置

贡献者