安全なSSH鍵認証のステップバイステップガイド
Secure Shell (SSH) はリモートシステム管理の基幹技術であり、安全でないネットワークを介してサーバーへの安全なアクセスを可能にします。パスワードベースの認証は一般的ですが、ブルートフォース攻撃やクレデンシャルスタッフィングに対して本質的に脆弱です。SSH鍵認証は、パスワードを送信せずに暗号鍵ペアを活用してIDを検証する、はるかに堅牢で安全な代替手段を提供します。
このガイドでは、安全なSSH鍵認証の設定プロセス全体を説明します。SSH鍵ペアの生成方法、公開鍵をリモートサーバーに安全に配布する方法、そして最も重要なこととして、安全性の低いパスワードログインを無効にすることでサーバーのSSH設定を強化する方法を学びます。これらの手順に従うことで、リモートアクセスのセキュリティ体制が大幅に強化され、システムが一般的な攻撃ベクトルに対してより耐性を持つようになります。
SSH鍵認証の理解
SSH鍵認証は、暗号学的にリンクされた一対の鍵、すなわち秘密鍵と公開鍵に依存します。
- 秘密鍵: この鍵は、ローカルマシン上で秘密に、かつ安全に保管されなければなりません。それは、あなただけが所有する非常に複雑なパスワードのようなものです。
- 公開鍵: この鍵は自由に共有でき、アクセスしたいリモートサーバーに配置されます。サーバーはこれを使用してあなたのIDを検証します。
接続を試みると、サーバーはあなたの公開鍵を使用してローカルマシンにチャレンジします。ローカルマシンは秘密鍵を使用してこのチャレンジに応答し、ネットワーク経由で秘密鍵を送信することなくあなたのIDを証明します。この方法は、正しく設定されれば接続ごとにパスワードを入力する必要がなくなるため、より安全であるだけでなく、より便利です。
ステップ1: SSH鍵ペアの生成
ssh-keygenユーティリティは、新しいSSH鍵ペアを作成するために使用されます。ED25519のような現代的で強力なアルゴリズムを使用することが推奨されます。
鍵の種類と強度を選択する
RSA鍵は依然として広く使用されていますが、ED25519は短い鍵長と高速な操作で優れたセキュリティを提供します。新規設定では、一般的にED25519が推奨されます。
鍵ペアの生成
ローカルマシン(クライアント)で、ターミナルを開き、以下のコマンドを実行します。
ssh-keygen -t ed25519 -C "[email protected]"
-t ed25519: 鍵のタイプをED25519として指定します。-C "[email protected]": 公開鍵にコメントを追加します。これは識別によく使われます。実際のメールアドレスまたは分かりやすいラベルに置き換えてください。
コマンドは、鍵を保存する場所とオプションのパスフレーズを尋ねます。
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/youruser/.ssh/id_ed25519):
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: ...
強力なパスフレーズを設定する(強く推奨)
プロンプトが表示されたら、秘密鍵には必ず強力なパスフレーズを設定すること。このパスフレーズはローカルマシン上の秘密鍵を暗号化し、追加のセキュリティ層を提供します。もし秘密鍵が誤って他人の手に渡ったとしても、パスフレーズがなければ無用となります。パスフレーズを繰り返し入力する手間を省くにはssh-agentを使用できます(ステップ4を参照)。
鍵ファイルの場所
デフォルトでは、ssh-keygenは秘密鍵を~/.ssh/id_ed25519に、公開鍵を~/.ssh/id_ed25519.pubに保存します。
秘密鍵のパーミッション
秘密鍵ファイルのパーミッションは非常に厳格であることが重要です。所有者のみが読み取れるようにする必要があります。ssh-keygenは通常これを正しく設定しますが、確認することをお勧めします。
chmod 600 ~/.ssh/id_ed25519
ステップ2: 公開鍵をサーバーに配布する
鍵ペアを生成したら、アクセスしたいリモートサーバーに公開鍵をコピーする必要があります。それはリモートサーバー上のユーザーの~/.ssh/ディレクトリ内にauthorized_keysという名前のファイルとして配置されるべきです。
方法1: ssh-copy-idを使用する(推奨)
ssh-copy-idは最もシンプルで安全な方法です。リモートサーバーにログインし(パスワードを使用)、~/.sshディレクトリが存在しない場合は作成し、正しいパーミッションを設定し、公開鍵を~/.ssh/authorized_keysに追加します。
ssh-copy-id user@your_server_ip
userをリモートサーバーのユーザー名に、your_server_ipをサーバーのIPアドレスまたはホスト名に置き換えてください。リモートサーバーのパスワードを尋ねられるでしょう。
方法2: 手動でのコピー
ssh-copy-idが利用できない場合は、公開鍵を手動でコピーできます。
-
ローカルマシンから公開鍵の内容をコピーする:
bash cat ~/.ssh/id_ed25519.pub
出力全体をクリップボードにコピーします(ssh-ed25519 ...で始まります)。 -
パスワードを使用してリモートサーバーにログインする:
bash ssh user@your_server_ip -
~/.sshディレクトリが存在しない場合は作成し、パーミッションを設定する:
bash mkdir -p ~/.ssh chmod 700 ~/.ssh -
公開鍵を
authorized_keysに追加する:
bash echo "PASTE_YOUR_PUBLIC_KEY_HERE" >> ~/.ssh/authorized_keys
PASTE_YOUR_PUBLIC_KEY_HEREをコピーした実際のコンテンツに置き換えることを確認してください。>>(追記)を使用することは、既存の鍵がある場合に上書きを避けるために重要です。 -
authorized_keysに正しいパーミッションを設定する:
bash chmod 600 ~/.ssh/authorized_keys- 警告:
~/.sshまたは~/.ssh/authorized_keysのパーミッションが正しくないと、鍵認証は機能しません。
- 警告:
ステップ3: SSH鍵認証のテスト
パスワード認証を無効にする前に、鍵認証が正しく機能していることを確認することが絶対に不可欠です。手動コピーの手順でまだ接続している場合は、リモートサーバーからログアウトしてください。
ローカルマシンから、パスワードを指定せずにサーバーに接続を試みます。
ssh user@your_server_ip
- 秘密鍵にパスフレーズを設定した場合、入力が求められます。
- パスワードプロンプトなしで(パスフレーズがある場合はその後に)接続が成功した場合、鍵認証は機能しています。リモートサーバーのプロンプトが表示されるはずです。
SSH鍵を使用してログインできない場合は、ステップ4に進まないでください。 パスワード認証を無効にする前に、問題を解決してください。そうしないと、サーバーからロックアウトされる危険性があります。
ステップ4: セキュリティの強化 - パスワード認証の無効化
SSH鍵認証が機能していることを確認したら、サーバーのパスワードベースのログインを無効にすることで、セキュリティを大幅に向上させることができます。これにより、パスワードに対するブルートフォース攻撃が防止され、有効なSSH鍵を持つ者だけがサーバーにアクセスできるようになります。
-
SSH鍵を使用してリモートサーバーにログインする。
bash ssh user@your_server_ip -
SSHデーモンの設定ファイルを編集する。 このファイルは通常
/etc/ssh/sshd_configにあります。
bash sudo nano /etc/ssh/sshd_config
(nanoの代わりにviまたは好みのテキストエディタを使用できます。) -
以下のディレクティブを見つけて変更する。
-
PasswordAuthenticationを見つけ、その値をnoに変更します。
#PasswordAuthentication yes PasswordAuthentication no
(#でコメントアウトされている場合は、コメントを解除してください) -
ChallengeResponseAuthenticationを見つけ、その値をnoに変更します。
#ChallengeResponseAuthentication yes ChallengeResponseAuthentication no -
(オプションだが推奨)通常ユーザーとしてログイン後に
sudoを使用する予定がある場合は、SSH経由でのroot直接ログインを無効にすることを検討します。
PermitRootLogin no -
(オプション)デフォルトのSSHポートを
22から非標準の高いポート(例:2222)に変更することを検討します。これは、標的型攻撃に対するセキュリティを追加するものではありませんが、自動ポートスキャナーからのノイズを減らすことができます。
#Port 22 Port 2222
ポートを変更した場合は、接続時に-pフラグで指定するのを忘れないでください(例:ssh -p 2222 user@your_server_ip)。
-
-
変更を保存し、テキストエディタを終了する。
-
新しい設定を適用するためにSSHサービスを再起動する。 コマンドはオペレーティングシステム(例: Ubuntu/DebianとCentOS/RHEL)によって若干異なります。
-
Systemdベースのシステム(ほとんどの現代的なLinuxディストリビューション):
bash sudo systemctl restart sshd -
古いSysVinitベースのシステム:
bash sudo service ssh restart
-
-
重要なこととして、新しいターミナルウィンドウを開き(現在のSSHセッションを閉じないでください!)、鍵を使用してログインを試みる。これにより、何か問題が発生した場合でもロックアウトされることなく、新しい設定をテストできます。
bash ssh user@your_server_ip
ポートを変更した場合:
bash ssh -p 2222 user@your_server_ip接続が成功したら、元のSSHセッションを安全に閉じることができます。
新しいログインが失敗した場合は、直ちに元のまだアクティブなSSHセッションで
sshd_configの変更を元に戻し、SSHサービスを再度再起動してから、再評価してください。
ベストプラクティスとヒント
- 秘密鍵には常に強力なパスフレーズを使用する。これは、秘密鍵が侵害された場合の最後の防衛線となります。
- 秘密鍵を保護する。決して共有せず、厳格なファイルパーミッション(
chmod 600 ~/.ssh/id_ed25519)で安全に保存されていることを確認してください。究極の保護のために、ハードウェアセキュリティモジュール(HSM)やYubiKeyを検討してください。 - 利便性のために
ssh-agentを使用する。ssh-agentは、秘密鍵をメモリにロードし、複数のSSH接続全体でセッションごとにパスフレーズを1回だけ入力できるようにします。ssh-add ~/.ssh/id_ed25519で鍵をエージェントに追加してください。 - SSH鍵を定期的にローテーションする。定期的に新しい鍵ペアを生成し、古い公開鍵をサーバーから削除してください。特にチームメンバーが去った場合や、鍵のセキュリティが侵害された疑いがある場合は重要です。
PermitRootLoginをnoまたはprohibit-passwordに制限する。一般的に、通常ユーザーとしてログインし、管理タスクにはsudoを使用する方が良いです。- ファイアウォールを設定する。必要なポート(SSHポートなど)のみがインターネットに公開されていることを確認してください。
ufwやfirewalldのようなツールが役立ちます。
結論
このステップバイステップガイドに従うことで、リモートサーバーのSSH鍵認証を正常に設定し、安全を確保したことになります。堅牢な暗号鍵ペアを生成し、公開鍵を配布し、そして最も重要なこととして、安全性の低いパスワードベースのログインを無効にしました。これにより、サーバーのセキュリティが大幅に向上し、一般的なハッキング試行に対する耐性が高まります。
秘密鍵とそのパスフレーズは、サーバーにアクセスするための主要な認証情報となるため、常に注意深く保護することを忘れないでください。これらのベストプラクティスを取り入れ、すべてのリモートアクセスニーズに対して強力なセキュリティ体制を維持してください。