Macに公開鍵認証でssh接続できない時はまずログを確認する
仮想マシンからMacに対して公開鍵認証でssh接続をしようとしたのですが、上手くいかずハマりました。
結局ログを確認することで原因が分かり解決したので、ログの確認方法などを残しておきます。
Macに対するsshに限らず、ssh接続が上手くいかない場合はまずクライアントとサーバーそれぞれのログを確認すると確実な解決に繋がりそうです。
環境
事象
公開鍵認証の設定をしてMacに対してssh接続しても、公開鍵認証にならず、パスワード認証になってしまっていました。
前提
ネットで調べると良く出てくる、基本的な公開鍵認証のための設定が行われている状態で起こりました。
具体的には次の対応を行っていました。
@Mac
- 「システム環境設定」からリモートログインの設定をオンにしている
~/.ssh/authorized_keys
に仮想マシンで作った公開鍵の内容が書かれている- パーミッション
- 所有者
~/.ssh
,~/.ssh/authorized_keys
の所有者がssh接続される時のユーザーになっている
$ sudo vim /etc/ssh/sshd_config
でsshd_config
の設定が次のようになっているPubkeyAuthentication yes
- ※
#PubkeyAuthentication yes
のようにコメントアウトされている場合は、デフォルトの設定でyes
になっているということ
- ※
AuthorizedKeysFile ~/.ssh/authorized_keys
(実はこれが間違い)- 変更した後は
sudo launchctl stop com.openssh.sshd
でsshd
を再起動する
原因の確認
ssh接続する側(仮想マシン)
ssh
コマンドに-v
オプションをつけるとデバッグできます。vは3つまでつけられ、3つが一番詳細にメッセージが表示されます。
$ ssh -vvv <ユーザー名>@<サーバーのipアドレス> -i ~/.ssh/id_rsa . . . (略) debug1: Next authentication method: publickey debug1: Trying private key: /home/admin/.ssh/id_rsa # ... ① debug3: sign_and_send_pubkey: RSA SHA256:bOLZyufzrEQvgiDjgpIwnvgRWfJXKu+HohP+UnfIXuc debug3: send packet: type 50 debug2: we sent a publickey packet, wait for reply debug3: receive packet: type 51 # ... ② debug1: Authentications that can continue: publickey,password debug2: we did not send a packet, disable method debug3: authmethod_lookup password debug3: remaining preferred: ,password debug3: authmethod_is_enabled password debug1: Next authentication method: password <ユーザー名>@<サーバーのipアドレス>'s password:
公開鍵認証をしたいのに普通のパスワード認証が求められました。
①の部分で秘密鍵を使って公開鍵認証を行おうとしています。そして②の部分で、サーバーからtype 51
というレスポンスが返ってきています。
これをGoogle検索してみると、RFC4252でsshの仕様が決められており、51というのはSSH_MSG_USERAUTH_FAILURE
というメッセージを表しているようです。
これはサーバーが認証に失敗したり、追加の認証が必要な場合に返すように定められているものだそうです。
ここでサーバー側(Mac)で認証が拒否されていそうであることが分かります。
ssh接続される側(Mac)
log
コマンドでMac全体のログを確認することができます。これを使って、ssh接続される時のログを確認します。
@Mac
ログに出力されるレベルをデフォルトのINFO
からDEBUG
に変更して、後で検索できるようにログをファイルに書き出します。
$ sudo vim /etc/ssh/sshd_config
#LogLevel INFO + LogLevel DEBUG
# sshd再起動 $ sudo launchctl stop com.openssh.sshd # logコマンドの設定もsshdだけdebugレベルまで出力するように変更 $ sudo log config --mode "level:debug" --subsystem com.openssh.sshd # ログを /tmp/logs.outに書き出す $ sudo log stream --level debug 2>&1 | tee /tmp/logs.out
$ ssh -vvv <ユーザー名>@<サーバーのipアドレス> -i ~/.ssh/id_rsa $ exit
@Mac
^C # 画面に流れ続けるログを止める $ grep sshd /tmp/logs.out (略) ... sshd: debug1: trying public key file /var/root/.ssh/authorized_keys ... sshd: debug1: Could not open authorized keys '/var/root/.ssh/authorized_keys': Permission denied (略) # logコマンドの設定を元に戻す $ sudo log config --mode "level:default" --subsystem com.openssh.sshd
なぜか~/.ssh/authorized_keys
ではなく/var/root/.ssh/authorized_keys
が見られています。
/etc/ssh/sshd_config
でAuthorizedKeysFile ~/.ssh/authorized_keys
を指定していますが、このパス展開が期待通りに行かないようです。
そこで/etc/ssh/sshd_config-e
でサンプルを確認してみると、、正しくは~/
が不要でした。デフォルトでは正しく書かれていたと思いますが、色々試しているうちに付けてしまったようです。
- AuthorizedKeysFile ~/.ssh/authorized_keys + AuthorizedKeysFile .ssh/authorized_keys
これで無事に公開鍵認証でssh接続できました。
Macでのログの確認方法が分からず手間取りましたが、ログさえ確認できれば解決のための手がかりが得られますね。