ryotatake blog

Webエンジニア

Macに公開鍵認証でssh接続できない時はまずログを確認する

仮想マシンからMacに対して公開鍵認証でssh接続をしようとしたのですが、上手くいかずハマりました。

結局ログを確認することで原因が分かり解決したので、ログの確認方法などを残しておきます。

Macに対するsshに限らず、ssh接続が上手くいかない場合はまずクライアントとサーバーそれぞれのログを確認すると確実な解決に繋がりそうです。

環境

事象

公開鍵認証の設定をしてMacに対してssh接続しても、公開鍵認証にならず、パスワード認証になってしまっていました。

前提

ネットで調べると良く出てくる、基本的な公開鍵認証のための設定が行われている状態で起こりました。

具体的には次の対応を行っていました。

@仮想マシン

@Mac

  • 「システム環境設定」からリモートログインの設定をオンにしている
  • ~/.ssh/authorized_keys仮想マシンで作った公開鍵の内容が書かれている
  • パーミッション
  • 所有者
    • ~/.ssh, ~/.ssh/authorized_keysの所有者がssh接続される時のユーザーになっている
  • $ sudo vim /etc/ssh/sshd_configsshd_configの設定が次のようになっている
    • PubkeyAuthentication yes
      • #PubkeyAuthentication yesのようにコメントアウトされている場合は、デフォルトの設定でyesになっているということ
    • AuthorizedKeysFile ~/.ssh/authorized_keys (実はこれが間違い)
    • 変更した後はsudo launchctl stop com.openssh.sshdsshdを再起動する

原因の確認

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検索してみると、RFC4252sshの仕様が決められており、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_configAuthorizedKeysFile ~/.ssh/authorized_keysを指定していますが、このパス展開が期待通りに行かないようです。

そこで/etc/ssh/sshd_config-eでサンプルを確認してみると、、正しくは~/が不要でした。デフォルトでは正しく書かれていたと思いますが、色々試しているうちに付けてしまったようです。

- AuthorizedKeysFile ~/.ssh/authorized_keys
+ AuthorizedKeysFile .ssh/authorized_keys

これで無事に公開鍵認証でssh接続できました。

Macでのログの確認方法が分からず手間取りましたが、ログさえ確認できれば解決のための手がかりが得られますね。

参考