摘要:爬蟲和反爬蟲日益成為每家公司的標(biāo)配系統(tǒng)。本文將描述一種盡量簡單的反爬蟲方案,可以在十幾分鐘內(nèi)解決部分簡單的爬蟲問題,緩解惡意攻擊或者是系統(tǒng)超負(fù)荷運行的狀況至于復(fù)雜的爬蟲以及更精準(zhǔn)的防御,需要另外討論。
爬蟲和反爬蟲日益成為每家公司的標(biāo)配系統(tǒng)。爬蟲在情報獲取、虛假流量、動態(tài)定價、惡意攻擊、薅羊毛等方面都能起到很關(guān)鍵的作用,所以每家公司都或多或少的需要開發(fā)一些爬蟲程序,業(yè)界在這方面的成熟的方案也非常多;有矛就有盾,每家公司也相應(yīng)的需要反爬蟲系統(tǒng)來達(dá)到數(shù)據(jù)保護(hù)、系統(tǒng)穩(wěn)定性保障、競爭優(yōu)勢保持的目的。
然而,一方面防守這事ROI不好體現(xiàn),另一方面反爬蟲這種系統(tǒng),相對簡單的爬蟲來說難度和復(fù)雜度都要高很多,往往需要一整套大數(shù)據(jù)解決方案才能把事情做好,因此只有少量的公司可以玩轉(zhuǎn)起來。當(dāng)出現(xiàn)問題的時候,很多公司往往束手無策。
本文將描述一種盡量簡單的反爬蟲方案,可以在十幾分鐘內(nèi)解決部分簡單的爬蟲問題,緩解惡意攻擊或者是系統(tǒng)超負(fù)荷運行的狀況;至于復(fù)雜的爬蟲以及更精準(zhǔn)的防御,需要另外討論。
整套方案會盡量簡單易懂,不會涉及到專門的程序開發(fā),同時盡量利用現(xiàn)有的組件,避免額外組件的引入。內(nèi)容上主要分為三大部分:
訪問數(shù)據(jù)獲取。采集用戶的訪問數(shù)據(jù),用來做爬蟲分析的數(shù)據(jù)源
爬蟲封禁。當(dāng)找到爬蟲后,想辦法去阻斷它后續(xù)的訪問
爬蟲分析。示例通過簡單策略來分析出爬蟲
簡單的數(shù)據(jù)獲取數(shù)據(jù)獲取是做好反爬蟲系統(tǒng)的關(guān)鍵,常見的幾種模式
本篇,采用nginx的日志方式,這種只需要通過對常見的nginx最簡單的配置就能從遠(yuǎn)程獲取相應(yīng)的訪問日志
官方nginx配置:
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" "; access_log syslog:server=127.0.0.1:9514?warden ;
tengine配置(編譯時帶上--with-syslog)
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" "; access_log syslog:user::127.0.0.1:9514?warden ;
這里面需要注意的是:
由于較老的nginx官方版本不支持syslog,所以tengine在這塊功能上做了多帶帶的開發(fā)(需要通過編譯選項來啟用),在不確定的情況下,請修改配置 文件后先使用(nginx -t)來測試一下,如果不通過,需要重新在configure時加上syslog選項,并編譯。
盡量獲取了跟爬蟲相關(guān)的數(shù)據(jù)字段,如果有定制的http header,可以自行加上
采用udp方式來發(fā)送syslog,可以將訪問日志發(fā)送給遠(yuǎn)端分析服務(wù),同時udp的方式保證nginx本身不會受到影響
訪問日志拿不到響應(yīng)的具體內(nèi)容(nginx有辦法搞定,但有代價),無法支持業(yè)務(wù)相關(guān)的防護(hù)
簡單的爬蟲封禁反爬蟲最后的生效,需要靠合理的封禁模式,這里比較幾種模式:
?
本段將介紹基于iptables的方案,雖然適用范圍較小;但是依賴少,可以通過簡單配置linux就能達(dá)到效果。
第一步安裝ipset。ipset擴(kuò)充了iptables的基本功能,可以提供更加高效的訪問控制 # centos 6.5上面安裝非常簡單 sudo?yum?install?-y ipset
?
第二步在iptables中建立相應(yīng)的ipset,來進(jìn)行訪問權(quán)限的封禁
?
# 新增用于封禁的ipset sudo?ipset -N --exist warden_blacklist iphash # 增加相應(yīng)的iptables規(guī)則 sudo?iptables -A INPUT -m?set?--set?warden_blacklist src -j DROP # 保存iptables sudo?service iptables save
?
第三步獲取當(dāng)前封禁的ip黑名單,并導(dǎo)入到iptables里面去
sudo?ipset --exist destroy warden_blacklist_tmp;?sudo?ipset -N warden_blacklist_tmp iphash;?echo?"1.1.1.1,2.2.2.2"?|?tr?,?" "?|?xargs?-n 1 -I {}?sudo?ipset -A warden_blacklist_tmp {} ;?sudo?ipset swap warden_blacklist_tmp warden_blacklist
?
這里為了盡可能的提升效率,作了以下事情:
建立臨時ipset,方便做操作
將當(dāng)前封禁黑名單中的ip提取出來,加入到此ipset(示例中用了最簡單的echo來展示,實際可相應(yīng)調(diào)整)
將ipset通過原子操作與iptables正在使用的ipset作交換,以最小的代價將最新的黑名單生效
簡單的爬蟲策略要能精確的分析爬蟲,需要強大的數(shù)據(jù)分析平臺和規(guī)則引擎,來分析這個IP/設(shè)備/用戶分別在短時間區(qū)間/長時間范圍里的行為特征和軌跡,這里涉及到了非常復(fù)雜的數(shù)據(jù)系統(tǒng)開發(fā),本文將通過簡單的shell腳本描述比較簡單的規(guī)則
例子1,封禁最近100000條中訪問量超過5000的ipnc -ul 9514 |?head?-100000 |?awk?-F?"" ""?"{print $2}"?|?sort?|?uniq?-c |?sort?-nr |?awk?"$1>=5000 {print $2}"
這里面:
udp服務(wù)監(jiān)聽nginx發(fā)過來的syslog消息,并取10000條,找到其中每條訪問記錄的ip
通過sort 和uniq來獲取每個ip出現(xiàn)的次數(shù),并進(jìn)行降序排列
再通過awk找到其中超過閾值的ip,這就得到了我們所需要的結(jié)果。
例子2,封禁最近100000條中user agent明顯是程序的ipnc -ul 9514 |?head?-100000 |?awk?-F?"" ""?"$10 ~ /java|feedly|universalfeedparser|apachebench|microsoft url control|python-urllib|httpclient/ {print $2}"?|?uniq
這里面:
通過awk的正則來過濾出問題agent,并將相應(yīng)ip輸出
關(guān)于agent的正則表達(dá)式列出了部分,可以根據(jù)實際情況去調(diào)整和積累
?
當(dāng)然,這里只是列舉了簡單的例子,有很多的不足之處
由于只采用了shell,規(guī)則比較簡單,可以通過擴(kuò)展awk或者其他語言的方式來實現(xiàn)更復(fù)雜的規(guī)則
統(tǒng)計的窗口是每100000條,這種統(tǒng)計窗口比較粗糙,好的統(tǒng)計方式需要在每條實時數(shù)據(jù)收到是對過去的一小段時間(例如5分鐘)重新做統(tǒng)計計算
不夠?qū)崟r,無法實時的應(yīng)對攻擊行為;生產(chǎn)環(huán)境中,需要毫秒級的響應(yīng)來應(yīng)對高級爬蟲
.......
拼起來所有模塊組合起來,做一個完整的例子。假設(shè):
負(fù)載均衡192.168.1.1,使用了官方nginx,并配置了syslog發(fā)往192.168.1.2
192.168.1.2啟動nc server,每隔一段時間進(jìn)行分析,找出問題ip,并吐給192.168.1.1
192.168.1.1通過iptables進(jìn)行阻攔,數(shù)據(jù)來源于192.168.1.2的分析機(jī)器
除了nginx配置和iptables基本配置,前幾段的配置略作改動:
### nginx conf@192.168.1.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" "; access_log syslog:server=192.168.1.2:9514 warden ; ? ### 分析@192.168.1.2, 增加了結(jié)果會吐,同時每隔60分鐘跑一次,把數(shù)據(jù)返回給192.168.1.1 ?while?true?;?do?nc -ul 9514 |?head?-100000 |?awk?-F?"" ""?"{print $2}"?|?sort?|?uniq?-c |?sort?-nr |?awk?"$1>=5000 {print $2}"?|?tr?" "?","?|?awk?"{print $0}"?| socat - UDP:192.168.1.1:9515? ;?sleep?3600 ;?done ? ### 阻斷@192.168.1.1 #基礎(chǔ)配置 sudo?ipset -N --exist warden_blacklist iphash sudo?iptables -A INPUT -m?set?--set?warden_blacklist src -j DROP sudo?service iptables save ? #動態(tài)接收并更新iptables while?true?;?do?sudo?ipset --exist destroy warden_blacklist_tmp;?sudo?ipset -N warden_blacklist_tmp iphash; socat UDP-LISTEN:9515 - |?tr?,?" "?|?xargs?-n 1 -I {}?sudo?ipset -A warden_blacklist_tmp {} ;sudo?ipset swap warden_blacklist_tmp warden_blacklist ;?sudo?ipset list ;?done
以上只是簡單示例,實際中還是建議換成shell腳本
?
本文列出一種簡單的反爬蟲方案,由于過于簡單,可以當(dāng)做概念示例或者是救急方案,如果需要進(jìn)一步深化,需要在以下方面去加強:
強化數(shù)據(jù)源,可以通過流量獲得全量數(shù)據(jù)。目前爬蟲等網(wǎng)絡(luò)攻擊逐漸轉(zhuǎn)向業(yè)務(wù)密切相關(guān)的部分,往錢的方向靠近,所以需要更多的業(yè)務(wù)數(shù)據(jù)去支撐,而不僅僅是訪問日志
更靈活的阻斷,需要有多種阻斷手段和略復(fù)雜的阻斷邏輯
除卻ip,還需要考察用戶、設(shè)備指紋等多種追蹤方式,應(yīng)對移動環(huán)境和ipv6環(huán)境下,“IP”這一信息的力不從心
強化規(guī)則引擎和模型,需要考察更多用戶行為的特征,僅僅從頻率等手段只等應(yīng)對傻爬蟲,同時會造成誤殺率更高
建立數(shù)據(jù)存儲、溯源、統(tǒng)計體系,方便分析人員去分析數(shù)據(jù)并建立新的模型和規(guī)則。反爬蟲是一件持續(xù)性行為,需要良好的平臺來支撐。
可以根據(jù)實際需要去做好反爬蟲系統(tǒng)的集成。比如nginx數(shù)據(jù)-->反爬系統(tǒng)-->nginx阻斷;F5數(shù)據(jù)-->反爬系統(tǒng)-->F5阻斷
反爬蟲
文章來源:http://bigsec.com/
豈安科技聯(lián)合創(chuàng)始人,首席產(chǎn)品技術(shù)官
曾擔(dān)任PayPal資深高級工程師,在可信計算,計算機(jī)風(fēng)控等領(lǐng)域有深入的理論研究和成果;并在防欺詐和風(fēng)險監(jiān)控行業(yè)有多年且深厚的工作經(jīng)歷,擅長分布式系統(tǒng)和實時大數(shù)據(jù)計算。他參與豈安科技所有產(chǎn)品線的架構(gòu)和設(shè)計,帶領(lǐng)團(tuán)隊在數(shù)據(jù)挖掘、多媒體分析、跨數(shù)據(jù)中心分布式系統(tǒng)、高性能實時大數(shù)據(jù)計算、海量數(shù)據(jù)采集等領(lǐng)域進(jìn)行前沿研究和產(chǎn)品化,幫助客戶更好的解決內(nèi)部的安全和風(fēng)控問題。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/39357.html
摘要:在這之前,還是有必要對一些概念超輕量級反爬蟲方案后端掘金前言爬蟲和反爬蟲日益成為每家公司的標(biāo)配系統(tǒng)。 爬蟲修煉之道——從網(wǎng)頁中提取結(jié)構(gòu)化數(shù)據(jù)并保存(以爬取糗百文本板塊所有糗事為例) - 后端 - 掘金歡迎大家關(guān)注我的專題:爬蟲修煉之道 上篇 爬蟲修煉之道——編寫一個爬取多頁面的網(wǎng)絡(luò)爬蟲主要講解了如何使用python編寫一個可以下載多頁面的爬蟲,如何將相對URL轉(zhuǎn)為絕對URL,如何限速,...
摘要:對我們來說最大的便利就是利用日志進(jìn)行錯誤發(fā)現(xiàn)和排查的效率變高了。 面臨的問題 程序運行的日志是一個必不可少的東西,可能是一些系統(tǒng)信息,比如?gc 的情況;可能是一些正常的模塊處理信息,比如最近更新的配置;還可能是一些在程序運行中,我們不希望出現(xiàn)的錯誤所帶來的信息。通過日志,可以知道我們的程序是不是在正常地運行,看到錯誤日志,我們還需要利用日志排查錯誤。 我們知道日志如此重要,并樂于記錄...
摘要:背景分析至此,下一步要解決的問題就是完成一次獨立的請求,并解析得到目標(biāo)數(shù)據(jù)。上方地址欄的網(wǎng)址是請求的入口,中間圓角方框中的格式天津則是請求參數(shù)。當(dāng)我看到中的天津時,非常開心,因為我找到了請求的入口。 概要 背景描述 網(wǎng)站和http請求分析 IP受限的問題 1. 背景描述 大為軟件公司于2001年9月在保定國家高新技術(shù)產(chǎn)業(yè)開發(fā)區(qū)注冊,公司致力于中國、日本知識產(chǎn)權(quán)軟件的研究開發(fā),立志成...
閱讀 2671·2021-11-25 09:43
閱讀 2579·2021-11-22 09:34
閱讀 2823·2021-11-12 10:34
閱讀 1431·2021-10-20 13:46
閱讀 2300·2019-08-30 13:21
閱讀 929·2019-08-30 11:21
閱讀 483·2019-08-30 11:20
閱讀 2186·2019-08-29 17:20