看一個運維如何拯救市值百億的互金平台
來自專欄安全圈
多年前,又是周六客服打電話過來,平台官網不能訪問,app完全無法打開,客戶在QQ群和微信群中各種反饋,說平台是不是跑路了?客服的多條400熱線完全被打爆,電話已經接不過來…
前言
作為一個互聯網金融平台,涉及到用戶資金,任何的服務(資金)差錯用戶都是不可容忍的,用戶不懂什麼是資料庫,不管你什麼網路不通,哪怕只是一小會兒,看不到錢在 App 裡面展示都會覺得不安。
在已經有很多 P2P 公司跑路的前提下,用戶個個都被鍛煉成了福爾摩斯偵探,每天打開 App 查看收益,監控著平台的一切,甚至半夜升級斷網十分鐘,都會被用戶察覺,直接就發到群裡面,更有甚者直接在 QQ 群或者微信群中開罵:你們的技術行不行?
下面給大家介紹我們從零開始起家,到現在可以支持百億交易量的平台所遇到的幾次關鍵事故,有大也有小,挑出一些比較有代表性的事件跟大家分享。
一、黑客攻擊
2015年應該是互聯網金融行業受黑客攻擊最多的一年吧,各互金公司都深受其害,當時我記得*貸之家有一段時間被黑客攻擊的太厲害,連續幾天網站都無法打開。
當然我們也未能倖免,DDoS 攻擊、SQL 注入、漏洞滲透等等,幾乎都經歷過,有的黑客比較仁慈,應該是出於善意或者展示自己,將漏洞放到烏雲上面或者漏洞盒子裡面讓廠商來修復。但更多的是一些黑產,完全就是威脅、敲詐、想撈一筆錢,先看看下面這位吧:
這個傢伙潛伏到我們公司的客戶群裡面,冒充我們的客戶代表將頭像和資料替換成一樣,然後給群里所有的客服發消息,讓發送我們內部的後台地址給他,想通過這種方式來尋找突破口,當然這是裡面的小菜鳥。
1、DDoS攻擊
DDoS 攻擊我們也遇到了很多次,確實沒有比較好的辦法,最後都是通過一些笨辦法來盡量避免的,先說說我們的經歷吧。
有一次我正在敲代碼,客服 QQ 又閃爍了起來,還沒來得及打開查看,客服的經理就直接打電話過來了,我立刻一種不祥的預感,他說官網打不開了,後台也登錄不了。
掛了電話,我在本機進行了測試,果然不行,立刻準備登錄 VPN 查看伺服器各項指標,結果登錄不上去,馬上上樓找運維經理,他也登錄不上,剛準備給機房打電話的時候,機房來電話了,說我們的一個 IP 正經歷著 1G 多的流量訪問,問我們是否正在做什麼活動,話沒說完,就又說流量已經到 5G,不到一分鐘之後流量已經到達 18G 之多。
因為我們的機房和集團公用了一個入口,結果集團上面陸續反饋他們的網站、服務也都出現了問題,機房方面害怕引起更大的衝擊,直接把我們官網對外的IP封掉了,集團的其它業務才慢慢恢復了過來,我們也緊急更換了外網IP,重新切換了域名解析後才恢復。
事後我們根據 Apache 分析了日誌,流量來自N多個不同的IP地址根本無法應對,也是因為這次攻擊,我們領導重視了起來,將我們公司的機房網路層和公司集團徹底分離,這樣不管哪一方受到大流量攻擊都不會相互影響。
當然我們也想了一些其他的辦法,來盡量避免此類情況的發生,因為畢竟金融公司如果經常出現這種網站打不開、APP打不開,400電話打不進來,對客戶而言是一種很不好的體驗,在P2P行業很敏感的時期,很容易給品牌造成負面影響,嚴重者直接引起客戶的恐慌,給公司造成致命的打擊。
當時我們老闆托關係,找到了從網宿這家上市公司出來,專門做網路安全的一家公司--智安網路,用的是他們的雲聯防產品。當時也考慮了一些大的廠商,最後因為價格實在是太貴了,小企業根本承受不起。
2、周年慶的DDOS攻擊
還有一次我們正在做周年慶活動,突然有人在 QQ 群裡面給我們客服說:叫你們的技術負責人來找我。然後我們的網站就掛了,我還保留了當時的一個對話:
黑客:你是平台的技術負責人嗎?
我:算是吧
黑客:你信不信我可以讓你們官網在5秒之內掛掉?
我:…(沉默,還真害怕又把官網搞掛了)
黑客:你們的官網漏洞很大
我:如果有好的建議請您賜教
黑客:你們的伺服器是不是什麼防護軟體都沒有裝?
我:…(繼續沉默,這會在想不會是那個安全廠商來推廣產品的吧,當然我們基礎的防護肯定有)
黑客:我們有非常多的肉雞,想攻擊誰,幾秒之內肯定搞定
我:…
黑客:我們已經給很多互聯網金融行業做了滲透測試,花點錢幫你們擺平,保證以後不會再出事情
我:…
黑客:免費的策略也有很多,比如 360、百度雲的安全產品可以免費抵擋10G 左右的流量
……(中間省略)
黑客:我說了這多,你們是不是給包煙錢,表示表示?
……
後來也和領導進行了商議,堅決不能給他們錢,不能助長這種囂張氣焰,實在不行就報警!
曝光一下當年使用的假 QQ 號,剛查了下變了個頭像和描述,如下:
後來我一直在想:為什麼 DDOS 攻擊總是喜歡根據外網 IP 來攻擊呢?後來慢慢有些理解了,如果針對域名來攻擊的話,那不就是攻擊到域名商的伺服器了嗎?而一般域名商比較強大,黑客不太搞的定,也確實沒有必要。
記得前一段時間,某著名域名服務商被攻擊,導致國外 Twitter 等著名的互聯網公司訪問中斷達半天以上,這是很嚴重的。但是對於我們這樣的小公司,倒不至於搞這麼大的動作。
那到底如何正確的防止 DDOS 攻擊?根據我的個人經驗總結了幾條:
第一種方案,隱藏伺服器外網地址,伺服器前端加 CDN 中轉,免費的有百度雲加速、360網站衛士、加速樂、安全寶等,如果資金充裕的話,可以購買高防盾機,用於隱藏伺服器真實 IP,域名解析使用 CDN 的 IP,所有解析的子域名都使用 CDN 的 IP 地址。
此外,伺服器上部署的其他域名也不能使用真實IP解析,全部都使用CDN來解析;
第二種方案,買一些安全產品來進行流量清洗,不差錢的可以選擇阿里雲、騰訊雲等這種大廠商提供的服務;中小型企業建議選擇一些第二梯度的廠商,比如:智安網路,因為我們就用的這家公司的雲聯防,後面基本上沒出現什麼大的問題。
第三種方案,有很多的防火牆產品聲稱可以防止 DDOS 攻擊,但是我個人使用感覺效果非常有限。
3、SQL注入
我們的官網使用的是 PHP 開發,因為框架比較老舊的原因,存在著一些 SQL 注入的點,我們發現後進行了修補,沒想到還是被一些黑客找到了突破點。
這裡要感謝這些黑客在漏洞盒子上提交的 Bug (如下圖),最後我們根據提示進行了緊急修復,後來我們也在 WAF 防火牆配置了一些攔截 SQL 注入的策略,起到雙保險的作用。
我一直在想為什麼 PHP 一般比較容易出現 SQL 注入,而 Java 較少呢?我估摸著有兩方面的原因:
第一,PHP 一般在前端使用的較多,受攻擊的機會更多一些,Java一般作為後端服務,攻擊的可能性會比較少;
第二,PHP 框架較多,而且很多早期的框架並沒有特別考慮 SQL 注入的情況。Java 大量普及了 Mybaits、Hibernate 等 ORM 框架,框架本身對常見的 SQL 注入有防禦的功能,但不是說他們就沒有被 SQL 注入的可能,大部分場景下是 OK 的,另外參數化查詢可以有效的避免 SQL 注入。
其它攻擊
其它方面的攻擊,主要是在業務方面,比如我們當初有一個很小的失誤,有一個程序員在 H5 的網頁中將發送簡訊驗證碼返回了前端,最後被黑客發現了,利用這個漏洞可以給任意的用戶重置登錄密碼;
簡訊攻擊,現在的網站幾乎都有發送簡訊或者簡訊驗證碼的功能,如果前端不做校驗,黑客會隨便寫一個 for 循環來發簡訊,一般系統的簡訊會進行全方位的防控,比如:
a、前端加驗證(字元驗證碼,有的是拖拽的動畫);
b、後端根據用戶或者 IP 加限制,比如用戶一分鐘只可以發送一條簡訊,忘記密碼的簡訊一天只能發送10條、一個 IP 地址限制每天只能發送100條簡訊等。
4、互金平台BUG
重複派息
2015年的某一天看到一個新聞說是陸金所的一個用戶發現自己銀行裡面突然多了很多錢,沒過多久又被扣走了,然後收到陸金所那邊的解釋,說是給用戶還本派息的時候程序出現了問題導致還本派息兩次。
當他們程序員發現了此問題後緊急進行了處理,用戶當然鬧了,也上了新聞,當然陸金所通道能力確實比較強可以直接從用戶卡裡面扣,當大家都興緻勃勃的談論這個話題的時候,我卻有一股淡淡的憂傷,為什麼呢?
因為這個錯誤我們也犯過,具體說就是我搞的,大家不知道我當時的心裡壓力有多大!
事情是這樣子的:我們使用的第三方支付的扣款介面不是特別的穩定,於是我們前期就對接了兩種不同的扣款介面,平時前端投資的時候走一個介面,後端派息或者還本的時候走另外的一個介面,在初期的時候扣款介面不穩定,因此在給用戶派息的時候經常會有個別用戶失敗,需要手動給失敗的用戶二次派息。
作為一個有志向的程序員當然覺得這種方式是低效的,於是將程序改造了一下,在後端派息的時候,如果第一種扣款失敗的時候,自動再次調用第二種扣款介面進行扣款,當時想著這種方式挺好的,各個環境測試也沒有問題,上線之後監控過一段時間也運行穩定。
當感覺一切都很美妙的時候,事故就來了,突然有一天,客服反饋說,有的用戶說自己收到的利息感覺不對,好像是多了(真的是太感謝這個用戶了),我登錄後台看了一下派息的流水,複核了一遍,果然利息被重複派了,感覺一盆冷水從頭而下。
我把當天所有的用戶派息記錄和到期記錄都進行了檢查,發現影響了70多個用戶,導致多派息了6萬多元,幸虧只是派息出了問題,如果是到期的話,金額會翻N倍,其中70多個人裡面有幾個進行了提現、幾個進行了再次投資,絕大部分用戶在我們發現的時候還不知情,金額也沒有動。
怎麼處理呢,當然不能直接就動用戶的錢了,只能給每個重複派息的用戶打電話,說明原因並贈送小禮物,請求諒解後,我們把重複派過的利息再次調回來。
大部分用戶進行了核對之後都還是比較配合的,當然肯定有一些用戶不幹了,但你也不能怪客戶,因為都是我的原因。有的客戶需要上門賠禮道歉,有的客戶需要公司出具證明材料,我們的老闆還親自給客戶打了N個電話,被客戶罵了N遍,我心裡壓力可想而知,當時心中真是一萬個***。
其中有一個客戶特別難纏,各種威脅,說既然到了我的賬戶裡面,肯定是我的,你們的失誤不應該讓我來承擔,折騰了很久。
你可能會說有的互聯網公司經常出現這種問題後就送給客戶了,哎,可是我們是小公司呀!這個噱頭玩不起。
到底是什麼原因呢,事後進行了復盤也給領導做了彙報:平時都是首先進行派息的定時任務,過一個小時之後進行到期的定時任務,當天的派息標的比較多,跑了一個半小時,就導致了派息和到期的兩個定時任務同時進行,轉賬有了並發,第三方支付的介面不穩定,給我們返回失敗,其實有的是成功的,就導致了我們進行了二次的扣款嘗試,引發了此問題。
這個事情給我帶來了非常大的教訓,對於金融扣款的這種事情一定需要謹慎,哪怕付款引發報警之後再人工處理,也不能盲目重試,極有可能引發雪崩效應。
總結
古代對將軍的要求是,心有萬馬奔騰,面如湖水平靜,在互聯網行業,對領導的要求也如此,特別是技術負責人,在面對生產事故的時候,一定是先安撫同事,靜下心來找到問題本質,再去解決,而不應該不斷去施加壓力催促,重壓之下很多心裡承受能力稍弱的隊友,會更加慌亂,不但不利於解決問題,還可能引發二次事故。
在看淘寶雙十一視頻中,有一段感受特別深,在雙十一初期,雖然技術團隊做了很多的準備,但是在零點過後流量瞬間湧入,服務被打垮,部分用戶投訴刷新不出網頁,緊接著隔壁同事也都反饋網站打不開,大家都在慌亂中,XX一拍桌子大喊一聲,大家都別動,三分鐘之後再說,過了幾分鐘之後服務慢慢恢復了正常。
後來回憶說,當時雖然服務癱瘓,但是監控到有部分業務成功,說明系統並沒有被壓垮,而此時的任何操作都有可能引發更大的問題,從此之後此人一戰成名,成為阿里大將。
有很多記的不是特別清楚了,寫的比較粗糙望見諒。
推薦閱讀:
※第三次網路攻擊浪潮正在襲來,你的信息安全嗎?
※4個月掌握核心技術 成為雲計算行業專家
※什麼是SaaS堡壘機?什麼是私有部署堡壘機?
※雲適配品牌升級改名「紅芯」背後的商業邏輯
※IDaaS與阿里遊戲盾的演進路線