網站防篡改內容監控


網站防篡改內容監控

一、背景介紹需求引入

  很久很久以前的需求了,先上一張圖。

   話說,曾經我們的新聞發布架構圖不是這樣的,是全部都放到線上,說是有個機房的:新聞編輯后台,數據庫等等(當時我還沒來這家公司)。

   然后,發生了一件非常嚴重的事,說是網站內容被篡改,鏈接到一個澳門賭博網站。查不出是什么病毒,只能運維和開發半夜三更去機房,切斷了網絡,一步步重置服務器,重裝各個服務搞回來的。最后,據說是因為后台編輯頁面有個上傳功能,估計病毒是從這里入侵服務器的。

  於是,我們偉大的經理敢為人先地,提出了上面的架構:把后台、數據庫都放到公司內網虛擬機上,內容管理員編輯好文章內容定時傳到gitlab上,線上服務器再定時拉取下來。

  當然,我們不會把特別大的文件,編輯后從內網存到gitlab,再傳到線上的;而是直接傳到線上服務器。具體原因我忘記了,開發之前有說過,好像說是gitlab對文件大小有限制,還是由於gitlab服務器端上的文件過大,會導致客戶端(即線上服務器啦)下載文件容易超時,導致同步不了。。。額,不糾結這個原因。然后文章內容或者比較小的文件都是通過這條鏈路上傳到線上服務器的。我特別說下,線上服務器之前沒做這需求的時候,不是單向定時拉取的,還能定時上傳到gitlab上!(先賣個關子唄)

  需求來了~~~~要搞個防篡改的監控,就是如果線上內容受到非法篡改的時候,能馬上報警給我們知道

 

二、問題解決

   查了一堆資料,說是可以用md5去搞。然后理了下思路,要分兩部分去處理:

  (1)大文件:直接上傳到線上服務器 ——》 不走gitlab線路,定時算md5,傳到內網比較

  (2)小文件:按圖上的線路同步 ——》根據git status返回狀態去判斷

 

1、大文件處理

  大文件我是用md5去搞的,先在內網服務器建個跟線上相同路徑的目錄(包括用戶賬號),即大文件放置的目錄,我都建了一個。為什么這么弄,因為好看,真的是因為好看,不開玩笑。運行md5命令的時候,會得出的一個結果,后面是文件路徑目錄,這樣人眼比對方便。類似這樣:

   所以預先算好個md5的文件,放到內網上,然后線上有個腳本,定時會計算這堆大文件的md5值(用md5sum命令),定時傳到內網上,用命令diff比對文件是否一致,不一致就是線上這堆大文件遭受到篡改了。

 

2、小文件處理

   這個我稍微說得詳細點吧。gitlab同步到線上服務器的線路要改成單向的,就是只能下載不能上傳。如果不改,哪天這個同步賬號逆向上傳東西到gitlab上,然后內網又上傳,很容易導致git不同步報錯。而且這樣設置是對內容篡改監控起到幫助作用的。

  線上禁止push只能pull代碼怎么做了,在gitlab上另外建一個用戶(之前沒做這需求的時候,是跟內網用同一個兼具上傳+拉取的賬號,想想都闊怕呢),設置為reporter,就可以達到這個目的。

  然后利用一個隱藏文件 .gitignore,把沒通過gitlab,直接上傳服務器的大文件都加進去,相當於白名單不檢查,不然git status 會報錯說你沒add 進去倉庫的,如下圖:

  然后這個文件加個普通用戶不能修改的權限,用chattr +i 去上鎖,只有root用戶能編輯這個文件。線上就跑着個定時 git status獲取結果的腳本,返回信息如果是 “nothing to commit” 就萬事大吉了。

 

  為什么這樣處理就可以?因為同步嘛,內網和線上一樣的文件只會被覆蓋!!!哪怕篡改了線上某個文件,只要內網是有這個文件的,定時腳本一執行,一定會把這個被篡改過的文件修正過來。而且因為傳輸線路是單向的,所以根本不會存在線上這個被篡改的文件會逆向傳回到gitlab的情況。

   所以一遇到這個報警,不要害怕,通常就是因為我那位可愛的開發同事自己偷偷上傳大文件上去,不經過gitlab,又不告訴我,自己又忘記往.gitignore添加這個大文件的白名單導致的啦。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM