EZTABLE IDEAS 是 EZTABLE 成員揮灑熱情和大家分享專業及創意的網誌。 EZTABLE 讓消費者 24 小時都可以在網路訂位全台灣最優質的餐廳,同時提供餐廳經營者 e 化的訂位管理系統 (雲端、iPad、智慧型手機)

淺談DDoS攻擊防護

五月 17 2011 Published by under Engineering

DDoS

(圖片來源:http://blog.trendmicro.com/)

人妻有三怕 – 撞車、撞鬼、撞小三。

網站也有三怕 – 被攻擊、被攻擊、被攻擊。
斯斯有二種,但網站攻擊可有百百種。其中一種,就叫DDoS(distributed denial-of-service)。

簡單來說,就是有人透過操控大量電腦的方式,對你的網站發出大量request。而這類request,對你來說可能都是合法的,但是因為量太大,導致主機無法負荷。

那麼,我們到底能夠怎麼樣降低DDoS所造成的傷害?

如果你的口袋夠深,可以購買專用的IPS設備進行防護,或是詢問你的ISP是否有提供貴森森的安全防護服務。

但IPS設備動輒要價六、七位數,安全防護服務也不是一般企業負擔得起。

不過倒是可以從兩個方向下手,降低DDoS的影響。

1.web server

apache有一個名為mod_evasive的3rd-party模組,就是專門用來處理DDoS的問題。

mod_evasive的安裝與設定都不困難, 若是ubuntu/Debian,只要下一行指令即可安裝完成: apt-get install libapache2-mod-evasive 若是CentOS/RHEL,只要加入epel這個repository,也可以用一行指令裝好: yum install mod_evasive

如何,簡單吧? 設定上也很直觀,主要有下列這些參數可設定:

(CentOS是在/etc/httpd/conf.d/底下,ubuntu是在/etc/apache2/mods-available/底下)

 

DOSHashTableSize 處理記憶體的大小,需根據網站流量狀況來設定,流量越大,此值就需要越大。
DOSPageCount 在DOSPageInterval所設定的時間區段中,同一個來源 IP 存取同一個頁面的最大存取次數。
DOSSiteCount 在DOSSiteInterval所設定的時間區段中,同一個來源 IP 可同時發出 HTTP 存取的最大次數。
DOSPageInterval 設定 DOSPageCount 的時間區段,以秒為單位。
DOSSiteInterval 設定 DOSSiteCount 的時間區段,以秒為單位。
DOSBlockingPeriod 當某一IP違反上述的DOSPageCount/DOSPageInterval或DOSSiteCount/DOSSiteInterval,將被block的秒數
DOSmailNotify 管理者的 Email 位址,當有IP被block時,即會寄發警告信至此信箱中。
DOSSystemCommand 當發現有疑似攻擊,即需自動執行的指令。
DOSLogdir mod_evasive 的Log檔位置,如果沒設定此值,預設存放 Log 的目錄為 /tmp。當有疑似攻擊時,會在該目錄下新增一個 dos_[ip] 的檔案。

 

2.firewall

Linux強大的iptables,有一個名為ipt_recent的module,能阻擋DDoS攻擊。

例如,你可以新增一個chain: iptables -N WEB_SRV_DOS

然後,再用以下的指令,把30秒內hit port 80/443超過200次的IP阻擋並記錄下來:

iptables -A INPUT -p tcp -m multiport –dports 80,443 -j WEB_SRV_DOS

iptables -A WEB_SRV_DOS -p tcp –syn -m multiport –dports 80,443 -m recent –rcheck –second 30 –hitcount 200 -j LOG –log-prefix “[Possible DOS Attack]"

iptables -A WEB_SRV_DOS -p tcp –syn -m multiport –dports 80,443 -m recent –rcheck –second 30 –hitcount 200 -j REJECT iptables -A WEB_SRV_DOS -p tcp –syn -m multiport –dports 80,443 -m recent –set iptables -A WEB_SRV_DOS -p tcp -m multiport –dports 80,443 -j ACCEPT

(如果你看dmesg遇到下列這類錯誤: hitcount (200) is larger than packets to be remembered (20) 表示你設定要計算的次數大於ipt_recent所設定的上限, 可透過調整ipt_recent module的ip_pkt_list_tot參數來解決。

CentOS是在:/sys/module/ipt_recent/parameters/ ubuntu是在:/sys/module/xt_recent/parameters/)

相較於mod_evasive只能阻擋web層的DDoS,iptable recent module只要視需求設定port,即可以提供更有彈性的防護。

一樣,來做個小實驗吧。

首先,我們把mod_evasive設定好並啟動。接著,對測試site發出大量的http request。

(可以寫程式來跑,或用所謂的工人智慧 – 用browser開多個TAB,不斷的reload網頁。)

結果可以發現,在DOSLogdir所設定的目錄中,出現了以發動攻擊的client IP為檔名的Log檔。

而再以browser試著打開測試網頁,發現變成403 forbidden。看來mod_evasive的確是發揮作用了。

再來,我們把mod_evasive關掉,並且設定上述的iptables指令,

一樣,先對測試site發出大量的http request,

可以發現在/var/log/message中出現下列訊息:

May 17 07:12:00 localhost kernel: [Possible DOS Attack]IN=eth0 OUT= MAC=XX:XX:XX:XX:43:77:00:1f:YY:YY:YY:YY SRC=192.168.0.105 DST=192.168.0.102 LEN=64 TOS=0x00 PREC=0x00 TTL=64 ID=45026 DF PROTO=TCP SPT=59437 DPT=80 WINDOW=65535 RES=0x00 SYN URGP=0

此時再以browser打開測試網頁,則會出現Connection refused,無法連上(因為我設定的rule是REJECT)。

OK,iptables的ipt_recent module也發揮作用了。 ^_^

 

這兩種方式,我個人比較推iptables。原因有幾個:

(1) iptables在網路層即阻擋掉攻擊封包,對server的loading影響較小

(2) iptables設定上較有彈性,可用來防護80,443以外的port

(3) iptables可設定於獨立的主機,擺在server的前方進行保護,可以完全不讓攻擊封包進入server。

如果你是用MS Windows + IIS,別傷心,你可以參考AQTRONIX WebKnight這套免費的web application firewall,裡面即有防護DDoS攻擊的功能。

祝大家的網站都平安健康! 🙂

 

Tinghan Chao,

Web Developer, EZTABLE

Related Posts Plugin for WordPress, Blogger...

No responses yet

發表迴響