セットプチフォッカ

勉強したアウトプット、ときどきフォッカチオ作っていました

突然ssh接続でDebianに繋がらなくなったときの対処法

記憶喪失のDebian

3日前くらいに、さくらVPS上のDebianに対して公開鍵の設定しました。
設定当初から問題なく公開鍵認証で接続できていたのですが、今日ssh接続を試みると、突然Permission denied (public key)と言われてしまいました。 f:id:ikmbear:20200805215246p:plain

何も設定を変えていなかったので、どうしたもんかと。アニメ「一週間フレンズ」しかり、Debianは数日立つと私のことを忘れてしまうのでしょうか。

Debian!俺だよ!思い出してくれよ!」
そう叫んだところで相手はシステム。思いは届きません。一つずつ確認しましょう。

前提

  • sshクライアント:macOS Catalina(10.15.6)
  • 接続先:さくらVPSに構築したDebian10.4
  • 以前は公開鍵認証で問題なく接続できていたが、突然Permission denied (public key)により接続できなくなった。
  • 公開鍵認証については、ssh接続を鍵認証で行うを参考に実施済み。つまり
    • client_rsaというキーペアを作成
    • クライアントのキーチェーンには秘密鍵を登録済(ssh-add -K ~/.ssh/client_rsa
    • Debian側にも公開鍵を登録済
    • Debian側のsshd_configは以下の設定がしてある
PasswordAuthentication  no
ChallengeResponseAuthentication  no
UsePAM  yes

思い出せDebian

覚えてるか?俺たち、昔はパスワードでssh接続したりしてさ...

  • 確認したいこと:原因が公開鍵認証によるものなのかの切り分け
  • 確認方法:Debian側のsshd_configでPasswordAuthentication yesに設定変更する。
  • 確認結果:パスワード認証では問題なくssh接続できる。

Debian「今もパスワード認証できるで」

覚えてるか?この鍵。半分、お前に渡してさ...

  • 確認したいこと:公開鍵がちゃんとサーバ側に格納されているかどうかを確認
  • 確認方法:macで作成した公開鍵を確認し、debian側のフォルダに配置されているものと比較する。
    • 具体的には以下の流れでクライアント、サーバでのcat結果を比較。
# クライアント(mac)にキーペアが作成されていることを確認
$ ls ~/.ssh
$ cat ~/.ssh/client_rsa.pub

# サーバ(debian)に公開鍵が配置されていることを確認
$ ls ~/.ssh
$ cat ~/.ssh/authorized_keys
  • 確認結果:作成した公開鍵がサーバ側に正しく格納されている。

Debian「今もちゃんと持ってるで、覚えとるで」

なあDebian、閉ざした心を開いてくれよ...

  • 確認したいこと:エラーメッセージにあるPermission Deniedが本当にパーミッションが原因か確認する。
  • 確認方法:クライアント、サーバ側それぞれの.sshディレクトリのパーミッションを確認する。
    • クライアントは700(rwx)
    • サーバ側は600(rw)
  • 確認結果:どちらも期待通り。

Debian「心オープンやで〜」

Debian、お前もしかして...

Debian「さっきから好き勝手疑ってくれてますけど」
Debian「全然こっちは問題ないですから。」
Debian「もうひとつ言っておくと、使用する鍵をちゃんと指定すればssh接続できますから!こんな感じで。」

$ ssh -i ~/.ssh/client_rsa -p 3090 YYYYYYYYYYYY@XXX.XX.XX.XXX

Debianは覚えていた編

忘れたのはクライアント(mac)のキーチェーン

実は問題があるのはDebianではなく、キーチェーンの方でした。
macOS 10.12 Sierra以降、キーチェーンが再起動時に読み込まれなくなる仕様となったそうです。

タイトルに「突然」とありますが、実際には「macの再起動」をトリガーとして本事象が発生します。 (事象発生まではmacbookをスリープするだけで、再起動していなかったんでしょうね...)

キーチェーンにDebianとの友情を邪魔させない。

再度ssh-add -K ~/.ssh/client_rsaを実行することで、一時的には繋がるようになりますが、再起動すると、またssh接続できなくなってしまいます。
そのため、恒久対応として~/.ssh/configに以下の設定を追加します。

Host *
  UseKeychain yes
  AddKeysToAgent yes

もっとDebianと仲良くなる

せっかくconfigの設定をしたので、毎回ポートやipを打たずに済むような設定もしておきます。

Host ikuma-t
  HostName XXX.XXX.XX.XX
  User ikuma-t
  IdentityFile ~/.ssh/client_rsa
  Port 3090
  TCPKeepAlive yes
  IdentitiesOnly yes

これで再起動してもssh ikuma-tで繋がるようになりました!

感想

コマンドだけでリモートとやり取りするような部分って、「これ何やってんだ?」「どれチェックしたか忘れた...もう一回しらみ潰しにやり直してみよう」ってことが多いと思います。

今回はDebianが記憶喪失したというストーリーで擬人化して考えましたが、とっつきにくい内容だからこそ、自分で噛み砕いてコミカルにしてみるのはなかなか効果的でした!

Debian「途中で設定とかストーリー書くの面倒になったでしょ」
私「ファッ!!!」

参考