Go 部落格

模組映象和校驗和資料庫已啟動

Katie Hockman
2019 年 8 月 29 日

我們很高興地宣佈,我們的模組映象索引校驗和資料庫現已可用於生產環境!對於Go 1.13 模組使用者go 命令將預設使用模組映象和校驗和資料庫。請參閱proxy.golang.org/privacy瞭解這些服務的隱私資訊,並查閱go 命令文件以獲取配置詳細資訊,包括如何停用這些伺服器或使用其他伺服器。如果您依賴非公共模組,請查閱配置環境的文件

本文將介紹這些服務及其優勢,並總結了 Gophercon 2019 上Go 模組代理:查詢的生命週期演講中的一些要點。如果您對完整演講感興趣,請參閱錄影

模組映象

模組是 Go 軟體包的集合,它們一起進行版本控制,每個版本的內容都是不可變的。這種不可變性為快取和認證提供了新的機會。當 go get 在模組模式下執行時,它必須獲取包含所需軟體包的模組,以及該模組引入的任何新依賴項,並根據需要更新您的go.modgo.sum檔案。從版本控制系統中獲取模組可能會耗費系統延遲和儲存空間:go 命令可能被迫拉取包含傳遞性依賴項的倉庫的完整提交歷史,即使是未被構建的依賴項,僅僅是為了解析其版本。

解決方案是使用模組代理,它提供的 API 更適合 go 命令的需求(請參閱 go help goproxy)。當 go get 在模組模式下使用代理執行時,它只需請求所需的特定模組元資料或原始碼,而不必擔心其他內容,從而工作更快。下面是 go 命令如何使用代理與 go get 結合的示例,它會先請求版本列表,然後請求最新標籤版本的 info、mod 和 zip 檔案。

模組映象是模組代理的一種特殊型別,它將元資料和原始碼快取到自己的儲存系統中,使得即使原始位置不再提供原始碼,映象仍然可以繼續提供服務。這可以加快下載速度,並保護您免受依賴項消失的影響。更多資訊請參閱Go Modules in 2019

Go 團隊維護一個模組映象,服務地址為proxy.golang.org,自 Go 1.13 起,go 命令將預設對模組使用者使用此映象。如果您執行的是早期版本的 go 命令,則可以在本地環境中設定 GOPROXY=https://proxy.golang.org 來使用此服務。

校驗和資料庫

模組引入了 go.sum 檔案,其中包含每個依賴項首次下載時其原始碼和 go.mod 檔案的 SHA-256 雜湊列表。go 命令可以使用這些雜湊來檢測源伺服器或代理的行為異常,例如對同一版本提供不同的程式碼。

這個 go.sum 檔案的侷限性在於,它完全依賴於您在首次使用時的信任。當您向模組新增從未見過的依賴項版本時(可能是透過升級現有依賴項),go 命令會立即獲取程式碼並向 go.sum 檔案新增行。問題在於,這些 go.sum 行並未與其他人生成的進行比對:它們可能與 go 命令剛剛為其他人生成的 go.sum 行不同,這可能是因為代理故意向您提供了惡意程式碼。

Go 的解決方案是一個全域性 go.sum 行來源,稱為校驗和資料庫,它確保 go 命令總是將相同的行新增到每個人的 go.sum 檔案中。無論何時 go 命令接收到新的原始碼,它都可以針對這個全域性資料庫驗證該程式碼的雜湊,以確保雜湊匹配,從而確保每個人都對給定版本使用相同的程式碼。

校驗和資料庫由sum.golang.org提供服務,並基於由Trillian支援的雜湊值的透明日誌(或稱“Merkle 樹”)構建。Merkle 樹的主要優勢在於它是防篡改的,其特性使得任何不良行為都無法不被察覺,這使其比簡單的資料庫更值得信賴。go 命令使用這棵樹來檢查“包含”證明(證明日誌中存在特定記錄)和“一致性”證明(證明樹未被篡改),然後才將新的 go.sum 行新增到您的模組的 go.sum 檔案中。下面是這樣一棵樹的示例。

校驗和資料庫支援 go 命令用於請求和驗證 go.sum 行的一組端點/lookup 端點提供一個“簽名樹頭”(STH)和請求的 go.sum 行。/tile 端點提供樹的塊,稱為瓦片go 命令可以使用它們進行證明。下面是 go 命令如何與校驗和資料庫互動的示例:透過對模組版本執行 /lookup,然後請求證明所需的瓦片。

這個校驗和資料庫使得 go 命令可以安全地使用原本不可信的代理。因為它上面有一個可審計的安全層,代理或源伺服器無法故意、隨意或意外地向您提供錯誤的程式碼而不被發現。即使是模組的作者,也無法隨意移動其標籤或更改與特定版本關聯的二進位制檔案而不被檢測到。

如果您使用的是 Go 1.12 或更早版本,可以使用gosumcheck工具手動檢查 go.sum 檔案與校驗和資料庫是否一致。

$ go get golang.org/x/mod/gosumcheck
$ gosumcheck /path/to/go.sum

除了 go 命令進行的驗證外,第三方審計員還可以透過遍歷日誌查詢不良條目來監督校驗和資料庫。他們可以協同工作,交流樹隨著增長的狀態,以確保其未被破壞,我們希望 Go 社群能執行這些審計員。

模組索引

模組索引由index.golang.org提供服務,是一個公共 feed,提供透過proxy.golang.org可用的新模組版本資訊。這對於希望保留自己的 proxy.golang.org 中可用模組快取的工具開發者,或者希望及時瞭解人們正在使用的一些最新模組的開發者特別有用。

反饋或 Bug

我們希望這些服務能改善您使用模組的體驗,並鼓勵您在遇到問題或有反饋時提交問題

下一篇文章:Go 1.13 釋出
上一篇文章:遷移到 Go 模組
部落格索引