從工具到實踐:如何在GitHub上保障開源項目安全?
1998年,Christine Peterson創造了 “開源軟件”這個詞。她解釋道:“這是刻意為之,為了讓其他人更容易理解這個領域”。同年,O’Reilly組織了首屆“開源峰會”。
開源軟件受到更多人青睞原因在于,用戶對軟件擁有更多的控制權因為他們可以檢查代碼。對于長期項目來說,開源軟件被認為是穩定的,因為這些項目遵循開放的標準,即便維護者停止工作,也不會憑空消失。活躍的開發者社區十分重要。
比起閉源軟件,開源需要更多地考慮安全問題,因為任何人都可以查看并修改代碼。貢獻者可以發現錯誤并提交一個PR對代碼進行變更。與此同時,這也伴隨著一系列的安全問題。
什么是軟件供應鏈攻擊?
當有人利用外部供應商或能夠訪問你的企業的數據和系統的第三方組件來滲透你的數字基礎設施時,就會發生軟件供應鏈攻擊。供應鏈攻擊的類型多種多樣,本文將聚焦于開源供應鏈。
任何人都可以通過開源舉措為項目的開發做出貢獻。利用這個切入點,黑客可以將漏洞編入開源項目中,當企業將該項目引入其軟件中時也引入了新的威脅,而且往往是在不知情的情況下,通過遍歷依賴或間接依賴引入。
Web 應用安全的重要性
Web 應用安全是一個概念,它涵蓋了一系列嵌入Web應用程序的安全管控,以保護其資產免受潛在的惡意行為的影響。它涉及安全開發實踐,在整個軟件開發生命周期(SDLC)中實施安全措施,以發現項目及其配置中的安全漏洞。
好消息是你可以通過使用不同的應用程序及 action 在 GitHub 內實現安全保護,不管是一個簡單的demo項目,還是大型開源項目。基于此,開源項目可以擁有與閉源軟件相同的安全水平。
Section 1:GitHub Marketplace 及 GitGuardian 應用
什么是 GitHub Marketplace?
2016年的GitHub Universe上,首次引入GitHub Marketplace。它是一個開發者可以找到集成插件并將其落實到工作流程中的地方。
如何利用安全工具創建基礎流水線并實現防護?
你可以利用GitHub Marketplace中的安全應用和action來保護你的流水線每個開發階段的安全。
一個基礎的流水線包括:
- 軟件成分分析工具,專注于識別代碼庫中的開放源碼,以便維護者和貢獻者能夠管理它們的安全和許可證合規問題
- 防止密鑰泄露的工具
- 代碼分析工具,它是一種在程序運行之前通過檢查源代碼進行調試的方法,一般根據一組編碼規則分許一組代碼
如何為你的項目選擇相關應用?你需要考慮些什么?
選擇工具、應用或是action 主要取決于你的項目或團隊的工作流程。你們使用的是什么類型的技術棧?你們是部署到Docker還是使用K8S?在你們的流水線中有多少個步驟?你能在每個步驟都實施防護嗎?
然后,你將會找到許多滿足你需求的工具和應用。而對于開放源碼軟件的維護者來說,好消息是這些應用程序通常對公開的代碼庫或開源軟件項目是免費的。
你可以在一個階段中采用2個工具,比如 Synk 和 Mend 掃描你的依賴項。這兩種工具在覆蓋率方面都會有其優點和缺點,并會幫助你更好地了解你的項目的依賴項。如果你認為一個工具比另一個好,你仍然可以刪除你不需要的那個。
讓我們來看看OWASP Zap基線掃描這個GitHub action,它會掃描目標URL的漏洞,并在你提交PR時將其反饋給你的項目。
當你打算在項目中采用一個action或一個應用時,你應該在項目頁上看到各種信息——GitHub是否驗證該action?上圖中顯示為已驗證,你可以在右側看到一個藍色的小勾。有多少貢獻者在為這個項目工作?該項目獲得了多少顆星?有多少issue和PR?
再導航到 GitHub 倉庫,看看維護者和貢獻者是如何積極推動這個項目的。它的文檔是否完善?他們是否提供了基本的使用范例?(比如一個簡單的YAML文件)是否容易實現?是否能與你項目的編程語言兼容?
接下來,我們來看看 GitGuardian 的實際用例。你可以直接在 Marketplace 中搜索到它。
點擊產品頁,你將獲得更多信息。作為項目的維護者,你將會用 OWASP Action 檢查我們前面提到的要求是否達標。我們可以看到 GitHub 是否驗證了該應用、應用安裝數量以及更多關于該組織的其他信息。
劃到頁面底部,你將看到價格及安裝信息。GitGuardian為公開的代碼庫提供免費的監控。選擇你想要安裝的賬號,并點擊“Install it for free”。
你可以在所有代碼庫上都安裝 GitGuardian 或者選擇其中幾個。你可以為需要安全防護的每個階段重復這一過程。
Section 2:管理開源項目
當貢獻者提交PR時,它將觸發流水線中集成的所有應用和action。理想狀況下,就GitGuardian而言,你希望憑證不被推送到源代碼中,并且在貢獻者提交PR之前停止這一行為。你可以在你的CLI上采用 GitGuardian Shield(ggsheild),并與預提交的 git hook集成以增強防護,確保憑證沒有被推送到源碼中。
如果沒有設置 ggshield,在代碼庫上推送密鑰的貢獻者會在提交PR時收到告警。下圖虛擬PR提交的過程中,你可以看到一些工具被觸發。
你可以讓其中一些工具在主干分支上是必須觸發的。要做到這一點,需要進入項目設置,在【Code and automation】中點擊【Branches】。在這里,你可以添加分支保護規則,要求在合并PR前必須通過狀態檢查。
如何從ChatOps中獲取價值?
ChatOps 是一個協作模型,將人、工具、流程和自動化連接到一個透明的工作流程中。使用Slack進行討論,并為特定的工具設置專門的頻道,這將有助于你了解項目中發生的事情。監控和設置告警是重要的一環,可以幫助開發人員獲得正確的信息。
GitHub 項目:如何利用面板追蹤安全任務
在開發開源項目時,你可以利用GitHub projects來列出你為某一特定功能所要做的所有任務。你可以創建標簽和epics(milestones)來跟蹤進度或用于提出問題。還可以創建一個安全標簽來追蹤你項目中的漏洞。
你可以使用自動化項目或面板,其中的卡片會根據PR的狀態相應地移動。這個方式可以很好地展示功能開發進度以及你可能需要幫助的地方。
在 README 文件中展示項目的健康狀態
如果你想為你的項目吸引更多的貢獻者,不要忘記使用應用及action工作流程提供的標簽或tag來展示項目的健康狀態,并將其添加到項目的README文件頂部。你通過GitHub文檔了解更多徽章設置:
https://docs.github.com/en/actions/monitoring-and-troubleshooting-workflows/adding-a-workflow-status-badge
Section 3:安全加固開源項目
除了在流水線各環節添加安全防護外,你還可以通過采用以下最佳實踐加固開源項目:
采用最小權限:在成員權限部分將基本權限設置為無權限,這樣成員只能克隆和提取公共代碼庫。如果要給貢獻者更多的權限,維護者需要把他們加入團隊或讓他們成為單個代碼庫的協作者。創建團隊、添加用戶,并將他們分配到具有特定權限的特定代碼庫中。
讓所有維護者和貢獻者都必須使用2FA。到2023年底,GitHub將要求所有貢獻代碼的用戶啟用一種或多種形式的雙因素認證。
保護主分支:如上所述,一定要保護主分支,以免被維護者意外刪除。
啟用提醒和告警:更新email地址以保證你能收到來自項目的提醒信息
添加正確的許可證:OSS許可證可以保護貢獻者和用戶。如果你不確定應該選擇哪個許可證,可以查看這篇文章進行簡單的入門,并且確保在你的代碼庫中有 LICENSE.md 或 LICENSE.txt 文件。
審查應用程序、工具和Webhooks的列表:如果你在流水線中的一個步驟中使用了多個應用程序、工具或webhooks,請review 它們是否仍然適用,并刪除任何陳舊過時的或未使用的組件。
如果你依賴 GitHub Actions 來構建、測試和部署你的項目,一定要檢查你的工作流程配置。訪問下方鏈接可以查看 GitHub Actions 安全最佳實踐:
https://blog.gitguardian.com/github-actions-security-cheat-sheet/
總結
開源組件可以成為大規模網絡攻擊的一個載體。去年我們已經看到了Apache Log4j 的漏洞,這是一個開源的Java包,用于支持許多Java應用程序的活動記錄。雖然不是所有用Java編寫的軟件都有漏洞,但受影響的軟件包被開發人員廣泛使用,有許多應用程序和服務都使用這個庫。大型科技公司,如微軟、VMWare、亞馬遜、IBM等都受到影響。
使用不同的工具和防護在整個流水線中擁有可見性對于減少攻擊面至關重要,在本文中我們已經看到借助 GitHub Marketplace 的應用和Action可以幫助達成這一目標。軟件供應鏈安全管理平臺SEAL 也可以幫助用戶獲取項目的全局安全可見性,目前已開放免費試用:seal.io/trial。
作為維護者和貢獻者,可以先創建一個小型流水線,并嘗試試用其中一些工具,為每個貢獻者安全加固GitHub項目。
不停地實踐是保證安全的關鍵一環,但更重要的是,不要在GitHub上push你的密鑰!