Fail2ban防暴力破解
发现总是有人尝试ssh暴力破解密码:
grep 'Failed' /var/log/secure
Mar 30 00:40:25 JD sshd[20486]: Failed password for root from 114.80.157.167 port 35427 ssh2
Mar 30 00:40:32 JD sshd[20617]: Failed password for invalid user gqm from 111.230.19.43 port 42054 ssh2
Mar 30 00:42:00 JD sshd[22103]: Failed password for invalid user tsj from 111.230.19.43 port 59534 ssh2
Mar 30 00:42:32 JD sshd[22684]: Failed password for invalid user mzm from 106.12.94.65 port 45340 ssh2
Mar 30 00:43:09 JD sshd[23413]: Failed password for invalid user gku from 14.63.168.78 port 34882 ssh2
Mar 30 00:47:04 JD sshd[27459]: Failed password for root from 218.234.16.17 port 43020 ssh2
Mar 30 00:47:08 JD sshd[27466]: Failed password for root from 118.130.133.161 port 57198 ssh2
Mar 30 00:48:10 JD sshd[28548]: Failed password for invalid user vpn from 14.63.168.78 port 46326 ssh2
频繁登陆不仅危险,而且造成大量日志消耗性能,所以使用Fail2ban防止暴力破解
简介
Fail2ban可以监视你的系统日志,然后匹配日志的错误信息(正则式匹配)执行相应的屏蔽动作(一般情况下是调用防火墙),例如当有人在试探你的SSH、SMTP、FTP密码,只要达到你预设的次数,fail2ban就会调用防火墙屏蔽这个IP,而且可以发送e-mail通知系统管理员,是一款很实用、很强大的IP自动屏蔽工具!
简洁的说,就是fail2ban通过对日志的监控, 发现具有破坏性的行为IP调用防火墙将它屏蔽一段时间生产环境fail2ban常被放在跳板机上使用,将入口保护起来,如果不带公网地址就不需要每台安装,如果都有公网的话就都可以使用fail2ban
功能、特性
- 支持大量服务:sshd 、apache 、qmail 等
- 支持多作动作:iptables 、tcp-wrapper 、shorewall 、mail notifications 等
- logpath 选项中支持通配符
- 需要 Gamin 支持(Gamin 用于监控文件和目录是否更改)
- 如果需要邮件通知,则系统事先要确保能够正常发送邮件
安装
yum -y install fail2ban
目录结构
/etc/fail2ban/
├── action.d # iptables 、mail 等动作文件目录
├── fail2ban.conf # fail2ban 配置文件,定义日志级别、日志、sock 文件位置等
├── filter.d # 条件匹配文件目录,过滤日志关键内容
├── jail.conf # fail2ban 防护配置文件
配置fail2ban实现防暴力破解
配置
官方的文档写到:在配置时,我们应该避免修改由fail2ban安装创建的文件,我们应该去编写具有.local扩展名的新文件。在.local新文件里配置的内容会覆盖jail.conf内容里相同的值。当我们的配置发生改变了我们可以使用 fail2ban-client reload ,来加载新的配置。
nano /etc/fail2ban/jail.d/00-firewalld.conf
文件内容:
# defalut这里是设定全局设置,如果下面的监控没有设置就以全局设置的值设置。
[DEFAULT]
# 用于指定哪些地址ip可以忽略 fail2ban 防御,以空格间隔。
ignoreip = 127.0.0.1/8
# ssh客户端主机被禁止的时长(默认单位为秒)
bantime = 3600
# 过滤的时长(秒)
findtime = 600
# 匹配到的阈值(允许失败次数)
maxretry = 3
[ssh-iptables]
# 是否开启
enabled = true
# 过滤规则
filter = sshd
# 动作
action = iptables[name=SSH, port=ssh, protocol=tcp]
# 日志文件的路径
logpath = /var/log/secure
# 匹配到的阈值(次数)
maxretry = 3
在这里需要注意一点就是:我们上面的action设置的时候,port=ssh,如果我们更改了sshd服务的端口号,我能需要在这里设置对应的端口号,否则配置不生效。
启动:
systemctl start fail2ban.service
systemctl restart fail2ban.service
如果修改了配置需要重启生效:
fail2ban-client reload
我们可以查看当前被禁止登陆的ip:
[root@jd]# fail2ban-client status ssh-iptables
Status for the jail: ssh-iptables
|- Filter
| |- Currently failed: 0 # 当前失败次数
| |- Total failed: 3 # 总失败次数
| `- File list: /var/log/secure # 日志文件路径列表
`- Actions
|- Currently banned: 1 # 当前禁止访问的IP数量
|- Total banned: 1 # 禁止IP总数
`- Banned IP list: 192.168.1.77 # 被禁IP列表
Fail2ban常用命令
启动/重启/停止/状态
systemctl start/restart/stop/status fail2ban.service
fail2ban-client常用命令
start | 启动fail2ban server和监狱 |
reload | 重新加载配置文件 |
stop | 暂停fail2ban和监狱 |
status | 查看运行的监控服务数量和列表 |
set loglevel | 设置日志等级,有 CRITICAL, ERROR, WARNING,NOTICE, INFO, DEBUG |
get loglevel | 获取当前日志的等级 |
set <JAIL> idle on|off | 设置某个监控(监狱)的状态。 |
set <JAIL> addignoreip <IP> | 设置某个监控(监狱)可以忽略的ip |
set <JAIL> delignoreip <IP> | 删除某个监控(监狱)可以忽略的ip |
set <JAIL> banip <IP> | 将ip加入 监控(监狱) |
set <JAIL> unbanip <IP> | 将ip从监控(监狱)移除 |
示例:fail2ban-client set ssh-iptables banip 192.168.1.77
fail2ban-regex
测试筛选规则设否匹配当前的日志格式:
fail2ban-regex /var/log/secure /etc/fail2ban/filter.d/sshd.conf
Fail2ban邮件报警
配置mail.rc
nano /etc/mail.rc 最后插入:
set [email protected] smtp=smtp.163.com
set smtp-auth-user=xxxxxxxx smtp-auth-password=xxxxxxxx
测试:echo test | mailx -v -s "test" [email protected]
然后在jail.local(自己的配置文件里),加入:
mail-whois[name=SSH, [email protected]]
dest 是填入收件人邮箱
最后重新加载下配置即可。
史前巨坑
邮件配置一定要在action后面,而且一定要是下面的格式,否则你会折腾一下午找收不到邮件的原因,fk
# 动作
action = iptables[name=SSH, port=ssh, protocol=tcp]
mail-whois[name=SSH, [email protected]]
时区问题:
http://www.fail2ban.org/wiki/index.php/FAQ_english:If time reference is not the same everywhere, then fail2ban won't ban any IP!
当我们更改了时区后,然后日志的时间并没有修改过来,导致两者的时间不一致,这样fail2ban的工作就失效了
解决办法:重启日志服务:systemctl restart rsyslog,保证两者的时间一致。
修改端口问题:
sshd更改端口号后使用fail2ban需要注意在填写配置的时候也需要更改端口号。否则会出现就算会将ip添加到防火墙,但是由于我更改了端口号,是起不到禁止作用的。
解决方法:配置文件中 action = iptables[name=SSH, port=ssh, protocol=tcp] ,port位置修改为新的端口。
结语
防止服务器被入侵还有很多方法,比如:
- 用密钥登陆,不用密码登陆
- 尽量不给服务器外网IP
- 修改SSH端口号
- 开启SSH只监听内网地址,通过VPN登陆跳板机,然后登陆
- 对外只开放80及443端口
- 最小化安装(因为软件安装要给它授权)
其实包括fail2ban等等这些操作还是很有必要的,因为入侵者会用nmap扫描开放的端口然后会尝试登陆,一是,频繁登陆会生成日志浪费系统性能,二是,万一密码被破解后果不堪设想,而责任都在身为运维的你身上