
Uno strumento da riga di comando per eseguire in modo sicuro il backup, il ripristino e la verifica dei segreti utilizzando standard interoperabili come age encryption e coreutils, garantendo l'accessibilità a lungo termine senza vincoli al fornitore.
secs-man è uno strumento per gestire backup di segreti pensando all'indipendenza dal software: se crittografi i tuoi segreti con questo software, dovresti essere in grado di decrittarli e ripristinarli senza questo software. Anche se secs-man sparisse dalla faccia della Terra, i tuoi dati sarebbero comunque accessibili.
secs-man può essere usato per gestire segreti di macchine locali e remote, ed è ideale per creare backup solo locali per dati troppo sensibili per essere salvati da qualche parte nel cloud.
Non dovresti dipendere da alcun software specifico per il backup dei tuoi dati estremamente importanti.
Qualsiasi software che ti costringa a rimanere nel suo ecosistema dopo l'uso (come: "se crittografi qualcosa con questo software, puoi decrittarlo solo con questo software") ti rende dipendente da esso.
Quindi, crittografia, decrittografia e ripristino dei tuoi dati importanti dovrebbero essere disaccoppiati: se li hai crittografati con il software X, dovresti comunque essere in grado di decrittarli senza il software X.
In pratica, non puoi creare una configurazione in cui i tuoi segreti siano al 100% al sicuro dalla perdita di dati. Anche se il tuo software X è compatibile con Y, Z e W, perderesti comunque l'accesso ai tuoi dati se X, Y, Z e W smettessero tutti di funzionare contemporaneamente.
Quello che fai in pratica è assicurarti di dipendere solo da tecnologie che sono "standard" o quasi. Per me va bene dipendere dall'esistenza di interpreti bash, porte USB e macchine Linux.
Il vero obiettivo di secs-man diventa quindi essere perfettamente riproducibile solo con:
cp, mv e sha256sumLa dipendenza da
ageè la più delicata, ma la dipendenza da qualche libreria crittografica è inevitabile, eageha sia una grande popolarità sia ottimi binding in Rust.
Questo garantisce che, anche se accadesse qualcosa a questo software che ti impedisse di usarlo di nuovo, supponendo che age esista ancora e che tu sia disposto a spendere 30 minuti della tua vita, potresti comunque recuperare tutti i tuoi segreti.
La sezione recupero manuale spiega come importare i segreti esportati da questo software senza usare questo software, cioè solo con coreutils, age e un terminale.
secs-man non è pubblicato da nessuna parte (non è una crate pubblicata, né è su nixpkgs, AUR o simili). Può essere installato solo direttamente da questo repository, in uno dei seguenti modi.
nix runSe devi eseguire secs-man solo occasionalmente, puoi eseguirlo direttamente senza installarlo (richiede i flakes abilitati)
nix run github:Fran314/secrets-manager-rs -- export /path/to/secrets /path/to/export/endpoint
Per rendere secs-man disponibile a livello di sistema, puoi importare questo repository nella tua configurazione Nix con fetchGit e aggiungere il pacchetto risultante a environment.systemPackages (o home.packages con 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 non sei su NixOS, puoi installare il binario secs-man puntando cargo a questo repository
cargo install --git https://github.com/Fran314/secrets-manager-rs
nota che nessuno di questi metodi installa lo script secs-man-ssh necessario per le macchine remote: è uno script autonomo che deve essere copiato separatamente da questo repository
Questo strumento consente di esportare e crittografare file da una determinata directory sorgente e di recuperarli importandoli nella stessa directory. Il modo consigliato per usare questo strumento è avere tutti i tuoi "segreti" (chiavi, file, ...) in una directory centralizzata.
Nella directory dei segreti, alla radice, dovrebbe esserci un file plaintext .secrets-manifest contenente l'elenco dei segreti da gestire, sotto forma di percorsi relativi alla directory dei segreti. I percorsi dei file non possono contenere spazi bianchi. Ogni voce può inoltre specificare un owner e una mode che verranno usati per impostare i permessi corretti durante l'importazione. Vedi .secrets-manifest.example per la sintassi.
Durante un'esportazione, i file elencati nel manifest vengono crittografati tramite age con una passphrase richiesta tramite un prompt interattivo (secs-man non la legge mai da un file, da un argomento o da una variabile d'ambiente). La stessa passphrase viene richiesta di nuovo all'importazione, per decrittare i file. L'integrità dei file è garantita da un file *.sha256 associato, che viene generato automaticamente se manca. I file crittografati vengono esportati in uno snapshot con timestamp all'interno della directory di destinazione dell'esportazione.
I file possono quindi essere decrittati e importati puntando alla directory di destinazione dell'esportazione (per importare lo snapshot più recente) o a uno snapshot specifico all'interno di questa directory.
I seguenti comandi possono essere eseguiti senza sudo, tuttavia falliranno se il manifest specifica un owner diverso dall'utente che esegue il comando (poiché la chiamata chown interna fallirà).
Per esportare i tuoi segreti, esegui
sudo secs-man export /path/to/secrets /path/to/export/endpoint
Per verificare l'integrità di un'esportazione esistente (vedi nota sotto), esegui
# 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
nota che un controllo di integrità viene eseguito automaticamente a ogni esportazione. Serve solo se vuoi verificare l'integrità di una vecchia esportazione che potrebbe essersi deteriorata e corrotta
Per importare i tuoi segreti, esegui
# 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
Questo strumento può essere usato anche per distribuire e fare il backup di segreti su macchine remote.
Il modo più semplice per esportare segreti remoti è esportarli in una directory temporanea sull'host remoto e poi copiare lo snapshot esportato in un backup locale. Allo stesso modo, per importare un backup locale, l'approccio più semplice è copiare lo snapshot locale in una directory temporanea sull'host remoto e poi importarlo da lì. Tuttavia, questo ha il problema che la passphrase di crittografia/decrittografia deve passare attraverso l'host remoto, che potrebbe essere considerato non fidato.
Per distribuire su host remoti non fidati / eseguire il backup da essi senza far passare la passphrase attraverso il remoto, puoi usare lo script secs-man-ssh. Questo script non presuppone il login root via SSH (poiché potrebbe essere disabilitato per motivi di sicurezza), ma presuppone che l'utente remoto abbia privilegi sudo (per consentire a secs-man di eseguire chown e chmod).
Per esportare da un host remoto, esegui: