作者丨Ariadne Conill
編譯丨諾亞
自從Linus Torvalds創建Linux內核並發布其第一個版本以來,已經過去了30多年。當我們回顧自由軟體發展早期時,當然應該給予Debian,FreeBSD和其他開源的自由/開源軟體發行版大量榮譽,它們提供了穩定性保證,預先打包了通用的實用程序,並且使用戶不必手動安裝所有內容。
但是,現在的世界與90年代大不相同,雖然確實有很多發行版在安全方面做得很好,但在許多方面,現代軟體消費模式,比如使用Docker構建軟體和使用curl-pipe-bash命令安裝軟體,已經給軟體供應鏈帶來了安全挑戰。通過這些變通辦法,世界在很大程度上已經擺脫了傳統的自由和開放源碼軟體分發模式,同時失去了通過精心策劃的分發獲得的軟體的優勢,例如分發提供的漏洞管理。
讓我們來看看軟體發行版的演變,現代開發人員的需求已經超出了以犧牲安全性為代價的一些傳統智慧的領域,並仔細看看 Wolfi——一個圍繞模塊化和可重新定位性構建的滾動發布 Linux 發行版,它提供了用於滿足現代用戶供應鏈安全需求的原語,同時還提供多個應用程式版本流的穩定性。
1、今天的軟體消費看起來有很大的不同
在傳統的軟體消費模型中,系統管理員選擇發行版,將它們安裝在虛擬機中,並直接從這些發行版獲取儘可能多的軟體。開發人員如果需要這些發行版之外的額外內容,就必須提交申請,等待IT部門為他們的請求提供服務。
容器和微服務立即顛覆了這種軟體消費模式,讓開發人員能夠完全控制軟體的構建、分發和獲取方式。
同時,FOSS的爆炸式增長產生了一種影響,即大多數開發人員所追求的軟體不再得到世界上最著名的發行版的支持。從NPM到Maven再到PyPI,世界上最受歡迎的語言和庫發布的軟體包和版本比發行版所能跟的要多幾個數量級。
其結果是,開發人員現在在他們的發行版之外安裝程序。好處是能夠獲得最新和最好的軟體。但缺點是,這一切都發生在直接從發行版安裝軟體時內置的管理和信任的背景之外。
當你在發行版之外安裝軟體時,你從誰那裡獲取軟體之間存在巨大的語義差異。手動安裝軟體時,開發人員可以獲得最新的軟體包(和版本),而不必等待發行版正式支持它們的緩慢步伐。然而,隨著FOSS的普及和普遍存在,人們習慣了在沒有任何舊世界發行版內置的信任保證的情況下獲取軟體。
2、軟體工件的安全壓力越來越大
積極利用像 Log4j 這樣的備受矚目的漏洞,為軟體供應鏈安全的重要性提供了新的視角。
在大多數組織痴迷於網絡安全的情況下,Log4j展示了這類全新的漏洞利用,因為開發人員構建系統和他們使用的工件從未被賦予信任機制。現代黑客是從這些敞開的門口進入——找到依賴項,不安全的庫或其他組件——然後一旦進入,就轉向所有其他可傳遞的依賴項。
對於現在關注軟體供應鏈安全的組織來說,Log4j激發了對更好地了解軟體工件來源的需求。公司開始問這些問題,比如這些人工製品是從哪裡來的?他們通過監管鏈被篡改了嗎?這個開源項目還在維護嗎?
許多人沮喪地意識到,他們的安全掃描程序完全錯過了安裝在容器外部和底層發行版之外的軟體。當掃描程序找不到這些軟體包時,它們也無法找到它們的漏洞。
除了不想花費下一個假期來補救下一個Log4j之外,組織也感受到了迫在眉睫的監管變化帶來的熱度。CISA的自我認證通用表格 ——結合正在進行的白宮網絡安全法令——清楚地表明,不安全軟體的責任將在未來適用於供應商。措辭仍然模糊不清,但這種立法/監管努力的演變是顯而易見的。FedRAMP(規定了向美國聯邦政府銷售軟體的合規條款)已經對建立軟體組件的信任和修復已知漏洞提出了非常具體的要求。
如今,大多數公司都意識到,扮演鴕鳥不是管理軟體支持生命周期的策略。我們都需要了解在環境中運行的所有軟體工件,並且我們需要對正在部署的軟體工件的安全狀況充滿信心。
3、我的發行版中有什麼亂七八糟的東西?
在開源項目進入軟體供應鏈之前,公司可以看到一些不錯的信號,以嘗試了解開源項目的安全狀況。例如,OpenSSF Scorecard項目就是一個很好的資源。
但是發行版本身通常是你在了解你已經在運行哪些安全漏洞時面臨的最大障礙之一。
一方面,世界上許多最流行的發行版都存在誤報問題——這是相當於「嘈雜尋呼機」綜合症的安全漏洞。例如,這裡是紅帽通用基礎映像 9 的掃描。如果我在此映像上運行 syft,我在此發行版中看到203個軟體包,其中記錄了211個 CVE,這比軟體包的數量還要多。例如,在這裡,我重點介紹 dmidecode 組件,該組件的嚴重程度評分為中等:
為什麼所有這些單片發行版都要在它們的基本映像中安裝那麼多你根本不需要的組件?例如,dmidecode是一個用於從伺服器的BIOS檢索信息的組件——它與容器化環境無關。
在發行版中包含這些工具的最初目的是為管理員提供統一的體驗,並支持「開箱即用」的最常用實用程序。因此,所有這些「廚房水槽」包的存在是累積技術債務的一種形式,這種債務是由於發行版需要默認地服務於每個可能的用例而產生的。
對於當今使用這些發行版的組織來說,這種技術債務是巨大的成本。如果我們經常遇到我們既不使用也沒有發行版維護者打算修復的組件上的CVE,我們就會遇到「漏報」問題,這會影響我們對影響我們基礎架構的實際漏洞進行分類的能力。
這些報告的漏洞不僅會產生你不想要的CVE修復的額外噪音,而且還可能創造出可用於其他開發鏈的小工具,這類攻擊被稱為「離地生活攻擊(LOTL)」。例如,攻擊者可以利用sudo,獲得容器內部的root權限,然後使用這些其他工具突破容器。現在,攻擊者已在主機上並已完全破壞系統。通過使用你實際上不使用的軟體包,你將承擔未知的責任。
4、Wolfi:調整發行版的大小,使安全信號有意義
Wolfi 是一個發行版,其名字的靈感來自世界上最小的章魚。它於一年前推出,強調模塊化設計,並將更細粒度和最小的包打包,以便開發人員和安全團隊可以對他們正在運行的內容進行推理。其設計原則是為了解決為早期時代設計的發行版與當今在雲和邊緣運行的工作負載之間的這些基本脫節:
- 容器映像往往滯後於上游更新,導致用戶運行具有已知漏洞的映像。
- 容器映像中使用的常見發行版也落後於上游版本,導致用戶手動或在包管理器外部安裝包。
- 容器映像通常包含比所需更多的軟體,從而導致不必要地增加攻擊面。
- 嵌入式方案(例如在邊緣運行的 IoT 設備)存儲容量較小,因此需要更小的分布。
大多數發行版都針對穩定性、廣泛的兼容性和緩慢、有目的的更改進行了優化——Wolfi 優先考慮快速更新和極簡主義,使用版本流允許用戶選擇他們希望使用的更新以及何時使用。
Wolfi 軟體包是使用 melange 構建的,melange 是一種靈活且安全的構建工具。它使用 YAML 進行配置(世界在 YAML 上運行),並在容器中運行構建步驟(可以使用 bwrap、docker、Kubernetes 運行)。它生成使用私鑰簽名的 .apk。Wolfi 將這些軟體包託管在CDN上,CLI(apk)管理安裝。此外,Chainguard使用apko(一種將APK軟體包組合成OCI基礎映像的工具)從這些軟體包以聲明式構建其Chainguard Images產品。
Wolfi 強調頻繁更新和自動化。過去,開源意味著你可以永遠獲得軟體的免費副本,而今天的現實是,你必須有一個不斷更新軟體的計劃,這就是Wolfi的原語優化的目的。用 Wolfi 術語來說,軟體包更新的生命周期如下所示:
- Wolfibot 監控 GitHub 和發布監控的更新,並將其作為 PR 歸檔。
- 維護者審查並批准這些更新,並將它們合併到發行版中。
- Wolfi 中上游發布和可用性之間的時間可以用分鐘來衡量,而不是幾天/幾周。
- 可用性並不意味著你應該將其推廣到生產環境,你應該對其進行測試。
- 在Wolfi的極簡設計下,默認情況下包含更少的組件,這意味著在測試時需要擔心的組件更少。
隨著Wolfi發布一周年,它吸引了一些偉大的貢獻,包括1300個軟體包配置。此外,我們還與一些使用最廣泛的容器掃描儀建立了合作夥伴關係,如Docker Scout,Grype,Snyk,Trivy,Wiz和Prisma Cloud。
不同的發行版有不同的優先級。Debian 的首要任務是穩定性、廣泛的兼容性以及緩慢而有目的的更改——這些優先事項使其成功了三十多年。Alpine的首要任務是……更快。Alpine以安全為中心,最小,更頻繁的發布和補丁——在許多方面,Alpine是Wolfi的精神前身。所有這些發行版都是了不起的公共產品,激發了圍繞Wolfi的許多設計合理化。
參考連結:https://thenewstack.io/meet-wolfi-the-linux-distro-designed-to-shrink-your-supply-chain/