The Go Blog
モジュールミラーとチェックサムデータベースが開始されました
モジュールミラー、インデックス、およびチェックサムデータベースが本番環境で利用可能になったことをお知らせします! goコマンドは、Go 1.13のモジュールユーザーの場合、デフォルトでモジュールミラーとチェックサムデータベースを使用します。これらのサービスのプライバシー情報についてはproxy.golang.org/privacyを、これらのサーバーの使用を無効にする方法や別のサーバーを使用する方法を含む設定の詳細についてはgoコマンドのドキュメントを参照してください。非公開モジュールに依存している場合は、環境設定のドキュメントを参照してください。
この投稿では、これらのサービスとその利用のメリットについて説明し、Gophercon 2019でのGo Module Proxy: Life of a Queryトークの要点をまとめます。詳細なトークに興味がある場合は、録画をご覧ください。
モジュールミラー
モジュールは、一緒にバージョン管理されるGoパッケージのセットであり、各バージョンの内容は変更不可能です。この変更不可能性は、キャッシュと認証に新たな機会を提供します。go getがモジュールモードで実行されると、要求されたパッケージを含むモジュール、およびそのモジュールによって導入された新しい依存関係をフェッチし、必要に応じてgo.modおよびgo.sumファイルを更新する必要があります。バージョン管理からモジュールをフェッチするのは、システムのレイテンシとストレージの観点からコストがかかる可能性があります。goコマンドは、そのバージョンを解決するためだけに、ビルドされていない推移的な依存関係を含むリポジトリの完全なコミット履歴をプルダウンすることを余儀なくされる場合があります。
解決策は、goコマンドのニーズにより適したAPIを話すモジュールプロキシを使用することです(go help goproxyを参照)。go getがプロキシを使用してモジュールモードで実行されると、必要な特定のモジュールメタデータまたはソースコードのみを要求し、それ以外を気にしないことで、より速く動作します。以下は、goコマンドがgo getでプロキシを使用する方法の例です。バージョンリストを要求し、次に最新のタグ付きバージョンの情報、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によって提供され、proxy.golang.orgを通じて利用可能になる新しいモジュールバージョンの公開フィードです。これは、proxy.golang.orgで利用可能なものの独自のキャッシュを保持したいツール開発者、または人々が使用している最新のモジュールの一部を最新の状態に保ちたい開発者にとって特に役立ちます。
フィードバックまたはバグ
これらのサービスがモジュールでのエクスペリエンスを向上させることを願っており、問題が発生した場合やフィードバックがある場合は課題を提出することをお勧めします!
次の記事:Go 1.13がリリースされました
前の記事:Go Modulesへの移行
ブログインデックス