web-dev-qa-db-ja.com

NAR情報ファイルに署名がないため、ローカルNixキャッシュは無視されます

[ここで部分的に解決: https://plus.google.com/110416349762686874861/posts/PVGHL1Tpeb9 ;完全ではありません]

NixOSマシンの1つをパッケージのキャッシュとして使用し、アップグレードのたびにHydraからすべてをプルしないようにします。だから私はこれをやろうとします: 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-envrootとして、または「信頼できるユーザー」として呼び出し、この「追加の」バイナリキャッシュを「信頼できるバイナリキャッシュ」として登録した場合。それは、私が何をしているのかを知っていることを意味するのではなく、システムが署名の欠落についてしつこくする必要がないのですか? (チェックを完全に無効にする必要はありません)特定の「信頼できる」ソース/ユーザーに対してのみ検証を無効にする方法が見つかりませんでした。検証が存在しない(つまりバグ)と思われます。

  • また、この署名メカニズムに準拠するために、nix-store --generate-binary-cache-key、次にnix-Push --dest <somewhere> --key-file <secret-1> --none <cherrypicked-paths>を使用し、クライアントに公開鍵を登録することで、「本格的な」バイナリキャッシュを設定することもできます。 (s)。しかし、それは私が望んでいることではありません。アーカイブを「サーバー」に保存し、nix-Pushのパスを明示的に設定します。 nix-serveが配達前にこれらの共有パッケージに署名して、受信側が満足するようにするか、nix-envが署名の欠如について文句を言わないようにしたいだけです。ソースは信頼できます!

結論:nix-serveまたは署名チェックメカニズム(またはその両方)が単に壊れているか、維持されていないことは間違いありません。したがって、それをすべて質問としてではなく、バグレポートの候補として考えることができます。しかし、私が間違っている場合は、さらに良いです。

7

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

これは、nix-Pushman-ページに記載されているため、詳細が必要な場合は、それも確認できます。

サーバー構成

この例では、サーバーのホスト名が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-buildnixos-rebuildなどのNixユーティリティに直接渡すことができます。

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:...="
9