中通統一安全檔案儲存服務實踐
作者簡介:samyj,中通訊息安全團隊安全研發工程師,負責中通SRC、各種後臺管理系統開發以及統一安全檔案儲存服務的開發與維護。
背景
資訊化產業的高速發展,使各行各業產生的資料量也呈現出了爆炸性增長的趨勢。以快遞行業為例,快遞業務量相較往年也有了成倍的提升,單是中通雙十一當天的訂單已經達到了1.5億件,隨之帶來的是海量的訂單、底單資料、圖片等,檔案資料的儲存也面臨了前所未有的機遇與挑戰。那我們該如何解決檔案儲存更多、更快、更安全的需求?傳統單機模式的檔案儲存方案顯然不能滿足我們對於海量高併發、安全、快速儲存的需求,於是分散式檔案系統(distributed file system)方案的設計變得愈發重要。結合中通實際業務場景與對安全的思考,我們設計實現了一套基於FastDFS分散式檔案系統的安全檔案服務解決方案。
面臨的問題與挑戰
中通早期WEB應用存在的問題
傳統WEB應用中,前端、API服務部署在同一臺伺服器,所有檔案都作為靜態資源訪問,隨著業務量的不斷增長,久而久之,圖片和檔案等資源佔用的空間變得越來越大。隨之帶來了各種效能、管理問題與安全風險:
- 若檔案直接置於應用伺服器中,難以管理;
- 昂貴的磁碟空間、高效能伺服器大大增加了運維成本;
- 易發生單點故障;
- 傳統FTP上傳檔案,存在諸多安全隱患(使用者名稱和口令的明文傳輸等);
- 無法保證檔案的機密性,某些敏感檔案如身份證照片等以明文儲存,檔案的授權訪問不易控制;
- 安全沒有保障,檔案上傳、下載、刪除、檢視依賴於各個業務系統的實現,一個上傳功能可能出現“修不完的漏洞”;
分散式檔案儲存系統
既然傳統的檔案儲存方式存在這麼多弊端,那麼新的分散式檔案系統需要滿足哪些需求呢?
1.應用功能需求
2.技術需求
中通安全檔案儲存解決方案
什麼是分散式檔案系統?
分散式檔案系統(Distributed File System, DFS)是一種允許檔案通過網路在多臺主機上分享的檔案系統,可讓多機器上的多使用者分享檔案和儲存空間。客戶端並非直接訪問底層的資料儲存區塊,而是通過網路以特定的通訊協議與伺服器通訊,借通訊協議來限制客戶端對於檔案系統的訪問。分散式檔案儲存利用多臺儲存伺服器分擔儲存壓力,利用跟蹤伺服器定位儲存資訊,不但提高了系統可靠性、可用性以及讀寫效率,而且方便水平擴充套件。分散式檔案儲存可採用多副本備份機制,分散式儲存對資料進行了分片,分片後的資料按照一定規則儲存在叢集節點上。即使單個叢集節點機器發生故障也能保證資料不會丟失,最小化對業務的影響。
分散式檔案系統選型
常見的分散式檔案系統有GFS、HDFS、Lustre 、Ceph 、GridFS 、mogileFS、TFS、FastDFS等。它們各自適用於不同的領域,都是應用級的分散式檔案儲存服務。
圖1 典型分散式檔案系統對比
FastDFS具有簡單易用、維護方便、高效能、穩定性好、滿足中通對於海量小檔案儲存的需求,結合以上優點,我們最終選擇了FastDFS作為中通安全檔案儲存的底層資料儲存系統。
FastDFS簡介
FastDFS是一個開源的的輕量級分散式檔案系統,追求高效能和高擴充套件性。FastDFS是一種基於檔案的key/value pair儲存系統,為網際網路量身定製,適合儲存4KB~500MB之間的小檔案,如圖片網站、短視訊網站、文件、下載站等等。作為一個輕量級分散式檔案儲存,FastDFS具有以下特性:
- 檔案不分塊儲存,上傳的檔案和OS檔案系統中的檔案一一對應
- 支援海量檔案的儲存和讀寫分離
- 支援相同內容檔案合併,節約磁碟空間
- 支援備份容錯
- 支援主從檔案
FastDFS具有以下 優點 :
- 結構簡單,元資料節點壓力低
- 擴容簡單,擴容後文件自動同步,無需重新平衡
- 高效能,檔案處理速度快,適合海量小檔案儲存
- 支援小檔案合併
缺點在於:
- 不能自定義檔案key,自己定義會降低靈活性
- 資料恢復效率低:磁碟映象分佈,修復速度取決於磁碟寫入速度
- 大檔案衝擊問題:大檔案沒有分片,導致大檔案的讀寫都由單塊硬碟承擔,對磁碟的衝擊很大,由於我們主要以小檔案為主,所以影響較小
- 缺乏自動化故障恢復機制、運維機制和線上配置能力
- 源storage寫一份即返回成功,源storage出現故障,就可能導致資料丟失,建立監控告警機制,對storage進行檢測,實現出現故障時及時通知處理
- 缺乏必要的安全訪問控制機制以及檔案資料保護措施,通過檔案服務閘道器可以自己實現訪問控制與資料保護
FastDFS服務端有三個角色:跟蹤伺服器(tracker server)、儲存伺服器(storage server)和客戶端(client)。
- tracker server :跟蹤伺服器,主要做排程工作,起負載均衡的作用。管理所有的storage server和group,tracker根據storage的心跳資訊建立對映表以生成元資料資訊。
- storage server: 儲存伺服器(又稱:儲存節點或資料伺服器),檔案和檔案屬性(meta data)都儲存到儲存伺服器上。以group為單位,每個group內可以包含多臺storage server,資料互相備份。
- client :客戶端,作為業務請求的發起方,通過專有介面,使用TCP/IP協議與跟蹤器伺服器或儲存節點進行資料互動。
圖2 FastDFS架構介紹
FastDFS儲存策略
為了支援大容量,儲存節點採用了分卷的組織方式。儲存系統由一個或多個卷組成,卷與卷之間的檔案相互獨立,一個卷可以由一臺或多臺儲存伺服器組成,一個卷下的儲存伺服器中的檔案都是相同的,卷中的多臺儲存伺服器起到了冗餘備份和負載均衡的作用。在卷中增加伺服器時,系統會自動同步已有的檔案,同步完成後,系統將新增伺服器切換到線上提供服務。當儲存空間不足或即將耗盡時,可以動態添加捲,只需要增加一臺或多臺伺服器,並將它們配置為一個新的卷,就可以完成檔案伺服器的擴容。
圖3 儲存策略
架構設計
中通安全檔案儲存以FastDFS為底層儲存,支援瀏覽器HTTP或者SDK的形式上傳、下載和刪除檔案,閘道器負責路由訪問請求到檔案服務Tracker, Tracker伺服器返回Storage伺服器的地址,閘道器和Storage通訊完成檔案上傳並記錄檔案元資料資訊到Redis叢集和Pika叢集。架構圖如下:
圖4 架構設計
原理/模組介紹:
- 採用Nginx作為閘道器處理請求轉發和校驗,Nginx的多路複用機制和非阻塞IO非常適合業務簡單、耗時短的校驗操作。Tengine 7層負載,作為L1 cache proxy_cache,大大提升了閘道器的效能和併發訪問能力
- 檔案閘道器處理圖片水印、檔案加解密、檔名稱自定義、訪問許可權控制等,並負責與底層檔案系統互動
- Redis叢集與Pika叢集用作檔案元資料的儲存,Redis和Pika叢集之間資料互相同步,前者作為臨時儲存,後者作為永續性儲存,Pika將資料寫入硬碟,易於遷移
- ZooKeeper叢集用於儲存應用配置資訊
核心實現
- 認證
使用者上傳時可以選擇上傳公開檔案以及私有檔案。為避免檔案盜用,我們採用簽名校驗和SSO token校驗的方式處理對私有檔案的上傳和訪問請求。業務系統需要申請檔案服務並配置上傳伺服器IP白名單後才能使用,申請成功後自動為業務系統建立儲存空間,生成appid、secret以及檔案系統group(如圖5)。檔案上傳時需攜帶使用secret生成的一次性簽名,檔案服務閘道器校驗簽名的合法性和時效性。下載時通過內網請求檔案閘道器,返回具有一定時效性的securityToken,瀏覽器訪問檔案時攜帶此token,檔案閘道器校驗通過後才能訪問到檔案。
- 快取策略
中通安全檔案儲存採用二級快取機制:瀏覽器快取和閘道器層快取。第一次請求檔案時返回完整資料包並在瀏覽器和Nginx閘道器層建立快取;再次請求相同檔案時先檢查瀏覽器本地快取,如本地快取失效或不存在則嘗試讀取Nginx中的快取檔案,再次失敗則重新請求底層檔案服務獲取檔案。
- 敏感檔案加解密
通過SSL進行上傳,防止中間人截獲,選擇檔案加密時,檔案閘道器先將檔案流做base64處理,再用aes進行加密後儲存到檔案伺服器,解密同理。
- 檔案上傳漏洞防範
上傳漏洞就是攻擊者通過上傳木馬檔案,直接得到webshell。提供檔案上傳SDK進行前端校驗的同時,伺服器本身不解析任何動態語言檔案,檔案閘道器也對使用者提交的資料進行嚴格的檢驗與過濾,設定檔案格式白名單與上傳IP白名單。同時嚴格設定輸出檔案的檔案型別,除圖片型別外所有的Response Content-Type設定為application/octet-stream 防止使用者訪問時直接開啟HTML或TXT,阻止XSS攻擊。
- 統計監控與日誌
為保證檔案服務的執行可靠性與可用性,系統的監控告警是必不可少的。服務閘道器使用Prometheus+Grafana作為監控告警工具,通過HTTP協議週期性抓取檔案伺服器的執行狀態以及介面呼叫情況。
圖5 監控
檔案用量根據應用來做統計分析,記錄每天的介面呼叫情況,檔案伺服器容量的使用情況等。檔案服務閘道器將每一個上傳動作記錄下來,統計檔案的大小與數量,將統計資訊寫入到Redis叢集中。當檔案佔用空間超過為當前應用分配總空間的閾值時給業務系統的相關負責人傳送郵件通知,及時擴容。中通安全檔案儲存對敏感檔案進行嚴格的日誌記錄,儲存訪問人的IP、帳號等資訊,一旦發生資訊洩露可以做到及時定位檔案資訊與訪問人資訊。
實踐效果
自中通安全儲存開始在內部使用以來,系統一直平穩執行,現已接入業務系統80餘個,日均上傳量300W+,讀取量1000W+,並且根治了危害性極高的上傳漏洞。
圖6 整體使用情況
圖7 應用使用情況
如何使用
我們提供了一套流程化接入方案:使用者先到管理後臺申請使用檔案儲存服務,申請通過後會獲得appid、secret等資訊,開發人員接入我們的上傳SDK後只需簡單配置secret與appid等資訊後即可使用。簡要流程如下所示:
圖8 建立工單
圖9 申請檔案儲存服務
圖10 部分SDK程式碼
總結和展望
中通安全檔案儲存服務上線以來,在效能、安全性、高可用等方面都獲得了不錯的評價,我們在多個方面也做了些設計上的權衡,但仍然面臨一些挑戰。第一,易用性方面,安全性和易用性某種程度上是有一定的矛盾,提高易用性的同時也要兼顧安全,比如提供在前端直接上傳檔案的jssdk,就需要綜合考慮各方面因素;第二,統一服務和定製化服務方面的衝突,如某些應用需要對圖片檔案進行特殊的定製化處理或者支援特定的互動流程,這個原則上檔案儲存本身只提供基礎的通用服務;第三,效率持續提升方面,需要研究使用更安全高效的檔案加解密演算法以及實施端到端的加密傳輸,在保證安全的同時提升儲存、傳輸效率,節省伺服器、頻寬、儲存資源。
另外隨著中通生態圈業務量的不斷飆升和業務多樣化,目前單租戶的架構設計已經逐漸無法滿足日益變化的業務需求,因此我們正在設計規劃支援多租戶的統一安全檔案儲存服務平臺,支援多租戶模式的同時支援對接業界流行的底層檔案儲存框架,如Ceph、S3等,提供更多雲平臺的對接支援,結合服務容器化等雲原生技術,支援混合雲架構下的應用對接和使用,幫助多租戶下的不同應用可以自動化部署以及靈活的水平擴充套件,以支援不同業務場景下檔案儲存服務的定製化需求,實現對檔案資源進行更細粒度的訪問管控。
團隊介紹
中通訊息安全團隊是一個年輕、向上、踏實以及為夢想而奮鬥的大家庭,我們的目標是構建一個基於海量資料的全自動資訊保安智慧感知響應系統及管理運營平臺。我們致力於支撐中通快遞集團生態鏈全線業務(快遞、快運、電商、傳媒、金融、航空等)的安全發展。我們的技術棧緊跟業界發展,前有 React、Vue,後到 Golang、Hadoop、Spark、TiDB、AI 等。全球日均件量最大快遞公司的資料規模也將是一個非常大的挑戰。我們關注的方向除了國內一線網際網路公司外,也關注 Google、Facebook、Amazon 等在基礎安全、資料安全等方面的實踐。
宣告:本文來自中通安全應急響應中心,版權歸作者所有。文章內容僅代表作者獨立觀點,不代表安全內參立場,轉載目的在於傳遞更多資訊。如需轉載,請聯絡原作者獲取授權。