案例:最近公司网站一直被别人暴力破解sshd服务密码。虽然没有成功,但会导致系统负载很高,原因是在暴力破解的时候,系统会不断地认证用户,从而增加了系统资源额外开销,导致访问公司网站速度很慢
fail2ban可以监视你的系统日志,然后匹配日志的错误信息(正则式匹配)执行相应的屏蔽动作(一般情况下是防火墙),而且可以发送e-mail通知系统管理员,很好、很实用、很强大!
ban (bæn)禁令 简单来说其功能就是防止暴力破解。工作的原理是通过分析一定时间内的相关服务日志,将满足动作的相关IP利用iptables加入到dorp列表一定时间。
注:重启iptables服务的话,所有DORP将重置
1)下载软件包:
官方地址: http://www.fail2ban.org
2)解压文件,查看readme文件,有安装手册
tar zxvf fail2ban-0.8.14.tar.gz
fail2ban-0.8.14/
fail2ban-0.8.14/.coveragerc
fail2ban-0.8.14/.gitignore
fail2ban-0.8.14/.project
fail2ban-0.8.14/.pydevproject
fail2ban-0.8.14/.pylintrc
fail2ban-0.8.14/.travis.yml
fail2ban-0.8.14/.travis_coveragerc
fail2ban-0.8.14/COPYING
fail2ban-0.8.14/ChangeLog
fail2ban-0.8.14/DEVELOP
fail2ban-0.8.14/FILTERS
fail2ban-0.8.14/MANIFEST
fail2ban-0.8.14/README.Solaris
fail2ban-0.8.14/README.md
需要安装python开发环境,并且版本要大于2.4(默认大于2.4)
查看当前系统中python的版本:
python -V
Python 2.7.5
3)安装fail2ban
python setup.py install
4)生成服务启动脚本:
cp files/redhat-initd /etc/init.d/fail2ban
chkconfig fail2ban on
5)应用实例
设置条件:ssh远程登录5分钟内3次密码验证失败,禁止用户IP访问主机1小时,1小时该限制自动解除,用户可重新登录。
实例文件/etc/fail2ban/jail.conf及说明如下:
[DEFAULT] #全局设置
ignoreip = 127.0.0.1/8 #忽略的IP列表,不受设置限制
bantime = 600 #屏蔽时间,单位:秒
findtime = 600 #这个时间段内超过规定次数会被ban掉
maxretry = 3 #最大尝试次数
backend = auto #日志修改检测机制(gamin、polling和auto这三种)
[ssh-iptables] #单个服务检查设置,如设置bantime、findtime、maxretry和全局冲突,服务优先级大于全局设置。
enabled = true #是否激活此项(true/false)修改成 true
filter = sshd #过滤规则filter的名字,对应filter.d目录下的sshd.conf
action = iptables[name=SSH, port=ssh, protocol=tcp] #动作的相关参数,对应action.d/iptables.conf文件
sendmail-whois[name=SSH, dest=you@example.com, sender=fail2ban@example.c
om, sendername="Fail2Ban"]#触发报警的收件人
logpath = /var/log/secure #检测的系统的登陆日志文件。这里要写sshd服务日志文件。 默认为logpath = /var/log/sshd.log
#5分钟内3次密码验证失败,禁止用户IP访问主机1小时。 配置如下
bantime = 3600 #禁止用户IP访问主机1小时
findtime = 300 #在5分钟内内出现规定次数就开始工作
maxretry = 3 #3次密码验证失败
6)启动服务:
[root@localhost fail2ban-0.8.14]# /etc/init.d/fail2ban start
Starting fail2ban (via systemctl): [ OK ]
[root@localhost fail2ban-0.8.14]# >/var/log/secure #清空日志开启收集信息
[root@localhost fail2ban-0.8.14]# /etc/init.d/fail2ban restart
Restarting fail2ban (via systemctl): [ OK ]
7)查看防火墙
iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
fail2ban-SSH tcp -- anywhere anywhere tcp dpt:ssh
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain fail2ban-SSH (1 references)
target prot opt source destination
RETURN all -- anywhere anywhere #会多生成一个规则链
8)测试:故意输入错误密码3次,再进行登录时,会拒绝登录
ssh 192.168.1.106
The authenticity of host '192.168.1.106 (192.168.1.106)' can't be established.
ECDSA key fingerprint is SHA256:u+aD8xanvdC/1mQJj43hoCTnmeAqxAxY5yeROsyQJ9Q.
ECDSA key fingerprint is MD5:93:9f:43:af:9f:18:35:ca:0e:16:1f:b8:50:41:2e:96.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.106' (ECDSA) to the list of known hosts.
root@192.168.1.106's password:
Permission denied, please try again.
root@192.168.1.106's password:
Permission denied, please try again.
root@192.168.1.106's password:
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
[root@localhost ~]# ssh root@192.168.1.106
ssh: connect to host 192.168.1.106 port 22: Connection refused
9)查看fail2ban的状态
[root@localhost fail2ban-0.8.14]# fail2ban-client status
Status
|- Number of jail: 1
`- Jail list: ssh-iptables
[root@localhost fail2ban-0.8.14]#
#配置好之后我们检测下fail2ban是否工作。
#具体看某一项的状态也可以看,如果显示被ban的ip和数目就表示成功了,如果都是0,说明没有成功
[root@localhost fail2ban-0.8.14]# fail2ban-client status ssh-iptables
Status for the jail: ssh-iptables
|- filter
| |- File list: /var/log/secure
| |- Currently failed: 0
| `- Total failed: 3 #连接失败次数
`- action
|- Currently banned: 1
| `- IP list: 192.168.1.10
`- Total banned: 1
通过其他方式防止暴力破解ssh
通过pam 模块来防止暴力破解ssh
[root@hopu ~]# vim /etc/pam.d/sshd
在第一行下面添加一行:
auth required pam_tally2.so deny=3 unlock_time=600 even_deny_root root_unlock_time=1200
说明:尝试登陆失败超过3次,普通用户600秒解锁,root用户1200秒解锁
手动解除锁定
查看某一用户错误登陆次数:
pam_tally2 –-user
例如,查看work用户的错误登陆次数:
pam_tally2 –-user work
清空某一用户错误登陆次数:
pam_tally2 –-user –-reset
例如,清空 work 用户的错误登陆次数,
pam_tally2 –-user work –-reset