「外部に置く前に暗号化しておきたい」「端末を紛失しても中身だけは守りたい」――そんなときは 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 ... |
--armor | ASCII化(メール貼付など) | 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本、暗号化バックアップ しておきましょう。

コメント