Security

在 centos/apache 中防止不正確的虛擬主機請求

  • January 19, 2018

我們使用 Apache 2.4 執行CentOS Linux 7.4 版LAMP 堆棧。在監控儀表板上,我跟踪各種性能指標,其中之一是虛擬主機與我們的伺服器不匹配的“錯誤主機請求”。

手動,我使用 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 */

這對於減緩來自海外的所有“嗅探器”流量非常有效。.


幾乎突然,在過去的兩周里,我們開始每天收到 3-6 個請求,這些請求來自伊利諾伊州芝加哥、亞馬遜 AWS(華盛頓州西雅圖)、弗里蒙特 CA 等。


以下是 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 research@pdrlabs.net"
./myurl.com-access.log:23.20.54.152 - - [16/Jan/2018:08:10:03 -0600] "HEAD / HTTP/1.1" 200 - "-" "Cloud mapping experiment. Contact research@pdrlabs.net"
./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 research@pdrlabs.net"
./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可能有幫助的解決方案,我檢查了 fail2ban 正在執行:

$ 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 地址訪問伺服器一次 - 它們不會重複使用它們。讓我聲明,我已經有效地辨識了網路應用程序第 2 行的流量。現在,我正在向他們發送一個帶有隨機數的狀態 200,非常小,非常快。但我需要一種“隱藏”伺服器的方法,以某種方式簡單地不以不會給伺服器帶來任何實際負載的方式進行響應

好的,fail2ban 不起作用,因為有問題的請求每次都使用不同的 IP 地址。200、403、404響應都需要apache請求佔用伺服器資源。

意識到我只想“掛斷電話”並讓 apache 停止與請求者交談,我發現安裝mod_security允許將 apache 配置為丟棄與伺服器 ip 的虛擬主機匹配的所有請求。在 centos 7 上安裝 mod_security 輕而易舉:

須藤百勝安裝 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"]

換句話說,要麼你知道我的主機名,要麼你可以與禁令交談

引用自:https://unix.stackexchange.com/questions/417543