
Uma ferramenta de linha de comando para fazer backup, restaurar e verificar segredos de forma segura usando padrões interoperáveis como criptografia age e coreutils, garantindo acessibilidade de longo prazo sem dependência de fornecedor.
secs-man é uma ferramenta para gerenciar backups de segredos com independência de ferramenta em mente: se você criptografar seus segredos com este software, você deve ser capaz de decifrá-los e restaurá-los sem este software. Mesmo que o secs-man desapareça da face da Terra, seus dados ainda estarão acessíveis.
secs-man pode ser usado para gerenciar segredos de máquinas locais e remotas, e é ideal para criar backups apenas locais para dados que são muito sensíveis para serem armazenados em algum lugar na nuvem.
Você não deve depender de nenhum software específico para fazer backup de seus dados extremamente importantes.
Qualquer software que force você a permanecer em seu ecossistema após o uso (como: "se você criptografar com este software, só pode decifrar com este software") torna você dependente dele.
Portanto, a criptografia, decifração e restauração de seus dados importantes devem ser desacopladas, ou seja, se você criptografou com o software X, ainda deve ser capaz de decifrá-lo sem o software X.
Na prática, você não pode criar uma configuração onde seus segredos estejam 100% seguros contra perda de dados. Mesmo que seu software X seja compatível com Y, Z e W, você ainda perderá o acesso aos seus dados se X, Y, Z e W pararem de funcionar ao mesmo tempo.
O que você faz na prática é garantir que depende apenas de tecnologias que sejam "padrões" ou próximas a isso. Estou bem em depender da existência de interpretadores bash, portas USB e máquinas Linux.
O verdadeiro objetivo do secs-man então se torna ser perfeitamente reproduzível apenas com:
cp, mv e sha256sumA dependência do
ageé a mais delicada, mas a dependência de alguma biblioteca criptográfica é inevitável, e oagetem grande popularidade e boas ligações em Rust.
Isso garante que mesmo que algo aconteça com este software que impeça você de usá-lo novamente, assumindo que o age ainda exista e que você esteja disposto a gastar 30 minutos da sua vida, você ainda poderá recuperar todos os seus segredos.
A seção recuperação manual explica como importar os segredos exportados por este software sem usar este software, ou seja, apenas com coreutils, age e um terminal.
secs-man não está publicado em nenhum lugar (não é uma crate publicada, nem está no nixpkgs, AUR ou similar). Só pode ser instalado diretamente deste repositório, de uma das seguintes maneiras.
nix runSe você só precisa executar o secs-man ocasionalmente, pode executá-lo diretamente sem instalá-lo (requer flakes ativados)
nix run github:Fran314/secrets-manager-rs -- export /path/to/secrets /path/to/export/endpoint
Para disponibilizar o secs-man em todo o sistema, você pode importar este repositório na sua configuração Nix com fetchGit e adicionar o pacote resultante a environment.systemPackages (ou home.packages com home-manager)
let
secs-man = pkgs.callPackage "${builtins.fetchGit {
url = "https://github.com/Fran314/secrets-manager-rs.git";
ref = "main";
# rev = "<commit>"; # pin a specific commit for reproducibility
}}/default.nix" { };
in
# add `secs-man` to environment.systemPackages or home.packages
cargoSe você não está no NixOS, pode instalar o binário secs-man apontando o cargo para este repositório
cargo install --git https://github.com/Fran314/secrets-manager-rs
note que nenhum desses métodos instala o script secs-man-ssh necessário para máquinas remotas: é um script independente que deve ser copiado deste repositório separadamente
Esta ferramenta permite exportar e criptografar arquivos de um diretório de origem e recuperá-los importando para o mesmo diretório. A maneira recomendada de usar esta ferramenta é ter todos os seus "segredos" (chaves, arquivos, ...) em um diretório centralizado.
Na raiz do diretório de segredos deve haver um arquivo de texto .secrets-manifest contendo a lista de segredos a serem gerenciados, na forma de caminhos relativos ao diretório de segredos. Caminhos de arquivo não podem conter espaços em branco. Cada entrada também pode especificar um owner e um mode que serão usados para definir as permissões corretas durante a importação. Veja .secrets-manifest.example para a sintaxe.
Durante uma exportação, os arquivos listados no manifesto são criptografados através do age com uma senha solicitada através de um prompt interativo (secs-man nunca a lê de um arquivo, argumento ou variável de ambiente). A mesma senha é solicitada novamente na importação, para decifrar os arquivos. A integridade dos arquivos é garantida por um arquivo *.sha256 companheiro, que é gerado automaticamente se estiver faltando. Os arquivos criptografados são exportados para um snapshot com timestamp dentro do diretório de destino da exportação.
Os arquivos podem então ser decifrados e importados apontando para o diretório de destino da exportação (para importar o snapshot mais recente) ou para um snapshot específico dentro deste diretório.
Os seguintes comandos podem ser executados sem sudo, no entanto, falharão se o manifesto especificar um proprietário diferente do usuário que executa o comando (pois a chamada interna de chown falhará).
Para exportar seus segredos, execute
sudo secs-man export /path/to/secrets /path/to/export/endpoint
Para verificar a integridade de uma exportação existente (veja nota abaixo), execute
# to verify the integrity of all the exported snapshots
sudo secs-man verify-export /path/to/export/endpoint
# to verify the integrity of a specific snapshot
sudo secs-man verify-export /path/to/export/endpoint/export-YYYY-MM-DD_HH-MM-SSZ
note que uma verificação de integridade é feita automaticamente a cada exportação. Isso é necessário apenas se você quiser verificar a integridade de uma exportação antiga que pode ter se degradado e corrompido
Para importar seus segredos, execute
# to import the latest snapshot
sudo secs-man import /path/to/export/endpoint /path/to/secrets
# to import a specific snapshot
sudo secs-man import /path/to/export/endpoint/export-YYYY-MM-DD_HH-MM-SSZ /path/to/secrets
# to import only specific secrets
sudo secs-man import /path/to/export/endpoint /path/to/secrets --pick ssh/id_ed25519 wg/wg0.key
Esta ferramenta também pode ser usada para implantar e fazer backup de segredos em máquinas remotas.
A maneira mais fácil de exportar segredos remotos é exportá-los em um diretório temporário no host remoto e, em seguida, copiar o snapshot exportado para um backup local. Da mesma forma, para importar um backup local, a abordagem mais fácil é copiar o snapshot local para um diretório temporário no host remoto e, em seguida, importá-los de lá. No entanto, isso tem o problema de que a senha de criptografia/decifração precisa passar pelo host remoto, que pode ser considerado não confiável.
Para implantar em / fazer backup de hosts remotos não confiáveis sem passar a senha pelo remoto, você pode usar o script secs-man-ssh. Este script não assume login remoto como root via SSH (pois pode estar desabilitado por razões de segurança), mas assume que o usuário remoto tem privilégios sudo (para permitir que o secs-man execute chown e chmod).
Para exportar de um host remoto, execute:
secs-man-ssh export <user@host> <remote-secrets-dir> <local-backup>
# The flow is the following:
# 1. the script copies the remote secrets to a temporary directory on the remote host
# 2. the temporary directory gets chowned to the remote normal user, so that it can be sudo-less read and copied locally
# 3. the temporary directory is copied on the local host and deleted from the remote host
# 4. the local directory gets exported to the local backup, then deleted
Para importar para um host remoto, execute:
# secs-man has to be installed on the remote for the script import to work
secs-man-ssh import <user@host> <local-container> <remote-secrets-dir>
# The flow is the following:
# 1. the latest snapshot gets imported to a temporary local directory with the `--skip-chown-chmod` flag, so that it can be sudo-less read and copied to the remote host
# 2. the local directory gets copied to the remote host in a temporary directory, and deleted from the local host
# 3. the remote temporary directory gets imported to the remote secrets directory with `--from-plaintext`, as the files have already been decrypted
# 4. the remote temporary directory is deleted
Arquivos exportados são criptografados usando age com uma senha. O nome do arquivo exportado é o nome original com a extensão adicional .age.
Para obter o mesmo comportamento, você pode usar o seguinte:
age --passphrase --output filename.txt.age --encrypt filename.txt
Observe que:
Verificar a integridade de uma exportação consiste em verificar se cada soma de verificação corresponde. Para isso, basta executar
find . -name "sha256sums.txt" -execdir sha256sum -c sha256sums.txt \;
no diretório do snapshot exportado
Arquivos importados são decifrados usando age com uma senha. O nome do arquivo importado é o nome exportado sem a extensão .age. Se owner e/ou mode forem especificados no manifesto para uma determinada entrada, o arquivo importado é definido com o proprietário e modo especificados. Se nenhum modo for especificado, o padrão é 600.
Para obter o mesmo comportamento, você pode usar o seguinte:
age --output filename.txt --decrypt filename.txt.age
# if no mode is specified, it defaults to 600
chmod <mode> filename.txt
# if no owner is specified, skip this step
chown <owner> filename.txt
Observe que:
Esta ferramenta cria automaticamente snapshots durante a exportação que não são limpos pela própria ferramenta. Isso significa que algum cuidado deve ser tomado ao exportar segredos com esta ferramenta.
Ao exportar segredos de "autenticação" (chaves SSH/WireGuard, tokens), que podem ser facilmente rotacionados, a existência do snapshot não apresenta risco adicional.
No entanto, ao exportar segredos de "decifração" (chaves de disco, identidades age/PGP, chave mestra do gerenciador de senhas), a existência dos snapshots significa que, se os segredos dentro das exportações vazarem e forem de alguma forma decifrados, um atacante poderia ter acesso a chaves de decifração atuais e passadas. Por esse motivo, ao rotacionar segredos de "decifração", seria seguro também excluir snapshots antigos exportados (o que pode ser feito facilmente com rm -r /caminho/para/destino/exportação/export-YYYY-MM-DD_HH-MM-SSZ). Note que o caminho crítico que expõe chaves de decifração antigas também implica o conhecimento dos segredos atuais, o que provavelmente é uma preocupação maior.