GShark:監測你的 GitHub 敏感資訊洩露
近幾年由於 Github 資訊洩露導致的資訊保安事件屢見不鮮,且規模越來越大。就前段時間華住集團旗下酒店開房記錄疑似洩露,涉及近5億個人資訊。後面調查發現疑似是華住的程式員在 Github 上上傳的 CMS 專案中包含了華住敏感的伺服器及資料庫資訊,被黑客利用導致資訊洩露(這次背鍋的還是程式猿)。
起源
對於大型 IT 公司或者其他行業,這種事件發生的概率實在是太常見了,只不過看影響的範圍。現在大家看到的,也僅僅只是傳播出來的而已。企業沒辦法保證所有人都能夠遵守規定不要將敏感資訊上傳到 Github,尤其是對於那種特別依賴於外包的甲方企業,而甲方的開發人員也是一無所知,這種事件發生也就是司空見慣了。
廢話說了一大通(可能是最近安全大佬的文章看多了),終於要介紹一下我的這個專案,GShark。名字是不是很酷炫,我是希望能夠像鯊魚一樣在 Github 中敏銳地捕獲“獵物”。這個工具主要是基於 golang 實現,這也是第一次學習 golang 的專案,基於 go-macron Web 框架實現的一個系統。其實最初我是看到小米安全開源的 x-patrol 專案。網上這種掃描 Github 敏感資訊的工具多如皮毛,我看過那種 star 數上千的專案,感覺實現方式也沒有很好。因為說到底,大家都是通過 Github 提供的 API 結合相應的關鍵字來進行搜尋的。但是,x-patrol 的這種實現方式我覺得是比較合理的,通過爬蟲爬取資訊,並對結果進行稽核。所以,最初我是一個 x-patrol 的使用者。使用過程中,也遇到過一些問題,因為這個庫似乎就是小米的某個固定的人維護的,文件寫的不是特別清晰。中間我有提過 PR,但都被直接拒絕掉了。後來,我就想基於 x-patrol 來實現一套自己的系統,這也就是 GShark 的來由了。目前,這個專案與 x-patrol 已經有著很大的變化,比如移除了原生代碼的檢測,因為這個場景沒有需求,其實我本身自己也實現了一個基於 lucene 的敏感資訊檢索工具。另外,將前端程式碼進行了梳理,並使用模板引擎來做模板的巢狀使用。基於 casbin實現基於角色的許可權控制等等。
原理
講完了起源,接著講一講這個系統的原理。基本上,這類工具都是首先會在 Github 申請相應的 token 來實現,接著通過相應的 API 來進行爬取。本專案主要是基於 Google 的 go-github。這個 API 使用起來還是比較方便的。通過這個 API 我們可實現在 Github 來進行搜尋,其實這基本上等同於 Advanced Search。因為 API 提供的搜尋能力肯定就是 Github 本身所具有的搜尋能力。最基本的包括關鍵詞,以及一些 owner 資訊以及 star 數等等。
另外一點就是 Github 的搜尋是基於 elasticsearch 的,因此也是支援 lucene 語法的。GShark 的黑名單過濾其實就是通過這個規則來實現的。
通過爬蟲將程式碼結果爬取到資料庫中,那麼我們就可以在 Web 介面進行程式碼的稽核。因為其實很多包含關鍵字的程式碼並不一定就是你想要的,有很多種可能,爬蟲專案,一些檔案的隨機亂碼,部落格等等。但是一般來說對於人工稽核來說,一般這種程式碼倉庫很容易就可以區分出,稽核就是還快的。對於那種比較疑似的,可能需要進一步調查,可能就需要進一步獲取資訊,比如閱讀程式碼資訊,檢視上傳者資訊等等。對於一條記錄,一共有三種操作,確認為敏感資訊,忽略這條記錄,忽略包含這條記錄的程式碼倉庫的所有記錄。
遇到過的問題
在做這個專案的時候,大大小小遇到過很多問題。這也是我第一次學習 golang,以前總是覺得 golang 的語法比較奇怪,但是學習一下感覺還是可以的。Golang 中的依賴是比較 頭疼的一個問題,golang 中的依賴包一般都會安裝在 GOPATH 中。另外對於一些 golang 依賴包的安裝,通過 goget
來安裝的話是無法安裝的,比如 net/http
,由於某種特殊的原因,我們只能從 Github 上獲取原始碼,總將其放入 GOPATH 中。還有一個比較糾結的問題是,你應該如何在你的專案中引入自己的 package,一共有三種方式,以 models
模組為例,假如我希望在別的 package 中引入 models
:
-
專案名引用:
gshark/models
-
相對路徑引用:
../models
-
全名引用:
github.com/neal1991/models
這三種引用方式我都有使用過,也在這3個裡面切換了好幾次,最終選擇最後一個,這也是最標準的實現方式。第一種方式其實沒啥大問題我覺得,只是我在使用 Travis 的時候,它無法識別。第二種方式可能沒有第一種那樣的問題,但是用起來比較麻煩,而且容易出錯。第三種也是大多數 golang 專案使用的方式,這樣別人也可以很方便地引入你的專案。
Gshark 實現了一套比較粗糙的許可權管理,主要是基於 casbin 來實現的。GShark 使用的 go-macaron 可以支援使用中介軟體 authz 來實現許可權管理,其實它的實現方式也是比較粗糙的,核心程式碼其實就是下面的一個函式:
可以看到必須要通過 BasicAuth 來進行認證的,從而獲取使用者的角色,來實現許可權的控制。因為 GShark 沒有使用 BasicAuth 來進行認證,所以角色的傳遞也是一個比較頭疼的問題,其實還是使用標準的認證方式比較好,目前因為沒有做到,只能通過 cookie 來進行傳遞,這種方式因此是不太可靠的。
專案部署
目前這個專案我部署在我騰訊雲的小水管上面,執行沒啥問題,因為本來這個應用就不會佔用特別多的資源。只不過最近 Github 好像越來越嚴格,我有一段時間 VPS 訪問 Github 一直不成功,而且要注意限制爬取的頻率,防止觸發 Github 濫用告警。專案部署之前就是專案的安裝,其實主要就是依賴包的安裝。得益於 golang 的跨平臺性,因此這個應用是可以執行在各個平臺的。 main.go
是啟動檔案:
Build 之後就會生成平臺對應的可執行檔案。專案的執行可以通過 CLI 來實現:
專案的執行的時候會初始化一些應用和規則配置,你需要將專案中的 app-template.ini 重新命名成 app.ini:
其實裡面主要就是服務以及資料庫方面資訊的配置。值得注意的一點是,如果你希望你的服務能夠被外部訪問,那麼你應該將 HTTP_HOST 設定為 0.0.0.0。我使用的是 sqlite3 資料庫,感覺使用起來已經比較方便了,而且對於小型 VPS 來說也是比較合適的。對於 scan 執行的時間間隔我建議可以設定大一點,可以讓這個服務一直執行,也可以讓它一直跑著。但老實說,一般短時間內,獲取的結果也是比較有限的。下面主要是管理介面的使用,使用起來也是比較簡單。核心介面就是搜尋結果的稽核,以及一些其他資訊的設定,最主要的是應該為程式提供 token,可以在 Github 中申請。
總結和展望
其實這個專案從開始到現在也有大半年的時間,但因為一直都是我一個人維護和使用,所以也都是一直修修補補,在細節方面做更多的改善。雖然,目前這個專案還是不算特別成熟,但還是想把這個專案開源出來正式的維護,並且介紹給更多的開發者,並吸收更多的建議和意見。所以任何建議都是歡迎的,歡迎 issue 以及 PR。
當然了,對於這個專案也有一些更多的期許,以後可能有更多的坑需要填補:
-
完善許可權管理
-
實現標準的使用者認證,比如 OAuth2
-
更準確地識別結果,或許可以結合機器學習,但目前還是沒有思路
以上就是 GShark 的開發過程中的一點小小心得,如果覺得對你有幫助的話,可以 star 一下,https://github.com/neal1991/gshark
歡迎掃描二維碼關注公眾號,閱讀原文獲取連線版圖文。