サーバー構成

サーバー構成

[ここで部分的に扱われました:https://plus.google.com/110416349762686874861/posts/PVGHL1Tpeb9;しかし完全ではない]

アップグレードするたびに、Hydraからすべてのアイテムをインポートしないように、NixOSシステムの1つをパッケージ用のキャッシュとして使用したいと思います。だから私はこれを試しました: https://nixos.org/nix/manual/#sec-sharing-packages。しかし、

  • 使用しようとするとnix-serve -p <port>(!nix-env --option extra-binary-caches http://<host>:<port>/で実行してもroot)、このキャッシュを無視して「NAR情報ファイル」...「署名がありません」と言って切り替えを試みます...だから期待cache.nixos.orgどおりnix-serveに動作しません。これは、文書がもはや本物ではないかnix-serve破損していることを意味しますか?

  • nix-copy-closure --to <user>@<host>動作しますが(<user>信頼できるユーザーとして追加された場合nix.trustedUsers)、アップグレードするたびにこれを行うと非常に不便になります。ところで。ここで私を混乱させるのは--fromそれを使う方法です。

暗号化署名がどのように機能するのか、パッケージ(およびリポジトリ)に署名するために使用される理由について一般的に理解しています。しかし、

  • この場合はまったく必要ありません。 MITMのリスクを心配する必要はありません。定期的にあるコンピュータから別のコンピュータにいくつかのGiBのバイナリファイルを簡単にコピーしたいと思います。もちろん、検証を完全に無効にすることもできますが、それほどnix.requireSignedBinaryCaches = false根本的なアプローチはありませんか?たとえば、「信頼できるユーザー」nix-envに電話rootして、この「追加」バイナリキャッシュを「信頼できるバイナリキャッシュ」として登録しても、私が何をしているのかわかるわけではなく、システムが文句を言う必要がないという意味です。です。署名はありませんか? (検査を完全に無効にする必要はありません。)特定の「信頼できる」ソース/ユーザーに対してのみ検証を無効にする方法が見つからず、ほとんど存在しないと疑われます(バグなど)。

  • nix-store --generate-binary-cache-keyこの署名メカニズムに準拠するために、nix-push --dest <somewhere> --key-file <secret-1> --none <cherrypicked-paths>クライアントに公開鍵を登録して「完全な」バイナリキャッシュを設定することもできます。しかし、それは私が望むものではありません。アーカイブを「サーバー」に保存し、nix-pushパスを明示的に設定します。nix-serveこの共有パッケージが出荷前に署名されているので、受信者がnix-envこの特定の情報源が信頼できると確信している場合は、署名の欠如について文句を言わずに喜んでいただけることを願っています!

nix-serve結論:署名検証メカニズム(またはその両方)が破損しているか維持されていないと確信しています。したがって、これを問題ではなくバグレポート候補と見なすことができます。しかし、私が間違っているなら、それはより良いです。

ベストアンサー1

nix-serveコマンドによって提供される署名付きバイナリキャッシュを使用するようにサーバーとクライアントを設定する方法は次のとおりです。これはnix-pushビルドキャッシュを使用する必要はなく、/nix/storeこの方法を使用して直接提供できます。

これはman-pageに文書化されているため、nix-push詳細についてはその内容も確認できます。

サーバー構成

この例では、サーバーのホスト名が仮定されていますcache.example.com

まず、次のように署名鍵ペアを生成する必要がありますnix-store --generate-binary-cache-key

$ nix-store --generate-binary-cache-key cache.example.com-1 nix-serve.sec nix-serve.pub

cache.example.com...サーバーに適したホスト名に変更してください。実際のホスト名と一致する必要はありませんが、公開鍵が属するサーバーを簡単に区別できるように一致すると便利です。

キャッシュサーバーが実行されている場合は、NixOS設定ファイルに次の2行を追加してキャッシュを提供できますNixOS

nix-serve = {
  enable = true;
  secretKeyFile = "/path/to/nix-serve.sec";
};

...ユーザーにnix-serveキーへの読み取りアクセス権があることを確認してくださいnix-serve.sec

キャッシュを指定せずに実行可能ファイルを使用して直接キャッシュを提供するNixOSには、次のように環境変数を使用してキーパスを指定する必要がnix-serveあります。NIX_SECRET_KEY_FILE

NIX_SECRET_KEY_FILE=/path/to/nix-serve.sec nix-serve ...

クライアント構成

クライアントシステムがNixOSシステムの場合は、設定ファイルに次の行を追加できますNixOS

nix.binaryCaches = [
  "https://cache.nixos.org/"

  # This assumes that you use the default `nix-serve` port of 5000
  "http://cache.example.com:5000"
];

nix.binaryCachePublicKeys = [
  "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="

  # Replace the following string with the contents of the
  # `nix-serve.pub` file you generated in the "Server configuration"
  # section above
  "cache.example.com-1:...="
];

NixOSコンピュータを使用していない場合は、nix.conf手動でファイルを編集して次の設定を指定できます。

binary-caches = https://cache.nixos.org/ http://cache.example.com
binary-cache-public-keys = cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY= cache.example.com-1:...=

1つのビルドに対してのみバイナリキャッシュを有効にするには、次のようにこれらのバイナリキャッシュ設定フラグを、またはnix-build同じNixユーティリティに直接渡すことができます。nixos-rebuild

nixos-rebuild build --option binary-caches "https://cache.nixos.org/ http://cache.example.com" --option binary-cache-public-keys "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY= cache.example.com-1:...="

おすすめ記事