SSH公開鍵認証の設定と接続失敗の原因

SSH公開鍵認証の設定と接続失敗の原因完全ガイド
SSH接続で公開鍵認証を使う場合、サーバー側で正しくauthorized_keysファイルを設定しないと「Permission denied (publickey)」エラーが発生します。このエラーは、鍵ペアの作成からサーバーへの配置、パーミッション設定までのどこかでミスが起きたことを示しています。本記事では、SSH公開鍵認証を正しく設定する手順と、接続失敗の具体的な原因と対処法を、実務で使える形で解説します。SSH接続で公開鍵認証を導入する際のトラブルシューティングに必ず役立つ内容です。
目次
- はじめに:SSH公開鍵認証の仕組み
- 鍵ペアの作成手順(クライアント側)
- サーバーへの公開鍵配置と設定
- SSH接続テストと基本的なトラブルシューティング
- SSH接続ができない主な原因と解決策
- セキュリティを考慮したSSH設定
- まとめ:SSH公開鍵認証の設定と接続成功のコツ
はじめに:SSH公開鍵認証の仕組み
SSH公開鍵認証は、暗号化された鍵ペア(秘密鍵と公開鍵)を使ってユーザー認証を行う仕組みです。公開鍵はサーバーに保存され、秘密鍵はクライアント側で安全に保管されます。接続時にサーバーは公開鍵を使ってチャレンジを暗号化し、クライアントは秘密鍵でそれを復号します。この仕組みにより、パスワード認証よりもセキュアな認証が可能になります。
公開鍵認証の主なメリットは以下の通りです。
- セキュリティの向上:パスワードよりも強力な暗号化を使用
- 自動化と効率化:パスワード入力が不要でスクリプトやCI/CDパイプラインで利用しやすい
- ブルートフォース攻撃への耐性:公開鍵認証ではパスワードが不要なため、ブルートフォース攻撃が無効化される
一方で、公開鍵認証の設定には正しい手順が必要です。特に、ファイルのパーミッション設定や鍵の配置場所を間違えると、接続ができなくなります。以下の手順に従って、確実に設定を行いましょう。
鍵ペアの作成手順(クライアント側)
1. 鍵ペアの生成
SSH鍵ペアを生成するには、ssh-keygenコマンドを使用します。以下のコマンドを実行してください。
ssh-keygen -t ed25519 -C "your_email@example.com"このコマンドでは、以下の点に注意してください。
-t ed25519:鍵の種類を指定します。ed25519は現代的な暗号方式で、安全性とパフォーマンスに優れています。-C "your_email@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
デフォルトの保存場所は~/.ssh/ディレクトリです。ファイル名を変更する場合は、上記のプロンプトで指定します。パスフレーズは任意ですが、セキュリティを高めるために設定することを推奨します。
2. 生成された鍵の確認
鍵ペアが正しく生成されたかどうかを確認します。以下のコマンドを実行してください。
ls -l ~/.ssh/出力例:
-rw------- 1 user user 411 Jan 1 12:34 id_ed25519
-rw-r--r-- 1 user user 106 Jan 1 12:34 id_ed25519.pub
秘密鍵(id_ed25519)は所有者のみが読み書きできるパーミッション(600)が設定されている必要があります。公開鍵(id_ed25519.pub)は読み取り可能なパーミッション(644)で問題ありません。
公開鍵の内容を確認するには、以下のコマンドを実行します。
cat ~/.ssh/id_ed25519.pub出力例:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... your_email@example.comこの公開鍵の文字列をコピーして、サーバー側の~/.ssh/authorized_keysファイルに追加します。
3. 秘密鍵の保護
秘密鍵は非常に重要なファイルです。以下の点に注意して保護してください。
- ファイルのバックアップ:秘密鍵は失われると再発行できません。バックアップを取っておきましょう。
- パスフレーズの設定:パスフレーズを設定すると、秘密鍵の不正使用を防ぐことができます。
- ファイルのパーミッション:秘密鍵のパーミッションは
600(所有者のみ読み書き可)に設定します。 - 鍵の保管場所:
~/.ssh/ディレクトリ以外に保存しないようにしましょう。
秘密鍵が漏洩した場合は、すぐに新しい鍵ペアを生成して古い鍵を無効化する必要があります。
サーバーへの公開鍵配置と設定
1. サーバーへの公開鍵の転送
公開鍵をサーバーに転送する方法はいくつかあります。以下に代表的な方法を紹介します。
方法1:ssh-copy-idコマンドを使用する
ssh-copy-idコマンドは、公開鍵をサーバーに自動的に配置してくれる便利なツールです。以下のコマンドを実行します。
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server_ip実行すると、以下のようなプロンプトが表示されます。
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
user@server_ip's password:
パスワードを入力すると、公開鍵がサーバーの~/.ssh/authorized_keysファイルに追加されます。
方法2:手動で公開鍵を配置する
ssh-copy-idコマンドが利用できない場合や、詳細な設定を行いたい場合は、手動で公開鍵を配置します。以下の手順に従ってください。
公開鍵の内容をコピーします。
cat ~/.ssh/id_ed25519.pubサーバーにSSH接続します。
ssh user@server_ip~/.sshディレクトリが存在しない場合は作成します。mkdir -p ~/.sshauthorized_keysファイルに公開鍵を追加します。既にファイルが存在する場合は、新しい行に追加します。echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... your_email@example.com" >> ~/.ssh/authorized_keysauthorized_keysファイルのパーミッションを600に設定します。chmod 600 ~/.ssh/authorized_keys
2. SSHサーバーの設定
サーバー側でSSHサーバー(sshd)の設定を確認します。設定ファイルは通常/etc/ssh/sshd_configにあります。以下の設定が正しく行われていることを確認してください。
sudo vi /etc/ssh/sshd_config主な設定項目は以下の通りです。
| 設定項目 | 推奨値 | 説明 |
|---|---|---|
| PubkeyAuthentication | yes | 公開鍵認証を有効にします。 |
| PasswordAuthentication | no | パスワード認証を無効にします(セキュリティ向上のため)。 |
| PermitRootLogin | prohibit-password | rootユーザーの直接ログインを禁止します(鍵認証のみ許可)。 |
| AuthorizedKeysFile | .ssh/authorized_keys | 公開鍵の保存場所を指定します。 |
設定を変更した場合は、sshdサービスを再起動します。
sudo systemctl restart sshd3. ファイルとディレクト…
SSH公開鍵認証では、ファイルとディレクトリのパーミッションが非常に重要です。以下のパーミッションが正しく設定されていることを確認してください。
| ファイル/ディレクトリ | 推奨パーミッション | 説明 |
|---|---|---|
| ~/.ssh | 700 (drwx——) | 所有者のみアクセス可能なディレクトリです。 |
| ~/.ssh/authorized_keys | 600 (-rw——-) | 所有者のみ読み書き可能なファイルです。 |
| ~/.ssh/id_rsa(秘密鍵) | 600 (-rw——-) | 所有者のみ読み書き可能なファイルです。 |
| /etc/ssh | 755 (drwxr-xr-x) | 所有者とグループ、その他ユーザーが読み取り可能なディレクトリです。 |
| /etc/ssh/sshd_config | 600 (-rw——-) | 所有者のみ読み書き可能なファイルです。 |
パーミッションを変更するには、以下のコマンドを使用します。
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/id_ed25519パーミッションが間違っていると、SSH接続時に「Permission denied (publickey)」エラーが発生します。
SSH接続テストと基本的なトラブルシューティング
1. SSH接続テスト
公開鍵認証が正しく設定されたかどうかをテストします。以下のコマンドを実行します。
ssh -i ~/.ssh/id_ed25519 user@server_ip接続が成功すると、サーバーのシェルにログインできます。以下のような出力が表示されます。
Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-86-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
Last login: Mon Jan 1 12:34:56 2024 from client_ip
user@server:~$接続が成功しない場合は、以下の手順でトラブルシューティングを行います。
2. 基本的なトラブルシュ…
1. エラーメッセージの確認
SSH接続時に表示されるエラーメッセージを確認します。主なエラーメッセージとその原因は以下の通りです。
| エラーメッセージ | 原因 | 対処法 |
|---|---|---|
| Permission denied (publickey) | 公開鍵がサーバーに正しく配置されていない、またはパーミッションが間違っている | 公開鍵の配置とパーミッションを確認 |
| Agent admitted failure to sign using the key | SSHエージェントに秘密鍵が登録されていない | ssh-add ~/.ssh/id_ed25519を実行 |
| No such file or directory | 鍵ファイルのパスが間違っている | 鍵ファイルの存在とパスを確認 |
| Bad permissions | ファイルやディレクトリのパーミッションが間違っている | パーミッションを600または700に設定 |
2. SSH接続の詳細なデバッグ
SSH接続の詳細なログを確認するには、-vオプションを使用します。以下のコマンドを実行します。
ssh -vvv -i ~/.ssh/id_ed25519 user@server_ipこのコマンドでは、接続プロセスの詳細なログが表示されます。ログを確認して、どこでエラーが発生しているかを特定します。
3. SSHエージェントの利用
SSHエージェントを使用すると、秘密鍵のパスフレーズを毎回入力する手間を省くことができます。以下の手順でSSHエージェントを設定します。
SSHエージェントを起動します。
eval "$(ssh-agent -s)"秘密鍵をSSHエージェントに追加します。
ssh-add ~/.ssh/id_ed25519パスフレーズを入力します。
SSH接続を試みます。
ssh user@server_ip
SSHエージェントを使用すると、接続がよりスムーズになります。
SSH接続ができない主な原因と解決策
SSH公開鍵認証で接続ができない場合、以下のような原因が考えられます。各原因と解決策を詳しく解説します。
1. 公開鍵がサーバーに正…
原因:公開鍵が~/.ssh/authorized_keysファイルに追加されていない、または間違った鍵が追加されている。
解決策:以下の手順で公開鍵を正しく配置します。
クライアント側で公開鍵を確認します。
cat ~/.ssh/id_ed25519.pubサーバーにSSH接続します。
ssh user@server_ip~/.ssh/authorized_keysファイルを確認します。cat ~/.ssh/authorized_keys公開鍵が正しく追加されていない場合は、以下のコマンドで追加します。
echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... your_email@example.com" >> ~/.ssh/authorized_keysauthorized_keysファイルのパーミッションを600に設定します。chmod 600 ~/.ssh/authorized_keys
2. ファイルやディレクト…
原因:~/.sshディレクトリやauthorized_keysファイルのパーミッションが間違っていると、SSH接続が拒否されます。
解決策:以下のパーミッションを設定します。
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/id_ed25519パーミッションが正しく設定されているかどうかを確認するには、以下のコマンドを実行します。
ls -ld ~/.ssh
ls -l ~/.ssh/authorized_keys
ls -l ~/.ssh/id_ed255193. SSHサーバーの設定…
原因:sshd_configファイルで公開鍵認証が無効になっている、またはパスワード認証が有効になっている。
解決策:以下の設定を確認します。
sudo vi /etc/ssh/sshd_config以下の設定が正しく行われていることを確認します。
PubkeyAuthentication yes
PasswordAuthentication no
PermitRootLogin prohibit-password
AuthorizedKeysFile .ssh/authorized_keys設定を変更した場合は、sshdサービスを再起動します。
sudo systemctl restart sshd4. 秘密鍵のパスが間違っ…
原因:sshコマンドで指定する秘密鍵のパスが間違っている。
解決策:以下のコマンドで正しいパスを指定します。
ssh -i ~/.ssh/id_ed25519 user@server_ip秘密鍵のデフォルトの保存場所は~/.ssh/ディレクトリです。ファイル名を変更した場合は、正しいパスを指定してください。
5. SSHエージェントに…
原因:SSHエージェントに秘密鍵が登録されていないため、接続時に秘密鍵を使用できない。
解決策:以下の手順でSSHエージェントに秘密鍵を登録します。
SSHエージェントを起動します。
eval "$(ssh-agent -s)"秘密鍵をSSHエージェントに追加します。
ssh-add ~/.ssh/id_ed25519パスフレーズを入力します。
SSH接続を試みます。
ssh user@server_ip
6. サーバーのファイアウ…
原因:サーバーのファイアウォールやセキュリティグループでSSHポート(デフォルトは22)がブロックされている。
解決策:以下の手順でファイアウォールやセキュリティグループの設定を確認します。
ファイアウォール(UFW)の場合
sudo ufw statusSSHポート(22)が許可されていることを確認します。許可されていない場合は、以下のコマンドで許可します。
sudo ufw allow 22/tcpセキュリティグループ(AWS EC2など)の場合
AWS EC2の場合、セキュリティグループでSSHポート(22)が許可されていることを確認します。許可されていない場合は、以下の手順で設定します。
AWS Management Consoleにログインします。
EC2ダッシュボードに移動します。
該当するインスタンスを選択し、セキュリティグループをクリックします。
インバウンドルールにSSH(ポート22)が許可されていることを確認します。
ルールが存在しない場合は、以下のルールを追加します。
- タイプ:SSH
- プロトコル:TCP
- ポート範囲:22
- 送信元:自分のIPアドレスまたは0.0.0.0/0(全てのIPからの接続を許可する場合)
7. サーバーのSSHサー…
原因:サーバーのSSHサービスが停止しているため、接続できない。
解決策:以下のコマンドでSSHサービスの状態を確認します。
sudo systemctl status sshdサービスが停止している場合は、以下のコマンドで起動します。
sudo systemctl start sshdまた、サービスを自動起動に設定します。
sudo systemctl enable sshdセキュリティを考慮したSSH設定
SSH公開鍵認証を導入する際には、セキュリティを考慮した設定を行うことが重要です。以下に、セキュリティを強化するための設定を紹介します。
1. SSHポートの変更
デフォルトのSSHポート(22)は、攻撃者に狙われやすいため、ポートを変更することを推奨します。以下の手順でポートを変更します。
sshd_configファイルを編集します。sudo vi /etc/ssh/sshd_config以下の行を追加または変更します。
Port 2222(任意のポート番号に変更します。例:2222)
ファイアウォールで新しいポートを許可します。
sudo ufw allow 2222/tcpsshdサービスを再起動します。sudo systemctl restart sshd接続テストを行います。
ssh -p 2222 user@server_ip
注意:ポートを変更する場合は、ファイアウォールやセキュリティグループで新しいポートを許可することを忘れないでください。また、ポート番号は1024以上の番号を使用してください。
2. rootユーザーの直…
rootユーザーの直接ログインを無効化することで、セキュリティを向上させることができます。以下の手順で設定します。
sshd_configファイルを編集します。sudo vi /etc/ssh/sshd_config以下の行を追加または変更します。
PermitRootLogin nosshdサービスを再起動します。sudo systemctl restart sshd
rootユーザーとしてログインする必要がある場合は、sudoコマンドを使用してください。
3. SSH接続のタイムア…
SSH接続のタイムアウトを設定することで、不正な接続を切断することができます。以下の手順で設定します。
sshd_configファイルを編集します。sudo vi /etc/ssh/sshd_config以下の行を追加します。
ClientAliveInterval 60 ClientAliveCountMax 3(60秒ごとに接続を確認し、3回確認に失敗すると接続を切断します)
sshdサービスを再起動します。sudo systemctl restart sshd
4. 2要素認証(2FA)…
SSH接続に2要素認証を導入することで、セキュリティをさらに強化することができます。以下に、Google Authenticatorを使用した2FAの設定方法を紹介します。
Google Authenticatorのインストール
以下のコマンドでGoogle Authenticatorをインストールします。
sudo apt update
sudo apt install libpam-google-authenticatorGoogle Authenticatorの設定
Google Authenticatorアプリをスマートフォンにインストールします。
以下のコマンドを実行します。
google-authenticator表示されるQRコードをGoogle Authenticatorアプリで読み取ります。
設定に関する質問に答えます。
- Do you want authentication tokens to be time-based (y/n) y
- Do you want me to update your “/home/user/.google_authenticator” file (y/n) y
- Do you want to disallow multiple uses of the same authentication token (y/n) y
- By default, tokens are good for 30 seconds and in order to compensate for possible time-skew between the client and the server, we allow an extra token before and after the current time. If you experience problems with poor time synchronization, you can increase the window from its default size of 1:30min. Do you want to do so (y/n) n
- If the computer that you are logging into isn’t hardened against brute-force login attempts, you can enable rate-limiting for the authentication module. By default, this limits attackers to no more than 3 login attempts every 30s. Do you want to enable rate【編集・制作ポリシー】
本記事はRoute Bloom編集部が公式ドキュメント・技術仕様書の一次情報をもとに作成しています。ITインフラ・技術情報は急速に変化するため、実装前に最新の公式ドキュメントをご確認ください。情報の正確性には万全を期していますが、最新情報は各公式サイトをご確認ください。【編集・制作ポリシー】
本記事はRoute Bloom編集部が各ベンダー公式ドキュメント・エンジニア監修をもとに作成しています。インフラ・クラウド構築は環境により異なります。本番環境への適用前に必ずテストを実施してください。情報の正確性には万全を期していますが、最新情報は各公式ドキュメントをご確認ください。【編集・制作ポリシー】
本記事はRoute Bloom編集部が各ベンダー・技術標準の公式ドキュメントをもとに作成しています。 インフラ・クラウド技術に関する最終判断は実際の環境・バージョンで検証のうえ実施してください。 情報の正確性には万全を期していますが、最新情報は各公式ドキュメントをご確認ください。編集ポリシー:この記事は、Route Bloom の編集チームが最新情報を元に執筆・監修しています。情報の正確性を保つために定期的な見直しを行っています。
この記事で学んだスキルをさらに深めたい方へ
インフラエンジニアのスキルアップに役立つ技術書です。Amazonで探してみましょう。
Amazonアソシエイトプログラムを利用しています。
ABOUT ME




