SSHキー認証の理解:公開鍵と秘密鍵の説明
SSH(Secure Shell)は、サーバーへの安全なリモートアクセスに不可欠であり、管理者や開発者がどこからでもシステムを管理できるようにします。パスワード認証も一般的な方法ですが、セキュリティ上の脆弱性がつきものです。業界で推奨され、はるかに安全な代替手段がSSHキー認証です。
この記事では、公開鍵と秘密鍵の基本的な役割を明確に説明することで、SSHキー認証を分かりやすく解説します。これらの暗号化のペアがどのように連携してリモート接続を保護し、不正アクセスに対する堅牢な防御を提供するのかを掘り下げます。この記事を読み終える頃には、なぜこの方法が従来のパスワード認証よりも安全であるだけでなく、日常的な使用においてもより便利なのかを理解できるようになるでしょう。
パスワードの問題点
従来のパスワード認証は、共有の秘密であるパスワードに依存しています。強力なパスワードは適度なレベルのセキュリティを提供できますが、いくつかの弱点にさらされています。
- 総当たり攻撃(Brute-force attacks): 攻撃者は、正しく推測するまで無数のパスワードの組み合わせを試すことができます。
- 辞書攻撃(Dictionary attacks): 一般的な単語やフレーズを使用して、攻撃者はアカウントを迅速に侵害できます。
- キーロガー(Keyloggers): 悪意のあるソフトウェアがキーストロークをキャプチャし、パスワードを漏洩させることができます。
- フィッシング(Phishing): ソーシャルエンジニアリングの手法により、ユーザーが認証情報を漏洩させられることがあります。
- 人的ミス(Human error): ユーザーは、推測されやすい、または使い回された弱いパスワードを選択しがちで、誤って漏洩させてしまうこともあります。
SSHキー認証は、ネットワーク経由で秘密情報を送信する必要性をなくすことで、これらのリスクを軽減し、リモートインフラストラクチャの保護において優れた選択肢となります。
SSHキー認証:概要
SSHキー認証は、非対称暗号化を利用しています。これは、数学的にリンクされた鍵のペア(公開鍵と秘密鍵)を使用するシステムです。暗号化と復号に同じ鍵を使用する対称暗号化とは異なり、非対称暗号化は、暗号化に一方の鍵を、復号にそれに関連する別の鍵を使用します。
キーを使用してSSHサーバーへの接続を試みると、サーバーはクライアントに挑戦を送り、クライアントはその秘密鍵をネットワーク上で送信することなく、秘密鍵を使用して身元を証明します。このプロセスにより、対応する公開鍵が信頼するように設定されたサーバーとの接続を確立できるのは、正しい秘密鍵を所有するクライアントのみであることが保証されます。
暗号化のデュオ:公開鍵と秘密鍵
SSHキー認証の中心にあるのは、これら2つの明確に区別されながらも相互に関連したコンポーネントです。
秘密鍵
秘密鍵は、あなたの秘密の身元です。それは長い複雑な文字列であり、絶対に機密に保ち、決して誰とも共有してはなりません。それをデジタルの金庫のユニークな鍵と考えてください。
- セキュリティの重要性: 秘密鍵が侵害された場合、攻撃者はあなたになりすまし、対応する公開鍵が展開されているどのサーバーにも不正にアクセスできるようになります。
- 場所: 通常、ローカルマシンに保存されます(例:
~/.ssh/id_rsa、~/.ssh/id_ed25519)。 - 保護: パスフレーズで保護されており、セキュリティの追加レイヤーとなります。攻撃者が秘密鍵ファイルにアクセスできたとしても、パスフレーズなしでは使用できません。
公開鍵
公開鍵は、秘密鍵の相棒です。秘密鍵から派生したものですが、秘密鍵を再作成するために使用することはできません。その名前が示すように、公開鍵は共有されることを目的としており、アクセスしたい任意のサーバーに配置されます。
- 共有可能: セキュリティを侵害することなく、安全に公開鍵を誰にでも、どのサーバーにも配布できます。
- 場所: サーバー上では、公開鍵は通常、各ユーザーアカウントの
~/.ssh/authorized_keysファイルに保存されます。このファイル内の各行は、信頼された公開鍵を表します。 - 役割: 公開鍵はデジタル指紋のように機能します。接続しようとすると、サーバーは公開鍵を使用して、秘密鍵自体を見ることなく、一致する秘密鍵をあなたが所有していることを確認します。
SSHキー認証の仕組み:ハンドシェイク
SSHキー認証が安全な接続を確立するステップバイステップのプロセスを見ていきましょう。
- 鍵ペアの生成: まず、ローカルマシンで公開鍵と秘密鍵のペアを生成します。秘密鍵は秘密のままにし、公開鍵は配布するものになります。
- 公開鍵の展開: アクセスしたいリモートサーバーに公開鍵をコピーします。この鍵は通常、サーバー上のユーザーのホームディレクトリにある
~/.ssh/authorized_keysファイルに追加されます。 - 接続試行: ローカルマシンからリモートサーバーへのSSH接続を開始すると、SSHクライアントはキーを使用して認証したいことを示します。
- サーバーの挑戦: 公開鍵を持っているサーバーは、ランダムなデータ文字列(「挑戦」)を生成し、公開鍵を使用してそれを暗号化します。
- クライアントの応答: サーバーはこの暗号化された挑戦をSSHクライアントに送信します。クライアントは、秘密鍵を使用して挑戦を復号します。
- 検証: クライアントは、元のランダム文字列(またはその派生物とセッションデータを一緒に)を秘密鍵で暗号化し、サーバーに返送します。サーバーは、公開鍵を使用してこの応答を復号します。復号された値が元の挑戦と一致する場合、サーバーはあなたが正しい秘密鍵を所有していると確信します。
- 認証の付与: 検証が成功すると、サーバーはアクセスを許可し、安全なSSHセッションが確立されます。
このプロセス全体を通じて、秘密鍵はローカルマシンから決して離れないことが重要です。 それから派生した暗号化された証明のみが交換されます。
SSH鍵ペアの生成
SSH鍵ペアの生成は、ローカルマシン(Linux、macOS、またはWindows上のWSL/Git Bash)でssh-keygenコマンドを使用して簡単に行えます。
ssh-keygen -t ed25519 -C "[email protected]"
-t ed25519: 作成する鍵の種類を指定します。ed25519は、最新で非常に安全かつ効率的なアルゴリズムです。rsaも一般的ですが、現在はed25519が一般的に推奨されています。-C "[email protected]": 公開鍵にコメントを追加し、その目的や所有者を特定するのに役立ちます。
鍵を保存するファイル(デフォルトは~/.ssh/id_ed25519)とパスフレーズを入力するように求められます。秘密鍵を保護するために、常に強力なパスフレーズを使用してください。
Generating public/private ed25519 key pair.
Enter file in which to save the key (~/.ssh/id_ed25519):
Created directory '/home/youruser/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/youruser/.ssh/id_ed25519.
Your public key has been saved in /home/youruser/.ssh/id_ed25519.pub.
The key fingerprint is: SHA256:...
The key's randomart image is:
+--[ED25519 256]----+
| .=+ |
| . o. . |
| . + o. |
| o = B o. |
| . S @ + + |
| = + B . |
| o * * E |
| . o o |
| . . |
+----[SHA256]-------+
生成後、~/.sshディレクトリに2つのファイルができます。
id_ed25519(秘密鍵)id_ed25519.pub(公開鍵)
注意: 秘密鍵ファイル(id_ed25519)には、あなただけが読み書きできるように厳格な権限(例:chmod 600 ~/.ssh/id_ed25519)を設定してください。
公開鍵の展開
キー認証を使用するには、アクセスしたいリモートサーバーに公開鍵を配置する必要があります。
ssh-copy-idの使用(推奨)
ssh-copy-idユーティリティは、公開鍵を展開する最も簡単で安全な方法です。存在しない場合は、~/.sshディレクトリとauthorized_keysファイルを正しい権限で作成します。
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@remote_host
リモートサーバーのユーザー名とサーバーのIPアドレスまたはホスト名に、userとremote_hostを置き換えてください。キーをアップロードするために、user@remote_hostのパスワードを最後に一度だけ入力するように求められます。
手動展開
ssh-copy-idが利用できない場合は、公開鍵を手動でコピーできます。
-
公開鍵の内容をコピー:
catを使用して公開鍵を表示します。
bash cat ~/.ssh/id_ed25519.pub
ssh-ed25519 ...で始まり、コメントで終わる出力全体をコピーします。 -
パスワード認証を使用してリモートサーバーにSSH接続:
bash ssh user@remote_host
プロンプトが表示されたらパスワードを入力します。 -
存在しない場合は
~/.sshディレクトリとauthorized_keysファイルを作成:
bash mkdir -p ~/.ssh chmod 700 ~/.ssh touch ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys -
公開鍵を
authorized_keysに追加: 前にコピーした公開鍵の内容をauthorized_keysファイルに貼り付けます。
bash echo "ssh-ed25519 AAAA..." >> ~/.ssh/authorized_keys
(ssh-ed25519 AAAA...を実際の公開鍵の内容に置き換えてください)
SSHキーでの接続
公開鍵がサーバーに配置されたら、ユーザーとホストを指定するだけで接続できます。
ssh user@remote_host
複数の鍵ペアがある場合や、秘密鍵がデフォルトの場所(~/.ssh/id_rsaまたは~/.ssh/id_ed25519)にない場合は、-iオプションを使用して指定する必要がある場合があります。
ssh -i ~/.ssh/my_custom_key user@remote_host
秘密鍵がパスフレーズで保護されている場合は、入力するように求められます。セッション中にパスフレーズを繰り返し入力するのを避けるには、ssh-agentを使用できます。
SSHキー認証のセキュリティ上の利点
- パスワード推測の排除: 認証にパスワードが使用されないため、パスワードに対する総当たり攻撃は不可能になります。
- より強力な認証情報: SSHキーは通常、2048ビット(RSA)または256ビット(Ed25519)の暗号化値であり、人間が生成した最も強力なパスワードよりもはるかに複雑で解読が困難です。
- 秘密情報の送信なし: 秘密鍵はローカルマシンから決して離れないため、認証中に傍受または盗難されるリスクが大幅に軽減されます。
- 自動化フレンドリー: キーにより、スクリプト可能なパスワードなしのログインが可能になり、自動化ツールやCI/CDパイプラインに不可欠です。
- パスフレーズ保護: 秘密鍵にパスフレーズを追加すると、セキュリティの追加レイヤーが提供されます。秘密鍵ファイルが盗まれたとしても、パスフレーズなしでは使用できません。
SSHキーの管理
ssh-agent
ssh-agentは、バックグラウンドで実行され、復号された秘密鍵をメモリに保持するプログラムです。SSHサーバーに接続しようとすると、SSHクライアントは必要な秘密鍵についてssh-agentに問い合わせることができ、パスフレーズを繰り返し入力する必要がなくなります。
ssh-agentを開始して鍵を追加するには:
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
鍵をエージェントに追加する際に、パスフレーズを一度入力します。
キーの命名と整理
複数のキー(例:異なる組織、プロジェクト、または個人的な使用のため)を管理するには、意味のある名前の使用を検討してください。
ssh-keygen -t ed25519 -f ~/.ssh/id_work_project -C "work_project_key"
ssh-keygen -t ed25519 -f ~/.ssh/id_personal_github -C "personal_github_key"
その後、-iオプションを使用して使用するキーを指定するか、ホストに基づいて正しいキーを自動的に選択するように~/.ssh/configファイルを構成できます。
~/.ssh/configの例:
Host github.com
IdentityFile ~/.ssh/id_personal_github
User git
Host work-server
Hostname 192.168.1.100
IdentityFile ~/.ssh/id_work_project
User devuser
ベストプラクティスとヒント
- 秘密鍵を絶対に共有しないでください: これが鉄則です。秘密鍵はあなたのデジタルアイデンティティです。
- 強力なパスフレーズを使用してください: 強力なパスワードと同様に、堅牢なパスフレーズで秘密鍵を保護してください。これにより、たとえ悪意のある手に渡ったとしても、鍵は無用になります。
- 定期的にキーをローテーションしてください: 特にキーが侵害された可能性があると思われる場合は、定期的に新しいキーを生成し、古いキーを無効にしてください。
- ファイル権限を制限してください: 秘密鍵ファイルには
600(rw-------)の権限を、~/.sshディレクトリには700(rwx------)の権限を設定してください。 - サーバーでパスワード認証を無効にしてください: キー認証を設定したら、サーバーでのSSHパスワード認証を無効にすることを検討してください。これにより、セキュリティが劇的に向上します。これは、
/etc/ssh/sshd_configでPasswordAuthentication noを設定することで行われることがよくあります。 ssh-agentを使用してください: 特にパスフレーズ付きのキーを管理するために、利便性とセキュリティのためにssh-agentを使用してください。
結論
SSHキー認証は、リモートサーバーにアクセスするための堅牢で安全、かつ便利な方法を提供します。公開鍵と秘密鍵の個別の役割と、それらが暗号化ハンドシェイクでどのように相互作用するかを理解することで、運用セキュリティを大幅に向上させることができます。パスワードベースのログインからSSHキーへの移行は、サーバー管理の改善と一般的な攻撃ベクトルからの保護に向けた基本的なステップです。この強力なセキュリティメカニズムを採用して、デジタルインフラストラクチャを保護してください。