我们运行一个CentOS Linux 7.4 版LAMP 堆栈与 Apache 2.4。在监控仪表板上,我跟踪各种性能指标,其中之一是“错误的主机请求”,其中虚拟主机与我们的服务器不匹配。
我使用 arin.net 手动查找不良主机请求。由于我们的业务性质是美国,仅限国内,因此我们会阻止没有正确虚拟主机名的外国 IP 范围访问我们。我们使用 iptables 来做到这一点;以下是其中的一个示例,fwiw。
$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- 187.0.0.0/8 anywhere /* montevideo uruguay */
DROP all -- 177.0.0.0/8 anywhere /* vmontevideo uraguay */
DROP all -- 164.77.0.0/16 anywhere /* montevideo uraguay */
DROP all -- 78-0-0-0.adsl.net.t-com.hr/8 anywhere /* amsterdam */
这可以有效减缓来自海外的所有“嗅探”流量。。
几乎突然之间,在过去的两周里,我们每天开始收到来自伊利诺伊州芝加哥、亚马逊 AWS(华盛顿州西雅图)、加利福尼亚州弗里蒙特等地的 3-6 个请求。
以下是 apache 的 access_log 中的一些日志条目:
./myurl.com-access.log:23.20.12.111 - - [16/Jan/2018:00:16:21 -0600] "HEAD / HTTP/1.1" 200 - "-" "Cloud mapping experiment. Contact [email protected]"
./myurl.com-access.log:23.20.54.152 - - [16/Jan/2018:08:10:03 -0600] "HEAD / HTTP/1.1" 200 - "-" "Cloud mapping experiment. Contact [email protected]"
./myurl.com-access.log-20180114:23.20.12.111 - - [13/Jan/2018:08:07:44 -0600] "HEAD / HTTP/1.1" 200 - "-" "Cloud mapping experiment. Contact [email protected]"
./myurl.com-ssl-access.log:74.82.47.3 - - [14/Jan/2018:07:20:31 -0600] "GET / HTTP/1.1" 200 21 "-" "-"
./myurl.com-ssl-access.log:108.178.61.58 - - [15/Jan/2018:06:40:17 -0600] "GET / HTTP/1.1" 200 20 "-" "Mozilla/5.0 zgrab/0.x"
./myurl.com-ssl-access.log:184.154.189.90 - - [15/Jan/2018:07:54:29 -0600] "GET / HTTP/1.1" 200 21 "-" "Mozilla/5.0 zgrab/0.x"
./myurl.com-ssl-access.log:108.178.61.58 - - [16/Jan/2018:06:16:45 -0600] "GET / HTTP/1.1" 200 21 "-" "Mozilla/5.0 zgrab/0.x"
./myurl.com-ssl-access.log:184.154.189.90 - - [16/Jan/2018:06:51:18 -0600] "GET / HTTP/1.1" 200 21 "-" "Mozilla/5.0 zgrab/0.x"
./myurl.com-ssl-access.log:74.82.47.3 - - [16/Jan/2018:07:28:43 -0600] "GET / HTTP/1.1" 200 20 "-" "-"
./myurl.com-ssl-access.log-20180114:74.82.47.3 - - [08/Jan/2018:06:25:14 -0600] "GET / HTTP/1.1" 302 - "-" "-"
有哪些方法可以预防(尽早彻底阻止)向没有单一、正确虚拟主机的服务器发出请求?
为了响应fail2ban
可能有帮助的解决方案,我检查了失败2ban正在运行:
$ ps aux | grep fail2ban
root 2824 0.0 0.0 368832 53632 ? Sl 2017 17:44 /usr/bin/python2 -s /usr/bin/fail2ban-server -s /var/run/fail2ban/fail2ban.sock -p /var/run/fail2ban/fail2ban.pid -x -b
我会考虑为它编写一条规则 - 我无法阻止合法的流量 - 假设没有有效的流量会在没有虚拟主机的情况下请求主机是否安全(当然,网络应用程序的编写方式要求这样做说实话)。
更新
fail2ban 将不起作用,因为它们只使用每个 IP 地址访问服务器一次 - 它们不会重复使用它们。让我声明一下,我已经有效地识别了 Web 应用程序第 2 行的流量。现在,我正在向他们发送状态 200,其中包含一个随机数,非常小,速度非常快。但我需要一种方法来“隐藏”服务器,以某种方式简单地无反应以不会给服务器带来任何实际负载的方式。
答案1
好吧,fail2ban 不起作用,因为违规请求每次都使用不同的 IP 地址。 200、403、404响应都需要apache请求占用服务器资源。
意识到我只想“挂断电话”并让 apache 停止与请求者交谈,我发现安装模组安全允许将 apache 配置为删除所有请求与服务器ip的虚拟主机相匹配。在 centos 7 上安装 mod_security 是一件轻而易举的事:
须藤 yum 安装 mod_security
然后我将这些行放入虚拟主机指令中,其中 ServerName 是主机 IP 地址:
<VirtualHost *:80>
ServerName 1xx.1xx.1xx.1xx
SecRuleEngine On
SecRule REMOTE_ADDR "^\d" "log,drop,phase:1,id:111,msg:'dropped bad host request'"
...
在firefox中,通过ip访问服务器现在看起来像这样:
...祝你再次尝试好运!
在服务器日志中,正在记录丢弃:
# tail -f 1xx.1xx.1xx.1xx-error.log
[Thu Jan 18 18:51:00.357113 2018] [:error] [pid 41716] [client 69.137.81.33] ModSecurity: Access denied with connection close (phase 1). Pattern match "^\\\\d" at REMOTE_ADDR. [file "/etc/httpd/vhost.d/ipaddyhost.conf"] [line "8"] [id "111"] [msg "dropped bad host access request"] [hostname "1xx.1xx.1xx.1xx"] [uri "/"] [unique_id "WmFA@q@5uqLACI9MKaxAAABbfwX"]
换句话说,要么你知道我的主机名,要么你可以与禁止
答案2
失败2禁止有几个规则用于阻止扫描或尝试对服务器做坏事的 IP 地址apache
,您可以编写自己的规则(例如,匹配 apache 错误日志中的“坏主机请求”)或添加到现有规则中。
fail2ban
已为大多数 Linux 发行版预先打包。
答案3
我将设置一个新的、全新的包罗万象的虚拟主机(即任何与您的真实/配置名称不匹配的名称的默认名称)。设置自定义 404 错误以重定向到 google 或类似的错误,并且正如其他人提到的那样,设置fail2ban
为监视该包罗万象的主机的日志。