
비밀을 안전하게 백업, 복원 및 검증하기 위한 명령줄 도구입니다. age 암호화 및 coreutils와 같은 상호 운용 가능한 표준을 사용하여 장기적인 접근성을 보장하고 벤더 종속을 피합니다.
secs-man은 도구 독립성을 염두에 둔 비밀 백업 관리 도구입니다: 이 소프트웨어로 비밀을 암호화하면 이 소프트웨어 없이도 복호화하고 복원할 수 있습니다. secs-man이 지구상에서 사라져도 데이터는 여전히 접근 가능합니다.
secs-man은 로컬 및 원격 머신의 비밀을 관리하는 데 사용할 수 있으며, 클라우드에 백업하기에는 너무 민감한 데이터를 로컬 전용 백업으로 생성하는 데 이상적입니다.
매우 중요한 데이터를 백업하기 위해 특정 소프트웨어에 의존해서는 안 됩니다.
사용 후에도 그 생태계에 머물도록 강요하는 소프트웨어(예: "이 소프트웨어로 암호화하면 이 소프트웨어로만 복호화할 수 있습니다")는 그 소프트웨어에 의존하게 만듭니다.
따라서 중요한 데이터의 암호화, 복호화 및 복원은 분리되어야 합니다. 즉, 소프트웨어 X로 암호화했더라도 소프트웨어 X 없이도 복호화할 수 있어야 합니다.
실제로 비밀이 데이터 손실로부터 100% 안전한 설정을 만들 수는 없습니다. 소프트웨어 X가 Y, Z, W와 호환되더라도 X, Y, Z, W가 모두 동시에 작동을 멈추면 데이터에 접근할 수 없게 됩니다.
실제로 하는 것은 "표준"에 가깝거나 표준인 기술에만 의존하도록 하는 것입니다. 저는 bash 인터프리터, USB 포트, Linux 머신의 존재에 의존하는 것은 괜찮습니다.
그러면 secs-man의 진정한 목표는 다음만으로 완벽하게 재현 가능해지는 것입니다:
cp, mv, sha256sum과 같은 coreutils
age에 대한 의존성이 가장 까다롭지만, 어떤 암호화 라이브러리에 대한 의존성은 피할 수 없으며,age는 인기가 많고 Rust에 좋은 바인딩을 가지고 있습니다.
이를 통해 이 소프트웨어에 어떤 일이 생겨 다시 사용할 수 없게 되더라도, age가 여전히 존재하고 30분 정도 시간을 투자할 의향이 있다면 모든 비밀을 복구할 수 있습니다.
수동 복구 섹션에서는 이 소프트웨어를 사용하지 않고 coreutils, age 및 터미널만으로 이 소프트웨어가 내보낸 비밀을 가져오는 방법을 설명합니다.
secs-man은 어디에도 출판되지 않았습니다(게시된 크레이트도 아니고, nixpkgs, AUR 등에도 없습니다). 다음 방법 중 하나로 이 저장소에서 직접 설치할 수 있습니다.
nix run 사용secs-man을 가끔만 실행해야 한다면, 설치하지 않고 직접 실행할 수 있습니다 (flakes 활성화 필요)
nix run github:Fran314/secrets-manager-rs -- export /path/to/secrets /path/to/export/endpoint
secs-man을 시스템 전체에서 사용할 수 있게 하려면 Nix 구성에서 fetchGit으로 이 저장소를 가져오고 결과 패키지를 environment.systemPackages(또는 home-manager를 사용하는 경우 home.packages)에 추가할 수 있습니다.
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
cargo 사용NixOS를 사용하지 않는다면, cargo를 이 저장소에 지정하여 secs-man 바이너리를 설치할 수 있습니다.
cargo install --git https://github.com/Fran314/secrets-manager-rs
참고: 이 방법들 중 어느 것도 원격 머신에 필요한 secs-man-ssh 스크립트를 설치하지 않습니다. 이 스크립트는 이 저장소에서 별도로 복사해야 하는 독립형 스크립트입니다.
이 도구는 주어진 소스 디렉토리에서 파일을 내보내고 암호화하며, 동일한 디렉토리로 가져와 복구할 수 있습니다. 이 도구를 사용하는 권장 방법은 모든 "비밀"(키, 파일 등)을 중앙 집중식 디렉토리에 두는 것입니다.
비밀 디렉토리의 루트에는 비밀 디렉토리에 상대적인 경로 형식으로 관리할 비밀 목록이 포함된 .secrets-manifest 일반 텍스트 파일이 있어야 합니다. 파일 경로에는 공백이 포함될 수 없습니다. 각 항목은 가져오기 중에 올바른 권한을 설정하는 데 사용될 owner 및 mode를 지정할 수도 있습니다. 구문은 .secrets-manifest.example을 참조하세요.
내보내기 중에 매니페스트에 나열된 파일은 대화형 프롬프트를 통해 요청된 암호로 age를 통해 암호화됩니다(secs-man은 파일, 인수 또는 환경 변수에서 암호를 읽지 않습니다). 가져오기 시 동일한 암호가 다시 요청되어 파일을 복호화합니다. 파일의 무결성은 동반되는 *.sha256 파일에 의해 보장되며, 이 파일은 없으면 자동으로 생성됩니다. 암호화된 파일은 내보내기 대상 디렉토리 내의 타임스탬프가 있는 스냅샷으로 내보내집니다.
그런 다음 파일은 내보내기 대상 디렉토리(최신 스냅샷 가져오기) 또는 이 디렉토리 내의 특정 스냅샷을 지정하여 복호화하고 가져올 수 있습니다.
다음 명령은 sudo 없이 실행할 수 있지만, 매니페스트가 명령을 실행하는 사용자와 다른 소유자를 지정하는 경우 실패합니다(내부 chown 호출이 실패하기 때문에).
비밀을 내보내려면 다음을 실행하세요.
sudo secs-man export /path/to/secrets /path/to/export/endpoint
기존 내보내기의 무결성을 확인하려면(아래 참고 참조) 다음을 실행하세요.
# 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
참고: 무결성 검사는 모든 내보내기에서 자동으로 수행됩니다. 이는 손상될 가능성이 있는 오래된 내보내기의 무결성을 확인하려는 경우에만 필요합니다.
비밀을 가져오려면 다음을 실행하세요.
# 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
이 도구는 원격 머신에 비밀을 배포하고 백업하는 데에도 사용할 수 있습니다.
원격 비밀을 내보내는 가장 쉬운 방법은 원격 호스트의 임시 디렉토리에 내보낸 다음 내보낸 스냅샷을 로컬 백업에 복사하는 것입니다. 마찬가지로 로컬 백업을 가져오는 가장 쉬운 방법은 로컬 스냅샷을 원격 호스트의 임시 디렉토리에 복사한 다음 거기서 가져오는 것입니다. 그러나 이 방법은 암호화/복호화 암호가 원격 호스트를 통과해야 하며, 이는 신뢰할 수 없는 것으로 간주될 수 있다는 문제가 있습니다.
암호를 원격으로 전달하지 않고 신뢰할 수 없는 원격 호스트에 배포하거나 백업하려면 secs-man-ssh 스크립트를 사용할 수 있습니다. 이 스크립트는 SSH를 통한 루트 로그인을 가정하지 않지만(보안상 비활성화될 수 있으므로), 원격 사용자가 sudo 권한을 가지고 있다고 가정합니다(secs-man이 chown 및 chmod를 실행할 수 있도록).
원격 호스트에서 내보내려면 다음을 실행하세요:
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
원격 호스트로 가져오려면 다음을 실행하세요:
# 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
내보낸 파일은 암호를 사용하여 age로 암호화됩니다. 내보낸 파일의 이름은 원래 이름에 추가 확장자 .age가 붙습니다.
동일한 동작을 얻으려면 다음을 사용할 수 있습니다:
age --passphrase --output filename.txt.age --encrypt filename.txt
참고:
내보내기의 무결성을 확인하는 것은 모든 체크섬이 일치하는지 확인하는 것입니다. 그러려면 다음을 실행하면 됩니다.
find . -name "sha256sums.txt" -execdir sha256sum -c sha256sums.txt \;
내보낸 스냅샷 디렉토리에서
가져온 파일은 암호를 사용하여 age로 복호화됩니다. 가져온 파일의 이름은 .age 확장자가 없는 내보낸 이름입니다. 특정 항목에 대해 매니페스트에서 owner 및/또는 mode가 지정된 경우 가져온 파일은 지정된 소유자와 모드로 설정됩니다. 모드가 지정되지 않은 경우 기본값은 600입니다.
동일한 동작을 얻으려면 다음을 사용할 수 있습니다:
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
참고:
이 도구는 내보내기 중에 스냅샷을 자동으로 생성하며, 이 스냅샷은 도구 자체에 의해 정리되지 않습니다. 즉, 이 도구로 비밀을 내보낼 때 주의가 필요합니다.
쉽게 교체할 수 있는 "인증" 비밀(SSH/WireGuard 키, 토큰)을 내보낼 때 스냅샷의 존재는 추가적인 위험을 초래하지 않습니다.
하지만 "복호화" 비밀(디스크 키, age/PGP ID, 비밀번호 관리자 마스터 키)을 내보낼 때 스냅샷이 존재한다는 것은, 내보내기 내의 비밀이 유출되어 어떻게든 복호화된다면 공격자가 현재 및 과거의 복호화 키에 접근할 수 있음을 의미합니다. 이러한 이유로 "복호화" 비밀을 교체할 때는 오래된 내보내기 스냅샷도 삭제하는 것이 안전합니다(rm -r /path/to/export/endpoint/export-YYYY-MM-DD_HH-MM-SSZ로 쉽게 수행 가능). 과거 복호화 키를 노출하는 중요 경로는 현재 비밀에 대한 지식도 암시하며, 이는 아마도 더 큰 문제일 수 있습니다.