Bộ đệm Nix cục bộ bị bỏ qua vì tệp thông tin NAR thiếu chữ ký


7

[đã giải quyết một phần tại đây: https://plus.google.com/110416349762686874861/posts/PVGHL1Tpeb9 ; nhưng không hoàn toàn]

Tôi muốn sử dụng một trong các máy NixOS của mình làm bộ đệm cho các gói, để không lấy mọi thứ từ Hydra cho mỗi máy trên mỗi lần nâng cấp. Vì vậy, tôi cố gắng làm điều này: https://nixos.org/nix/manual/#sec-shaming-packages . Nhưng

  • Khi tôi cố gắng sử dụng nix-serve -p <port>, nix-env --option extra-binary-caches http://<host>:<port>/(ngay cả khi chạy dưới dạng root!) Chỉ cần bỏ qua bộ đệm này, nói rằng "tệp thông tin NAR" ... "thiếu chữ ký" và cố gắng chuyển sang cache.nixos.org. Vì vậy, nix-servekhông làm việc như mong đợi. Điều đó có nghĩa là tài liệu này không còn thực tế nữa hay đã nix-servebị hỏng?

  • While nix-copy-closure --to <user>@<host>không hoạt động (nếu <user>được thêm dưới dạng người dùng đáng tin cậy vào nix.trustedUsers). Nhưng làm điều này trên mỗi nâng cấp sẽ rất bất tiện. BTW. Điều gì cũng đánh đố tôi ở đây là làm thế nào --fromđược cho là được sử dụng?

Tôi có hiểu biết chung về cách chữ ký mã hóa hoạt động và lý do tại sao chúng được sử dụng để ký các gói (và kho lưu trữ). Nhưng

  • Trong những trường hợp này, tôi đơn giản là không cần nó: nguy cơ MITM không phải là điều đáng lo ngại. Tôi chỉ muốn sao chép một vài nhị phân của GiB từ máy này sang máy khác, thường xuyên và dễ dàng. Tất nhiên, tôi có thể vô hiệu hóa hoàn toàn xác minh thông qua nix.requireSignedBinaryCaches = false, nhưng không có cách nào triệt để hơn? Nếu, giả sử, tôi gọi nix-envroot, hoặc là "người dùng đáng tin cậy" và có bộ đệm nhị phân "phụ" này được đăng ký là "bộ đệm nhị phân đáng tin cậy"; không phải nó ngụ ý rằng tôi biết những gì tôi đang làm và không cần hệ thống cằn nhằn về việc thiếu chữ ký? (không cần phải vô hiệu hóa việc kiểm tra hoàn toàn) Tôi chưa tìm thấy cách vô hiệu hóa xác minh cho một nguồn / người dùng "đáng tin cậy" nhất định và khá nhiều nghi ngờ rằng nó không tồn tại (ví dụ như lỗi).

  • Tôi cũng có thể, để tuân thủ cơ chế ký này, hãy thử thiết lập bộ đệm nhị phân "đầy đủ", bằng cách sử dụng nix-store --generate-binary-cache-key, sau đó nix-push --dest <somewhere> --key-file <secret-1> --none <cherrypicked-paths>và đăng ký khóa chung trên máy khách. Nhưng đó không phải là điều tôi muốn: lưu trữ tài liệu lưu trữ trên "máy chủ" và thiết lập đường dẫn cho nix-pushrõ ràng. Tôi chỉ muốn rằng họ nix-serveđã ký các gói chia sẻ đó trước khi giao hàng, để bên nhận được vui vẻ hoặc nix-envkhông phàn nàn về việc thiếu ký, nếu tôi hoàn toàn chắc chắn rằng nguồn cụ thể này đáng tin cậy!

Tóm lại: Tôi khá chắc chắn nix-servehoặc cơ chế kiểm tra chữ ký (hoặc cả hai) chỉ đơn giản là bị hỏng / không rõ ràng. Vì vậy, người ta có thể coi tất cả ít hơn là một câu hỏi, nhiều hơn là một ứng cử viên báo cáo lỗi. Nhưng nếu tôi sai - tốt hơn.

Câu trả lời:


9

Đây là cách bạn định cấu hình máy chủ và máy khách để sử dụng bộ đệm nhị phân đã ký được cung cấp thông qua nix-servelệnh. Điều này không yêu cầu sử dụng nix-pushđể tạo bộ đệm và bạn có thể phục vụ /nix/storetrực tiếp bằng phương pháp này.

Điều này được ghi lại trong man-page nix-pushvì vậy nếu bạn muốn biết thêm chi tiết, bạn cũng có thể kiểm tra xem

Cấu hình máy chủ

Ví dụ này giả định rằng tên máy chủ của máy chủ của bạn là cache.example.com.

Trước tiên, bạn cần tạo một cặp khóa ký bằng cách sử dụng nix-store --generate-binary-cache-key, như sau:

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

... chỉ cần thay thế cache.example.combằng bất kỳ tên máy chủ thích hợp nào cho máy chủ của bạn. Nó không phải khớp với tên máy chủ thực sự, nhưng sẽ rất hữu ích nếu chúng khớp với nhau để bạn có thể dễ dàng phân biệt máy chủ thuộc về máy chủ nào.

Nếu máy chủ bộ đệm của bạn đang chạy NixOSthì bạn có thể phục vụ bộ đệm của mình bằng cách thêm hai dòng này vào NixOStệp cấu hình của bạn :

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

... Và đảm bảo rằng nix-servengười dùng có quyền truy cập đọc vào nix-serve.seckhóa.

Nếu bạn không sử dụng NixOSvà bạn muốn phục vụ bộ đệm của mình trực tiếp bằng cách sử dụng nix-servetệp thực thi, thì bạn cần sử dụng NIX_SECRET_KEY_FILEbiến môi trường để chỉ định đường dẫn đến khóa bí mật, như sau:

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

Cấu hình máy khách

Nếu máy khách của bạn là một NixOSmáy, thì bạn có thể thêm các dòng này vào NixOStệp cấu hình của mình :

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

Nếu bạn không ở trên NixOSmáy thì bạn có thể chỉnh sửa thủ công nix.conftệp của mình để có các cài đặt sau:

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

Nếu bạn muốn cho phép một bộ nhớ cache nhị phân cho chỉ là một tòa nhà, bạn thay vì có thể vượt qua những lá cờ cấu hình bộ nhớ cache nhị phân trực tiếp đến bất kỳ tiện ích Nix như nix-buildhoặc nixos-rebuild, như thế này:

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:...="
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.