自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

超輕量級(jí)反爬蟲(chóng)方案

安全 應(yīng)用安全
爬蟲(chóng)和反爬蟲(chóng)日益成為每家公司的標(biāo)配系統(tǒng)。爬蟲(chóng)在情報(bào)獲取、虛假流量、動(dòng)態(tài)定價(jià)、惡意攻擊、薅羊毛等方面都能起到很關(guān)鍵的作用,所以每家公司都或多或少的需要開(kāi)發(fā)一些爬蟲(chóng)程序,業(yè)界在這方面的成熟的方案也非常多;有矛就有盾,每家公司也相應(yīng)的需要反爬蟲(chóng)系統(tǒng)來(lái)達(dá)到數(shù)據(jù)保護(hù)、系統(tǒng)穩(wěn)定性保障、競(jìng)爭(zhēng)優(yōu)勢(shì)保持的目的。

[[173551]]

前言

爬蟲(chóng)和反爬蟲(chóng)日益成為每家公司的標(biāo)配系統(tǒng)。爬蟲(chóng)在情報(bào)獲取、虛假流量、動(dòng)態(tài)定價(jià)、惡意攻擊、薅羊毛等方面都能起到很關(guān)鍵的作用,所以每家公司都或多或少的需要開(kāi)發(fā)一些爬蟲(chóng)程序,業(yè)界在這方面的成熟的方案也非常多;有矛就有盾,每家公司也相應(yīng)的需要反爬蟲(chóng)系統(tǒng)來(lái)達(dá)到數(shù)據(jù)保護(hù)、系統(tǒng)穩(wěn)定性保障、競(jìng)爭(zhēng)優(yōu)勢(shì)保持的目的。

然而,一方面防守這事ROI不好體現(xiàn),另一方面反爬蟲(chóng)這種系統(tǒng),相對(duì)簡(jiǎn)單的爬蟲(chóng)來(lái)說(shuō)難度和復(fù)雜度都要高很多,往往需要一整套大數(shù)據(jù)解決方案才能把事情做好,因此只有少量的公司可以玩轉(zhuǎn)起來(lái)。當(dāng)出現(xiàn)問(wèn)題的時(shí)候,很多公司往往束手無(wú)策。

本文將描述一種盡量簡(jiǎn)單的反爬蟲(chóng)方案,可以在十幾分鐘內(nèi)解決部分簡(jiǎn)單的爬蟲(chóng)問(wèn)題,緩解惡意攻擊或者是系統(tǒng)超負(fù)荷運(yùn)行的狀況;至于復(fù)雜的爬蟲(chóng)以及更精準(zhǔn)的防御,需要另外討論。

整套方案會(huì)盡量簡(jiǎn)單易懂,不會(huì)涉及到專(zhuān)門(mén)的程序開(kāi)發(fā),同時(shí)盡量利用現(xiàn)有的組件,避免額外組件的引入。內(nèi)容上主要分為三大部分:

  • 訪問(wèn)數(shù)據(jù)獲取。采集用戶的訪問(wèn)數(shù)據(jù),用來(lái)做爬蟲(chóng)分析的數(shù)據(jù)源
  • 爬蟲(chóng)封禁。當(dāng)找到爬蟲(chóng)后,想辦法去阻斷它后續(xù)的訪問(wèn)
  • 爬蟲(chóng)分析。示例通過(guò)簡(jiǎn)單策略來(lái)分析出爬蟲(chóng)

簡(jiǎn)單的數(shù)據(jù)獲取

數(shù)據(jù)獲取是做好反爬蟲(chóng)系統(tǒng)的關(guān)鍵,常見(jiàn)的幾種模式

本篇,采用nginx的日志方式,這種只需要通過(guò)對(duì)常見(jiàn)的nginx最簡(jiǎn)單的配置就能從遠(yuǎn)程獲取相應(yīng)的訪問(wèn)日志

官方nginx配置:

  1. log_format warden '" "$remote_addr" "$remote_port" "$server_addr" "$server_port" "$request_length" "$content_length" "$body_bytes_sent" "$request_uri" "$host" "$http_user_agent" "$status" "$http_cookie" "$request_method" "$http_referer" "$http_x_forwarded_for" "$request_time" "$sent_http_set_cookie" "$content_type" "$upstream_http_content_type" "$request_body"\n'; 
  2.  
  3. access_log syslog:server=127.0.0.1:9514 warden ; 

tengine配置(編譯時(shí)帶上–with-syslog)

  1. log_format warden '" "$remote_addr" "$remote_port" "$server_addr" "$server_port" "$request_length" "$content_length" "$body_bytes_sent" "$request_uri" "$host" "$http_user_agent" "$status" "$http_cookie" "$request_method" "$http_referer" "$http_x_forwarded_for" "$request_time" "$sent_http_set_cookie" "$content_type" "$upstream_http_content_type" "$request_body"\n'; 
  2.  
  3. access_log syslog:user::127.0.0.1:9514 warden ; 

這里面需要注意的是:

由于較老的nginx官方版本不支持syslog,所以tengine在這塊功能上做了單獨(dú)的開(kāi)發(fā)(需要通過(guò)編譯選項(xiàng)來(lái)啟用),在不確定的情況下,請(qǐng)修改配置 文件后先使用(nginx -t)來(lái)測(cè)試一下,如果不通過(guò),需要重新在configure時(shí)加上syslog選項(xiàng),并編譯。

盡量獲取了跟爬蟲(chóng)相關(guān)的數(shù)據(jù)字段,如果有定制的http header,可以自行加上

采用udp方式來(lái)發(fā)送syslog,可以將訪問(wèn)日志發(fā)送給遠(yuǎn)端分析服務(wù),同時(shí)udp的方式保證nginx本身不會(huì)受到影響

訪問(wèn)日志拿不到響應(yīng)的具體內(nèi)容(nginx有辦法搞定,但有代價(jià)),無(wú)法支持業(yè)務(wù)相關(guān)的防護(hù)

簡(jiǎn)單的爬蟲(chóng)封禁

反爬蟲(chóng)最后的生效,需要靠合理的封禁模式,這里比較幾種模式:

本段將介紹基于iptables的方案,雖然適用范圍較小;但是依賴少,可以通過(guò)簡(jiǎn)單配置linux就能達(dá)到效果。

第一步

安裝ipset。ipset擴(kuò)充了iptables的基本功能,可以提供更加高效的訪問(wèn)控制

  1. # centos 6.5上面安裝非常簡(jiǎn)單 
  2. sudoyuminstall -y ipset 

第二步

在iptables中建立相應(yīng)的ipset,來(lái)進(jìn)行訪問(wèn)權(quán)限的封禁

  1. # 新增用于封禁的ipset 
  2. sudo ipset -N --exist warden_blacklist iphash 
  3.  
  4. # 增加相應(yīng)的iptables規(guī)則 
  5. sudo iptables -A INPUT -m set --set warden_blacklist src -j DROP 
  6.  
  7. # 保存iptables 
  8. sudo service iptables save 

第三步

獲取當(dāng)前封禁的ip黑名單,并導(dǎo)入到iptables里面去

  1. sudoipset --exist destroy warden_blacklist_tmp;sudoipset -N warden_blacklist_tmp iphash;echo"1.1.1.1,2.2.2.2"|tr,"\n"|xargs-n 1 -I {}sudoipset -A warden_blacklist_tmp {} ;sudoipset swap warden_blacklist_tmp warden_blacklist 

這里為了盡可能的提升效率,作了以下事情:

  • 建立臨時(shí)ipset,方便做操作
  • 將當(dāng)前封禁黑名單中的ip提取出來(lái),加入到此ipset(示例中用了最簡(jiǎn)單的echo來(lái)展示,實(shí)際可相應(yīng)調(diào)整)
  • 將ipset通過(guò)原子操作與iptables正在使用的ipset作交換,以最小的代價(jià)將最新的黑名單生效

簡(jiǎn)單的爬蟲(chóng)策略

要能精確的分析爬蟲(chóng),需要強(qiáng)大的數(shù)據(jù)分析平臺(tái)和規(guī)則引擎,來(lái)分析這個(gè)IP/設(shè)備/用戶分別在短時(shí)間區(qū)間/長(zhǎng)時(shí)間范圍里的行為特征和軌跡,這里涉及到了非常復(fù)雜的數(shù)據(jù)系統(tǒng)開(kāi)發(fā),本文將通過(guò)簡(jiǎn)單的shell腳本描述比較簡(jiǎn)單的規(guī)則

例子1

封禁最近100000條中訪問(wèn)量超過(guò)5000的ip

  1. nc -ul 9514 |head-100000 |awk-F'" "''{print $2}'|sort|uniq-c |sort-nr |awk'$1>=5000 {print $2}' 

這里面:

1.udp服務(wù)監(jiān)聽(tīng)nginx發(fā)過(guò)來(lái)的syslog消息,并取10000條,找到其中每條訪問(wèn)記錄的ip

2.通過(guò)sort 和uniq來(lái)獲取每個(gè)ip出現(xiàn)的次數(shù),并進(jìn)行降序排列

3.再通過(guò)awk找到其中超過(guò)閾值的ip,這就得到了我們所需要的結(jié)果。

例子2

封禁最近100000條中user agent明顯是程序的ip

  1. nc -ul 9514 |head-100000 |awk-F'" "''$10 ~ /java|feedly|universalfeedparser|apachebench|microsoft url control|python-urllib|httpclient/ {print $2}'|uniq 

這里面:

1.通過(guò)awk的正則來(lái)過(guò)濾出問(wèn)題agent,并將相應(yīng)ip輸出

2.關(guān)于agent的正則表達(dá)式列出了部分,可以根據(jù)實(shí)際情況去調(diào)整和積累

當(dāng)然,這里只是列舉了簡(jiǎn)單的例子,有很多的不足之處

1.由于只采用了shell,規(guī)則比較簡(jiǎn)單,可以通過(guò)擴(kuò)展awk或者其他語(yǔ)言的方式來(lái)實(shí)現(xiàn)更復(fù)雜的規(guī)則

2.統(tǒng)計(jì)的窗口是每100000條,這種統(tǒng)計(jì)窗口比較粗糙,好的統(tǒng)計(jì)方式需要在每條實(shí)時(shí)數(shù)據(jù)收到是對(duì)過(guò)去的一小段時(shí)間(例如5分鐘)重新做統(tǒng)計(jì)計(jì)算

3.不夠?qū)崟r(shí),無(wú)法實(shí)時(shí)的應(yīng)對(duì)攻擊行為;生產(chǎn)環(huán)境中,需要毫秒級(jí)的響應(yīng)來(lái)應(yīng)對(duì)高級(jí)爬蟲(chóng)

4…….

拼起來(lái)

所有模塊組合起來(lái),做一個(gè)完整的例子。假設(shè):

1.負(fù)載均衡192.168.1.1,使用了官方nginx,并配置了syslog發(fā)往192.168.1.2

2.192.168.1.2啟動(dòng)nc server,每隔一段時(shí)間進(jìn)行分析,找出問(wèn)題ip,并吐給192.168.1.1

3.192.168.1.1通過(guò)iptables進(jìn)行阻攔,數(shù)據(jù)來(lái)源于192.168.1.2的分析機(jī)器

除了nginx配置和iptables基本配置,前幾段的配置略作改動(dòng):

  1. ### nginx conf@192.168.1.1 
  2. log_format warden '" "$remote_addr" "$remote_port" "$server_addr" "$server_port" "$request_length" "$content_length" "$body_bytes_sent" "$request_uri" "$host" "$http_user_agent" "$status" "$http_cookie" "$request_method" "$http_referer" "$http_x_forwarded_for" "$request_time" "$sent_http_set_cookie" "$content_type" "$upstream_http_content_type" "$request_body"\n'; 
  3. access_log syslog:server=192.168.1.2:9514 warden ; 
  4.  
  5. ### 分析@192.168.1.2, 增加了結(jié)果會(huì)吐,同時(shí)每隔60分鐘跑一次,把數(shù)據(jù)返回給192.168.1.1 
  6. while true ; do nc -ul 9514 | head -100000 | awk -F '" "' '{print $2}' | sort | uniq -c | sort -nr | awk '$1>=5000 {print $2}' | tr '\n' ',' | awk '{print $0}' | socat - UDP:192.168.1.1:9515  ; sleep 3600 ; done 
  7.  
  8. ### 阻斷@192.168.1.1 
  9. #基礎(chǔ)配置 
  10. sudo ipset -N --exist warden_blacklist iphash 
  11. sudo iptables -A INPUT -m set --set warden_blacklist src -j DROP 
  12. sudo service iptables save 
  13.  
  14. #動(dòng)態(tài)接收并更新iptables 
  15. while true ; do sudo ipset --exist destroy warden_blacklist_tmp; sudo ipset -N warden_blacklist_tmp iphash; socat UDP-LISTEN:9515 - | tr , "\n" | xargs -n 1 -I {} sudo ipset -A warden_blacklist_tmp {} ;sudo ipset swap warden_blacklist_tmp warden_blacklist ; sudo ipset list ; done 

以上只是簡(jiǎn)單示例,實(shí)際中還是建議換成shell腳本

總結(jié)

本文列出一種簡(jiǎn)單的反爬蟲(chóng)方案,由于過(guò)于簡(jiǎn)單,可以當(dāng)做概念示例或者是救急方案,如果需要進(jìn)一步深化,需要在以下方面去加強(qiáng):

1.強(qiáng)化數(shù)據(jù)源,可以通過(guò)流量獲得全量數(shù)據(jù)。目前爬蟲(chóng)等網(wǎng)絡(luò)攻擊逐漸轉(zhuǎn)向業(yè)務(wù)密切相關(guān)的部分,往錢(qián)的方向靠近,所以需要更多的業(yè)務(wù)數(shù)據(jù)去支撐,而不僅僅是訪問(wèn)日志

2.更靈活的阻斷,需要有多種阻斷手段和略復(fù)雜的阻斷邏輯

3.除卻ip,還需要考察用戶、設(shè)備指紋等多種追蹤方式,應(yīng)對(duì)移動(dòng)環(huán)境和ipv6環(huán)境下,“IP”這一信息的力不從心

4.強(qiáng)化規(guī)則引擎和模型,需要考察更多用戶行為的特征,僅僅從頻率等手段只等應(yīng)對(duì)傻爬蟲(chóng),同時(shí)會(huì)造成誤殺率更高

5.建立數(shù)據(jù)存儲(chǔ)、溯源、統(tǒng)計(jì)體系,方便分析人員去分析數(shù)據(jù)并建立新的模型和規(guī)則。反爬蟲(chóng)是一件持續(xù)性行為,需要良好的平臺(tái)來(lái)支撐。

6.可以根據(jù)實(shí)際需要去做好反爬蟲(chóng)系統(tǒng)的集成。比如nginx數(shù)據(jù)–>反爬系統(tǒng)–>nginx阻斷;F5數(shù)據(jù)–>反爬系統(tǒng)–>F5阻斷

責(zé)任編輯:趙寧寧 來(lái)源: FreeBuf
相關(guān)推薦

2016-10-13 13:01:51

2009-06-23 08:56:55

Linux桌面搜索

2009-03-09 21:06:35

LinuxEvilvte終端模擬器

2009-03-09 18:08:26

LinuxEvilvte終端模擬器

2023-05-10 18:18:55

Linux發(fā)行版

2017-05-27 08:36:54

2023-07-26 08:40:27

2022-02-12 21:05:11

異步爬蟲(chóng)框架

2020-08-27 11:39:05

JavaRESTful Web編程語(yǔ)言

2019-10-18 14:57:05

人臉識(shí)別AI人工智能

2018-01-17 15:05:22

框架設(shè)計(jì)爬蟲(chóng)Scrapy

2016-03-03 18:03:08

ZStack

2009-07-14 18:05:28

輕量級(jí)Swing組件

2009-07-17 14:38:51

輕量級(jí)Swing組件

2022-11-24 10:24:32

2022-08-11 08:35:40

Hanko開(kāi)源

2022-09-14 23:06:45

2009-09-11 08:26:49

Linux系統(tǒng)CRUX 2.6Linux

2023-08-09 08:01:38

場(chǎng)景Redis接口

2023-09-14 09:31:21

Docker容器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)