Fail2ban防暴力破解
企业案例
生产环境发现总是有人尝试ssh暴力破解密码:
grep 'Failed' /var/log/secure
频繁登陆不仅危险,而且造成大量日志消耗性能,所以使用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 用于监控文件和目录是否更改)
- 如果需要邮件通知,则系统事先要确保能够正常发送邮件
安装
环境检查
- Python版本必须大于2.4.3
- 防火墙iptables必须开启
安装
# 需要epel源
yum -y install epel-release 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 ,来加载新的配置。
vim /etc/fail2ban/jail.d/jail.local
文件内容:
# 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服务的端口号,我能需要在这里设置对应的端口号,否则配置不生效。
启动:
/etc/init.d/fail2ban start
如果修改了配置需要重启生效:
fail2ban-client reload
测试
故意输入错误密码3次,再进行登录时,会拒绝登录
[root@hostname ~]# ssh 192.168.1.87 root@192.168.1.87's password: Permission denied, please try again. root@192.168.1.87's password: Permission denied, please try again. root@192.168.1.87's password: Permission denied (publickey,password). [root@hostname ~]# ssh 192.168.1.87 ssh: connect to host 192.168.1.87 port 22: Connection refused
我们可以查看当前被禁止登陆的ip:
[root@hostname jail.d]# 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常用命令
启动/重启/停止/状态
/etc/init.d/fail2ban start/restart/stop/status
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
vim /etc/mail.rc 最后插入: set from=xxxxxxxxx@163.com smtp=smtp.163.com set smtp-auth-user=xxxxxxxx smtp-auth-password=xxxxxxxx
测试:echo test | mailx -v -s "test" test@qq.com
然后在jail.local(自己的配置文件里),加入:
mail-whois[name=SSH, dest=xxxxx@qq.com]
dest 是填入收件人邮箱
最后重新加载下配置即可。
史前巨坑
邮件配置一定要在action后面,而且一定要是下面的格式,否则你会折腾一下午找收不到邮件的原因,fk
# 动作 action = iptables[name=SSH, port=ssh, protocol=tcp] mail-whois[name=SSH, dest=xxxxxxxx@qq.com]
注意的问题:
python版本问题
是由于更新系统默认python 版本,而 配置自动找寻的是 python 2.6,所以需要重新配置 引导python版本: 编辑: /usr/bin/fail2ban-server 和 /usr/bin/fail2ban-client 更改 第一行: #!/usr/bin/python -Es 更改为 #!/usr/bin/python2.6 -Es
时区问题:
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扫描开放的端口然后会尝试登陆,一是,频繁登陆会生成日志浪费系统性能,二是,万一密码被破解后果不堪设想,而责任都在身为运维的你身上