
起因
真正的懒癌晚期患者(缺钱也治不了),懒到不想给服务器做安全加固,就靠着复杂的数字字母混合16位密码保障着。前段时间看了看/var/log/secure文件,吓到了,好几个IP登录ssh失败,有近几万次之多。网上的闲人是真不少啊,网站没几个正经访客,各种扫描的倒是每天都有近千IP。还是得出手干活啊,不然哪天真攻破了服务器,也对不起自己的专业了。
手里服务器大部分是centos7,方案上自然选择fail2ban+firewall了。
firewall 相关配置可以查看这里:firewall设置笔记
安装fail2ban
fail2ban主要靠监控系统各种日志文件,并根据一定规则匹配异常IP后,再使用相应的防火墙将IP屏蔽,针对密码爆破和漏洞扫描非常有用。
# yum -y install epel-release # yum -y install fail2ban
安装成功之后,fail2ban的配置文件位于/etc/fail2ban,其中的jail.conf为主要配置文件,有关的匹配规则位于filter.d目录下。
fail2ban的目录结构说明如下:
/etc/fail2ban ## fail2ban 服务配置目录 /etc/fail2ban/action.d ## iptables 、mail 等动作文件目录 /etc/fail2ban/filter.d ## 条件匹配文件目录,过滤日志关键内容 /etc/fail2ban/jail.d ## 规则文件目录,按具体防护项目分成文件 /etc/fail2ban/jail.local ## 默认规则文件 /etc/fail2ban/jail.conf ## fail2ban 防护配置文件 /etc/fail2ban/fail2ban.conf ## fail2ban 配置文件,定义日志级别、日志、sock 文件位置等
fail2ban规则配置
新建/etc/fail2ban/jail.local来设置默认配置
# vi /etc/fail2ban/jail.local
# 以下是全局默认设置
[DEFAULT]
#time is in seconds. 3600 = 1 hour, 86400 = 24 hours (1 day)
findtime = 600
bantime = 8640000
maxretry = 2
ignoreip = 127.0.0.1 127.0.0.0/8 192.168.0.0/16
[sshd]
enabled = true
filter = sshd
action = %(action_mwl)s
logpath = /var/log/secure
#这里banaction必须用firewallcmd-ipset,这是fiewalll支持的关键,如果是用Iptables请不要这样填写
banaction = firewallcmd-ipset
action = %(action_mwl)s
参数说明:
ignoreip:IP白名单,白名单中的IP不会屏蔽
bantime:屏蔽时间,单位为秒(s)
findtime:时间范围
maxretry:最大次数
banaction:过滤动作由那个软件来执行
action:过滤动作
修改 /etc/fail2ban/jail.d/00-firewalld.conf
# vi /etc/fail2ban/jail.d/00-firewalld.conf //加入以下几句 [DEFAULT] #banaction = firewallcmd-ipset #action = %(action_mwl)s 参数说明: banaction:屏蔽IP所使用的方法,上面使用firewalld屏蔽ip action: 触发规则后进行的动作 这里banaction必须用firewallcmd-ipset,这是firewall支持的关键, 如果是用Iptables则填写iptables-multiport[name=sshd-ddos, port="22", protocol=tcp]
防止SSH爆破
#为ssh新建文件/etc/fail2ban/jail.d/sshd.local ,或者写入全局配置文件
# vi /etc/fail2ban/jail.local
//加入以下内容
[sshd]
enabled = true
filter = sshd
action = %(action_mwl)s
logpath = /var/log/secure
参数说明:
[sshd]:名称,可以随便填写
filter:规则名称,必须填写位于filter.d目录里面的规则,sshd是fail2ban内置规则
port:对应的端口,默认端口,所以这里没有填写
action:采取的行动
logpath:需要监视的日志路径
防止CC攻击
已经过反复测试
这里仅以Nginx
为例,使用fail2ban
来监视nginx
日志,匹配短时间内频繁请求的IP
,并使用firewalld
将其IP
屏蔽,达到CC
防护的作用。
# 需要先新建一个nginx日志匹配规则
vi /etc/fail2ban/filter.d/nginx-cc.conf
# 填写如下内容
[Definition]
# 屏蔽访问次数异常的ip 已经排除jpg/css等普通类型的文件
# 只有后缀如,html,tm,php,asp,jsp,aspx,或无后缀的文件才会被匹配
failregex = <HOST> - - .? \"(GET|POST|HEAD) .?\/(?:(?!(\.jpg|\.css|\.js|\.txt|\.gif|\.png)).)+? HTTP/1.* .*$
ignoreregex =
继续修改jail.local追加如下内容:
[nginx-cc]
enabled = true
port = http,https
filter = nginx-cc
action = %(action_mwl)s
maxretry = 40
findtime = 30
bantime = 3600
logpath = /var/log/nginx/access.log //请填写自己nginx服务器日志的位置
上面的配置意思是如果在60s
内,同一IP
达到180
次请求,则将其IP ban 1
小时,上面只是为了测试,请根据自己的实际情况修改。logpath
为nginx
日志路径。
测试规则是否有效:
//使用如下命令,可以测试正则规则的有效性: 重要!!
//主要是匹配ip
# fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-cc.conf
防止目录爆破
已经过反复测试:
vi /etc/fail2ban/filter.d/nginx-404.conf
[Definition]
failregex = ^<HOST> - - .* \"(GET|POST|HEAD) .*\.(php|html|htm|asp|aspx|jsp).*? HTTP/1.* 404 .*$
ignoreregex =
//继续修改jail.local追加如下内容:
[nginx-404]
# 屏蔽尝试访问404页的ip
enabled = true
port = http,https
filter = nginx-404
maxretry = 3
findtime = 60
bantime = 8640000
logpath = /var/log/nginx/access.log
action = %(action_mwl)s
banaction = firewallcmd-ipset
防止Wordpress爆破
如果您经常分析日志会发现有大量机器人在扫描wordpress
登录页面wp-login.php
,虽然对方可能没成功,但是为了避免万一还是将他IP
干掉为好。
#需要先新建一个nginx日志匹配规则
vi /etc/fail2ban/filter.d/wordpress.conf
#填写如下内容
[Definition]
failregex = ^<HOST> - - .*/wp-login.php.* HTTP/1\.."
ignoreregex =
继续修改jail.local
追加如下内容:
[wordpress]
enabled = true
port = http,https
filter = wordpress
action = %(action_mwl)s
maxretry = 5
findtime = 600
bantime = 864000
logpath = /var/log/nginx/access.log //请填写自己nginx服务器日志的位置
//日志文件不存在时无法启动服务器 # mkdir -p /var/log/nginx/ # cd /var/log/nginx/ # touch access.log # chmod 0777 ./access.log
解除绑定
# fail2ban-client set nginx-404 unbanip 184.15.66.88
fail2ban相关的命令
查看当前版本 fail2ban-server -v fail2ban-server status 启动 systemctl start fail2ban 停止 systemctl stop fail2ban 启动 systemctl restart fail2ban 开机启动 systemctl enable fail2ban 是配置立即生效 systemctl daemon-reload 查看是否开机启动 systemctl is-enabled fail2ban 查看被ban IP,其中sshd为名称 fail2ban-client status sshd 删除被ban IP fail2ban-client set sshd unbanip 192.168.111.111 或 fail2ban-client set sshd delignoreip 192.168.111.111 如果用以上命令删除被ban IP发现这个IP还是无法连接,是因为在临时策略中的ipset集合,只有电脑重启或者从这里面删除IP才行。 查看临时策略中的ipset集合:“ipset list”,删除ipset集合中IP:“ipset del fail2ban-sshd 192.168.111.111 -exist” 查看日志 tail /var/log/fail2ban.log
状态说明
|- Filter | |- Currently failed: 14 //当前失败数 | |- Total failed: 953 //总失败数 | `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd `- Actions |- Currently banned: 2 //当前屏蔽数 |- Total banned: 6 //包含已经解封的(曾经屏蔽的)总屏蔽数 `- Banned IP list:117.182.xxx.xxx 116.19.xxx.xxx //当前屏蔽的列表
总结
fail2ban
已经内置很多匹配规则,位于filter.d
目录下,包含了常见的SSH/FTP/Nginx/Apache
等日志匹配,如果都还无法满足您的需求,您也可以自行新建规则来匹配异常IP
。使用fail2ban
+Firewalld
来阻止恶意IP
是行之有效的办法,可极大提高服务器安全。