暗号化によるデータの保護

この主題は、公開鍵暗号(非対称暗号)という1つの技術が、Linuxシステムの中で「OpenSSH(リモートログイン・ファイル転送)」と「GnuPG(ファイルの暗号化・署名)」という2つの異なる場面でどう使われているかを扱います。

画像

公開鍵暗号では、数学的に対になった公開鍵と秘密鍵の鍵ペアを使います。

  • 公開鍵は誰に渡しても構いません(名前のとおり公開してよい鍵です)。
  • 秘密鍵は本人だけが保持し、絶対に他人に渡してはいけません。

用途によって、鍵ペアの使い方は次のように変わります。

  • 暗号化・復号:公開鍵で暗号化したデータは、対応する秘密鍵でしか復号できません。「秘密鍵の持ち主だけが読める」データを作れます。
  • 署名・検証:秘密鍵で作成した署名は、対応する公開鍵で検証できます。「対応する秘密鍵の持ち主が作成した(改ざんされていない)」ことを確認できます。公開鍵と本人の対応付けを信頼できる方法で確認している場合には、その本人による作成も確認できます。

OpenSSHでは公開鍵暗号が主にサーバー・ユーザーの認証や鍵交換に使われ、実際の通信データは鍵交換後に共有した共通鍵による対称暗号で暗号化されます。GnuPGは主にファイル・メッセージの暗号化と署名にこの仕組みを使います。それぞれの具体的な使い方を見ていきます。

OpenSSHの鍵ペアと認証

ssh-keygen:鍵ペアの生成

ssh-keygenは、SSHで使う公開鍵・秘密鍵の鍵ペアを生成するコマンドです。-tオプションで鍵のアルゴリズムを指定します。

ssh-keygen -t ed25519

-tを省略してssh-keygenとだけ実行した場合、現在のOpenSSHではED25519の鍵ペアが生成されますこの既定値はOpenSSHのバージョンによって異なります。長らくRSAが既定でしたが、現在のOpenSSHのマニュアルでは「引数無しで実行するとED25519の鍵を生成する」と明記されています。導入されているOpenSSHのバージョンによっては、既定がRSAのままの場合もあります。[2]。

DSAの現在の扱いについて

DSAは、公式の出題範囲・関連ファイル一覧(~/.ssh/id_dsa、/etc/ssh/ssh_host_dsa_keyなど)に今も名前が残っていますが、実際のOpenSSHでの扱いは大きく後退しています。

  • OpenSSH 7.0(2015年):SSHで使われるDSA鍵(ssh-dss)を既定で無効化しました。SSHのDSA鍵は1024ビットに固定されていたことなどが背景にあります(設定を変更すれば利用は可能でした)。
  • OpenSSH 10.0(2025年):DSA鍵のサポート自体を完全に削除しました。

そのため、OpenSSH 10.0以降では、新たにDSA鍵を生成したり、DSA鍵で認証したりすることはできません。OpenSSH 7.0以降10.0未満では、DSA鍵の生成自体は可能な場合がありますが、ssh-dssによる認証は既定で無効です。「id_dsa・ssh_host_dsa_keyというファイル名が何のためのものかを知っている」ことと、「OpenSSHのDSAは現在では非推奨・廃止されたアルゴリズムであると理解している」ことの両方が、試験対策上のポイントになります非常に古いディストリビューション・古いバージョンのOpenSSHが稼働している環境では、今でもDSA鍵が有効な場合があります。「DSAは絶対にどの環境でも使えない」という意味ではなく、現在の主要なOpenSSHのリリースでは廃止済み、という理解が正確です。[3]。

ユーザーの鍵ファイル:~/.ssh/id_*

ssh-keygenで生成した鍵ペアは、既定では次のファイル名でホームディレクトリの~/.ssh/以下に保存されます。

アルゴリズム秘密鍵公開鍵
RSA~/.ssh/id_rsa~/.ssh/id_rsa.pub
DSA(廃止済み)~/.ssh/id_dsa~/.ssh/id_dsa.pub
ECDSA~/.ssh/id_ecdsa~/.ssh/id_ecdsa.pub
ED25519~/.ssh/id_ed25519~/.ssh/id_ed25519.pub

これらはユーザー自身の身元を証明するための鍵です。秘密鍵ファイルは所有者本人以外がアクセスできないパーミッション(600など)である必要があり、sshコマンドは秘密鍵ファイルのパーミッションが緩すぎる場合、その秘密鍵の使用を拒否します。公開鍵ファイル(.pubが付くほう)は、後述のauthorized_keysに登録することで、パスワードの代わりにこの鍵ペアでログインできるようになります。

サーバーのホスト鍵:/etc/ssh/ssh_host_*_key

/etc/ssh/以下のホスト鍵には、ssh_host_rsa_key・ssh_host_dsa_key・ssh_host_ecdsa_key・ssh_host_ed25519_key(それぞれに対応する.pubファイル)というファイル名があります。ただし、実際に生成されるホスト鍵の種類はディストリビューションの設定やOpenSSHのバージョンに依存し、すべてのファイルが存在するとは限りません。特にOpenSSH 10.0以降ではDSAホスト鍵はサポートされません。これらはユーザーの鍵ではなく、SSHサーバー(sshd)自身の身元を証明するための鍵で、OSのインストール時やsshdの初回起動時に自動生成されるのが一般的です。

  • ユーザー鍵(~/.ssh/id_*):クライアント側で、「自分が誰であるか」をサーバーに証明するために使います。
  • ホスト鍵(/etc/ssh/ssh_host_*_key):サーバー側で、「接続先が本当にそのサーバーであるか」をクライアントに証明するために使います。

この2種類の鍵は、ファイル名が似ているために混同されがちですが、「誰が」「何を証明するために」使う鍵かという役割がまったく異なります。試験でもこの違いを問う出題が見られるポイントです。

authorized_keysとknown_hosts

ホスト鍵・ユーザー鍵と関連して、次の2つのファイルもそれぞれ異なる側(サーバー側/クライアント側)で使われます。

ファイル置き場所役割
~/.ssh/authorized_keys接続先(サーバー)側公開鍵認証でログインを許可するユーザー公開鍵の一覧。公開鍵認証が有効であり、アカウントや鍵ごとの制限にも抵触しない場合、ここに登録された公開鍵に対応する秘密鍵を持つ相手はパスワード無しでログインできます
known_hosts(~/.ssh/known_hostsまたは/etc/ssh/ssh_known_hosts)接続元(クライアント)側これまでに接続したサーバーのホスト公開鍵を記録した一覧。同じサーバーに再接続した際、記録済みのホスト鍵と食い違いがあれば警告を表示します

known_hostsにホスト鍵が記録された状態で、サーバーのホスト鍵が変わっていた場合、SSHクライアントは強い警告(中間者攻撃の可能性を示すメッセージ)を表示し、既定の設定では接続を拒否します。これは、正規のサーバー再構築時にホスト鍵が再生成された場合にも起こり得るため、警告が出た際は「本当にサーバー側の正当な変更か」を確認したうえで対応する必要があります~/.ssh/known_hostsはユーザーごとの記録、/etc/ssh/ssh_known_hostsはシステム全体で共有する記録という違いがあります。どちらか一方だけが存在する環境も、両方使われている環境もあります。[4]。

ssh-agentとssh-add

パスフレーズ(秘密鍵自体を保護するパスワード)を設定した秘密鍵は、SSH接続のたびにパスフレーズの入力を求められます。これを毎回入力する手間を省くための仕組みがssh-agentとssh-addです。

  • ssh-agent:バックグラウンドで動作し、復号済みの秘密鍵をメモリ上に保持しておくためのプログラムです。
  • ssh-add:手元の秘密鍵ファイルをssh-agentに登録するコマンドです。パスフレーズの入力はこのssh-add実行時の1回だけで済み、以降は同じエージェントを利用する間、sshコマンド実行時にパスフレーズを聞かれなくなります。

ssh-agentの終了時期は起動方法やセッション管理方式に依存します。シェルから起動した場合はそのシェルの終了に伴って終了することがありますが、デスクトップセッションやsystemdのユーザーサービスなどで起動されている場合は、シェルを終了しても動作を継続することがあります。保持していた鍵の情報が失われても、ディスク上の秘密鍵ファイル自体が変更されるわけではありません。

SSHポートフォワーディング(ポートトンネル)

画像

SSH接続の暗号化された通信路(トンネル)を使って、SSH以外の通信を中継させる機能がポートフォワーディング(ポートトンネル)です。

GnuPG(GPG)による暗号化・署名

gpgコマンドの基本操作

GnuPG(GNU Privacy Guard)は、gpgコマンドを中心に、ファイルやメッセージの暗号化・復号、署名・検証を行うツールです。

  • 鍵ペアの生成:gpg --full-generate-key(対話的にアルゴリズム・鍵長・有効期限を選べる、現在推奨されている方法)またはgpg --gen-key(簡易版)。
  • 鍵の一覧表示:gpg --list-keys(公開鍵の一覧)、gpg --list-secret-keys(秘密鍵の一覧)。
  • 暗号化:gpg -e -r 相手のユーザーID ファイル名(相手の公開鍵を使って暗号化。相手だけが自分の秘密鍵で復号できます)。
  • 復号:gpg -d ファイル名.gpg(自分の秘密鍵で復号)。
  • 対称暗号化:gpg -c ファイル名(公開鍵を使わず、共有のパスフレーズだけで暗号化する方式。相手にも同じパスフレーズを別途安全な方法で伝える必要があります)。
  • 署名:gpg -s ファイル名(署名付きファイルを作成)、gpg -b ファイル名(本文とは別ファイルの署名=分離署名を作成)。
  • 検証:gpg --verify 署名ファイル 対象ファイル(署名が正しいか、改ざんされていないかを確認)。

この記事で扱うSSHのユーザー鍵が主に「ログイン認証」に使われるのに対し、GnuPGの鍵ペアは「暗号化」「署名」という2つの異なる用途の両方に使える、という違いも押さえておくとよいポイントです。

gpg-agentと~/.gnupg/

gpg-agentは、GnuPGの秘密鍵を復号するためのパスフレーズをキャッシュしておくプログラムで、役割の考え方はssh-agentとよく似ています実装上は、gpg-agentはssh-agent互換のモードで動作させることもでき、SSHの鍵管理をgpg-agentに一本化する構成も可能です。ただしこれは応用的な構成であり、両者が別々の独立したプログラムであるという基本を理解しておけば試験対策としては十分です。[6]。GnuPGの鍵(公開鍵・秘密鍵)や、鍵の信頼関係の情報(トラストデータベース)、各種設定ファイルは、ホームディレクトリの~/.gnupg/ディレクトリにまとめて保存されます。

OpenSSHGnuPG
鍵ペア生成コマンドssh-keygengpg --full-generate-key
鍵の保存場所~/.ssh/~/.gnupg/
パスフレーズを覚えておくエージェントssh-agentgpg-agent
エージェントに鍵を登録するコマンドssh-add(gpg-agentが自動的に管理)

鍵の失効(失効証明書)

GnuPGの鍵ペアの秘密鍵を紛失したり、パスフレーズを忘れてしまったり、鍵が漏えいした疑いがある場合、その公開鍵を「もう有効な鍵として扱わないでほしい」と周囲に知らせる必要があります。これを行うための仕組みが失効証明書です。

現行のGnuPGでは、鍵ペアの生成時に失効証明書が自動生成され、通常は~/.gnupg/openpgp-revocs.d/に保存されます。また、gpg --gen-revoke ユーザーIDで手動生成することもできます。失効証明書は、対象の鍵の秘密鍵がまだ手元にある状態でなければ作成できません。そのため、鍵を紛失してから慌てて作ろうとしても手遅れになる場合があります。鍵ペアを作成した後は、生成された失効証明書を鍵本体とは別の安全な場所に保管しておくことが推奨されています失効証明書自体は「まだ発行していない(適用していない)」状態で保管しておき、実際に鍵を失効させたいタイミングで公開鍵サーバーに取り込む(gpg --importしてから公開鍵を再度公開する)、という運用が一般的です。[7]。

鍵アルゴリズムの比較:RSA・DSA・ECDSA・ED25519

OpenSSH・GnuPGのいずれでも登場する鍵アルゴリズムの特徴を整理します。

アルゴリズム方式現在の位置づけ
RSA大きな整数の素因数分解の困難さに基づく方式現在も広く使われる標準的な方式。鍵長は3072ビット以上が目安
DSA離散対数問題に基づく方式OpenSSHでは、1024ビット固定のssh-dssが非推奨化されたのち、現在はサポートが完全に削除されている(前述)
ECDSA楕円曲線暗号に基づく方式RSAより短い鍵長で同等の強度とされる。曲線の種類(256/384/521ビット)を選択する
ED25519楕円曲線暗号の一種(EdDSA)に基づく方式鍵長固定・高速に動作し、現在のssh-keygenの既定アルゴリズムになっている

補足

  1. RSAの推奨ビット数・既定値はOpenSSHのバージョンによって変わってきた経緯があります(かつては2048ビットが既定でした)。「RSAは常に2048ビット」と固定的に覚えず、必要に応じて現在の既定値を確認してください。 ↩
  2. この既定値はOpenSSHのバージョンによって異なります。長らくRSAが既定でしたが、現在のOpenSSHのマニュアルでは「引数無しで実行するとED25519の鍵を生成する」と明記されています。導入されているOpenSSHのバージョンによっては、既定がRSAのままの場合もあります。 ↩
  3. 非常に古いディストリビューション・古いバージョンのOpenSSHが稼働している環境では、今でもDSA鍵が有効な場合があります。「DSAは絶対にどの環境でも使えない」という意味ではなく、現在の主要なOpenSSHのリリースでは廃止済み、という理解が正確です。 ↩
  4. ~/.ssh/known_hostsはユーザーごとの記録、/etc/ssh/ssh_known_hostsはシステム全体で共有する記録という違いがあります。どちらか一方だけが存在する環境も、両方使われている環境もあります。 ↩
  5. -X(untrusted)は、転送先アプリケーションによる一部の操作(他ウィンドウの操作等)を制限するセキュリティ上の追加制約が働きます。-Y(trusted)はこの制約を外すため、より柔軟に動作しますがその分リスクも高くなります。「-Xのほうが単純に上位互換」ではなく、信頼度の違いを表すオプションです。 ↩
  6. 実装上は、gpg-agentはssh-agent互換のモードで動作させることもでき、SSHの鍵管理をgpg-agentに一本化する構成も可能です。ただしこれは応用的な構成であり、両者が別々の独立したプログラムであるという基本を理解しておけば試験対策としては十分です。 ↩
  7. 失効証明書自体は「まだ発行していない(適用していない)」状態で保管しておき、実際に鍵を失効させたいタイミングで公開鍵サーバーに取り込む(gpg --importしてから公開鍵を再度公開する)、という運用が一般的です。 ↩