自动屏蔽多次登录失败的IP

来自Domoticz

介绍

当你允许外部网络访问Domoticz时,建议使用'fail2ban'来确保系统的安全。
Fail2ban是一个在指定的日志文件中查找失败的登录尝试的应用程序。Domoticz从3507beta版开始将登录失败尝试及来源IP地址记录在日志文件中,通过fail2ban监测日志文件来并处理(比如屏蔽来源IP)。

英文论坛用户'manuloup'创建了一个不错的教程[1]。下面是教程中的步骤

设置fail2ban

按照以下步骤设置fail2ban.

安装fail2ban

第一步当然是安装fail2ban:
sudo apt-get install fail2ban

将Domoticz日志文件加入到fail2ban

首先,需要告诉fail2ban应该监测的日志文件在哪里。

cd /etc/fail2ban
sudo cp jail.conf jail.local
sudo nano jail.local

编辑窗口打开后,在文件末尾加入以下信息:

[domoticz] enabled = true port = 8080 filter = domoticz logpath = /var/log/domoticz.log maxretry = 3 findtime = 3600 将端口port及日志路径logpath改为你自己的设置,maxretry是最大尝试次数,登录失败超过3次后屏蔽。

如果/var/log/目录中没有'domoticz.log'文件,你需要先启用Domoticz的日志选项,修改domoticz.sh文件:

sudo nano /etc/init.d/domoticz.sh

去掉#DAEMON_ARGS="$DAEMON_ARGS -log /tmp/domoticz.txt"开头的井号#, 改完后应该是这样的:
DAEMON_ARGS="$DAEMON_ARGS -log /tmp/domoticz.txt"
保存后重启Domoticz:

sudo /etc/init.d/domoticz.sh restart

但要注意的是,日志文件很快就会变大。建议使用类似logrotate的工具。在树莓派上(使用SD卡)不建议开启日志,会减少SD卡寿命。如何向内存中写入日志,请查看英文论坛

想要查看日志中我们需要的信息,执行

cat /var/log/domoticz.log | grep 'Incoming'


会返回如下结果:

2015-11-10 17:51:55.765  Incoming connection from: 127.0.0.1
2015-11-10 17:52:02.220  Incoming connection from: 192.168.4.1
2015-11-10 17:52:03.932  Incoming connection from: 192.168.4.29
2015-11-10 17:56:49.103  Incoming connection from: 192.168.4.29

向fail2ban中加入Domoticz搜索规则

想要fail2ban找到需要屏蔽的IP,我们需要为fail2ban定义一些搜索规则(正则表达式)。

新建一个配置文件:

sudo nano /etc/fail2ban/filter.d/domoticz.conf

,内容如下:

# Fail2Ban configuration file for domoticz
#
# Author: Domoticz user 'ThinkPad'
#
# $Revision$
#

[Definition]

# Option:  failregex
# Notes.:  regex to match the password failures messages in the logfile. The
#          host must be matched by a group named "host". The tag "<HOST>" can
#          be used for standard IP/hostname matching and is only an alias for
#          (?:::f{4,6}:)?(?P<host>[\w\-.^_]+)
# Values:  TEXT
#
failregex = Error: Failed login attempt from <HOST> for user '.*' !   							
            Error: Failed login attempt from <HOST> for '.*' !
            Error: Webserver: Failed authentication attempt, ignoring client request \(remote addresses: <HOST>\)

#First line is for 'Login Page' authentication mode of Domoticz
#Second line is for 'Basic-Auth' authentication mode in Domoticz
#
#
#
# Option:  ignoreregex
# Notes.:  regex to ignore. If this regex matches, the line is ignored.
# Values:  TEXT
#
ignoreregex =

保存并退出编辑。

(可选)将不想屏蔽的IP加入IP白名单

如果不想屏蔽局域网中的IP,将IP加入fail2ban的白名单。

编辑jail.local文件:

sudo nano /etc/fail2ban/jail.local

找到'ignoreip',改成这样的格式:
ignoreip = 127.0.0.1/8 192.168.1.0/24 将192.168.1.0改为你本地的IP范围。如果你还有其它要加入的网络,直接在后面追加(IP之间通过空格分隔)。
详细信息请查看 http://www.fail2ban.org/wiki/index.php/Whitelist

重启fail2ban

要使设置生效,需要重启fail2ban

sudo /etc/init.d/fail2ban restart

测试fail2ban

测试匹配规则

要进行快速测试,您可以创建一个提供给fail2ban测试的正则表达式文件。执行: sudo nano wronglogin.txt
加入以下内容:

2015-11-03 18:35:51.908  Error: Failed login attempt from 37.130.158.115 for user 'testing123' !
2015-11-10 18:35:08.105  Error: Webserver: Failed authentication attempt, ignoring client request (remote addresses: 37.130.158.115)

然后执行:

fail2ban-regex wronglogin.txt /etc/fail2ban/filter.d/domoticz.conf

这时还不会屏蔽任何IP,只是看看fail2ban能不能通过正则表达式匹配到我们提供的文件(wronglogin.txt)中的信息。

如果正则表达式没问题,应该返回如下结果:

Results
=======

Failregex: 2 total
|-  #) [# of hits] regular expression
|   1) [1] Error: Failed login attempt from <HOST> for user '.*' !
|   2) [1] Error: Webserver: Failed authentication attempt, ignoring client request \(remote addresses: <HOST>\)
`-

你可以看到结果中,一行匹配第一条正则表达式(Domoticz 'Login Page'验证方式),一行匹配第二条正则表达式(Domoticz 'Basic-Auth'验证方式).
匹配结果中的数量应该等于你在测试日志中写入的'failed login attempts'的行数.

测试实时设置

用手机测试,三次登录失败后,手机的IP被屏蔽了。
可以运行sudo iptables -L来查看防火墙状态,文件末尾中的'DROP'部分,列出了被屏蔽的IP。

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
fail2ban-domoticz  tcp  --  anywhere             anywhere             multiport dports 8080
fail2ban-ssh  tcp  --  anywhere             anywhere             multiport dports ssh

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain fail2ban-domoticz (1 references)
target     prot opt source               destination
DROP       all  --  37.140.158.148       anywhere
RETURN     all  --  anywhere             anywhere

其中的37.140.158.148就是被屏蔽的手机的IP(手机的IP可以通过访问 http://ip138.com/ 来获取).

从屏蔽列表中移除IP

执行以下命令:

sudo fail2ban-client set domoticz unbanip 你的IP

这里使用规则名'domoticz',要找到对应的规则名,执行: sudo fail2ban-client status

取消屏蔽后,查看防火墙状态

sudo iptables -L

文件末尾中的'DROP'部分已经没有了:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
fail2ban-domoticz  tcp  --  anywhere             anywhere        multiport dports 8080
fail2ban-ssh  tcp  --  anywhere             anywhere             multiport dports ssh

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain fail2ban-domoticz (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

Chain fail2ban-ssh (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere