O cache do Nix local é ignorado porque o arquivo de informações do NAR não possui uma assinatura

6

[parcialmente resolvido aqui: link ; mas não inteiramente]

Eu quero usar uma das minhas máquinas NixOS como um cache para os pacotes, para não puxar tudo da Hydra para cada um em cada atualização. Então eu tento fazer isso: link . Mas

  • Quando tento usar nix-serve -p <port> , nix-env --option extra-binary-caches http://<host>:<port>/ (mesmo quando executado como root !) simplesmente ignora esse cache, dizendo que "arquivo de informações NAR" ... "não possui uma assinatura", e tenta mudar para cache.nixos.org . Portanto, nix-serve não funciona como esperado. Isso significa que a documentação não é mais real ou que nix-serve está quebrado?

  • Enquanto nix-copy-closure --to <user>@<host> funciona (se <user> for adicionado como usuário confiável em nix.trustedUsers ). Mas fazer isso em cada atualização seria muito inconveniente. BTW. O que também me intriga aqui é como o --from deve ser usado?

Tenho uma compreensão geral de como as assinaturas criptográficas funcionam e por que são usadas para assinar pacotes (e repositórios). Mas

  • Nestas circunstâncias, eu simplesmente não preciso disso: o risco de um MITM não é algo para se preocupar. Eu só quero copiar alguns GiB's de binários de uma máquina para outra, regularmente e sem esforço. Eu poderia, é claro, simplesmente desabilitar a verificação completamente via nix.requireSignedBinaryCaches = false , mas não há uma maneira menos radical? Se, digamos, eu invoco nix-env as root , ou como um "usuário confiável" e tenho esse cache binário "extra" registrado como "cache binário confiável"; Isso não significa que eu sei o que estou fazendo e não preciso do sistema importunando a falta de assinaturas? (sem a necessidade de desabilitar a verificação) Eu não encontrei como desabilitar a verificação apenas para uma certa fonte / usuário "confiável", e suspeito que ela não existe (por exemplo, bug).

  • Eu provavelmente também poderia, para obedecer a esse mecanismo de assinatura, tentar configurar um cache binário "completo", usando nix-store --generate-binary-cache-key , depois nix-push --dest <somewhere> --key-file <secret-1> --none <cherrypicked-paths> e registrando a chave pública em os clientes). Mas não é bem o que eu quero: armazenar os arquivos no "servidor" e definir os caminhos para nix-push explicitamente. Eu só quero que nix-serve assine esses pacotes compartilhados antes da entrega, para que o lado de recebimento seja feliz, ou nix-env para não reclamar da falta de assinatura, se eu tiver certeza absoluta de que essa fonte em particular é confiável!

Em conclusão: Tenho certeza de que nix-serve ou o mecanismo de verificação de assinatura (ou ambos) estão simplesmente quebrados / não-mantidos. Então, pode-se considerar tudo menos como uma pergunta, mais como um candidato a um relatório de bug. Mas se eu estiver errado - ainda melhor.

    
por Andrew Miloradovsky 14.07.2016 / 20:14

1 resposta

7

Aqui está como você configura o servidor e o cliente para usar um cache binário com sinal fornecido por meio do comando nix-serve . Isso não requer o uso de nix-push para gerar o cache e você pode servir seu /nix/store diretamente usando este método.

Isso está documentado na man -page para nix-push , por isso, se você quiser mais detalhes, também pode verificar isso.

Configuração do servidor

Este exemplo assume que o nome do host do seu servidor é cache.example.com .

Primeiro, você precisa gerar um par de chaves de assinatura usando nix-store --generate-binary-cache-key , assim:

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

... apenas substituindo cache.example.com por qualquer nome de host apropriado para seu servidor. Ele não precisa corresponder ao nome do host real, mas ajuda se eles corresponderem para que você possa distinguir facilmente a qual servidor uma chave pública pertence.

Se o seu servidor de cache estiver executando NixOS , você poderá servir seu cache adicionando essas duas linhas ao arquivo de configuração NixOS :

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

... e certifique-se de que o usuário nix-serve tenha acesso de leitura à chave nix-serve.sec .

Se você não estiver usando NixOS e quiser servir seu cache diretamente usando o executável nix-serve , será necessário usar a variável de ambiente NIX_SECRET_KEY_FILE para especificar o caminho para a chave secreta, desta forma:

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

Configuração do cliente

Se a sua máquina cliente for uma máquina NixOS , você poderá adicionar essas linhas ao arquivo de configuração 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:...="
];

Se você não estiver em uma máquina NixOS , poderá editar manualmente o arquivo nix.conf para ter as seguintes configurações:

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

Se você preferir ativar um cache binário para apenas uma compilação, poderá passar esses flags de configuração de cache binário diretamente para qualquer utilitário Nix como nix-build ou nixos-rebuild , desta forma:

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:...="
    
por 15.09.2016 / 02:12

Tags