當前位置: 妍妍網 > 碼農

我被刷幾萬元的血淚經驗。。。

2024-03-19碼農

大家好,我是程式設計師魚皮。

曾經有一個無辜的程式設計師,他想要上線自己的網站給別人用。

他聽說使用雲服務可以很輕松地儲存網站檔,於是他試了下,發現果真如此。

從那天起,他仿佛發現了一個新世界,雲伺服器、物件儲存、CDN,一個個開箱即用的雲產品,讓他如沐春風、開發效率嘎嘎倍增。

他樂此不疲地用著各種雲服務。直到有一天,記得那是一個風雨交加的夜晚,他收到了一條簡訊:「您的雲帳戶已欠費 x 萬元」。

那一刻,他發如雨下,終於意識到了:世道險惡,人心不古啊!使用雲服務,就意味著有被小人攻擊的風險。

沒錯,這位無辜的程式設計師就是在下。

我從大學開始做網站,至今 7 - 8 年了,經歷過無數的網路攻擊,也損失過數萬元的米。但也正因如此,我積累了豐富的實戰經驗。

這篇文章魚皮會以最容易造成大額損失的、按量計費的雲服務 —— 物件儲存和 CDN 為例,給大家分享一些安全使用雲服務的方法,希望能幫助更多的開發者避坑。

友情提示:不要以為攻擊不會發生在自己身上,建議讀完這篇文章,不要讓自己成為下一位 「無辜的程式設計師」。

如何安全使用雲服務?

1、能不用就不用!

一定要根據自己的需求和實際情況選用雲服務,不要為了用技術而用技術。

比如你做的是學習練手的計畫或者免費網站,那麽就慎用像物件儲存、CDN 這種按量計費的服務。

的確,物件儲存是很方便、CDN 能給網站加速,但真的有必要麽?你伺服器的頻寬不足以支撐那點兒使用者了麽?不用 CDN 網站就要違背 8 秒原則了麽?

8 秒原則是互聯網的一個著名的原則:使用者在存取網頁時,如果時間超過 8 秒就會感到不耐煩;如果下載需要太長時間,他們就會放棄存取。

其實再加一點點成本給伺服器增大頻寬,也能提高網站的載入速度。

以前魚皮就很喜歡用 CDN,覺得不給網站套 CDN 加速就渾身難受,但其實大多數網站沒什麽並行存取量,用了 CDN 也快不了多少,反而增加了成本和被攻擊的風險。別跟我說什麽 Cloudflare CDN,國內用免費版本堪稱 「網站減速器」。

之前也給大家推薦過一些免費的網站部署服務,像 Vercel、GitHub Pages、Railway 等等,都是省成本的好方法,可以試試。但是一旦部署到這些平台的網站被攻擊,平台大機率會把你封號。畢竟他們沒必要關註誰是攻擊者,只要你的服務產生了流量,把你的服務和帳號封了,也算是解決問題了。

2、保護好唯一標識!

唯一標識是一個比較廣泛的定義,對於不同的雲服務,唯一標識也不同。

  • 雲伺服器:伺服器的 IP

  • 物件儲存:物件儲存的儲存桶名稱

  • CDN:CDN 服務的網域名稱

  • 開發者帳號:accessKey

  • 套用:appId

  • 這點非常重要,因為大多數雲服務的唯一標識是 不可更改的 ,一旦暴露給攻擊者,他就可以一直打你。

    比如知道了你的伺服器 IP,就可以對伺服器進行 DDOS 攻擊;知道了物件儲存的桶名,就能夠拼接出物件儲存的網域名稱,然後刷你的流量。

    有同學會問了,伺服器的 IP 不是透過網站的請求或者 DNS 解析就能看到麽?

    如果你的網站部署在單台伺服器,那的確是這樣,但如果你背後接了負載均衡服務(伺服器集群)或者 CDN,那麽得到的 IP 可能是動態變化的,攻擊者無法直接攻擊到背後的某台伺服器。

    所以,一定要保護好服務的唯一標識,不要主動暴露!

    3、嚴格控制許可權

    盡量遵循 「最小許可權原則」,預設關閉全部許可權,然後根據需要逐個放開。

    比如使用物件儲存服務,控制許可權的方法有:儲存桶存取許可權設定、防盜鏈設定、按需分配許可權等。

    1)在建立儲存桶的時候,就要將許可權設定為 「私有讀寫」。如果需要給團隊成員開放許可權,盡量使用子帳號,不要直接把自己的主帳號分享出去。

    2)防盜鏈設定,拒絕空 Referer,並且只添加自己網站的網域名稱到白名單中。

    3)按需配置許可權。比如儲存桶內有很多目錄,可以只允許特定的使用者公開讀取其中一部份目錄(比如公開的圖片)。

    4、配置監控告警

    前面提到的策略是為了防止受到攻擊,但如果真的出現了攻擊,我們一定要在第一時間能夠收到 「被攻擊」 的通知,而不是直接收到 「欠費」 通知。

    所以每個雲服務,都必須配置監控告警,而且一定要綜合考慮多種維度和告警策略,不能隨便配置一條就完事。

    比如可以配置多個指標的組合,服務錯誤、流量過大、或者客戶端錯誤請求過多時,都會進行告警。

    在之前我出了被刷量的那個事情後,給騰訊雲官方提了不少改進建議,官方也是做出了改進,現在建立桶時就會提醒你告警,這點我覺得非常 nice~

    值得一提的是,官方還補充了一條公告,說物件儲存已經自動支持流量防盜刷功能了:

    emmm,無論是真是假,還是建議大家手動配置下許可權和告警吧,雙保險。

    5、緊急管控措施

    如果我們透過告警發現雲服務正在被攻擊,其實可以采取一些緊急的措施來防止損失繼續擴大。

    比如。。。關閉服務!

    別笑,如果你服務繼續執行的收益還不如被攻擊的損失,臨時關閉服務可能是最好的選擇,打不過就戰術撤退~

    一般雲服務平台都提供了限制或封禁攻擊的手段,比如 IP 黑白名單、IP 存取限頻、禁止某區域使用者存取、禁止某些請求等。

    如果你要使用物件儲存,一定不要直接使用物件儲存的網域名稱,而是使用 CDN 網域名稱來存取儲存桶。因為 CDN 不僅提供的能力更多,還可以保護物件儲存(源站)的地址。

    當然了,CDN 本身一樣可以被攻擊,所以也要做好上述防護措施。其中,必須要配置 IP 存取限頻,而且如果面向國內使用者的計畫,建議直接封禁國外地域的存取。

    6、儲存遷移

    這一點我相信 90% 以上的同學沒有經驗。

    舉一個之前我遇到的場景吧,有攻擊者持續請求某個物件儲存桶來刷流量。被我發現後,很快禁止了他的存取,他的所有請求都變成了 403 Forbidden(被伺服器拒絕)。

    結果你猜怎麽著?他依然持續不斷地發送請求。

    天坑的是,物件儲存服務的計費不僅有流量,也會按照請求數計費!也就是說,即使把攻擊者的請求全部拒絕了,只要他繼續請求,依然會對我造成損失!

    對了,還有個值得分享的經歷,為了查詢出攻擊者的 IP,需要給物件儲存開通日誌記錄功能。但你猜怎麽著?日誌檔是儲存在你自己的物件儲存桶內的,也就是說,攻擊者的每次請求,都相當於在給你的儲存桶寫入檔!好家夥,被刷個幾天,日誌的數量比正常的檔都多!而且日誌儲存也是要計費的哦~

    我也咨詢過客服,這種情況下怎麽辦?就讓他一直刷?

    客服給出的解決方案是:儲存遷移。

    也就是說,換一個新的桶名,不要讓攻擊者知道就可以了。

    嗯,的確是一種解決方案,雖然代價有點大。

    所以再次強調,物件儲存的桶名不要泄露!保護好服務的唯一標識!

    7、按需充值

    大白話:不要一次性給雲帳戶充太多!

    因為網路攻擊這件事防不勝防,即使你配置了告警,但也不是完全可控的。假如淩晨 3 點給我發了簡訊告警,還是得第二天才能看到,說不定為時已晚。

    這個時候,如果帳戶還有余額,就會接著扣除;如果欠費了,就不會繼續扣除了,能夠更快地發現問題、及時止損。


    以上就是本期分享。最後再次強調,不要以為網路攻擊不會發生在自己身上,90% 的 Bug 都來源於自信,攻擊者盯上你根本不需要理由。
    👇🏻 點選下方閱讀原文,獲取魚皮往期編程幹貨。

    往期推薦