一台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 sjso@41.132.xxx.xxx
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.
sjso@41.132.xxx.xxx: Permission denied (publickey).
- 确定SSH 必须使用Key登录,sshd_config中部分配置如下
PasswordAuthentication no
PermitEmptyPasswords yes
- 使用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地址。
设置白名单
设置白名单的步骤:
- 打开你的
fail2ban
配置文件(通常建议编辑jail.local
而不是jail.conf
,因为.local
文件会覆盖.conf
文件中的设置):
sudo nano /etc/fail2ban/jail.local
- 在文件中找到
[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
的失败尝试。
- 保存并关闭配置文件。
- 重启
fail2ban
服务以应用更改:
sudo systemctl restart fail2ban
设置完成后,fail2ban
将不会对ignoreip
中列出的IP地址采取任何封禁动作。这对于确保公司的出口IP或你自己的IP不被意外封禁非常有用。然而,要小心使用这个选项,因为如果攻击者能够伪造白名单上的IP地址,他们可能会绕过fail2ban
的保护。