データの暗号化 - SSH 鍵/GPG/openssl【LPIC-1 110.3】

データの暗号化 - 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 は秘密鍵が他者から読める状態だと利用を拒否する。~/.ssh700、秘密鍵を 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 のパーミッションが緩い

~/.ssh777、秘密鍵が 644 のように他者から読める状態だと、OpenSSH はセキュリティ上の理由で鍵を無視し、パスワード認証へフォールバックするか接続を拒否する。chmod 700 ~/.sshchmod 600 ~/.ssh/id_* で修正する。

ミス 2: known_hosts のホスト鍵変更警告を無視する

サーバーを再構築すると公開鍵が変わり、接続時に REMOTE HOST IDENTIFICATION HAS CHANGED! の警告が出る。これは中間者攻撃の可能性も示す重要な警告。正当な変更だと確認できたら ssh-keygen -R hostnameknown_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 ~/.sshchmod 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 は得点源になる。

次に読む