SSH鍵登録不備の通知に関する話

SSHで公開鍵認証に使う認証鍵の公開鍵をサーバに登録する場合、パーミッションがまずくて想定通りにならないケースが散見されますが、実はサーバが教えてくれますよ…という話に関連して色々。
2

先に簡単に結論

  • パーミッション関係で不備があって公開鍵認証うまくいかないても、パスワード認証通せばデバッグ情報から分かるよ
  • 2010年のOpenSSH 5.6からある機能なので、今なら大抵どこでも使えるはず
  • OpenSSHクライアント(sshコマンド)以外でも、クライアントソフトが対応してたら情報は見られるよ

発端はこのような思い付きから。

angel (as ㌵㌤の猫) @angel_p_57

sshで認証鍵の公開鍵を登録する時のトラブルって良く見るけど、「ちゃんと登録できたかどうか」は実際にログインしないと確かめられないってのもどうかな、という気もする。

2020-04-30 08:58:40
angel (as ㌵㌤の猫) @angel_p_57

パーミッション設定ミスってるって話は…。パスワード認証でログインすれば教えてくれるってのがあったような。 twitter.com/ttdoda/status/…

2020-04-30 08:59:35
いわもと こういち @ttdoda

OpenSSHで公開鍵認証する時にauthorized_keysや.sshディレクトリのパーミッションの問題で蹴られるってのはよく有る事だけど、実はssh -vでパスワード認証でログインすると debug1: Remote: Ignored authorized keys: bad ownership or modes for directory /home/sue って教えてくれるんだよね

2019-12-16 18:43:52
angel (as ㌵㌤の猫) @angel_p_57

なんか、RHEL/CentOS7系のだと、そういうのなかった記憶があったんだけどどうだろう。うろ覚えかもしれない。どのバージョンからかは確かめたいかな。

2020-04-30 09:00:55
angel (as ㌵㌤の猫) @angel_p_57

手元のCentOS7/OpenSSH 7.4p1だとあったな > パスワード認証成功時の authorized_keysファイルパーミッション不備通知 twitter.com/angel_p_57/sta…

2020-04-30 11:35:39
angel (as ㌵㌤の猫) @angel_p_57

これただ、SSHの通信開始時のやりとりで、サーバからのデバッグ情報っぽいのを受け取る仕組みがあるってことだよね。どこら辺見ると分かるかな。あと、クライアントがSSH以外の場合も分かるのかな。

2020-04-30 09:03:18
angel (as ㌵㌤の猫) @angel_p_57

あ、ぼけてる。「OpenSSH以外の場合」だ。 それはそれとして「どんな鍵が登録されてるか」チェックするツール、あっても良い気がするんだよね…。だって、ユーザがいくら「正しく登録した!」って思っても、判断するのはサーバなんだし。

2020-04-30 09:05:02
angel (as ㌵㌤の猫) @angel_p_57

OpenSSHのソース片かき集めたらフツーに作れそうな気がする。問題は、サーバの設定と照らし合わせないとあんま意味がないことで、sgidで設定見られるよう権限つける? ってのが微妙かな。 ※基本的にsshd_configは一般ユーザには見られない

2020-04-30 09:06:47
angel (as ㌵㌤の猫) @angel_p_57

…sshd_configが一般ユーザから見られないって、別に必須要件じゃないか。でもあんまり見せたいものではないよねえ。

2020-04-30 09:13:18

ここで「いつからある機能か」について情報をいただきました

高橋カヲル @kaoru6

@angel_p_57 翻訳では sshd(8) を ssh(8) に typo してますが、 unixuser.org/~haruyama/secu… の "sshd(8) will now queue" で始まるところが対応しそうに見えます。 なお、ls -Zしないと分からんようなやつ(SELinux絡み)は検出できなさそうです。 github.com/openssh/openss…

2020-04-30 19:51:56
angel (as ㌵㌤の猫) @angel_p_57

@kaoru6 あ! 有難うございます。結構昔に追加されてるんですね。

2020-04-30 20:28:29

OpenSSH 5.6 のリリースノートで紹介されている機能で、このリリースが(翻訳前のテキストによると)2010年8月なので、10年前からあるってことに。

angel (as ㌵㌤の猫) @angel_p_57

@kaoru6 ちょうどソースを追っていたんですが、認証成功後の do_authenticated() の中でデバッグ情報を送る auth_debug_send() という仕組みがあって、事前に情報を追加する auth_debug_add() が、幾つかのエラー項目にあてられているようでした。このcommitでパーミッション不備も対象に、ということですね

2020-04-30 20:32:12
angel (as ㌵㌤の猫) @angel_p_57

@kaoru6 多分ですが、SELinux絡みだと単純にopen(2)に失敗してそれで終わりですね。扱いはファイルなしとあまり変わりませんが、一応「ファイルがあるのに失敗」ということで、サーバのデバッグログとしては残るようです。

2020-04-30 20:46:48

デバッグ情報の通知に関してちょっと踏み込んだ情報

angel (as ㌵㌤の猫) @angel_p_57

これについてはもともとSSH2に"Debug Message"というメッセージ種 (メッセージ番号4) が定義されていて、デバッグ情報がいつでも送れる。それを認証に関する不備の情報伝達に使ってるわけね。 twitter.com/angel_p_57/sta…

2020-04-30 21:15:25
angel (as ㌵㌤の猫) @angel_p_57

このRFC4253の11.3章に載ってた。番号が4ってのは12章。 でもって、ssh -vvv でデバッグレベル3にしておけば、件の情報出力の直前に "debug3: receive packet: type 4" ってのが出てわかるようになっている。 tools.ietf.org/html/rfc4253

2020-04-30 21:18:18
angel (as ㌵㌤の猫) @angel_p_57

ちなみに、.ssh のパーミッションがまずい場合のデバッグログのサンプルを読み解くとこんな感じ。 pic.twitter.com/6XlJ8hknV5

2020-05-01 00:05:25
拡大

別途教えていただきました。他ソフトでの情報の見方についてもあります。

いわもと こういち @ttdoda

プロトコルとして SSH_MSG_DEBUG というデバッグメッセージが定義されていて、これを使って通知してきます。OpenSSH以外のクライアントでも、このメッセージが扱えれば表示できます。 twitter.com/angel_p_57/sta…

2020-05-01 00:39:51
いわもと こういち @ttdoda

例えばTera TermならばTERATERM.INIでLogLevel 100と設定してあるとTTSSH.LOGに"2020-04-30 15:32:45.605Z [6592] DEBUG message from server: Ignored authorized keys: bad ownership or modes for file /home/sue/.ssh/authorized_keys"のように記録されます。

2020-05-01 00:41:26
いわもと こういち @ttdoda

PuTTYの場合は、タイトルバー右クリック⇒Event Logで表示出来ます。 pic.twitter.com/tZilAczzBN

2020-05-01 00:43:05
拡大