Der lokale Nix-Cache wird ignoriert, da in der NAR-Info-Datei keine Signatur vorhanden ist

7

[teilweise hier gelöst: https://plus.google.com/110416349762686874861/posts/PVGHL1Tpeb9 ; aber nicht ganz]

Ich möchte eine meiner NixOS-Maschinen als Cache für die Pakete verwenden, um nicht bei jedem Upgrade für jede einzelne Maschine alles aus Hydra abzurufen. Also versuche ich das: https://nixos.org/nix/manual/#sec-sharing-packages . Aber

  • Wenn ich versuche zu verwenden nix-serve -p <port>, nix-env --option extra-binary-caches http://<host>:<port>/(auch bei der Ausführung wie root!) Einfach ignoriert diesen Cache und sagte , dass „NAR - Info - Datei“ ... „eine Unterschrift fehlt“, und versucht, Schalter auf cache.nixos.org. Funktioniert nix-servealso nicht wie erwartet. Bedeutet das, dass die Dokumentation nicht mehr aktuell ist oder dass sie nix-servekaputt ist?

  • While nix-copy-closure --to <user>@<host>funktioniert (wenn <user>als vertrauenswürdiger Benutzer hinzugefügt wird nix.trustedUsers). Dies bei jedem Upgrade zu tun, wäre jedoch sehr unpraktisch. Übrigens. Was mich hier auch verwirrt, ist, wie --fromes verwendet werden soll?

Ich habe ein allgemeines Verständnis dafür, wie kryptografische Signaturen funktionieren und warum sie zum Signieren von Paketen (und Repositorys) verwendet werden. Aber

  • Unter diesen Umständen brauche ich es einfach nicht: Das Risiko eines MITM ist kein Grund zur Sorge. Ich möchte nur einige GiBs Binärdateien regelmäßig und mühelos von einem Computer auf einen anderen kopieren. Ich könnte die Überprüfung natürlich einfach vollständig über deaktivieren nix.requireSignedBinaryCaches = false, aber gibt es keinen weniger radikalen Weg? Wenn ich beispielsweise nix-envals rootoder als "vertrauenswürdiger Benutzer" aufrufe und diesen "zusätzlichen" Binärcache als "vertrauenswürdigen Binärcache" registriert habe; Bedeutet das nicht, dass ich weiß, was ich tue, und dass das System nicht über fehlende Signaturen nörgeln muss? (ohne dass die Überprüfung insgesamt deaktiviert werden muss) Ich habe nicht herausgefunden, wie die Überprüfung nur für eine bestimmte "vertrauenswürdige" Quelle / einen bestimmten "vertrauenswürdigen" Benutzer deaktiviert werden kann, und vermute ziemlich genau, dass sie nicht vorhanden ist (dh Fehler).

  • Um diesen Signaturmechanismus einzuhalten, könnte ich wahrscheinlich auch versuchen, einen "vollwertigen" Binärcache einzurichten, indem ich nix-store --generate-binary-cache-keydann nix-push --dest <somewhere> --key-file <secret-1> --none <cherrypicked-paths>den öffentlichen Schlüssel auf den Clients verwende und registriere. Aber es ist ganz und gar nicht das, was ich will: die Archive auf dem "Server" speichern und die Pfade nix-pushexplizit festlegen. Ich möchte nur, dass entweder nix-servediese gemeinsam genutzten Pakete vor der Lieferung signiert werden, damit die empfangende Seite glücklich ist, oder nix-envdass ich mich nicht über das Fehlen einer Signatur beschwere, wenn ich absolut sicher bin, dass diese bestimmte Quelle vertrauenswürdig ist!

Fazit: Ich bin mir ziemlich sicher, dass nix-serveder Mechanismus zur Überprüfung der Signatur (oder beides) einfach defekt / nicht gewartet ist. Man kann also alles weniger als Frage betrachten, sondern eher als Kandidaten für einen Fehlerbericht. Aber wenn ich falsch liege - noch besser.

Andrew Miloradovsky
quelle

Antworten:

9

So konfigurieren Sie den Server und den Client für die Verwendung eines signierten Binärcaches, der über den nix-serveBefehl bereitgestellt wird . Dies erfordert keine Verwendung nix-pushzum Generieren des Caches und Sie können Ihre /nix/storedirekt mit dieser Methode bedienen .

Dies ist auf der man-page dokumentiert. nix-pushWenn Sie weitere Details wünschen, können Sie dies auch überprüfen

Serverkonfiguration

In diesem Beispiel wird davon ausgegangen, dass der Hostname Ihres Servers lautet cache.example.com.

Zunächst müssen Sie ein Signaturschlüsselpaar nix-store --generate-binary-cache-keywie folgt generieren :

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

... einfach durch cache.example.comeinen geeigneten Hostnamen für Ihren Server ersetzen . Es muss nicht mit dem tatsächlichen Hostnamen übereinstimmen, aber es hilft, wenn sie übereinstimmen, damit Sie leicht unterscheiden können, zu welchem ​​Server ein öffentlicher Schlüssel gehört.

Wenn Ihr Cache-Server ausgeführt wird, NixOSkönnen Sie Ihren Cache bedienen, indem Sie diese beiden Zeilen zu Ihrer NixOSKonfigurationsdatei hinzufügen :

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

... und stellen Sie sicher, dass der nix-serveBenutzer Lesezugriff auf den nix-serve.secSchlüssel hat.

Wenn Sie nicht verwenden NixOSund Ihren Cache direkt über die nix-serveausführbare Datei bereitstellen möchten, müssen Sie die NIX_SECRET_KEY_FILEUmgebungsvariable verwenden, um den Pfad zum geheimen Schlüssel wie folgt anzugeben:

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

Client-Konfiguration

Wenn Ihr Client-Computer ein NixOSComputer ist, können Sie Ihrer NixOSKonfigurationsdatei folgende Zeilen hinzufügen :

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

Wenn Sie sich nicht auf einem NixOSComputer befinden, können Sie Ihre nix.confDatei manuell bearbeiten , um die folgenden Einstellungen vorzunehmen:

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

Wenn Sie es vorziehen , nur für einen Build eine binäre Cache aktivieren können Sie stattdessen diese binäre Cache - Konfiguration Flags direkt zu einem Nix Dienstprogramm wie geben nix-buildoder nixos-rebuild, wie folgt aus :

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:...="
Gabriel Gonzalez
quelle