一次推送,毀掉一個公司

极狐GitLab發表於2024-09-03

本文分享如何使用極狐GitLab 17.2 釋出的金鑰推送保護功能(Secret Push Protection)從源頭方式金鑰被推送到程式碼倉庫中,從而導致金鑰資訊洩漏,給公司造成鉅額損失。

金鑰(使用者名稱、密碼、令牌、key 等)是軟體研發中繞不過去的因素,如何管理好這些金鑰,是保護企業核心資產不外洩的關鍵。極狐GitLab 有完整的金鑰保護體系,包括:

  • 程式碼稽核:透過程式碼稽核來儘可能地發現變更程式碼中包含的金鑰資訊,避免金鑰資訊被合併到主分支;
  • 程式碼推送規則設定:透過設定來阻止某些金鑰檔案被推送到程式碼倉庫中,比如 SSH Key;
  • 金鑰檢測:極狐GitLab DevSecOps 體系有七大安全測試手段,金鑰檢測是其中非常重要的一環,透過將金鑰安全檢測嵌入到 CI/CD 流水線中,來自動檢測程式碼變更中的金鑰資訊;

此次分享的金鑰推送保護是自 16.7 以試驗功能引入,在 17.1 升級為 Beta,17.2 中在私有化部署中正式可用。金鑰推送保護功能結合上述的三大手段,能夠構建堅固的金鑰防護體系。

該功能為旗艦版功能,不過可以申請免費試用,旗艦版 license 申請連結 https://dl.gitlab.cn/jgc6re9s

金鑰洩漏的案例

先看幾個因為敏感資訊洩露導致遭受鉅額損失的例子:

案例一

2016 年,一位為 Uber 工作的員工不小心將 AWS 的訪問憑據上傳到了 GitHub,隨後該憑據被駭客發現並利用,竊取了 5700萬使用者、60萬司機的資訊。事件發生後,當時的安全主管並未公開披露此事,而是選擇以給駭客支付贖金的方式避免資料被刪除。一年以後,該事件被披露,安全主管離開公司,同時 Uber 公司遭受了超 1億美金的罰款(和解費)。

案例二

Code Spaces是一家提供程式碼託管服務的公司,公司 AWS 控制檯的訪問憑據被駭客竊取之後,駭客對公司的資料進行了竊取,並索要贖金,在未得到贖金之後,駭客刪除了公司資料,包括主儲存和備份。由於大部分資料被永久刪除,包括所有的備份,Code Spaces 失去了其所有關鍵資料,導致無法繼續運營。儘管公司努力試圖恢復,但因資料的喪失和隨之而來的客戶流失,公司最終宣佈關閉。

現代化公司內部有很多系統,涉及到的敏感資訊也非常多,如何更好的保護敏感資訊是企業安全合規的重中之重。極狐GitLab 17.2 中推出的金鑰推送保護功能能夠從源頭避免開發者將金鑰資訊洩露到外部,進一步加強了極狐GitLab 的安全合規體系。

金鑰推送保護,從源頭避免金鑰洩露

極狐GitLab 最新推出的金鑰推送保護功能是為了防止金鑰資訊(諸如 API 和 token)被直接推送到極狐GitLab 倉庫中。當使用者進行程式碼推送時,該功能會檢測每一個提交中的內容,如果檢測到有金鑰資訊,就會阻止本次提交,並給出具體的告警資訊:指明金鑰資訊存在的位置。

當前該功能處於 Beta 版本,對於私有化部署使用者來說,必須要確保版本在 17.2 以後,而且需要管理員在整個例項上開啟該功能。

極狐GitLab 版本的安裝升級可以檢視官網指南

可透過管理中心(Admin area) --> 安全 --> Security and compliance --> Secret檢測中開啟:

file

此外,還需要在每個專案上開啟此功能。可透過專案 --> 安全 --> 安全配置開啟此功能。

file

該功能不僅可以在程式碼變更中對金鑰資訊進行檢測,還能對 Issue、MR 評論中的金鑰資訊進行檢測。下面以極狐GitLab 個人訪問令牌為金鑰資訊進行該功能的演示。

對提交程式碼進行檢測防護

下面是一段 python 程式碼:

import requests

login_url = 'https://jihulab.com'

pat = "glpat-kQvcWtA6pBJAyYDqcza6"

login_headers = {
    'username' : "小馬哥",
    'password' : "JiHu-GitLab"
}

login_response = requests.post(login_url)

print(login_response.get())

如果在沒有開啟該功能的情況下,使用 git push 命令可以將上面的程式碼推送到極狐GitLab 倉庫中:

git push --set-upstream origin secret-push-protection
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 16 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 339 bytes | 339.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
remote:
remote: To create a merge request for secret-push-protection, visit:
remote:   http://jhma.jihulab.net/root/jh-gitlab/-/merge_requests/new?merge_request%5Bsource_branch%5D=secret-push-protection
remote:
To jhma.jihulab.net:root/jh-gitlab.git
 * [new branch]      secret-push-protection -> secret-push-protection
branch 'secret-push-protection' set up to track 'origin/secret-push-protection'.

在極狐GitLab 專案頁面上能夠看到該金鑰資訊:

file

在開啟該功能後,如果要對包含 PAT 的程式碼進行提交時,就會出錯,並且提示在程式碼的第 5 行有金鑰資訊:

file

而且明確提示PUSH BLOCKED: Secrets detected in code changes

透過頁面提交程式碼,也會提示 PUSH BLOCKED: Secrets detected in code changes 從而阻止相關程式碼的提交:

file

對 Issue、MR 評論進行檢測防護

如果在 Issue、MR 的評論中包含金鑰資訊,也會進相應的不安全提示。比如在 Issue 的評論中輸入極狐GitLab 個人訪問令牌,就會提示以下內容:

file

file

可以看到如果在 MR、Issue 的評論中包含金鑰資訊,在新增的時候,就會發出告警,提示這裡麵包含哪些金鑰資訊。

跳過也要留痕

如果在某些特殊情況下(比如為了測試之類),想跳過此功能進行程式碼的正常合入,這時候就需要在提交程式碼的時候做一些特殊處理。但是對於跳過該功能這件事情,會在安全審計裡面進行記錄。

命令列提交

如果是透過 git push 的方式從命令列進行程式碼提交,則需要新增一個引數** -o secret_push_protection.skip_all**,結果如下:

git push -o secret_push_protection.skip_all origin secret-push-protection
Enumerating objects: 8, done.
Counting objects: 100% (8/8), done.
Delta compression using up to 16 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 504 bytes | 504.00 KiB/s, done.
Total 4 (delta 1), reused 0 (delta 0), pack-reused 0
remote:
remote: View merge request for secret-push-protection:
remote:   http://jhma.jihulab.net/root/jh-gitlab/-/merge_requests/1
remote:
To jhma.jihulab.net:root/jh-gitlab.git
   6b3acb2..0b7fdb3  secret-push-protection -> secret-push-protection

可以看到程式碼推送成功。

在網頁端提交

如果是透過極狐GitLab 網頁端進行程式碼提交,則需要在 commit 資訊中新增 [skip secret push protection] 資訊,然後即可提交成功:

file

不管是哪種方式,只要是跳過金鑰推送保護功能,都會在在安全審計(專案 --> 安全 --> 審計事件)中看到對應的審計事件:

file

極狐GitLab 的金鑰安全防護體系

極狐GitLab 是一個內建安全、預設安全的 DevSecOps 平臺,有多種安全功能、策略來保障軟體研發全生命週期的安全。17.2 新增的金鑰推送保護功能是金鑰安全防護體系的重要補充部分。之前針對金鑰安全防護,主要有以下幾種手段:

  • 程式碼稽核:透過程式碼稽核來儘可能地發現變更程式碼中包含的金鑰資訊,避免金鑰資訊被合併到主分支;

  • 程式碼推送規則設定:透過設定來阻止某些金鑰檔案被推送到程式碼倉庫中,比如 SSH Key;

  • 金鑰檢測:極狐GitLab DevSecOps 體系有七大安全測試手段,金鑰檢測是其中非常重要的一環,透過將金鑰安全檢測嵌入到 CI/CD 流水線中,來自動檢測程式碼變更中的金鑰資訊;

此次新發布的金鑰推送保護直接從源頭阻止了包含金鑰資訊的程式碼被推送到倉庫中。這幾種手段結合起來就可以構建一個堅固的金鑰安全防護體系。

由於該功能當前是旗艦版功能,歡迎大家升級到 17.2 來體驗該功能,然後在官網申請旗艦版 license 進行測試體驗。

相關文章