Fail2ban

Fail2ban防暴力破解

企业案例

生产环境发现总是有人尝试ssh暴力破解密码:

grep 'Failed' /var/log/secure

频繁登陆不仅危险,而且造成大量日志消耗性能,所以使用Fail2ban防止暴力破解

简介

  Fail2ban可以监视你的系统日志,然后匹配日志的错误信息(正则式匹配)执行相应的屏蔽动作(一般情况下是调用防火墙),例如当有人在试探你的SSH、SMTP、FTP密码,只要达到你预设的次数,fail2ban就会调用防火墙屏蔽这个IP,而且可以发送e-mail通知系统管理员,是一款很实用、很强大的IP自动屏蔽工具!

  简洁的说,就是fail2ban通过对日志的监控, 发现具有破坏性的行为IP调用防火墙将它屏蔽一段时间

生产环境fail2ban常被放在跳板机上使用,将入口保护起来,如果不带公网地址就不需要每台安装,如果都有公网的话就都可以使用fail2ban

功能、特性

  1. 支持大量服务:sshd 、apache 、qmail 等
  2. 支持多作动作:iptables 、tcp-wrapper 、shorewall 、mail notifications 等
  3. logpath 选项中支持通配符
  4. 需要 Gamin 支持(Gamin 用于监控文件和目录是否更改)
  5. 如果需要邮件通知,则系统事先要确保能够正常发送邮件

安装

环境检查

  1. Python版本必须大于2.4.3 
  2. 防火墙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位置修改为新的端口。

结语

防止服务器被入侵还有很多方法,比如:

  1.  用密钥登陆,不用密码登陆
  2.  尽量不给服务器外网IP
  3.  修改SSH端口号
  4.  开启SSH只监听内网地址,通过VPN登陆跳板机,然后登陆
  5.  对外只开放80及443端口
  6.  最小化安装(因为软件安装要给它授权)

其实包括fail2ban等等这些操作还是很有必要的,因为入侵者会用nmap扫描开放的端口然后会尝试登陆,一是,频繁登陆会生成日志浪费系统性能,二是,万一密码被破解后果不堪设想,而责任都在身为运维的你身上

 

posted @ 2019-05-14 15:00  load晴天  阅读(2731)  评论(0编辑  收藏  举报