データの暗号化 - SSH 鍵/GPG/openssl【LPIC-1 110.3】
この記事で達成できること
ssh-keygenで RSA / ED25519 の鍵ペアを生成し、用途を説明できるssh-copy-idで公開鍵をリモートに登録し、公開鍵認証で接続できるssh-agent/ssh-addでパスフレーズ入力を一度だけにできる- SSH ポートフォワーディング(
-L/-R/-D)の用途を区別できる gpgでファイルの暗号化・復号、署名・検証ができるopensslでハッシュ計算と対称暗号の基本を実行できる- 鍵ファイルのパーミッション(600 / 700)が認証失敗にどう関わるかを説明できる
LPIC-1 主題 110.3「暗号化によってデータを保護する」の中核。通信路の保護(SSH)とデータ自体の保護(GPG / openssl)を分けて理解するのが攻略の鍵。
SSH の公開鍵認証はどう動くのか
公開鍵認証は「秘密鍵を持つことの証明」で認証する方式。クライアントの公開鍵をサーバーの ~/.ssh/authorized_keys に登録し、秘密鍵は手元から出さない。パスワードを回線に流さないため安全性が高い。
| ファイル / ディレクトリ | 役割 | 推奨パーミッション |
|---|---|---|
~/.ssh/ |
SSH 関連ファイル格納 | 700 |
~/.ssh/id_ed25519 |
秘密鍵(手元のみ) | 600 |
~/.ssh/id_ed25519.pub |
公開鍵(配布する) | 644 |
~/.ssh/authorized_keys |
サーバー側の許可鍵一覧 | 600 |
~/.ssh/known_hosts |
接続済みサーバーの公開鍵記録 | 644 |
認証の流れは「サーバーがクライアントの公開鍵で乱数を暗号化 → クライアントが秘密鍵で復号して応答 → 秘密鍵保持を証明」というチャレンジ・レスポンス。秘密鍵はネットワークに流れない。
鍵を生成して接続する手順
Step 1: ssh-keygen で鍵ペアを生成する
ssh-keygen -t ed25519 -C "user@example.com"
Generating public/private ed25519 key pair. Enter file in which to save the key (/home/user/.ssh/id_ed25519): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/user/.ssh/id_ed25519 Your public key has been saved in /home/user/.ssh/id_ed25519.pub
-t で鍵種別を指定する。man ssh-keygen によると -t の値は dsa / ecdsa / ecdsa-sk / ed25519 / ed25519-sk / rsa。現在は ED25519 が推奨で、RSA を使う場合は -b 4096 のように鍵長を指定する。-C はコメント(公開鍵末尾に付く識別ラベル)。パスフレーズは秘密鍵を保護する追加の鍵で、空にもできるが設定が安全。
ssh-keygen -t rsa -b 4096
RSA を選ぶ場面は、ED25519 を解釈できない古いサーバーと接続する必要がある場合などに限られる。
Step 2: 公開鍵をリモートに登録する
ssh-copy-id user@server.example.com
Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'user@server.example.com'" and check to make sure that only the key(s) you wanted were added.
ssh-copy-id は公開鍵をリモートの ~/.ssh/authorized_keys に追記し、パーミッションも調整する。手動で行う場合は公開鍵の内容を authorized_keys に 1 行追加する。秘密鍵(.pub の付かない方)は決して送らない。
Step 3: 公開鍵認証で接続する
ssh user@server.example.com
Enter passphrase for key '/home/user/.ssh/id_ed25519': Last login: Fri May 30 10:00:00 2026 from 203.0.113.10 user@server:~$
公開鍵が登録済みなら、パスワードではなく秘密鍵のパスフレーズだけで入れる。問題があるときは ssh -v user@host で詳細ログを確認する。
Step 4: ssh-agent で鍵をキャッシュする
eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_ed25519 ssh-add -l
Agent pid 4521 Enter passphrase for /home/user/.ssh/id_ed25519: Identity added: /home/user/.ssh/id_ed25519 (user@example.com) 256 SHA256:abc...xyz user@example.com (ED25519)
ssh-agent は秘密鍵をメモリに保持する認証エージェント。ssh-add で鍵を登録すると、以後の接続でパスフレーズ入力が不要になる。ssh-add -l で登録中の鍵を一覧、ssh-add -D で全削除する。
Step 5: パーミッションを正す
chmod 700 ~/.ssh chmod 600 ~/.ssh/id_ed25519 chmod 644 ~/.ssh/id_ed25519.pub
OpenSSH は秘密鍵が他者から読める状態だと利用を拒否する。~/.ssh を 700、秘密鍵を 600 にするのが基本。これを外すと「鍵があるのに認証できない」典型例になる。
SSH ポートフォワーディングの 3 種類は何が違うのか
-L はローカル転送(手元のポートを経由してリモート側のサービスへ)、-R はリモート転送(リモートのポートを手元のサービスへ)、-D は動的転送(SOCKS プロキシ)。方向と用途で使い分ける。
| オプション | 名称 | 典型用途 |
|---|---|---|
-L local:host:hostport |
ローカルフォワード | 手元から踏み台越しに内部 DB へ接続 |
-R remote:host:hostport |
リモートフォワード | リモートから手元のサービスへ到達させる |
-D port |
動的フォワード(SOCKS) | ブラウザ等のトラフィックを SSH 経由に |
ssh -L 8080:internal-db:5432 user@gateway ssh -R 9000:localhost:3000 user@remote ssh -D 1080 user@gateway
man ssh の -L / -R / -D の定義どおり、SSH の暗号化された通信路にアプリケーションの通信を載せる仕組み。トンネルを張った上で平文プロトコルを安全に運べる。
GPG でデータ自体を暗号化・署名するには
GPG(GnuPG)は OpenPGP 規格の実装で、ファイルそのものを暗号化・署名する。SSH が通信路を守るのに対し、GPG は保存・配布するデータを守る。公開鍵で暗号化し、対応する秘密鍵でのみ復号できる。
鍵ペアを生成する
gpg --gen-key gpg --list-keys
pub ed25519 2026-05-30 [SC]
ABCDEF0123456789ABCDEF0123456789ABCDEF01
uid [ultimate] User Name <user@example.com>
sub cv25519 2026-05-30 [E]
gpg --gen-key で名前とメールアドレスを対話入力し、鍵ペアを作る。--list-keys で公開鍵、--list-secret-keys で秘密鍵を一覧する。
公開鍵を配布・取り込みする
gpg --export -a user@example.com > mypubkey.asc gpg --import friend_pubkey.asc
--export -a は公開鍵を ASCII 形式(armored)で書き出す。相手はこれを --import で取り込む。暗号化して送るには受信者の公開鍵が手元に必要。
配布するのは公開鍵。--export-secret-keys で出力される秘密鍵は絶対に渡さない。秘密鍵が漏れれば、その鍵宛の暗号文がすべて復号され、署名も偽造される。
ファイルを暗号化・復号する
gpg -e -r user@example.com secret.txt gpg -d secret.txt.gpg > secret.txt
gpg: encrypted with cv25519 key, ID 0123456789ABCDEF, created 2026-05-30
"User Name <user@example.com>"
-e(--encrypt)と -r(受信者指定)で暗号化すると secret.txt.gpg が生成される。復号は -d(--decrypt)。復号できるのは指定した受信者の秘密鍵を持つ人だけ。
署名と検証
gpg --sign document.txt gpg --verify document.txt.gpg
gpg: Signature made Fri 30 May 2026 10:00:00 JST gpg: using EDDSA key ABCDEF0123456789ABCDEF0123456789ABCDEF01 gpg: Good signature from "User Name <user@example.com>"
--sign は秘密鍵で署名し、改ざんと作成者を保証する。--verify は署名者の公開鍵で検証する。暗号化(秘匿)と署名(真正性)は別目的なので混同しないこと。
openssl で何ができるのか
openssl は TLS / 暗号機能を提供するツールキット。ハッシュ計算、対称暗号、鍵・証明書の生成など幅広く扱える。LPIC-1 では基本的なハッシュと暗号化を押さえる。
openssl dgst -sha256 file.txt openssl enc -aes-256-cbc -pbkdf2 -in file.txt -out file.enc openssl enc -d -aes-256-cbc -pbkdf2 -in file.enc -out file.txt
SHA256(file.txt)= 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08 enter AES-256-CBC encryption password:
openssl dgst -sha256 はハッシュ値(ファイルの指紋)を計算する。openssl enc は対称暗号で、暗号化と復号に同じパスワードを使う。鍵導出には -pbkdf2 を付ける。GPG が公開鍵暗号でデータを守るのに対し、enc はパスワード共有型である点が違う。
よくあるミスと対処
ミス 1: 秘密鍵や ~/.ssh のパーミッションが緩い
~/.ssh が 777、秘密鍵が 644 のように他者から読める状態だと、OpenSSH はセキュリティ上の理由で鍵を無視し、パスワード認証へフォールバックするか接続を拒否する。chmod 700 ~/.ssh と chmod 600 ~/.ssh/id_* で修正する。
ミス 2: known_hosts のホスト鍵変更警告を無視する
サーバーを再構築すると公開鍵が変わり、接続時に REMOTE HOST IDENTIFICATION HAS CHANGED! の警告が出る。これは中間者攻撃の可能性も示す重要な警告。正当な変更だと確認できたら ssh-keygen -R hostname で known_hosts の該当行を削除してから再接続する。
ミス 3: GPG で公開鍵と秘密鍵を取り違える
暗号化には受信者の公開鍵、復号には自分の秘密鍵を使う。配布するのは公開鍵だけ。--export(公開鍵)と --export-secret-keys(秘密鍵)を混同して秘密鍵を共有すると、暗号化の意味が失われる。
ミス 4: パスフレーズを設定しない/管理しない
秘密鍵にパスフレーズを設定しないと、鍵ファイルを盗まれただけで成りすましが可能になる。パスフレーズを設定し、ssh-agent で入力回数を減らすのが実務的。GPG の秘密鍵パスフレーズも同様に管理する。
ミス 5: 公開鍵ではなく秘密鍵をサーバーへ送る
authorized_keys に登録するのは .pub が付いた公開鍵。ssh-copy-id を使えば自動で正しく登録される。手動コピー時に秘密鍵(id_ed25519)を送らないよう注意する。
トラブルシューティング
症状: 公開鍵を登録したのにパスワードを求められる
原因: 秘密鍵や ~/.ssh のパーミッション過多、または authorized_keys への登録不備
確認:
ssh -v user@host ls -ld ~/.ssh ls -l ~/.ssh/authorized_keys
対処: chmod 700 ~/.ssh、chmod 600 ~/.ssh/authorized_keys に修正。ssh -v の出力で鍵が提示・拒否される箇所を確認する。
症状: 接続時にホスト鍵変更の警告で止まる
原因: サーバー側のホスト鍵が変わり、known_hosts の記録と一致しない
確認:
ssh-keygen -l -F hostname
対処: 正当な変更だと確認できたら ssh-keygen -R hostname で古い記録を削除して再接続。心当たりがなければ接続を中止し原因を調査する。
症状: gpg --decrypt で復号できない
原因: 対応する秘密鍵が鍵束に無い、または受信者指定を誤って暗号化した
確認:
gpg --list-secret-keys
対処: 自分の秘密鍵があるか確認。無ければその暗号文は復号できない。暗号化時は -r に正しい受信者(自分が復号するなら自分)を指定する。
作業完了チェックリスト
- [ ]
ssh-keygen -t ed25519で鍵ペアを生成した - [ ]
ssh-copy-idで公開鍵をリモートに登録した - [ ] 公開鍵認証で接続できた
- [ ]
ssh-addで秘密鍵を ssh-agent に追加した - [ ]
~/.sshを 700、秘密鍵を 600 に設定した - [ ]
gpgでファイルの暗号化・復号を確認した - [ ]
openssl dgstでハッシュ値を計算した
まとめ
| 目的 | コマンド | 守る対象 |
|---|---|---|
| 鍵生成 | ssh-keygen -t ed25519 |
SSH 接続の認証 |
| 公開鍵登録 | ssh-copy-id user@host |
リモートの authorized_keys |
| 鍵キャッシュ | ssh-add |
パスフレーズ入力回数 |
| データ暗号化 | gpg -e -r user file |
保存・配布データ |
| 署名 / 検証 | gpg --sign / --verify |
真正性 |
| ハッシュ / 対称暗号 | openssl dgst / openssl enc |
完全性・パスワード共有暗号 |
SSH は通信路、GPG / openssl はデータそのものを守る。この役割分担と、鍵ファイルのパーミッション規律を押さえれば 110.3 は得点源になる。