NixOS e segredos
(isabelroses.com)- No NixOS, se você deixar segredos em texto puro na configuração do Nix, em um repositório Git privado ou no
git-crypt, a Nix store fica legível por qualquer pessoa, então quem tiver acesso à máquina poderá ler os segredos - O sops-nix criptografa arquivos de segredos com regras em
.sops.yamle o fluxo de edição dosops, e na ativação os descriptografa com a chave SSH do host, deixando o texto puro em tmpfs em/run/secrets/<name> - O agenix define, em
secrets.nix, as chaves públicas destinatárias de cada segredo e descriptografa arquivos.agepara tmpfs em/run/agenix/<name>; ao adicionar um novo host ou trocar chaves, é preciso fazer rekey - A abordagem de manter segredos diretamente no sistema de arquivos pode servir para um único servidor ou notebook, mas deve-se evitar ler no momento da avaliação, como em
builtins.readFile "/var/lib/myservice/token", porque o valor vai parar na Nix store - Se você está começando e tem só alguns tokens independentes, o agenix exige menos etapas; se o host tem muitos segredos relacionados, como um servidor de e-mail, o sops-nix se encaixa melhor por agrupar vários valores em um só arquivo
Risco básico ao lidar com segredos no NixOS
- O gerenciamento de segredos no NixOS normalmente se divide entre
sops-nix,agenix/ragenix, uso do sistema de arquivos, repositórios Git privados,git-crypte escrever diretamente na configuração do Nix - Repositórios Git privados,
git-crypte escrever diretamente na configuração do Nix não devem ser usados se você compartilha a máquina ou pretende tornar a configuração pública- A Nix store pode ser lida por qualquer pessoa, então alguém com acesso à máquina pode ler os segredos
- Esse risco é especialmente importante quando existem vulnerabilidades como CVE-2026-31431(copyfail) e CVE-2026-43284 e CVE-2026-43500(dirtyfrag)
- Já houve pelo menos dois casos de vazamento de segredos em configurações públicas, e os exemplos seguem em 1, 2
sops-nix
- O sops-nix pode parecer difícil de configurar no começo, mas a documentação melhorou bastante, e o fato de o
sopsagora oferecer suporte nativo a criptografar e descriptografar segredos com chaves SSH é uma grande melhora - Ainda assim, o
sops-nixcontinua atrasado nesse suporte a chaves SSH, com trabalho em andamento em sops-nix#779 e sops-nix#922 - O fluxo de uso consiste em criar regras de criptografia/descriptografia em
.sops.yamle editar os arquivos de segredos com o comandosops- Um exemplo é definir chaves públicas SSH como destinatárias
agepara o caminhosecrets/*.yaml - Ao executar
sops secrets/shush.yaml, o editor escolhido é aberto, e você pode escrever valores YAML comohello: sops - Ao sair do editor, os valores são criptografados no formato
ENC[AES256_GCM,...], e o mesmo comando pode ser usado depois para editar novamente
- Um exemplo é definir chaves públicas SSH como destinatárias
- Na configuração do NixOS, o módulo
sops-nixcuida da maior parte do trabalhodefaultSopsFile = ./secrets/shush.yaml;define o arquivo padrão de segredosage.sshKeyPaths = [ "/etc/ssh/ssh_host_ed25519_key" ];define a chave SSH do host- Em
secrets."hello", você defineowner,groupemodepara configurar as permissões do arquivo
- No momento da ativação, o
sops-nixdescriptografa o arquivo com a chave SSH do host e deixa o texto puro em/run/secrets/<name>- Esse caminho fica em tmpfs, então os segredos não tocam o disco
- Os serviços que precisam do valor só precisam ler esse caminho
- O recurso de templates é útil em configurações compartilhadas ou referenciadas por outros usuários
- Quando um arquivo de configuração de serviço exige texto puro junto com alguns segredos, não é necessário criptografar o arquivo inteiro
- Por exemplo,
SMTP_USER=isabelpode ficar em texto puro, enquantoSMTP_PASSWORD=${config.sops.placeholder."mailserver/smtp_password"}pode ser usado como marcador do segredo
agenix
- O agenix, ao contrário do
sops-nix, configura os segredos e as chaves com acesso emsecrets.nix, o que dá uma sensação de uso mais próxima do Nix - Em
secrets.nix, você faz bindings das chaves públicas SSH de usuários e hosts e define quais chaves públicas podem acessar cada arquivo.age- Por exemplo,
"secret1.age".publicKeys = [ isabel host1 ];e"secret2.age".publicKeys = [ isabel host2 ];permitem listas diferentes de destinatários para cada segredo
- Por exemplo,
- Os arquivos de segredos precisam ser criados com a CLI do
agenix- O comando
agenix -e secret1.agecriasecret1.ageou permite editá-lo novamente depois
- O comando
- A forma de conectar isso à configuração do host é parecida com a do
sops-nix, mas cada segredo fica em um arquivo separado, então a superfície aparente é menorage.secrets.secret1.file = ./secrets/secret1.age;define o arquivoowner,groupemodedefinem proprietário e permissões
- Na inicialização, a chave SSH do host é usada para descriptografar cada arquivo
.ageem/run/agenix/<name>- Esse caminho também fica em tmpfs
- O ponto em que mais se tropeça é o rekeying
- Ao adicionar um novo host ou trocar chaves, todos os segredos cuja lista
publicKeysmudou emsecrets.nixprecisam ser criptografados novamente agenix --rekeyfaz isso, mas precisa da chave privada de um dos destinatários atuais para ler o texto cifrado existente- Na prática, o rekey costuma ser feito na máquina mais confiável, e não no host novo que você quer subir
- Ao adicionar um novo host ou trocar chaves, todos os segredos cuja lista
Abordagem usando apenas o sistema de arquivos
- Manter segredos diretamente no sistema de arquivos tem o custo de a configuração deixar de descrever completamente a máquina
- Em uma reinstalação, todos os arquivos precisam ser recolocados nos lugares corretos com a propriedade correta
- Em uma recuperação de servidor às 2 da manhã, isso pode virar um grande desastre
- O padrão a evitar é algo como
builtins.readFile "/var/lib/myservice/token"- Essa abordagem lê o arquivo no momento da avaliação e inclui o conteúdo na Nix store
- Como a Nix store pode ser lida por qualquer pessoa, isso vira exatamente o mesmo modo de falha alertado no começo
- Em vez disso, deve-se passar ao serviço o caminho, e não o valor em si
- Por exemplo, é possível usar opções como services.*.environmentFiles
- Em um único servidor ou notebook, isso pode ser aceitável, mas para uma frota ou para um ambiente que você queira reconstruir do zero só com a configuração,
sops-nixouagenixsão mais adequados - Também pode servir quando cada máquina tem um ou dois valores que realmente não devem entrar no repositório, mas aí a responsabilidade de recolocá-los no futuro fica para você mesmo
Comparando sops-nix e agenix
- O principal motivo para escolher
sops-nixé poder agrupar o máximo possível de dados em um único arquivo- Em casos com muitos segredos relacionados, como um servidor de e-mail, você pode manter mais segredos em um único arquivo em vez de dividi-los em cerca de cinco arquivos, como aconteceria com o
agenix - É uma ferramenta poderosa para uso contínuo e vale ser a primeira opção em hosts com muitos segredos, como um servidor de e-mail
- Em casos com muitos segredos relacionados, como um servidor de e-mail, você pode manter mais segredos em um único arquivo em vez de dividi-los em cerca de cinco arquivos, como aconteceria com o
- O
agenixse destaca pela simplicidade- Não há esquema YAML para aprender
- Não existe
.sops.yamlpara sincronizar - Como
secrets.nixé apenas Nix, você pode usar nas chaves os mesmos bindingslet ... inque já usa para hosts e usuários - O modelo mental é “um segredo, um arquivo, uma lista de destinatários”, o que combina bem com a forma de controle de acesso
- Como é a opção com menos peças móveis e ainda oferece controle de acesso por chave para cada host, é uma boa recomendação para quem pergunta pela primeira vez sobre gerenciamento de segredos em máquinas NixOS
- As duas ferramentas resolvem o problema, e hoje a diferença é principalmente de usabilidade
- Se você está começando e vários serviços exigem conjuntos de segredos relacionados, o
sops-nixescala melhor - Se você está começando e tem basicamente só alguns tokens independentes, o
agenixleva ao objetivo com menos etapas - Se for escolher sua primeira ferramenta de segredos, vale começar com
agenixpara se acostumar com o fluxo e migrar parasops-nixquando o desconforto real de “um arquivo por segredo” começar a pesar
- Se você está começando e vários serviços exigem conjuntos de segredos relacionados, o
- O trecho sobre resistência a computação quântica foi corrigido
1 comentários
Comentários no Lobste.rs
O segredo criptografado e a chave dele não ficam ambos no disco? Ou um dos dois fica armazenado em algum lugar como um TPM?
Comecei a usar Nix há pouco tempo e, em implantações pequenas de self-hosting, estou usando o método simples de colocar no sistema de arquivos com
scpPesquisando um pouco, parece que dá para proteger a chave privada SSH com TPM, e eu também estava me perguntando se isso funcionaria em VMs, mas ao ver que pode haver suporte a vTPM acabei encontrando minha própria resposta
Também existe a abordagem do NixOps no lado do servidor. Dá para ver como o Colmena faz: https://colmena.cli.rs/0.4/features/keys.html
A ideia central é que uma máquina confiável que tem os segredos faz o push para o servidor remoto. É parecido com o que você faz hoje com
scp, mas faz esse processo de um jeito mais alinhado ao NixComo passei as últimas noites reconfigurando a parte da família agenix no flake do meu sistema, só posso falar sobre agenix. Para quem tiver interesse, escolhi agenix-rekey, porque ele evita a necessidade de manter um arquivo
.ymlcom segredos e permite configurar todos os segredos diretamente no Nix, como talvez você já façaOs segredos criptografados ficam na Nix store e, como outras coisas na Nix store, são legíveis globalmente. A chave privada SSH que os descriptografa normalmente é a chave privada do servidor SSH real, embora opcionalmente não precise ser assim. Os segredos são descriptografados no momento da ativação, aproximadamente no boot, e colocados em
/run/agenix/<user>Uma ferramenta chamada secrix vai além e vincula segredos a serviços systemd, e depois vincula esse serviço ao serviço que precisa do segredo. Assim, o segredo só fica descriptografado enquanto aquele serviço estiver em execução. Na prática, porém, usuários de NixOS raramente ficam iniciando e parando serviços com frequência, então na maioria dos casos isso acaba significando “enquanto o sistema estiver rodando”. Pode fazer sentido para segredos usados na ativação do sistema, como criação de usuários
O agenix-rekey torna o rekey menos trabalhoso e substitui
secrets.nixpor saídas do flake. Em uma das metades da chave ele usa um split ID do YubiKey. O rekey consiste em autenticar com essa chave e a outra metade para descriptografar o segredo, depois criptografá-lo novamente para a chave pública SSH do servidor. A chave pública é gerada no momento da instalação do sistema, e eu uso--copy-host-keysno nixos-anywhere para pegar a chave gerada no closure de instalação. Eu deixo os segredos criptografados no repositório, mas em um submódulo separado acessível apenas a builders confiáveisSó para constar, vTPM normalmente não é baseado em hardware, e muitos provedores, mesmo quando oferecem TPM, geralmente oferecem apenas TPM v1.2 e não TPM v2. Esse é o caso do meu provedor, a BinaryLane. É verdade que isso adiciona uma camada extra de segurança, mas não é um HSM mágico como um TPM de verdade, e não protege contra comprometimento do provedor ou do nó hospedeiro. Para permitir vTPM real baseado em HSM, imagino que o custo para o provedor seria bem alto, e a AWS aparentemente oferece isso a preço de AWS
agenix+agenix-rekey+age-plugin-1pMinha chave mestra fica no 1Password, então consigo editar, visualizar e fazer rekey das senhas de qualquer servidor sem deixar nenhuma credencial no disco do notebook
Também posso conceder acesso a servidores que precisam de acesso à chave em tempo de execução. Você informa ao agenix-rekey quais chaves aquele servidor pode ver e executa
agenix rekey; então uma versão criptografada da chave, que aquele servidor pode descriptografar, é gravada na Nix store. A chave privada SSH do servidor fica apenas naquele servidor e nunca sai de lá. O agenix-rekey só precisa da chave pública para fazer o rekeyPortanto, os casos em que meus segredos seriam comprometidos são: minha conta do 1Password ser invadida, ou o servidor que usa aquele segredo ser comprometido
/etc/ssh/ssh_host_ed25519_keye depois colocado em um ramfs montado em/run/agenix.dEntão sim. O conteúdo criptografado, a chave de criptografia e o conteúdo descriptografado ficam todos acessíveis no sistema de arquivos
https://github.com/oddlama/agenix-rekey
Além disso, credenciais de longa duração estão ficando cada vez menos comuns. Estamos saindo da cópia de credenciais de longo prazo e indo para credenciais baseadas em hardware, usando-as diretamente ou trocando-as por credenciais de curta duração