機密ファイルをサーバーに保存しても「暗号化さえしていれば」不正アクセスされてもデータは読めない——そう思っていませんか? しかし現場では、暗号化の手間を省いたまま平文のパスワードリストや秘密鍵をサーバーに置いているケースが後を絶ちません。
この記事では、Linuxで標準的に使われる暗号化ツール gpg(GNU Privacy Guard) を使ったファイル暗号化の実践方法を解説します。対称鍵暗号と公開鍵暗号の使い分け、鍵ペアの生成・管理手順、情シス1人の環境でも実運用できる設計まで網羅します。
gpg(GNU Privacy Guard)とは?なぜLinuxのファイル暗号化に使うのか
gpg(GNU Privacy Guard)は、OpenPGP規格(RFC 4880)に準拠したオープンソースの暗号化ツールです。PGP(Pretty Good Privacy)の後継として1997年に開発され、現在もLinux・macOS・Windowsで広く使われています。
gpgが選ばれる理由は3つあります。
・標準搭載: ほとんどのLinuxディストリビューションにデフォルトでインストール済みで、追加コストがかからない
・用途の広さ: ファイル暗号化・メール暗号化・デジタル署名・パッケージ検証(yumやaptのGPG検証)まで対応
・強固な暗号アルゴリズム: AES-256・RSA・Ed25519など現代のセキュリティ標準を採用している
gpgには大きく2つの暗号方式があります。
| 方式 | 仕組み | 向いている用途 |
|---|---|---|
| 対称鍵暗号(共通鍵) | 同じパスフレーズで暗号化・復号する | 自分だけが使うファイルのバックアップ暗号化 |
| 公開鍵暗号(非対称) | 公開鍵で暗号化、秘密鍵で復号する | 他者へのセキュアなファイル送付・チーム間の鍵管理 |
暗号化しないと何が起きるか(攻撃者の視点)
攻撃者がLinuxサーバーに侵入したとき、まず探すのは「すぐ使える認証情報」です。具体的には次のようなファイルが標的になります。
・.env ファイル: データベースのパスワードやAPIキーが平文で書かれていることが多い
・バックアップアーカイブ: ユーザーDBのdumpファイルなど個人情報を含む tar.gz
・設定ファイル: /etc/ 配下の認証設定、WordPressの wp-config.php など
・秘密鍵ファイル: ~/.ssh/id_rsa が平文のまま置かれているケース
これらが平文で存在すると、ファイルを1つ盗むだけで連鎖的な侵害が始まります。バックアップファイルを外部ストレージやNASに転送する場合は特に注意が必要です——転送経路での盗聴に加え、保存先が別途侵害された場合のリスクも生じるからです。
暗号化することで、ファイルを盗まれても「鍵を持っていなければ読めない」状態にすることが目的です。
gpgのインストールと初期セットアップ
1. インストール確認とバージョン確認
まずgpgがインストールされているか確認します。
# バージョン確認(gpg または gpg2) gpg --version # インストールされていない場合 # Debian/Ubuntu系 sudo apt install gnupg2 # RHEL/Rocky/AlmaLinux系 sudo dnf install gnupg2
gpg 2.x系が現在の標準です。古いgpg 1.x系が入っている場合は gpg2 コマンドを使うか、アップグレードを推奨します。
2. 鍵ペアの生成(公開鍵暗号を使う場合)
公開鍵暗号を使う場合はまず鍵ペアを生成します。対称鍵暗号だけを使う場合はこの手順は不要です。
# インタラクティブな鍵生成(推奨) gpg --full-generate-key # 選択肢の指示: # 鍵の種類: (1) RSA and RSA または (9) ECC (sign and encrypt) # ← ECC (Ed25519/Curve25519) が現代的で推奨 # 鍵の長さ: RSAの場合は4096ビットを選択 # 有効期限: 2y(2年)を推奨(無期限は更新の機会を失う) # 名前・メールアドレス・コメントを入力 # パスフレーズを設定(秘密鍵を保護する重要な設定)
3. 生成した鍵を確認する
# 公開鍵リストを表示 gpg --list-keys # 秘密鍵リストを表示(長形式のキーIDで確認) gpg --list-secret-keys --keyid-format LONG # 出力例: # sec rsa4096/ABCD1234EFGH5678 2026-06-17 [SC] [expires: 2028-06-17] # uid [ultimate] Tomohiro Miyazaki
# ssb rsa4096/WXYZ9012IJKL3456 2026-06-17 [E] # # ABCD1234EFGH5678 がキーID(後の操作で指定に使う)
対称鍵暗号でファイルを暗号化する(シンプル・即実践)
「自分だけが復号できればいい」用途なら対称鍵暗号が最もシンプルです。バックアップファイルの暗号化に最適で、鍵ペアの生成も不要です。
1. ファイルを暗号化する
# AES-256で暗号化(パスフレーズの入力を求められる) gpg --symmetric --cipher-algo AES256 secret.tar.gz # → secret.tar.gz.gpg が同じディレクトリに生成される # ASCIIアーマー形式(テキストとして送受信できる .asc)で出力 gpg --symmetric --armor --cipher-algo AES256 secret.tar.gz # → secret.tar.gz.asc が生成される # パスフレーズをファイルから読み込む(スクリプト向け) # 注意: ヒストリーへの漏洩を防ぐためコマンドライン直書きは避ける echo "yourpassphrase" | gpg --batch --symmetric \ --cipher-algo AES256 --passphrase-fd 0 secret.tar.gz
2. 暗号化ファイルを復号する
# 復号(パスフレーズを求められる) gpg --decrypt --output secret.tar.gz secret.tar.gz.gpg # または gpg のみでも拡張子から自動判断して復号 gpg secret.tar.gz.gpg # → secret.tar.gz に復号される
公開鍵暗号でファイルを暗号化する(チーム・送受信向け)
「特定の相手だけが復号できるファイルを作りたい」場合は公開鍵暗号を使います。相手の公開鍵があれば、秘密鍵なしで暗号化できます。
1. 相手の公開鍵をインポートする
# 相手から受け取った公開鍵ファイルをインポート gpg --import partner-pubkey.asc # 公開鍵サーバーから取得(Ubuntu 鍵サーバー例) gpg --keyserver keyserver.ubuntu.com --search-keys partner@example.com # インポート後、鍵の信頼レベルを設定する(重要) gpg --edit-key partner@example.com # gpg> trust # 3 = I trust marginally(日常的な相手) # 4 = I trust fully(社内の同僚等、確実に確認済み) # gpg> quit
2. 相手の公開鍵でファイルを暗号化する
# 相手のメールアドレス(または鍵ID)を指定して暗号化 gpg --encrypt --recipient partner@example.com secret.tar.gz # → secret.tar.gz.gpg が生成される(相手の秘密鍵でのみ復号可能) # 送信者自身も復号できるようにする(紛失対策として推奨) gpg --encrypt \ --recipient partner@example.com \ --recipient myemail@example.com \ secret.tar.gz # ASCIIアーマー形式で出力(メール本文に貼り付ける場合等) gpg --encrypt --armor --recipient partner@example.com secret.tar.gz # → secret.tar.gz.asc が生成される
3. 秘密鍵で復号する
# 自分の秘密鍵のパスフレーズを使って復号 gpg --decrypt --output secret.tar.gz secret.tar.gz.gpg
鍵管理のセキュリティ設計
1. 公開鍵のエクスポートと配布
# 自分の公開鍵を ASCII ファイルにエクスポート gpg --armor --export myemail@example.com > my-pubkey.asc # 鍵のフィンガープリントを確認(相手への正当性確認に使う) gpg --fingerprint myemail@example.com # 公開鍵サーバーに登録(オプション) gpg --keyserver keyserver.ubuntu.com --send-keys ABCD1234EFGH5678
2. 秘密鍵のバックアップ(最重要)
# 秘密鍵をエクスポート(このファイルは厳重管理が必要) gpg --armor --export-secret-keys myemail@example.com > my-secret-key.asc # 秘密鍵はオフラインのUSBメモリや金庫に保管する # ネットワーク上に平文でアップロードすることは絶対にしない # ファイルのパーミッションを制限する chmod 600 my-secret-key.asc
3. 失効証明書の事前作成
# 鍵の紛失・漏洩時に使う失効証明書を事前に作成しておく gpg --gen-revoke --armor --output revoke.asc myemail@example.com # 理由を選択 → 1 (Key has been compromised) などを選ぶ # 鍵ペアを生成した直後に必ず作成し、安全な場所に保管する # この証明書を公開鍵サーバーに送ると鍵が失効扱いになる
Linuxのファイルパーミッション管理と組み合わせることで、暗号化ファイル自体へのアクセス制御もより堅牢にできます。詳細は姉妹サイトLinuxMaster.JPの権限管理記事もあわせてご覧ください。
中小企業でも今日からできること
「gpgを使った暗号化、うちでも導入できるか?」という声はよく聞きます。対称鍵暗号を使ったバックアップ暗号化であれば、コマンド3行で今日から始められます。
・今日(30分): バックアップスクリプトに gpg 対称鍵暗号の1行を追加し、tar.gz をそのままNASに置くのをやめる
・今週(半日): 外部送付が必要なファイルは公開鍵暗号を使うルールを文書化する
・今月(1日): 担当者の鍵ペアを生成し、公開鍵をチームで共有・失効証明書を金庫に保管する体制を整える
バックアップの暗号化に使うパスフレーズはパスワードマネージャーで管理し、担当者が退職したときに鍵を再生成できる引き継ぎ手順を整備することも忘れないでください。
よくある誤解と注意点
「圧縮すれば暗号化の代わりになる?」
なりません。zip・tar.gz・7z(パスワードなし)はファイルを小さくするだけで、暗号化機能はありません。7zのAES-256暗号化はオプションで有効にした場合のみ機能します。標準の zip 形式のパスワード保護は暗号強度が低いため、gpg を使うことを推奨します。
「公開鍵は公開していいから、誰から入手してもいい?」
公開鍵は「本人のもの」であることを別の手段で検証する必要があります。中間者攻撃で偽の公開鍵を配布される「鍵のなりすまし」は実際に起きています。鍵のフィンガープリントを電話やSlackなど別チャネルで確認することが基本です。公開鍵サーバーから入手した鍵も、フィンガープリントの確認なしに信頼してはいけません。
「暗号化されていればサーバーに秘密鍵を置いてもいい?」
秘密鍵はファイル暗号化の核となる情報です。サーバーに置く場合はファイルパーミッションを 600 に設定し、パスフレーズで保護されていることを必ず確認してください。理想的には、秘密鍵はオフライン端末またはYubiKeyなどのハードウェアキーで管理します。
「gpg-agent のキャッシュ時間は長い方が便利では?」
~/.gnupg/gpg-agent.conf の default-cache-ttl のデフォルトは 600秒(10分)です。これを無制限に設定すると、パスフレーズがメモリに残り続け、画面ロック後でも復号できる状態が続きます。セキュリティと利便性のバランスを考慮し、1800秒程度が現実的な上限として推奨されます。
本記事のまとめ
| 用途 | コマンド例 | 難易度 |
|---|---|---|
| バックアップの暗号化(自分用) | gpg –symmetric –cipher-algo AES256 | 低(今日から実践可能) |
| 特定の相手へのセキュア送付 | gpg –encrypt –recipient メールアドレス | 中(鍵交換と信頼設定が必要) |
| チームでの鍵管理体制整備 | 鍵ペア生成+信頼設定+バックアップ | 中(運用ルール策定が必要) |
| スクリプトでの自動暗号化 | –passphrase-fd 0 などのバッチオプション | 中(テストと権限設計が必要) |
gpgは難しそうに見えて、対称鍵暗号から始めれば今日中に実運用に乗せられます。まずはバックアップファイル1つを暗号化するところから始めてみてください。サーバーに平文のデータが眠っているリスクを減らすことが、情シス1人体制でも取れる確実な一手です。
Linuxのファイル暗号化、実際に設定できましたか?
「コマンドはわかったが、鍵管理をどう運用すればいいか迷っている」という声をよく聞きます。
正しいセキュリティ知識を体系的に身につけたい方へ、メルマガで実践的なセキュリティ対策ノウハウをお届けしています。
