nginx預防常見攻擊

目錄

nginx防止DDOS攻擊
    概述
    攻擊手段
    攻擊方式
    配置
        限制請求率
        限制連接的數量
        關閉慢連接
        設置 IP 黑名單
        設置IP白名單
        小站點解決方案
nginx防止CC攻擊
    概述
    主動抑制方法
        應用舉例(Discuz!)
    被動防禦方法
        拒絕IP地址
預防爬蟲攻擊
    概述
    利用http_user_agent
    利用Robots.txt
        擴展瞭解

nginx防止DDOS攻擊
概述

信息安全的三要素:“保密性”、“完整性”和“可用性”中,DoS(Denial of Service),即拒絕服務攻擊,針對的目標正是“可用性”。該攻擊方式利用目標系統網絡服務功能缺陷或者直接消耗其系統資源,使得該目標系統無法提供正常的服務。

DDoS:Distributed Denial of Service,即分佈式拒絕服務攻擊。藉助於客戶/服務器技術,將多個計算機聯合起來作爲攻擊平臺,對一個或多個目標發動DDoS攻擊,從而成倍地提高拒絕服務攻擊的威力。通常,攻擊者使用一個偷竊帳號將DDoS主控程序安裝在一個計算機上,在一個設定的時間主控程序將與大量代理程序通訊,代理程序已經被安裝在網絡上的許多計算機上。代理程序收到指令時就發動攻擊。利用客戶/服務器技術,主控程序能在幾秒鐘內激活成百上千次代理程序的運行。

比喻可以用一個比方來深入理解什麼是DDOS。一羣惡霸試圖讓對面那家有着競爭關係的商鋪無法正常營業,他們會採取什麼手段呢?惡霸們扮作普通客戶一直擁擠在對手的商鋪,賴着不走,真正的購物者卻無法進入;或者總是和營業員有一搭沒一搭的東扯西扯,讓工作人員不能正常服務客戶;也可以爲商鋪的經營者提供虛假信息,商鋪的上上下下忙成一團之後卻發現都是一場空,最終跑了真正的大客戶,損失慘重。此外,惡霸們完成這些壞事有時憑單幹難以完成,需要叫上很多人一起。嗯,網絡安全領域中DoS和DDoS攻擊就遵循着這些思路。

DDoS的攻擊方式有很多種,最基本的DoS攻擊就是利用合理的服務請求來佔用過多的服務資源,從而使合法用戶無法得到服務的響應。單一的DoS攻擊一般是採用一對一方式的,當攻擊目標CPU速度低、內存小或者網絡帶寬小等等各項指標不高的性能,它的效果是明顯的。隨着計算機與網絡技術的發展,計算機的處理能力迅速增長,內存大大增加,同時也出現了千兆級別的網絡,這使得DoS攻擊的困難程度加大了,目標對惡意攻擊包的"消化能力"加強了不少。在此情況下,分佈式的拒絕服務攻擊手段(DDoS)就應運而生了。DDoS就是利用更多的“傀儡機”來發起進攻,以比從前更大的規模來進攻受害者,導致“可用性”坍塌、失效。
攻擊手段

1、通過使網絡過載來干擾甚至阻斷正常的網絡通訊。

2、通過向服務器提交大量請求,使服務器超負荷。

3、阻斷某一用戶訪問服務器。

4、阻斷某服務與特定系統或個人的通訊。
攻擊方式

SYN/ACK Flood攻擊:
可通殺各種系統的網絡服務,主要是通過向受害主機發送大量僞造源IP和源端口的SYN或ACK包,導致主機的緩存資源被耗盡或忙於發送迴應包而造成拒絕服務,由於源都是僞造的故追蹤起來比較困難,缺點是實施起來有一定難度,需要高帶寬的殭屍主機支持。
TCP全連接攻擊
這種攻擊是爲了繞過常規防火牆的檢查而設計的,一般情況下,常規防火牆對於正常的TCP連接是放過的,但是Web服務器能接受的TCP連接數是有限的,一旦有大量的TCP連接,即便是正常的,也會導致網站訪問非常緩慢甚至無法訪問,TCP全連接攻擊就是通過許多殭屍主機不斷地與受害服務器建立大量的TCP連接,直到服務器的內存等資源被耗盡而被拖跨,從而造成拒絕服務,這種攻擊的特點是可繞過一般防火牆的防護而達到攻擊目的,缺點是需要找很多殭屍主機,並且由於殭屍主機的IP是暴露的,因此此種DDOS攻擊方式容易被追蹤。
針對一些動態頁面攻擊力度最大,就是需要和數據庫進行交互的,特徵是和服務器建立正常的TCP連接,並不斷的向腳本程序提交查詢、列表等大量耗費數據庫資源的調用,而服務器爲處理此請求卻可能要從上萬條記錄中去查出某個記錄,這種處理過程對資源的耗費是很大的,而對於客戶端來說輕而易舉,常見的現象就是網站慢如蝸牛,缺點是對付只有靜態頁面的網站效果會大打折扣,並且可能會暴露攻擊主機地址

配置
限制請求率

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m;

server {
    ...
    location /login.html {
        limit_req zone=one;
    ...
    }
}
//limit_req_zone:配置了一個名爲one的共享內存
//zone:用來存儲$binary_remote_addr的請求狀態
//rate=30r/m:設置Nginx每兩秒鐘接收一個客戶端IP的請求(大約等同於每分鐘30個請求)
//location 塊中 /login.html 的limit_req指令引用了共享內存zone

限制連接的數量

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

limit_conn_zone $binary_remote_addr zone=addr:10m;
 
server {
    ...
    location /shopping/ {
        limit_conn addr 10;
        ...
    }
}
// 限制每一個 IP 對網站 /shopping 部分打開的連接數不超過 10 個.
//limit_conn指令引用了共享內存zone,並將最大連接數設置爲 10.

關閉慢連接

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

server {
    client_body_timeout 5s;
    client_header_timeout 5s;
    ...
}
//關閉那些一直保持打開同時寫數據又特別頻繁的連接
//client_body_timeout和client_header_timeout指令控制請求體或者請求頭的超時時間,配置將等待時間控制在 5s 之內:

設置 IP 黑名單

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

location / {
    deny 111.212.23.1;
    deny 123.111.123.5;
    deny 123.113.123.7;
    ...
}
//如果能識別攻擊者所使用的客戶端 IP 地址,那麼通過deny指令將其屏蔽,可以通過腳本和計劃任務自動檢測

設置IP白名單

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

location / {
    allow 192.122.1.0/24;
    deny all;
    ...
}
//在互聯網環境中不太容易實現,依據實際環境。

小站點解決方案

location /index/server/p/ {
if (KaTeX parse error: Expected group after '^' at position 16: http_referer ~ ^̲){
return 403;
}
if (KaTeX parse error: Expected '}', got 'EOF' at end of input: … rewrite ^/(.*) http://127.0.0.1/ redirect;

            #利用地址重寫功能
            }
            if ($http_user_agent ~* (wget|curl|qdesk) ) {
                    return 403;
            }                
            #若瀏覽器類型屬於這幾類,返回錯誤頁面
    }

nginx防止CC攻擊
概述

CC攻擊的原理是通過代理服務器或者大量肉雞模擬多個用戶訪問目標網站的動態頁面,製造大量的後臺數據庫查詢動作,消耗目標CPU資源,造成拒絕服務

CC不像DDoS可以用硬件防火牆來過濾攻擊,CC攻擊本身的請求就是正常的請求。
我們都知道網站的頁面有靜態和動態之分,動態網頁是需要與後臺數據庫進行交互的,比如一些論壇用戶登錄的時候需要去數據庫查詢你的等級、權限等等,當你留言的時候又需要查詢權限、同步數據等等,這就消耗很多CPU資源,造成靜態網頁能打開,但是需要和數據庫交互的動態網頁打開慢或者無法打開的現象。這種攻擊方式相對於前兩種實現要相對複雜一些,但是防禦起來要簡單的多,提供服務的企業只要儘量少用動態網頁並且讓一些操作提供驗證碼就能抵禦一般的CC攻擊。

這裏能看出來DDoS和CC的區別,DDoS攻擊打的是網站的服務器,而CC攻擊是針對網站的頁面攻擊的,用術語來說就是,一個是WEB網絡層拒絕服務攻擊(DDoS),一個是WEB應用層拒絕服務攻擊(CC)
主動抑制方法

爲了讓Nginx支持更多的併發連接數,根據實際情況對工作線程數和每個工作線程支持的最大連接數進行調整。例如設置“worker_processes 10”和“worker_connections 1024”,那這臺服務器支持的最大連接數就是10×1024=10240。

worker_processes 10;
events {
use epoll;
worker_connections 10240;
}

Nginx 0.7開始提供了2個限制用戶連接的模塊:NginxHttpLimitZoneModule和NginxHttpLimitReqModule。NginxHttpLimitZoneModule可以根據條件進行併發連接數控制。

http {
limit_zone my_zone $binary_remote_addr 10m;
server {
location /somedir/ {
limit_conn my_zone 1;
}
}
}
#其中“limit_zone my_zone $binary_remote_addr 10m”的意思是定義一個名稱爲my_zone的存儲區域、my_zone中的內容爲遠程IP地址、my_zone的大小爲10M;“location /somedir/”的意思是針對somedir目錄應用規則;“limit_conn my_zone 1”的意思是針對上面定義的my_zone記錄區記錄的IP地址在指定的目錄中只能建立一個連接。

NginxHttpLimitReqModule可以根據條件進行請求頻率的控制。例如可以定義以下代碼:

http {
limit_req_zone $binary_remote_addr zone=my_req_zone:10m rate=1r/s;

server {

location /somedir/ {
limit_req_zone zone= my_req_zone burst=2;
}
#其中“limit_req_zone $binary_remote_addr zone=my_req_zone:10m rate=1r/s”的意思是定義一個名稱爲my_req_zone的存儲區域,my_req_zone內容爲遠程IP地址,my_req_zone大小爲10M,my_req_zone中的平均請求速率只能爲1個每秒;“location /somedir/”的意思是針對somedir目錄應用規則;“limit_req_zone zone= my_req_zone burst=2”的意思是針對上面定義的my_req_zone記錄區記錄的IP地址在請求指定的目錄中的內容時最高2個每秒的突發請求速率。

#當有連接觸發上訴規則時,Nginx會報“503 Service Temporarily Unavailable”的錯誤,停止用戶請求。返回一個503,對服務器來說影響不大,只佔用一個nginx的線程而已,相對來說還是很划算的。

爲了測試效果,我將以上代碼放入Nginx的配置文件,並編寫了一個PHP文件顯示phpinfo;另外還寫了一個html文件,其中嵌入了多個iframe調用php文件。當我打開這個html文件了,可以看到只有一個iframe中的php文件正常顯示了,其他的iframe都顯示503錯誤。

應用舉例(Discuz!)

Discuz!是使用比較多的一個php論壇程序。以Discuz!7.0爲例,程序目錄下有比較多的可以直接訪問的php文件,但其中最容易受到攻擊的一般有index.php(首頁)、forumdisplay.php(板塊顯示)、viewthread.php(帖子顯示)。攻擊者一般會對這些頁面發起大量的請求,導致HTTP服務器連接數耗盡、mysql數據庫停止響應,最終導致服務器崩潰。爲了防止上述頁面被攻擊,我們可以設定以下的規則進行防禦:

http {
limit_zone myzone_bbs $binary_remote_addr 10m;
limit_req_zone KaTeX parse error: Expected '}', got 'EOF' at end of input: …viewthread).php {
limit_conn myzone_bbs 3;
limit_req zone=bbs burst=2 nodelay;
root html;
fastcgi_pass unix:/dev/shm/php-cgi.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name;
include fastcgi_params;
}
}
}
//應用這條規則後,bbs目錄下的index.php、forumdisplay.php和viewthread.php這些頁面同一個IP只許建立3個連接,並且每秒只能有1個請求(突發請求可以達到2個)。雖然這樣的規則一般來說對正常的用戶不會產生影響(極少有人在1秒內打開3個頁面),但是爲了防止影響那些手快的用戶訪問,可以在nginx中自定義503頁面,503頁面對用戶進行提示,然後自動刷新。在Nginx中自定義503頁面:

error_page 503 /errpage/503.html;
//503頁面的源代碼:

[root@localhost ~]# vim /usr/local/nginx/html/503.html

<html>
< head>
< title>頁面即將載入....</title>
< meta http-equiv=content-type c>
< META NAME="ROBOTS" C>
< /head>
< body bgcolor="#FFFFFF">
< table cellpadding="0" cellspacing="0" border="0" width="700" align="center" height="85%">
<tr align="center" valign="middle">
<td>
<table cellpadding="10" cellspacing="0" border="0" width="80%" align="center" style="font-family: Verdana, Tahoma; color: #666666; font-size: 11px">
<tr>
<td valign="middle" align="center" bgcolor="#EBEBEB">
<br /><b style="font-size: 16px">頁面即將載入</b>
<br /><br />你刷新頁面的速度過快。請少安毋躁,頁面即將載入...
<br /><br />[<a href="javascript:window.location.reload();"><font color=#666666>立即重新載入</font></a>]
<br /><br />
</td>
</tr>
</table>
</td>
</tr>
< /table>
< /body>
< /html>

< SCRIPT language=javascript>
function update()
{
window.location.reload();
}
setTimeout("update()",2000);
< /script>

被動防禦方法

雖然主動防禦已經抵擋了大多數HTTP GET FLOOD攻擊,但是道高一尺魔高一丈,攻擊者會總會找到你薄弱的環節進行攻擊。所以我們在這裏也要介紹一下被動防禦的一些方法。

拒絕IP地址

訪問者通過瀏覽器正常訪問網站,與服務器建立的連接一般不會超過20個,我們可以通過腳本禁止連接數過大的IP訪問。以下腳本通過netstat命令列舉所有連接,將連接數最高的一個IP如果連接數超過150,則通過 iptables阻止訪問:

[root@localhost ~]# vim /opt/deny_ng.sh
#!/bin/sh
status=netstat -na|awk '$5 ~ /[0-9]+:[0-9]+/ {print $5}' |awk -F ":" -- '{print $1}' |sort -n|uniq -c |sort -n|tail -n 1
NUM=echo $status|awk '{print $1}'
IP=echo $status|awk '{print $2}'
result=echo "$NUM > 150" | bc
if [ result=1]thenechoIP:result = 1 ] then echo IP:IP is over $NUM, BAN IT!
/sbin/iptables -I INPUT -s $IP -j DROP
fi
[root@localhost ~]# crontab -e
* * * * * /bin/bash /opt/deny_ng.sh

[root@localhost ~]# ab -n 1000 -c 100 http://www.xxx.com/bbs/index.php
//進行ab工具的測試

測試完成後,我們就可以看到系統中有IP被封的提示:

#tail /var/spool/mail/root
Content-Type: text/plain; charset=ANSI_X3.4-1968
Auto-Submitted: auto-generated
X-Cron-Env: <Shell=/bin/sh>
X-Cron-Env: <HOME=/root>
X-Cron-Env: <;PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=root>
X-Cron-Env: <USER=root>

IP:xx.xxx.xx.xx is over 1047, BAN IT!

至此,又一次HTTP GET FLOOD防禦成功。

根據特徵碼屏蔽請求(對CC攻擊效果較好)

一般同一種CC攻擊工具發起的攻擊請求包總是相同的,而且和正常請求有所差異。當服務器遭遇CC攻擊時,我們可以快速查看日誌,分析其請求的特徵,比如User-agent。下面的是某一次CC攻擊時的User-agent,Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; MyIE 3.01)Cache-Control: no-store, must-revalidate幾乎沒有正常的瀏覽器會在User-agent中帶上“must-revalidate”這樣的關鍵字。所以我們可以以這個爲特徵進行過濾,將User-agent中帶有“must-revalidate”的請求全部拒絕訪問:

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
if ($http_user_agent ~ must-revalidate) {
return 403;
}

預防爬蟲攻擊
概述

爬蟲的比喻  如果我們把互聯網比作一張大的蜘蛛網,那一臺計算機上的資源便是蜘蛛網上的一個獵物,而爬蟲程序就是一隻小蜘蛛,沿着蜘蛛網抓取自己想要的獵物。

爬蟲的定義  向網站發起請求,獲取資源後分析並提取有用的程序。爬蟲攻擊事件利用網絡漏洞對網站進行攻擊,最終造成網站癱瘓!
利用http_user_agent

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
server {

listen 80; 
server_name www.localhost.com; 

if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot") 
{ 
return 403; 
} 
if ($request_method !~ ^(GET|HEAD|POST)$) {
return 403;
}
//禁止非GET|HEAD|POST方式的抓取

利用Robots.txt
擴展瞭解

robots.txt是搜索引擎中訪問網站的時候要查看的第一個文件。robots.txt文件告訴蜘蛛程序在服務器上什麼文件是可以被查看的。

當一個搜索蜘蛛訪問一個站點時,它會首先檢查該站點根目錄下是否存在robots.txt,如果存在,搜索機器人就會按照該文件中的內容來確定訪問的範圍;如果該文件不存在,所有的搜索蜘蛛將能夠訪問網站上所有沒有被口令保護的頁面。百度官方建議,僅當您的網站包含不希望被搜索引擎收錄的內容時,才需要使用robots.txt文件。如果您希望搜索引擎收錄網站上所有內容,請勿建立robots.txt文件。

Robots協議是國際互聯網界通行的道德規範,基於以下原則建立:

1、搜索技術應服務於人類,同時尊重信息提供者的意願,並維護其隱私權;

2、網站有義務保護其使用者的個人信息和隱私不被侵犯。

當然,如果搜索引擎不遵守約定的Robots協議,那麼通過在網站下增加robots.txt也是不起作用的。(在正式環境中,可以適當允許搜索引擎抓取收錄)

robots.txt文件生成地址 http://tool.chinaz.com/robots/

原博客地址:
nginx預防常見攻擊:https://www.cnblogs.com/joinbestgo/p/10766352.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章