重要ファイルを暗号化してバックアップする方法|gpgの基本と実例(コピペ可)

バックアップ・復元

「外部に置く前に暗号化しておきたい」「端末を紛失しても中身だけは守りたい」――そんなときは GnuPG(gpg) が定番。ここでは 最短レシピ→用途別の実例→運用の注意点 の順でまとめます(Linux/macOS想定、WSL でも可)。

最短レシピ(まずは動くやつ|コピペ可)

A) 単一ファイルをパスワード(共通鍵)で暗号化

# 暗号化(.gpg を作成) ※復号時にパスフレーズを要求
gpg --symmetric --cipher-algo AES256 --armor \
    -o secret.txt.asc secret.txt

# 復号(元ファイルへ戻す)
gpg --output secret.txt --decrypt secret.txt.asc

B) 公開鍵で暗号化(配布・自動化に強い)

# 1) 相手(=復号する人)の公開鍵を取り込む
gpg --import receiver_public.asc

# 2) 暗号化(相手の鍵ID/メールを指定)
gpg --encrypt --recipient "user@example.com" \
    -o report.pdf.gpg report.pdf

# 3) 復号(相手側で秘密鍵を使って復号)
gpg --output report.pdf --decrypt report.pdf.gpg

どっちを選ぶ?

  • 手早さ重視・自分だけ復号 → 共通鍵(--symmetric
  • 配布/自動化・鍵管理を分離 → 公開鍵(--encrypt

フォルダ丸ごと:tar+gpg が鉄板

1) 圧縮→暗号化(共通鍵)

STAMP=$(date +%F)                        # 例: 2025-08-23
SRC="/path/to/important"
OUT="/backup/${STAMP}-important.tar.gz.gpg"

tar -czf - "$SRC" \
| gpg --symmetric --cipher-algo AES256 -o "$OUT"

2) 圧縮→暗号化(公開鍵)

RECIPIENT="user@example.com"
STAMP=$(date +%F)
OUT="/backup/${STAMP}-important.tar.gz.gpg"

tar -czf - "/path/to/important" \
| gpg --encrypt --recipient "$RECIPIENT" -o "$OUT"

3) 署名も付けて「改ざん検知」まで

# 送信者の秘密鍵で署名しつつ、受信者の公開鍵で暗号化
gpg --encrypt --sign --recipient "$RECIPIENT" \
    -o "$OUT" < <(tar -czf - "/path/to/important")

復号は gpg -d ... | tar -xzf - のストリーム復元が便利。
まずは一時ディレクトリへ展開し、内容を確認してから本番へ戻すのが安全です。

公開鍵の準備(はじめての人向け)

# 対話式で鍵を作成(推奨:ed25519/3072~4096bit RSA、期限は1〜2年)
gpg --full-generate-key

# 鍵の確認
gpg --list-keys
gpg --list-secret-keys

# 公開鍵を書き出して相手へ渡す
gpg --export -a "Your Name <you@example.com>" > my_public.asc

# 秘密鍵は厳重にバックアップ(権限600で保管、オフライン推奨)
gpg --export-secret-keys -a "Your Name <you@example.com>" > my_private.asc

# 万が一の失効証明書も作成・保管
gpg --output revoke.asc --gen-revoke "Your Name <you@example.com>"

自動化テンプレ(cron 向け/公開鍵方式)

無人運用は 公開鍵暗号 一択(共通鍵パスフレーズをファイルに置かないため)。
復号は復元端末側の秘密鍵だけが必要。

# /usr/local/sbin/enc_backup.sh
#!/usr/bin/env bash
set -euo pipefail
umask 077

RECIPIENT="backup@example.com"           # 復号側の公開鍵ID/メール
STAMP=$(date +%F)
SRC="/srv/data"
OUT="/backup/${STAMP}-data.tar.gz.gpg"
LOG="/var/log/enc_backup.log"

flock -n /tmp/enc_backup.lock -c "
  tar -czf - \"$SRC\" \
  | gpg --batch --yes --encrypt --recipient \"$RECIPIENT\" \
        -o \"$OUT\" >>\"$LOG\" 2>&1
  sha256sum \"$OUT\" >> \"$OUT.sha256\"
"
# crontab -e(毎日02:15)
MAILTO=""
15 2 * * * bash /usr/local/sbin/enc_backup.sh

ローテーション(30日より古いものを削除)

find /backup -name '*.tar.gz.gpg' -mtime +30 -exec echo rm -f {} +
# ↑ 最初は echo でドライラン、問題なければ echo を外す

復号・検証の手順(戻せて初めて成功)

# 整合性チェック(保存してあるハッシュで検証)
sha256sum -c /backup/2025-08-23-data.tar.gz.gpg.sha256

# 復号して一時ディレクトリへ展開
mkdir -p /tmp/restore
gpg -d /backup/2025-08-23-data.tar.gz.gpg \
| tar -xzf - -C /tmp/restore

# 署名付きなら改ざん検証(署名者の公開鍵を事前に import しておく)
gpg --verify signed_payload.sig signed_payload

よく使うオプション早見表

コマンド目的
--symmetric共通鍵(パスフレーズ)で暗号化gpg -c -o file.gpg file
--encrypt -r公開鍵で暗号化(受信者指定)gpg -e -r user@ex.com
--sign署名付与(改ざん検知)gpg --sign --encrypt ...
--armorASCII化(メール貼付など)gpg -a ...
--cipher-algo AES256暗号方式の明示共通鍵で付けがち
--batch --yes非対話(自動化)cron/スクリプト向け
--pinentry-mode loopback非対話でのパスフレーズ入力※共通鍵運用時のみ、慎重に

注意:共通鍵運用を自動化したい場合、--pinentry-mode loopback--passphrase-file 等で非対話化できますが、パスフレーズを平文で残すリスクが大きいです。原則は 公開鍵方式 を選びましょう。

運用のコツ/落とし穴(回避策)

  • 鍵のバックアップ:秘密鍵と失効証明書をオフライン保管(権限600、二重化)。
  • 鍵の期限:期限つきで作り、更新時はローテーション計画を。
  • 誰の鍵で暗号化?復号する人(場所)の公開鍵です。送る相手が複数なら --recipient を複数指定可能。
  • 復元テスト:月1でランダムスナップショットを実際に復号・展開して検証。
  • サイズが大きいpigz で並列圧縮(tar -I 'pigz -9' ... | gpg ...')。
  • macOS で gpg が無いbrew install gnupg
  • 誤上書きが怖い:復号は 必ず一時ディレクトリへ展開して確認後に本番へ。

まとめ

  • gpg は「共通鍵=手早い」「公開鍵=自動化/配布に強い」。
  • バックアップは tar で固めて gpg で暗号化が王道。
  • 事故を減らす三種の神器:自動化(cron)・整合性(hash/verify)・復元テスト

このページのレシピをベースに、まずは最重要フォルダを 今日中に1本、暗号化バックアップ しておきましょう。

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント