一台Ubuntu22.04 对公网开放了SSH端口,虽然设置了ED25519 SSH KEY登录,并且禁用了密码登录,但我每天还是收到了百万级别的/var/log/auth.log日志。本文将记录使用Faile2ban来自动封锁。

...
Apr  3 09:09:05 localhost sshd[1202307]: Invalid user sii from 104.236.122.69 port 60232
Apr  3 09:06:05 localhost sshd[1201681]: Invalid user 123 from 80.94.92.65 port 54474
Apr  3 09:06:05 localhost sshd[1201682]: Invalid user 345 from 80.94.92.66 port 54474
Apr  3 09:06:05 localhost sshd[1201683]: Invalid user 135 from 80.94.92.67 port 54474
Apr  3 09:06:05 localhost sshd[1201642]: Invalid user 245 from 80.94.92.68 port 54474
Apr  3 09:06:05 localhost sshd[1201646]: Invalid user rew from 80.94.92.69 port 54474
...

很遗憾我不能为了这个问题关闭SSH对外的端口

为了验证我的SSH是否必须为Key登录 我使用随机用户名尝试登录,提示

ssh -p 65522 [email protected]
The authenticity of host '[41.132.xxx.xxx]:65522 ([41.132.xxx.xxx]:65522)' can't be established.
ED25519 key fingerprint is SHA256:x+Gslxr43gldoOwwx/jwerrewx+dsalcoJlskwpq.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[41.132.xxx.xxx]:65522' (ED25519) to the list of known hosts.
[email protected]: Permission denied (publickey).
  1. 确定SSH 必须使用Key登录,sshd_config中部分配置如下
PasswordAuthentication no
PermitEmptyPasswords yes
  1. 使用Fail2ban实现自动封锁

安装fail2ban

为了解决这个问题,你可以考虑实施自动IP封禁的策略。一个流行的解决方案是使用fail2ban。fail2ban是一个用于防止暴力破解攻击的工具,它监视日志文件中的失败登录尝试,并在检测到多次失败尝试时自动封禁来源IP地址。下面是安装和配置fail2ban的步骤:
安装fail2ban:

sudo apt-get update
sudo apt-get install auditd # 按照审计模块
sudo apt-get install fail2ban

复制默认配置文件以创建一个本地配置文件(这样在软件更新时不会覆盖你的设置):

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

配置fail2ban sshd模块

nano /etc/fail2ban/jail.local

[sshd] 模块中加入如下配置

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
findtime = 86400      ; 检测周期设置为24小时
maxretry = 24         ; 首次封禁之前允许的最大尝试次数
bantime = 86400       ; 初始封禁时间设置为24小时

# 以下配置定义了增量封禁的规则
bantime.increment = true     ; 启用增量封锁
bantime.factor = 1           ; 封禁时间增加因子
bantime.maxtime = 7776000    ; 封禁时间的最大值90天
bantime.multipliers = 1 3 5 15 30 90    ; 禁时间的增加倍数

配置解释

# 配置注意
port = ssh 默认设置为ssh,但如果你更改了ssh端口 请直接使用ssh的端口

# 功能解释:
24小时内 如果尝试失败24次则出发封禁,首次封锁为24小时。

# 增量封锁
因为启用增量封锁,所以首次封锁结束后开始进入增量:
首次解封后再次触发封锁  1天
第2次解封后再次触发封锁 3天
第3次解封后再次触发封锁 5天
第4次解封后再次触发封锁 15天
第5次解封后再次触发封锁 30天
第6次解封后再次触发封锁 90天
第7次解封后再次触发封锁 90天
...

# 增量注意
开启了增量部分后一定要配置一个 bantime.maxtime 最大限制,反正出现配置失误、程序bug导致封锁循环

常用命令

配置检查

测试/etc/fail2ban/jail.local配置是否正确主要包含两个步骤:检查配置文件的语法正确性,以及确保fail2ban服务能够成功启动并且按照配置规则运行。

步骤 1: 检查配置文件的语法

可以使用fail2ban-client命令来测试配置文件的语法是否正确。运行以下命令:

sudo fail2ban-client -t

如果配置文件没有语法错误,你将看到这样的输出:

Configuration test is successful

如果有错误,fail2ban-client会显示相关的错误信息,你可以据此调整配置文件。

步骤 2: 启动fail2ban服务并检查状态

如果配置文件的语法检查没有问题,你可以尝试重启fail2ban服务,并检查其状态以确保服务正在运行:

sudo systemctl restart fail2ban
sudo systemctl status fail2ban

# 开机自启动
sudo systemctl enable fail2ban

如果服务启动成功,状态应该显示为active (running)

步骤 3: 检查封禁规则是否生效

一旦你确认fail2ban服务正在正常运行,你可以通过以下方式检查封禁规则是否生效:

  • 尝试使用错误的密钥或密码从不同的IP地址登录SSH服务,确保超过你设置的maxretry次数。
  • 观察是否按照配置的规则封禁了该IP地址。

查看fail2ban的日志文件:

sudo tail -f /var/log/fail2ban.log

这个命令会显示实时更新的fail2ban日志,你可以在这里查看到相关的封禁行为。

  • 使用fail2ban-client命令查看当前被封禁的IP列表:
sudo fail2ban-client status sshd

这将显示sshd监视下的封禁状态,包括当前被封禁的IP地址列表。

通过这些步骤,你可以验证/etc/fail2ban/jail.local配置是否正确并且fail2ban服务是否按照预期在运行。记得在测试时要谨慎,以避免意外地封禁自己的IP地址。

设置白名单

设置白名单的步骤:

  1. 打开你的fail2ban配置文件(通常建议编辑jail.local而不是jail.conf,因为.local文件会覆盖.conf文件中的设置):
sudo nano /etc/fail2ban/jail.local
  1. 在文件中找到[DEFAULT]部分,然后添加或修改ignoreip选项。你可以添加单个IP地址、子网或多个IP地址(用空格分隔)。例如:
[DEFAULT]
   ignoreip = 127.0.0.1/8 192.168.0.0/16 200.0.113.1

这个配置告诉fail2ban忽略来自本地回环地址、整个本地子网192.168.0.0/16,以及特定IP203.0.113.1的失败尝试。

  1. 保存并关闭配置文件。
  2. 重启fail2ban服务以应用更改:
sudo systemctl restart fail2ban

设置完成后,fail2ban将不会对ignoreip中列出的IP地址采取任何封禁动作。这对于确保公司的出口IP或你自己的IP不被意外封禁非常有用。然而,要小心使用这个选项,因为如果攻击者能够伪造白名单上的IP地址,他们可能会绕过fail2ban的保护。

最后修改:2024 年 11 月 06 日
如果觉得我的文章对你有用,请随意赞赏