変更要約: 初版(主題1.10・副主題1.10.1〜1.10.4に対応)
5.3暗号化によるデータの保護
公開鍵技術によるデータ・通信の保護を学びます。OpenSSH クライアントの鍵管理(ssh-keygen・ssh-agent・ssh-add)、主要な暗号化アルゴリズム(RSA・ECDSA・Ed25519)の特徴、SSHポート転送(ローカル/リモート)、GnuPG(gpg・gpg-agent・~/.gnupg/)によるファイルの暗号化・署名を押さえます。
101 で「鍵で SSH 接続する」ところまでは学びました。本節はその先——鍵の生成と管理を自分で行い、暗号化の仕組みを通信(SSH)とファイル(GnuPG)の両方に応用する——が範囲です。公開鍵と秘密鍵のペアという1つの原理で全部つながります。
5.3.1SSH 鍵の生成と管理
- ssh-keygen=鍵ペアの生成(
ssh-keygen -t ed25519)。パスフレーズを付ければ秘密鍵ファイル自体も暗号化され、盗まれても即悪用されない。 - アルゴリズムの特徴=RSA(伝統・広い互換性・鍵長 3072〜4096 推奨)/ECDSA(楕円曲線・短い鍵で同等強度)/Ed25519(現行の推奨・高速で安全・鍵が短い)。
- ssh-agent=復号済みの秘密鍵をメモリに保持する常駐エージェント。ssh-add で鍵を登録すれば、パスフレーズ入力はセッションで1回になり、以後の接続は自動。
5.3.2ポート転送と GnuPG
- SSHポート転送=暗号化トンネルに他の通信を通す。ローカル転送
ssh -L 8080:db01:3306 踏み台=手元の8080への接続が踏み台経由で db01:3306 へ届く(社内DBに安全に到達する定石)。リモート転送は -R で逆向き。 - GnuPG(gpg)=ファイルの暗号化・復号・署名。鍵生成
gpg --gen-key・公開鍵で暗号化gpg -e -r 宛先 file・復号gpg -d。鍵束は ~/.gnupg/ に保存され、gpg-agent がパスフレーズを管理。 - 原理の対応=相手に渡すのは常に公開鍵。SSH では公開鍵をサーバーへ(authorized_keys)、GnuPG では受取人の公開鍵で暗号化し、受取人だけが秘密鍵で復号できる。
「パスフレーズ入力を1回にする=ssh-agent+ssh-add」「現行推奨アルゴリズム=Ed25519」「-L ローカル転送の書式(手元ポート:宛先ホスト:宛先ポート)」「受取人の公開鍵で暗号化=gpg -e -r」 が定番です。ssh-keygen(鍵生成)と ssh-add(エージェント登録)の役割の混同を誘う選択肢に注意。
安全と利便を両立する日常構成はこうなります。ssh-keygen -t ed25519 でパスフレーズ付きの鍵を作り、公開鍵を各サーバーの authorized_keys へ配布。作業開始時に eval $(ssh-agent) → ssh-add ~/.ssh/id_ed25519 で1回だけパスフレーズを入れれば、以後のセッションは自動認証です——「秘密鍵は暗号化して保管し、復号済みの鍵はメモリのエージェントにだけ持たせる」という設計思想を理解すると選択肢に迷いません。ポート転送の書式は「listen する側:届けたい先」と読みます:-L 8080:db01:3306 は「手元で 8080 を listen し、トンネルの向こうで db01:3306 に届ける」。ファイアウォールで直接届かない DB へ、SSH の口ひとつで安全に到達できるわけです。GnuPG は「バックアップを自分の公開鍵で暗号化して保存」「リリース物に署名して改ざん検知を可能にする」(yum のリポジトリ署名も同じ原理)が代表用途で、暗号化=相手(または自分)の公開鍵・署名=自分の秘密鍵という向きを押さえれば完成です。
| 道具 | 役割 | 要点 |
|---|---|---|
| ssh-keygen | 鍵ペアの生成 | -t ed25519 が現行推奨 |
| ssh-agent + ssh-add | 復号済み鍵の保持/登録 | パスフレーズは1回 |
| ssh -L | ローカルポート転送 | 手元:宛先ホスト:宛先ポート |
| gpg | ファイル暗号化・署名 | 暗号化は受取人の公開鍵で |
ひっかけ: 「ssh-agent は鍵ペアを生成するコマンド」は誤りです(生成は ssh-keygen・agent は保持・add は登録)。また「GnuPG でファイルを暗号化するときは自分の秘密鍵を使う」も誤り=暗号化は受取人の公開鍵で行い、秘密鍵を使うのは復号と署名です。「Ed25519 より RSA 1024 の方が安全」も誤り(短い RSA は現代では危険)です。
5.3.3この節のまとめ
- ssh-keygen(生成・Ed25519推奨・パスフレーズ付与)→ ssh-agent/ssh-add(1回入力で保持)
- -L 手元:宛先:ポート=トンネル経由の到達。gpg は暗号化=公開鍵・署名=秘密鍵(鍵束は ~/.gnupg/)
進捗の記録にはログインが必要です。
理解度チェック
(軽い確認用)Q1. パスフレーズ付きの SSH 秘密鍵を使っているが、作業のたびの入力を避けたい。セッション中1回の入力で済ませる仕組みは?
Q2. ファイアウォールで直接接続できない社内 DB(db01:3306)へ、踏み台サーバー経由の SSH トンネルで手元の 8080 番から届くようにしたい。適切なコマンドは?
Q3. 取引先(受取人)だけが復号できる形でファイルを GnuPG で暗号化して送りたい。使う鍵として正しいのはどれ?

