亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > Nginx > 正文

Nginx服務器抵御CC攻擊的相關配置講解

2024-08-30 12:27:55
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Nginx服務器抵御CC攻擊的相關配置講解,CC攻擊原理與DDoS基本相似而且技術含量低,注意防范即可,需要的朋友可以參考下
 

0x00 CC攻擊的基本原理
  CC攻擊利用代理服務器向網站發送大量需要較長計算時間的URL請求,如數據庫查詢等,導致服務器進行大量計算而很快達到自身的處理能力而形成DOS。而攻擊者一旦發送請求給代理后就主動斷開連接,因爲代理并不因爲客戶端這邊連接的斷開就不去連接目標服務器。因此攻擊機的資源消耗相對很小,而從目標服務器看來,來自代理的請求都是合法的。
  以前防CC攻擊的方法
  為了防范CC,以前的方法一個是限制每個IP的連接數,這在地址范圍很廣闊的情況下比較難實現;二是限制代理的訪問,因為一般的代理都會在HTTP頭中帶 X_FORWARDED_FOR字段,但也有局限,有的代理的請求中是不帶該字段的,另外有的客戶端確實需要代理才能連接目標服務器,這種限制就會拒絕一些正常用戶訪問。
  CC攻擊用硬防難防住
  CC攻擊比DDOS攻擊更可怕的就是,CC攻擊一般是硬防很難防止住的。
  個人分析原因有三:
  一、因為CC攻擊來的IP都是真實的,分散的;
  二、CC攻擊的數據包都是正常的數據包;
  三、CC攻擊的請求,全都是有效的請求,無法拒絕的請求。
  防CC攻擊思路
  防CC有效性在于攻擊方不接受服務器回應的數據,發送完請求后就主動斷開連接,因此要確認連接是否是CC,服務器端不立即執行URL請求命令,而是簡單的返回一個頁面轉向的回應,回應中包含新的URL請求地址。如果是正常訪問,客戶端會主動再次連接到轉向頁面,對用戶來說是透明的;而對于CC攻擊者,由于不接收回應數據,因此就不會重新連接,服務器也就不需要繼續進行操作。

0x01 驗證瀏覽器行為

簡易版

我們先來做個比喻。

社區在搞福利,在廣場上給大家派發紅包。而壞人派了一批人形的機器人(沒有語言模塊)來冒領紅包,聰明工作人員需要想出辦法來防止紅包被冒領。

于是工作人員在發紅包之前,會給領取者一張紙,上面寫著“紅包拿來”,如果那人能念出紙上的字,那么就是人,給紅包,如果你不能念出來,那么請自覺。于是機器人便被識破,灰溜溜地回來了。

是的,在這個比喻中,人就是瀏覽器,機器人就是攻擊器,我們可以通過鑒別cookie功能(念紙上的字)的方式來鑒別他們。下面就是nginx的配置文件寫法。

if ($cookie_say != "hbnl"){   add_header Set-Cookie "say=hbnl";   rewrite .* "$scheme://$host$uri" redirect;}

讓我們看下這幾行的意思,當cookie中say為空時,給一個設置cookie say為hbnl的302重定向包,如果訪問者能夠在第二個包中攜帶上cookie值,那么就能正常訪問網站了,如果不能的話,那他永遠活在了302中。你也可以測試一下,用CC攻擊器或者webbench或者直接curl發包做測試,他們都活在了302世界中。

當然,這么簡單就能防住了?當然沒有那么簡單。

增強版

仔細的你一定會發現配置文件這樣寫還是有缺陷。如果攻擊者設置cookie為say=hbnl(CC攻擊器上就可以這么設置),那么這個防御就形同虛設了。我們繼續拿剛剛那個比喻來說明問題。

壞人發現這個規律后,給每個機器人安上了揚聲器,一直重復著“紅包拿來,紅包拿來”,浩浩蕩蕩地又來領紅包了。

這時,工作人員的對策是這樣做的,要求領取者出示有自己名字的戶口本,并且念出自己的名字,“我是xxx,紅包拿來”。于是一群只會嗡嗡叫著“紅包拿來”的機器人又被攆回去了。

當然,為了配合說明問題,每個機器人是有戶口本的,被趕回去的原因是不會念自己的名字,雖然這個有點荒誕,唉。

然后,我們來看下這種方式的配置文件寫法

if ($cookie_say != "hbnl$remote_addr"){   add_header Set-Cookie "say=hbnl$remote_addr";   rewrite .* "$scheme://$host$uri" redirect;}

這樣的寫法和前面的區別是,不同IP的請求cookie值是不一樣的,比如IP是1.2.3.4,那么需要設置的cookie是say=hbnl1.2.3.4。于是攻擊者便無法通過設置一樣的cookie(比如CC攻擊器)來繞過這種限制。你可以繼續用CC攻擊器來測試下,你會發現CC攻擊器打出的流量已經全部進入302世界中。

不過大家也能感覺到,這似乎也不是一個萬全之計,因為攻擊者如果研究了網站的機制之后,總有辦法測出并預先偽造cookie值的設置方法。因為我們做差異化的數據源正是他們本身的一些信息(IP、user agent等)。攻擊者花點時間也是可以做出專門針對網站的攻擊腳本的。

完美版

那么要如何根據他們自身的信息得出他們又得出他們算不出的數值?

我想,聰明的你一定已經猜到了,用salt加散列。比如md5("opencdn$remote_addr"),雖然攻擊者知道可以自己IP,但是他無法得知如何用他的IP來計算出這個散列,因為他是逆不出這個散列的。當然,如果你不放心的話,怕cmd5.com萬一能查出來的話,可以加一些特殊字符,然后多散幾次。

很可惜,nginx默認是無法進行字符串散列的,于是我們借助nginx_lua模塊來進行實現。

rewrite_by_lua '   local say = ngx.md5("opencdn" .. ngx.var.remote_addr)   if (ngx.var.cookie_say ~= say) then     ngx.header["Set-Cookie"] = "say=" .. say     return ngx.redirect(ngx.var.scheme .. "://" .. ngx.var.host .. ngx.var.uri)   end';

通過這樣的配置,攻擊者便無法事先計算這個cookie中的say值,于是攻擊流量(代理型CC和低級發包型CC)便在302地獄無法自拔了。

大家可以看到,除了借用了md5這個函數外,其他的邏輯和上面的寫法是一模一樣的。因此如果可以的話,你完全可以安裝一個nginx的計算散列的第三方模塊來完成,可能效率會更高一些。

這段配置是可以被放在任意的location里面,如果你的網站有對外提供API功能的話,建議API一定不能加入這段,因為API的調用也是沒有瀏覽器行為的,會被當做攻擊流量處理。并且,有些弱一點爬蟲也會陷在302之中,這個需要注意。

同時,如果你覺得set-cookie這個動作似乎攻擊者也有可能通過解析字符串模擬出來的話,你可以把上述的通過header來設置cookie的操作,變成通過高端大氣的js完成,發回一個含有doument.cookie=...的文本即可。

那么,攻擊是不是完全被擋住了呢?只能說那些低級的攻擊已經被擋住而來,如果攻擊者必須花很大代價給每個攻擊器加上webkit模塊來解析js和執行set-cookie才行,那么他也是可以逃脫302地獄的,在nginx看來,確實攻擊流量和普通瀏覽流量是一樣的。那么如何防御呢?下節會告訴你答案。

0x02 請求頻率限制

不得不說,很多防CC的措施是直接在請求頻率上做限制來實現的,但是,很多都存在著一定的問題。

那么是哪些問題呢?

首先,如果通過IP來限制請求頻率,容易導致一些誤殺,比如我一個地方出口IP就那么幾個,而訪問者一多的話,請求頻率很容易到上限,那么那個地方的用戶就都訪問不了你的網站了。

于是你會說,我用SESSION來限制就有這個問題了。嗯,你的SESSION為攻擊者敞開了一道大門。為什么呢?看了上文的你可能已經大致知道了,因為就像那個“紅包拿來”的揚聲器一樣,很多語言或者框架中的SESSION是能夠偽造的。以PHP為例,你可以在瀏覽器中的cookie看到PHPSESSIONID,這個ID不同的話,session也就不同了,然后如果你杜撰一個PHPSESSIONID過去的話,你會發現,服務器也認可了這個ID,為這個ID初始化了一個會話。那么,攻擊者只需要每次發完包就構造一個新的SESSIONID就可以很輕松地躲過這種在session上的請求次數限制。

那么我們要如何來做這個請求頻率的限制呢?

首先,我們先要一個攻擊者無法杜撰的sessionID,一種方式是用個池子記錄下每次給出的ID,然后在請求來的時候進行查詢,如果沒有的話,就拒絕請求。這種方式我們不推薦,首先一個網站已經有了session池,這樣再做個無疑有些浪費,而且還需要進行池中的遍歷比較查詢,太消耗性能。我們希望的是一種可以無狀態性的sessionID,可以嗎?可以的。

rewrite_by_lua '   local random = ngx.var.cookie_random   if(random == nil) then     random = math.random(999999)   end   local token = ngx.md5("opencdn" .. ngx.var.remote_addr .. random)   if (ngx.var.cookie_token ~= token) then     ngx.header["Set-Cookie"] = {"token=" .. token, "random=" .. random}     return ngx.redirect(ngx.var.scheme .. "://" .. ngx.var.host .. ngx.var.uri)   end';

大家是不是覺得好像有些眼熟?是的,這個就是上節的完美版的配置再加個隨機數,為的是讓同一個IP的用戶也能有不同的token。同樣的,只要有nginx的第三方模塊提供散列和隨機數功能,這個配置也可以不用lua直接用純配置文件完成。

有了這個token之后,相當于每個訪客有一個無法偽造的并且獨一無二的token,這種情況下,進行請求限制才有意義。

由于有了token做鋪墊,我們可以不做什么白名單、黑名單,直接通過limit模塊來完成。

http{   ...   limit_req_zone $cookie_token zone=session_limit:3m rate=1r/s;}

然后我們只需要在上面的token配置后面中加入

limit_req zone=session_limit burst=5;

于是,又是兩行配置便讓nginx在session層解決了請求頻率的限制。不過似乎還是有缺陷,因為攻擊者可以通過一直獲取token來突破請求頻率限制,如果能限制一個IP獲取token的頻率就更完美了。可以做到嗎?可以。

http{   ...   limit_req_zone $cookie_token zone=session_limit:3m rate=1r/s;   limit_req_zone $binary_remote_addr $uri zone=auth_limit:3m rate=1r/m;}location /{   limit_req zone=session_limit burst=5;   rewrite_by_lua '   local random = ngx.var.cookie_random   if (random == nil) then     return ngx.redirect("/auth?url=" .. ngx.var.request_uri)   end   local token = ngx.md5("opencdn" .. ngx.var.remote_addr .. random)   if (ngx.var.cookie_token ~= token) then     return ngx.redirect("/auth?url=".. ngx.var.request_uri)   end';}location /auth {   limit_req zone=auth_limit burst=1;   if ($arg_url = "") {     return403;   }   access_by_lua '     local random = math.random(9999)     local token = ngx.md5("opencdn" .. ngx.var.remote_addr .. random)     if (ngx.var.cookie_token ~= token) then       ngx.header["Set-Cookie"] = {"token=" .. token, "random=" .. random}       return ngx.redirect(ngx.var.arg_url)     end   ';}

我想大家也應該已經猜到,這段配置文件的原理就是:把本來的發token的功能分離到一個auth頁面,然后用limit對這個auth頁面進行頻率限制即可。這邊的頻率是1個IP每分鐘授權1個token。當然,這個數量可以根據業務需要進行調整。

需要注意的是,這個auth部分我lua采用的是access_by_lua,原因在于limit模塊是在rewrite階段后執行的,如果在rewrite階段302的話,limit將會失效。因此,這段lua配置我不能保證可以用原生的配置文件實現,因為不知道如何用配置文件在rewrite階段后進行302跳轉,也求大牛能夠指點一下啊。

當然,你如果還不滿足于這種限制的話,想要做到某個IP如果一天到達上限超過幾次之后就直接封IP的話,也是可以的,你可以用類似的思路再做個錯誤頁面,然后到達上限之后不返回503而是跳轉到那個錯誤頁面,然后錯誤頁面也做個請求次數限制,比如每天只能訪問100次,那么當超過報錯超過100次(請求錯誤頁面100次)之后,那天這個IP就不能再訪問這個網站了。

于是,通過這些配置我們便實現了一個網站訪問頻率限制。不過,這樣的配置也不是說可以完全防止了攻擊,只能說讓攻擊者的成本變高,讓網站的扛攻擊能力變強,當然,前提是nginx能夠扛得住這些流量,然后帶寬不被堵死。如果你家門被堵了,你還想開門營業,那真心沒有辦法了。

然后,做完流量上的防護,讓我們來看看對于掃描器之類的攻擊的防御。

0x03 防掃描

ngx_lua_waf模塊

這個是一個不錯的waf模塊,這塊我們也就不再重復造輪子了??梢灾苯佑眠@個模塊來做防護,當然也完全可以再配合limit模塊,用上文的思路來做到一個封IP或者封session的效果。

0x04 總結

本文旨在達到拋磚引玉的作用,我們并不希望你直接單純的復制我們的這些例子中的配置,而是希望根據你的自身業務需要,寫出適合自身站點的配置文件。



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久久久不卡| 亚洲欧美资源在线| 日韩欧美中文字幕在线播放| 国产精品爱啪在线线免费观看| 亚洲男人天堂古典| 成人黄色中文字幕| 欧美夫妻性视频| 久色乳综合思思在线视频| 日韩欧美视频一区二区三区| 精品久久久久久久久久久久久久| 日韩成人av一区| 91色p视频在线| 欧美裸体xxxx极品少妇| 91精品视频在线免费观看| 57pao成人永久免费视频| 成人妇女免费播放久久久| 一本色道久久综合亚洲精品小说| 久久亚洲精品中文字幕冲田杏梨| 一本色道久久综合亚洲精品小说| 精品中文字幕久久久久久| 精品在线小视频| 欧美极品美女视频网站在线观看免费| 欧美日韩免费区域视频在线观看| 亚洲精品综合久久中文字幕| 黄色一区二区在线观看| 国产97在线|日韩| 国产一区二区三区在线观看视频| 精品无人区太爽高潮在线播放| 福利一区视频在线观看| 精品国偷自产在线视频| 欧美电影免费看| 成人写真福利网| 国产在线观看一区二区三区| 国产精品视频网站| 国产91在线高潮白浆在线观看| 国产精品∨欧美精品v日韩精品| 久久精品中文字幕一区| 91精品国产乱码久久久久久蜜臀| 久久69精品久久久久久国产越南| 久久人91精品久久久久久不卡| 国产精品成人播放| 欧美成人免费网| 人人爽久久涩噜噜噜网站| 久久久天堂国产精品女人| 一道本无吗dⅴd在线播放一区| 色偷偷9999www| 91成品人片a无限观看| 欧美日韩精品在线播放| 日韩精品极品视频免费观看| 伊人久久免费视频| 2018中文字幕一区二区三区| 亚洲综合在线中文字幕| 欧美专区在线播放| 欧美大片在线看免费观看| 亚洲第一男人天堂| 国产午夜精品麻豆| 2019最新中文字幕| 国产精品美女www爽爽爽视频| 精品成人乱色一区二区| 欧美亚洲第一区| 91久久精品美女| 国产欧美一区二区三区在线看| 国产视频在线观看一区二区| 国产精品99免视看9| 午夜精品一区二区三区在线视| 黑人狂躁日本妞一区二区三区| 欧美与欧洲交xxxx免费观看| 精品久久久久久亚洲国产300| 国产精品自产拍在线观看中文| 久久人人爽亚洲精品天堂| 久久久亚洲精品视频| 欧美精品久久久久久久久久| 欧美性高潮床叫视频| 欧美成人精品在线| 欧美在线精品免播放器视频| 亚洲国产日韩欧美在线动漫| 中日韩午夜理伦电影免费| 国产丝袜一区二区三区| 97久久超碰福利国产精品…| 亚洲欧美另类人妖| 欧美wwwxxxx| 精品久久久视频| 欧美成aaa人片在线观看蜜臀| 欧美性xxxxxxx| 精品无人区太爽高潮在线播放| 欧美日韩亚洲一区二区| 亚洲国产精品推荐| 韩国欧美亚洲国产| 国产综合香蕉五月婷在线| 蜜月aⅴ免费一区二区三区| 亚洲欧美色图片| 一区二区三区视频在线| 91在线视频一区| 色悠久久久久综合先锋影音下载| 亚洲黄一区二区| 亚洲福利在线观看| 国产97在线视频| 亚洲图中文字幕| 久久久久久伊人| 国产成人av在线| 欧美日韩一区二区免费视频| 久久久精品国产一区二区| 亚洲精品国产综合区久久久久久久| 亚洲人成网站色ww在线| 视频在线观看99| www.日本久久久久com.| 亚洲精品xxx| 91精品久久久久久久久久久| 亚洲r级在线观看| 这里只有精品视频在线| 久久久久久亚洲精品中文字幕| 欧美在线视频观看| 欧美精品在线视频观看| 欧美日韩中文在线| 色综合久综合久久综合久鬼88| 中文字幕v亚洲ⅴv天堂| 国产有码一区二区| 日韩经典中文字幕在线观看| 国产精品偷伦视频免费观看国产| 在线观看欧美日韩| 国内精品在线一区| 亚洲精品日韩av| 日本久久久久亚洲中字幕| 久久91精品国产91久久久| 18性欧美xxxⅹ性满足| 久久精品国产精品| 亚洲女人被黑人巨大进入al| 韩剧1988免费观看全集| 黑人巨大精品欧美一区二区三区| 中文字幕日韩av| 亚洲精品久久久久久久久| 91国偷自产一区二区三区的观看方式| 欧美日韩一区二区免费在线观看| 日韩国产高清视频在线| 国产精品视频最多的网站| 久久久久久亚洲| 久久99热精品这里久久精品| 欧美色图在线视频| 国产精品劲爆视频| 国产午夜一区二区| 日韩av免费看| 精品一区二区三区四区在线| 亚洲精品视频中文字幕| 国产精品久久久久久久久免费看| 亚洲精品aⅴ中文字幕乱码| 日本久久精品视频| 亚洲精品wwww| 欧美俄罗斯乱妇| 精品国产精品三级精品av网址| 国产成人综合亚洲| 久久久精品视频在线观看| 日韩美女毛茸茸| 国产乱人伦真实精品视频| 日韩中文字幕网址| 欧美高清视频在线播放| 午夜精品99久久免费| 国产精品爽黄69| 国产日韩欧美成人| 主播福利视频一区| 一本色道久久88综合亚洲精品ⅰ| 欧美第一黄网免费网站| 精品国产欧美一区二区三区成人| 美乳少妇欧美精品| 精品久久久久久国产91|