トラブルシューティングの極意―達人に訊く問題解決のヒント

第2回 [サーバ・インフラ・ネットワーク編]SSHでありがちなトラブルとその対策―不都合なくSSHを使えていますか?

この記事を読むのに必要な時間:およそ 4 分

LinuxやBSDなどのサーバを扱う上で欠かせないSSH(Secure SHell)ですが,鍵の管理や認証まわりで多くのトラブルが起こり得ます。SSHは,サーバのオペレーションだけではなく,Gitなどの開発ツールでの利用,ソースコードのデプロイなどでも欠かせないプロトコルとなっており,利用する機会は非常に増えています。

第2回では,読者の多くは公開鍵認証方式でのSSHを利用していると想定して,パスワード認証方式ではなく,公開鍵認証方式を使ったSSHでよくあるトラブルとその対策について触れていきます(SSHの接続元をクライアント,接続先をサーバとして解説します)⁠

トラシュー事例1
「ログインできない場合にありがちなこと」

SSHでサーバにログインしようとしたとき,⁠Permission denied, please try again.」の表示や,公開鍵認証なのにパスワードを求められてログインできないという事象は,多くの方が遭遇したことがあるかと思います。この場合によくある代表的な原因をいくつか挙げます。

鍵のミスマッチ

sshコマンドの「-i」オプションで指定した秘密鍵,もしくはssh-add コマンドでssh-agentに登録した秘密鍵(ssh-agentの詳細については後述しています)と,サーバに設置してある公開鍵が一致しない場合はログインすることはできません。正しい鍵を用意して置き換えることができれば対処は簡単ですが,鍵を比較しないと正しいかどうか判断できません。どの鍵と一致しているかどうかを確認する方法の1つとして,それぞれの鍵のフィンガープリントを比較する方法があります。

フィンガープリントとは,公開鍵からハッシュ関数を使って作られるユニークな文字列です。ssh-keygenコマンドの「-l」オプションを使って,鍵のフィンガープリントを表示できます。

$ ssh-keygen -l -f key_file
2048 e6:ef:57:c6:20:b6:40:1c:44:cd:cb:8f:fc:90:40:5d [email protected] (RSA)

このコマンドは,複数の鍵を管理している場合などで,キーペアを確認することに役立ちます。万が一,公開鍵を紛失した場合や,何の公開鍵かがわからなくなってしまった場合は,秘密鍵から公開鍵を生成することもできます。ssh-keygenコマンドの「-y」オプションを使うことで,秘密鍵をもとに公開鍵を表示できます(パスフレーズが設定されている場合はパスフレーズの入力が必要です)⁠

$ ssh-keygen -y -f secret_key_file
ssh-rsa AAAAB3NzaC1yc2……

パーミッションの問題

手元の秘密鍵のパーミッションに問題があるとログインできません。たとえば,秘密鍵ファイルのパーミッションが0644の場合,sshコマンド実行時に図1のようなエラーが発生します。

図1 秘密鍵ファイルのパーミッションに問題がある場合

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '.ssh/id_rsa' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
bad permissions: ignore key: .ssh/id_rsa
Permission denied (publickey).

秘密鍵のファイルは,所有者のみが読み書きできるように,パーミッションを0600に設定しておくことが必要です。

シェルのスタートアップファイルの問題

ログイン時に読み込まれるシェルのスタートアップファイル($HOME/.bashrcなど)の記述に問題があるとSSHやSCP(Secure Copy)ができない場合があります。

たとえば,接続先のサーバの$HOME/.bashrcの先頭に別のシェル(たとえば/bin/zshなど)を起動するように設定していると,SCPができなくなったり,SSH越しのコマンド実行ができなくなります。SSHでログインはできるけどSCPができないといった場合には,スタートアップファイルを疑ってみましょう。

ホスト認証用の公開鍵とknown_hostsの不一致

初めてサーバに接続すると,サーバが持つホスト認証用の公開鍵がクライアント側の$HOME/.ssh/known_hostsへ記録されます。known_hostsに公開鍵が記録されたままで,サーバが持つ公開鍵が何らかの原因で変わった場合,ssh接続時にエラーが発生します図2)⁠

図2 ホスト認証用公開鍵とknown_hostsの不一致時に起きるエラー

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
1a:91:35:c3:58:2a:21:cb:de:72:02:51:37:2d:83:64.
Please contact your system administrator.
Add correct host key in /home/isao.shimizu/.ssh/known_hosts to get rid of this message.
Offending RSA key in /home/isao.shimizu/.ssh/known_hosts:9
RSA host key for 192.168.0.10 has changed and you have requested strict checking.
Host key verification failed.

サーバ側のホストキーの再生成や,OSの再インストール時などによって遭遇することが多くありますが,そうではない場合は,意図せずなりすまされた別のサーバに接続しようとしている可能性もあるので注意が必要です。前者の場合は,とくに問題はないため,known_hostsファイルから使わなくなった公開鍵を削除することで解決します。削除はssh-keygenコマンドの「-R」オプションを使います。

$ ssh-keygen -R ホスト名
/home/isao.shimizu/.ssh/known_hosts updated.
Original contents retained as /home/isao.shimizu/.ssh/known_hosts.old

ここまでは,とくに基本的なログインに関わるトラブルと対策について解説してきました。

しかし,SSH をより深く使っていくとさらなるトラブルに遭遇するかもしれません。次は少し上級者向けのトラブル事例と対策について解説していきます。

著者プロフィール

清水勲(しみずいさお)

SI企業を8年間勤めた後,2011年に株式会社ミクシィ 運用部 アプリ運用グルー プにてSNS mixiの運用に携わる。

2014年にスマホアプリ「モンスターストライク」のサーバーチームに加わり,現 在はXFLAG™スタジオ ゲーム開発室 SREグループに所属。

得意分野はLinux,ミドルウェアレイヤー。最近はGoでコードを書くのが好き。 クラフトビールが大好物。

Twitter:@isaoshimizu

バックナンバー

トラブルシューティングの極意―達人に訊く問題解決のヒント

バックナンバー一覧

コメント

コメントの記入