FreeBSD_sshd_fail_log

これは何?

FreeBSD 12.0-RELEASE 以降の版で、ssh でログインに成功しているのに 内部的には認証失敗が起きていることになっていて、 auth.log に Failed publickey for $USER from… が記録される現象が出ていた。

これによって fail2ban や blacklistd によって後続のパケットを落とされ、 ログインできなくなることがある。

原因は MON_ISAUTH を返すべき処で MON_AUTH を返していたことだと判明した。 12.2-RELEASE には取り込まれるのではないか、12.1 の Errata で出してほしい、 という声もあるが、勢いで /usr/sbin/sshd を再コンパイルして入れ替えた。 後悔はしていない。

経緯

FreeBSD Bugzilla には Bug 234793 として登録されている。 まあ、はっきり言ってこれを読めば全部書いてあるので、分かる人にはその方が早いかもしれない。

結果だけ書くと Henrry Hu さんのコメント23 が指摘している s/MON_AUTH/MON_ISAUTH/ のバグということになる。 Hu さんや NAITO さんをはじめ関係諸賢に感謝いたします。

[stable]における修正ログとしては Revision 355160 が該当していて、 その内容はこう なっている。

再コンパイル

もはや蛇足ではあるが、パッチ形式にすると次のようになる。

sshd patch
# diff -u crypto/openssh/monitor.c.orignal crypto/openssh/monitor.c
--- crypto/openssh/monitor.c.orignal  2019-12-03 09:15:21.460905000 +0900
+++ crypto/openssh/monitor.c  2019-12-03 09:19:55.020447000 +0900
@@ -193,7 +193,12 @@
 #endif
     {MONITOR_REQ_SIGN, MON_ONCE, mm_answer_sign},
 #ifdef HAVE_LOGIN_CAP
-    {MONITOR_REQ_GETPWCLASS, MON_AUTH, mm_answer_login_getpwclass},
+    /* See https://svnweb.freebsd.org/base?view=revision&revision=355160
+     * and https://svnweb.freebsd.org/base/stable/12/crypto/openssh/monitor.c?r1=355160&r2=355159&pathrev=355160
+     *
+     * {MONITOR_REQ_GETPWCLASS, MON_AUTH, mm_answer_login_getpwclass},
+     */
+     {MONITOR_REQ_GETPWCLASS, MON_ISAUTH, mm_answer_login_getpwclass},
 #endif
     {MONITOR_REQ_PWNAM, MON_ONCE, mm_answer_pwnamallow},
     {MONITOR_REQ_AUTHSERV, MON_ONCE, mm_answer_authserv},

これで /usr/sbin/sshd を再コンパイルして置き換えることで問題が解消した。 openssh のソースコードは /usr/src/crypto/openssh/ にあり、コンパイルすると /usr/obj/amd64.amd64/secure/usr.sbin/sshd/ あたりにバイナリができる。

ところで sshd だけの再コンパイルをしたかったのだが方法がわからず、 結局 make buildworld しちゃったことはまことに遺憾であった。

駄目な時のログ
Dec  3 20:03:47 hostname sshd[29673]: user user1 login class  [preauth]
Dec  3 20:03:47 hostname syslogd: last message repeated 2 times
Dec  3 20:03:47 hostname sshd[29673]: Failed publickey for user1 from 192.168.0.195 port 65308 ssh2: RSA SHA256:HANAMOGERA_HASH
Dec  3 20:03:47 hostname sshd[29673]: Failed unknown for user1 from 192.168.0.195 port 65308 ssh2
Dec  3 20:03:47 hostname sshd[29673]: user user1 login class  [preauth]
Dec  3 20:03:47 hostname sshd[29673]: Failed unknown for user1 from 192.168.0.195 port 65308 ssh2
Dec  3 20:03:47 hostname sshd[29673]: user user1 login class  [preauth]
Dec  3 20:03:47 hostname sshd[29673]: Accepted publickey for user1 from 192.168.0.195 port 65308 ssh2: RSA SHA256:HANAMOGERA_HASH
パッチ後のログ
Dec  3 20:52:06 hostname sshd[72802]: user user1 login class  [preauth]
Dec  3 20:52:06 hostname syslogd: last message repeated 4 times
Dec  3 20:52:06 hostname sshd[72802]: Accepted publickey for user1 from 192.168.0.195 port 53001 ssh2: RSA SHA256:HANAMOGERA_HASH

note

2019/Dec/04 ごろ書いた。