신원 파일(SSH/GPG)을 손상 없이 백업하려면 어떻게 해야 할까요?
Source: Dev.to
내 신원 파일(SSH/GPG) 백업을 안전하게 하는 방법
왜 백업이 필요할까?
SSH 개인키와 GPG 비밀키는 내가 가장 중요한 인증 수단이다.
키를 분실하면:
- 원격 서버에 접근할 수 없게 된다.
- 암호화된 메일을 복호화할 수 없게 된다.
- 서명된 커밋을 재작성하거나 검증할 수 없게 된다.
따라서 안전하게 백업해 두는 것이 필수다. 하지만 백업을 만들면서 키 자체가 노출되지 않도록 해야 한다.
백업을 만들 때 피해야 할 실수
| 실수 | 위험도 |
|---|---|
| 평문으로 파일을 클라우드에 업로드 | 키가 바로 탈취당함 |
| 백업에 비밀번호를 쓰지 않음 | 누군가 파일을 복사하면 바로 사용 가능 |
| 백업을 여러 곳에 동일하게 저장 | 한 곳이 해킹당하면 모든 복사본이 위험 |
| 백업을 오래 보관하지 않음 | 키를 잃어버렸을 때 복구 불가 |
안전한 백업 전략
1. 암호화된 아카이브 만들기 (GPG 대칭 암호화)
# 1) 백업할 파일을 하나의 디렉터리로 모음
mkdir -p ~/backup-identity
cp ~/.ssh/id_rsa* ~/backup-identity/
gpg --export-secret-keys > ~/backup-identity/gpg-secret-keys.asc
# 2) tar 로 압축
tar -czf ~/backup-identity.tar.gz -C ~/backup-identity .
# 3) GPG 대칭 암호화 (패스프레이즈 입력)
gpg -c ~/backup-identity.tar.gz
# 결과: backup-identity.tar.gz.gpg
-c옵션은 대칭 암호화이며, 복호화 시 동일한 패스프레이즈가 필요하다.- 강력하고 고유한 패스프레이즈를 사용하고, 패스프레이즈 관리 툴(예: 1Password, Bitwarden) 에 저장한다.
2. age 로 경량 암호화
# age 키 생성 (한 번만 실행)
age-keygen -o ~/.config/age/keys.txt
# 백업 파일 암호화
age -r $(cat ~/.config/age/keys.txt | grep "^public key:" | cut -d' ' -f3) \
-o backup-identity.tar.gz.age backup-identity.tar.gz
age는 현대적인 대칭/비대칭 암호화를 제공하며, 사용법이 간단하다.- 복호화는
age -d -i ~/.config/age/keys.txt -o backup-identity.tar.gz backup-identity.tar.gz.age로 수행한다.
3. sops 로 파일 단위 암호화
# sops.yaml (키 관리 설정)
creation_rules:
- pgp: "YOUR_GPG_KEY_ID"
encrypted_regex: "^(data|secret)$"
# 예시: SSH 개인키를 JSON 형태로 변환 후 sops 로 암호화
jq -n --arg key "$(cat ~/.ssh/id_rsa)" '{"ssh_private_key": $key}' > ssh-key.json
sops -e -i ssh-key.json
sops는 다중 키(GPG, AWS KMS, Azure Key Vault 등) 를 지원해 키 분산이 가능하다.
4. 하드웨어 보안 모듈(HSM) / YubiKey 활용
- YubiKey에 GPG 서브키와 SSH 인증키를 저장하면, 키 자체가 디바이스 밖으로 절대 유출되지 않는다.
- 백업은 YubiKey 설정 파일(
yubikey-manager로 추출한 공개키와 메타데이터)만 저장하고, 비밀키는 디바이스에 남겨둔다.
백업 보관 위치
| 보관소 | 장점 | 주의점 |
|---|---|---|
| 암호화된 USB 스틱 | 물리적 격리, 인터넷 공격 차단 | 분실 시 복구 불가 → 다중 복제 필요 |
| 암호화된 클라우드 스토리지 (e.g., Backblaze B2, Wasabi) | 자동 복제, 접근성 | 반드시 클라이언트‑사이드 암호화 후 업로드 |
| 비밀 관리 서비스 (e.g., 1Password, Bitwarden) | 비밀번호와 암호화 키를 동시에 관리 | 서비스 탈취 시 2FA와 별도 백업 필요 |
| 오프사이트 금고 | 물리적 보안 강화 | 접근이 번거로울 수 있음 |
Tip: 최소 2개의 서로 다른 위치에 암호화된 백업을 보관하라. 한 곳이 손상돼도 다른 곳에서 복구 가능하도록 한다.
복구 절차 (요약)
-
복호화
- GPG:
gpg -d backup-identity.tar.gz.gpg | tar -xz - age:
age -d -i ~/.config/age/keys.txt -o backup-identity.tar.gz backup-identity.tar.gz.age - sops:
sops -d encrypted-file.json > decrypted.json
- GPG:
-
키 복원
cp backup-identity/id_rsa* ~/.ssh/ chmod 600 ~/.ssh/id_rsa gpg --import gpg-secret-keys.asc -
권한 확인
chmod 600 ~/.ssh/id_rsa chmod 644 ~/.ssh/id_rsa.pub -
테스트
ssh -T git@github.com # SSH 키가 정상 동작하는지 확인 gpg --list-secret-keys # GPG 비밀키가 정상 로드되는지 확인
마무리
- 절대 평문으로 보관하지 말고, 반드시 강력한 암호화와 다중 보관 전략을 사용한다.
- 정기적으로 백업 파일이 정상적으로 복구되는지 테스트해 두면, 실제 사고 발생 시 당황하지 않는다.
- 키에 패스프레이즈를 설정하고, 그 패스프레이즈 자체도 안전하게 관리한다면, 백업이 노출되더라도 키 자체가 바로 사용되지 않는다.
이제 SSH와 GPG 키를 안전하게 백업하고, 필요할 때 언제든 복구할 수 있다! 🚀
The Story: Paranoia & SSH Keys 🔑
저는 SSH와 GPG 키를 잃어버리는 것에 대해 특별히 강박이 있습니다.
오늘 제 노트북이 고장 난다면, 서버 접근 권한, GitHub 서명 기능, 그리고 암호화된 백업을 모두 잃게 됩니다. 하지만 백업을 하는 것이 두렵습니다.
id_rsa파일을 USB 드라이브에 복사하는 것은 위험하게 느껴집니다(드라이브를 잃어버리면 어떡하나요?).~/.ssh폴더를 Google Drive나 Dropbox에 업로드하는 것은 보안 악몽과 같습니다.
저는 중간 지점을 원했습니다—‘디지털 금고’ 같은 것이요. 가장 민감한 키들을 비밀번호 없이는 수학적으로 열 수 없는 폴더에 잠궈 두고, 그 암호화된 블롭을 클라우드에 안전하게 업로드하고 싶었습니다.
그래서 Vaultix를 만들었습니다. 이것은 일반적인 “비밀”을 위한 것이 아니라, 제 디지털 정체성을 가장 안전하게 전송하기 위한 레이어로 설계된 것이었습니다.
Vaultix란? 🛡️
Vaultix는 Go 로 작성된 크로스‑플랫폼 명령줄 도구입니다. 로컬 머신에서 비밀번호로 보호된 암호화 폴더를 관리합니다.
설계 목표
- Simple – 복잡한 키 관리가 없습니다. 비밀번호만 있으면 됩니다.
- Secure – AES‑256‑GCM 암호화와 Argon2id 키 파생을 사용합니다.
- Invisible – 금고 안의 파일 이름조차도 암호화됩니다.
“멋진” 기능들
암호화만으로는 만족하지 못했습니다. 개발자 경험 (DX) 을 좋게 만들고 싶었죠. Vaultix를 재미있게 사용할 수 있게 하는 요소는 다음과 같습니다:
1. 퍼지 매칭 🪄
긴 파일명을 일일이 입력하는 것이 귀찮습니다. super_secret_aws_keys_v2.json 같은 파일이 있더라도 전체를 입력할 필요가 없습니다:
# This works!
vaultix extract aws
Vaultix가 가장 적합한 파일을 찾아서 추출합니다.
2. 메타데이터 누수 제로 🕵️
누군가 노트북을 훔쳐서 금고를 발견해도 무엇을 숨기고 있는지 알 수 없습니다. Vaultix는 파일 내용 과 파일 이름을 모두 암호화합니다. passwords.txt 라는 파일은 디스크 상에서 3f9a2c1d.enc 와 같은 무작위 문자열로 변합니다.
3. Drop & Go 🗑️
파일을 한 번 사용하고 바로 파기하고 싶나요? drop 명령을 사용하세요. 파일을 복호화해 사용할 수 있게 해 주고, 즉시 보안 금고에서 삭제합니다:
vaultix drop api_keys
Vaultix를 사용해 밤에 더 잘 자기
SSH 키를 세 가지 명령으로 백업합니다:
# 1. Create a secure vault
mkdir my_identity_backup
cd my_identity_backup
vaultix init
# 2. Add the sensitive keys
cp ~/.ssh/id_ed25519 .
cp ~/.gnupg/private-keys-v1.d/* .
vaultix add id_ed25519
# 3. Verify and sync
vaultix list
# Now I can zip this 'my_identity_backup' folder
# and upload it to Google Drive without fear.
작동 방식 (기술적인 내용) 🤓
보안 매니아 여러분(저처럼)에게, 여기 아키텍처를 소개합니다. 저는 황금 규칙을 따랐습니다: 직접 암호를 구현하지 마세요.
| 구성 요소 | 세부 사항 |
|---|---|
| 언어 | Go (1.21+) |
| 암호화 | AES‑256‑GCM (인증된 암호화) |
| 키 파생 | Argon2id (GPU 크래킹에 저항) |
| 저장소 | 모든 데이터는 디렉터리 내 숨김 .vaultix/ 폴더에 저장됩니다 |
| 비밀번호 처리 | Vaultix는 절대 비밀번호를 저장하지 않으며, 프로그램이 실행되는 동안 메모리 안에만 존재합니다. 비밀번호를 잃어버리면 데이터는 영원히 사라집니다(버그가 아니라 기능입니다). |
빠른 시작
Windows, macOS, 또는 Linux용 바이너리를 Releases 페이지에서 다운로드하거나, Go가 설치되어 있다면 소스에서 빌드하세요:
go install github.com/zayan-mohamed/vaultix@latest
볼트 초기화
cd my_secrets
vaultix init
# 강력한 비밀번호를 입력하세요...
파일 추가
vaultix add .env
보안 파일 목록 보기
vaultix list
# 볼트에 있는 파일:
# .env
이게 전부입니다. 이제 .env 파일이 휴지 상태에서 암호화되었습니다.
왜 Go인가? 🐹
저는 단일 정적 바이너리와 제로 의존성을 원했기 때문에 Go를 선택했습니다. 사용자는 파일을 복호화하기 위해 Python, Node, 혹은 OpenSSL 라이브러리를 설치할 필요가 없습니다. vaultix를 다운로드하면 바로 작동합니다.
한번 시도해 보세요!
I’m looking for feedback, contributors, and security enthusiasts to break it (or fix it).
💻 GitHub:
Repository: Zayan-Mohamed/vaultix – 비밀번호로 보호된 암호화 폴더를 관리하는 크로스‑플랫폼 CLI 도구.
암호화된 폴더
- AES‑256‑GCM 암호화와 Argon2id 키 파생을 사용합니다.
- 단일 바이너리이며, 의존성이 없습니다.
- Linux, macOS, Windows에서 작동합니다.
vaultix
비밀번호로 보호된 암호화 폴더를 관리하기 위한 크로스‑플랫폼 명령줄 도구
기능 •
설치 •
빠른 시작 •
문서 •
보안 •
기여
📖 개요
vaultix는 군용 수준의 암호화를 사용하여 파일을 제자리에서 암호화하는 안전하고 가벼운 CLI 도구입니다. 클라우드도, 서비스도, 복잡성도 없습니다—민감한 파일을 위한 강력한 암호화만 제공합니다.
주요 특징
- 🔒 강력한 암호화 – Argon2id 키 파생을 사용한 AES‑256‑GCM
- 🚀 의존성 없음 – 단일 정적 바이너리, 런타임 요구 사항 없음
- 💻 크로스 플랫폼 – Linux, macOS, Windows에서 작동
- 🎯 간단한 사용자 경험 – 스마트한 기본값을 갖춘 직관적인 명령
- 🔐 비밀번호 저장 없음 – 비밀번호는 메모리 내에만 존재
- 📦 휴대성 – 암호화된 볼트는 모든 플랫폼에서 교환 가능
✨ 기능
- ✅ 자동 암호화 – 금고를 초기화하면 모든 파일이 즉시 암호화됩니다.
- ✅ 퍼지 파일 매칭 – 정확한 파일명을 입력할 필요가 없습니다.
- ✅ 현재 디렉터리 기본 설정 – 입력은 줄이고, 작업은 늘립니다.
- ✅ 추출 또는 드롭 – 추출…
📄 문서:
유용하다고 생각하시면, 레포에 ⭐를 달아 주세요—많은 도움이 됩니다!
면책 조항: 업계 표준 라이브러리를 사용했지만, 중요한 데이터는 항상 백업해 두세요!