iT邦幫忙

8

在 CentOS 上防止被 Try Web AP

前兩天發現 Apache 的 Log 一堆 /phpmyadmin/、/myadmin/、/admin/ ... 之類的錯誤連結。顯然是有人在 Try 主機裡面安裝哪些 Web AP,看看是否有可趁之機。雖然主機內沒裝什麼,但被這樣子 Try,出現一堆錯誤 Log,看起來就很刺眼,所以弄個簡單有效的自動封鎖來擋掉這些個鼠輩。底下是這三個步驟:

  1. 先把 Apache 加一個虛擬主機如下。記得要先建立 "/var/www/html/reject" 這個目錄。

    <VirtualHost *>
    DocumentRoot "/var/www/html/reject"

    Options -Indexes
    Order Allow,Deny
    Allow from All

    ErrorDocument 404 /index.php

此虛擬主機必須放在所有虛擬主機之前。才能讓所有沒有 Hostname (直接用 IP 連) 或者錯誤 Hostname 的 Request 都進到這裡來。如果原本沒有任何主機,那麼加了這個虛擬主機之後,接著要再加上原本站台的虛擬主機:

<VirtualHost *>
	ServerName "www.MySite.com.tw"   ### 所有用此網名連的 URL 都會到這裡來
</VirtualHost>
  1. 再在目錄中建立一個亂連時的錯誤文件 index.php,當駭客亂 Try URL 而找不到時,就會導到這支 php 來。PHP 的內容如下:

也就是執行 iptables 把此 IP 給封掉,並且寄封信給 root。此 PHP 程式很簡單,也能輕易改成其它語言。

  1. 設定 sudo 可以讓 apache runner 執行 iptables 指令,在 /etc/sudoers 檔案中加入底下兩行:

    Defaults:apache !requiretty
    apache ALL=NOPASSWD: /sbin/iptables -A INPUT -i eth0 -p tcp -j REJECT -s [0-9].[0-9].[0-9].[0-9]

好了!重新啟動 Apache 後就可以不必擔心再被亂 Try了。只要無聊人士用 IP 連一次主機任何 URL,他就被封鎖了。不過如果自己的站台是用 IP 連的,就不能使用此法。建議還是把自己的公開站用 Domain name 來存取會比較好,IP 很容易就會被列舉法攻擊。

同場加映:
一位剛交女友的年輕人問:「我自己架了個相簿,想要讓自己跟女朋友看就好了 (裡頭大概有噴血照)。但是她家是動態 IP,不能用 Allow from IP 這指令來限制只有她能看。有沒有什麼簡單方法,只讓她可以看就好了呢?」

是的!這年輕人有救了。超簡單的方法就在這裡。當你按照以上的方式設定好,任何用 IP 連就會被 ban 掉之後,請再加一個虛擬主機:

<VirtualHost *>
	ServerName "MySweetheart"
	DocumentRoot  請指到你安裝相簿的目錄
</VirtualHost>

請注意那個 MySweetheart,可以換成任何你想換的字,這是你跟女友間的通關密語,不可以給別人知道。

找一天幫女友的電腦改一下 hosts。用 Teamviewer 也行。
在 "C:\WINDOWS\system32\drivers\etc\hosts" 這個檔案裡面加一行:
xxx.xxx.xxx.xxx MySweetheart
那個 xxx 請換成是站台的真實 IP。
好了!以後請女友用 http://MySweetheart/ 來連相簿站台就可以了。全世界沒人可以連進去你的相簿。除非他用 MySweetheart 這個 Domain name 來連。當然你自己也是。這樣你們就隨時有一個只有你們自己知道的線上相簿,任何地方都能連,只要先加上 hosts 那行設定就行了。當然,如果不是自己的電腦,記得離開前要去掉那行。


2 則留言

0
逮丸逮丸
iT邦大師 1 級 ‧ 2011-06-24 07:36:01

有個狀況的狀況是,
1.如果任何測一下該主機IP的port 80通不通的話,一試就被deny掉了。
2.若外部有個連結是用ip指到該主機的話,google等spider的IP,
也就被擋掉了,也會使得其他的虛擬主機無法被google給index到。
這是可能會碰到的問題。

類似的議題,也可參考 fail2ban 在 apache 上的解決方案:
http://www.fail2ban.org/wiki/index.php/Apache

wiseguy iT邦超人 1 級 ‧ 2011-06-24 10:41:30 檢舉

當然,使用 ErrorDocument 的方式是比較嚴格一點,是寧可錯殺也不放過一隻的策略。
假如想放鬆一點,則可以把 ErrorDocument 那行,換成 AliasMatch:

AliasMatch RegExp /index.php

其中 RegExp 的地方可以參考 twtw 給的那個 link 裡最下面那一坨過濾字串。
這樣就可以避掉 twtw 提到的兩個問題。

不過除非這站台就是用 IP 來存取,否則這兩個問題其實 ... 根本可以忽略。
一般要測 80 port 通不通的行為根本少之又少,如果要測站台是否運作,也不會只是看 80 port 是不是還在 listen。所以假如是自己要監看 Web Server 是否正常,有太多方法可以用,不會只是在測 80 port 通不通。因此把亂測 80 port 的傢伙封鎖,應該是不為過。
而 google spider 會以 IP 來連的機會就更是少之又少了。要公開出去的站台應該是以 Domain Name 到 google 登錄,讓它以 Domain Name 的方式來索引,怎麼會是讓 google 自己以 IP 來掃呢?那頂多也只能掃到預設的 Site 而已。如果想對 Google friendly 一點,那就加個Rewrite指令特別 Service 它也行:

&lt;pre class="c" name="code">RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} ^Googlebot
RewriteRule ^(.+) http://&lt;站台的DOMAIN_NAME>$1 [R,L]

其中 <站台的DOMAIN_NAME> 請換成實際 Domain name。
這樣就把 google spider 導到使用 domain name 的站台,也就不會被封鎖了。

0
逮丸逮丸
iT邦大師 1 級 ‧ 2011-06-24 08:05:39

有關 virtual host 的default的語法:
http://httpd.apache.org/docs/2.2/vhosts/examples.html#default
類似像:

&lt;pre class="c" name="code">&lt;VirtualHost _default_:*>
DocumentRoot /www/default
&lt;/VirtualHost> 

會用到 <VirtualHost *:*> 字樣的是:
http://httpd.apache.org/docs/2.2/vhosts/examples.html#proxy
proxy或後送到其他地方的語法。

此虛擬主機必須放在所有虛擬主機之前。才能讓所有沒有 Hostname (直接用 IP 連) 或者錯誤 Hostname 的 Request 都進到這裡來。

沒有定義 _default_ 的話,
應是把第一個被定義到的 DocumentRoot 或說排第一個的 web host,
當作的 預設 主機目錄。

如果有加上 _default_ 的話,
應就沒有 排在其他虛擬主機的最前面 的必然吧。

wiseguy iT邦超人 1 級 ‧ 2011-06-24 10:44:23 檢舉

您說的是。
小弟承認是自己偷懶而已。後續的 VirtualHost 都直接 copy 比較方便。偷笑

我要留言

立即登入留言