本当は5つあるSSHの認証方法

一般にSSHでユーザ認証方式として知られているのは公開鍵認証とパスワード認証の2種類だけだけど、実はもっと方法があるよ、というお話
10

話の発端としては「2種類だけじゃないんだよね」という話から

angel (as ㌵㌤の猫) @angel_p_57

これ実は、パスワード認証・公開鍵認証以外にもあって全部で5種類なんだけど、「2種類だけ」と思ってる人意外と多い。 通常はそれで困らないんだけど、「パスワード認証に見えて実はキーボードインタラクティブ認証でした」という落とし穴な事例を最近聞いた。 twitter.com/docker_compose…

2022-04-21 18:49:44
k-miyazoe@24卒就活中 @docker_compose_

研究室のサーバたまに触るんですが、SSHでの認証にパスワード認証と公開鍵認証があることを今日知りました。

2022-04-21 18:19:27
angel (as ㌵㌤の猫) @angel_p_57

しかも、クライアントソフトによっては自動的に方式を切り替えてくれるから「実はキーボードインタラクティブ認証を使ってる」ってことに気付きにくくて、特定ソフトだけなぜかつながらないように見えるという。単に方式指定が間違ってるだけなんだけど。

2022-04-21 18:51:17
angel (as ㌵㌤の猫) @angel_p_57

具体的には、Dellのサーバが搭載しているBMCであるiDRAC。これはSSH接続できるけど、認証がキーボードインタラクティブ。でも入力するのはパスワードなので、パスワード認証と区別し辛い。 で、TeraTermで「パスワード認証」を指定すると、方式が違うのでつながらない、と。

2022-04-21 18:53:27
angel (as ㌵㌤の猫) @angel_p_57

TeraTermで「キーボードインタラクティブ認証」を指定してパスワードを入力すれば問題ない。また、sshコマンドやPuTTYなんかだと、自動的に判断して認証方法を切り替えてくれるから、特に意識する必要なくパスワードを入力するだけで良い。

2022-04-21 18:55:28

その後、5種類軽く説明した方が良いかな? と思い立った。

angel (as ㌵㌤の猫) @angel_p_57

この5種類についてもうちょっと説明した方がいいかな? twitter.com/angel_p_57/sta…

2022-04-21 21:30:19
angel (as ㌵㌤の猫) @angel_p_57

一番最初は「公開鍵認証」から。 公開鍵暗号の特長である「秘密鍵の持ち主でないと○○できない」という性質を利用して本人確認とする認証方式で、SSHと言えばこれ! という代表的な方式である。

2022-04-21 21:31:49
angel (as ㌵㌤の猫) @angel_p_57

なお、公開鍵暗号と言っても、使うのは「デジタル署名」である。「サーバが公開鍵で暗号化したデータをチャレンジとして送ってきて…」なんて説明すると漏れなく誤りなので要注意。 参考 → qiita.com/angel_p_57/ite…

2022-04-21 21:34:20
angel (as ㌵㌤の猫) @angel_p_57

公開鍵認証については、情処の試験でも最近聞かれるようで、まあ常識になってきてると思う。 なお、OpenSSHだと証明書を使った認証もあるけど、結局これも公開鍵認証の一種である。( ユーザ・鍵の対応の管理が違うだけ )

2022-04-21 21:36:28
angel (as ㌵㌤の猫) @angel_p_57

続いて有名な方式が「パスワード認証」 要は、ユーザに対応したパスワードを指定してくださいってだけの話で、ユーザ登録・パスワード設定がされてれば直ぐに使えるから、最もお手軽な方法ではある。

2022-04-21 21:38:38
angel (as ㌵㌤の猫) @angel_p_57

ちなみに「認証のためにパスワード文字列を指定してくださいね」ってだけの話で、そのパスワードをどのように管理しているか。それはSSHの話の外になる。

2022-04-21 21:39:48
angel (as ㌵㌤の猫) @angel_p_57

サーバによってはLDAPに問い合わせてパスワードチェックするかも知れないし、kerberosシステムが裏にいるかも知れない。あるいは、オーソドックスにサーバの shadowデータベース ( /etc/shadow ) と突き合わせるかも知れない。

2022-04-21 21:41:06
angel (as ㌵㌤の猫) @angel_p_57

まあ、Linuxサーバが相手なら、そこら辺はPAMの管理するところの話だと思う。

2022-04-21 21:41:54
angel (as ㌵㌤の猫) @angel_p_57

さて、これ以降は知名度がガクっと下がる。続いては「ホストベース認証」 「ホスト認証」( クライアントからサーバが本物かどうか確認する手続き ) と似て異なる機能と言いつつ、それなりに似てはいる。

2022-04-21 21:43:46
angel (as ㌵㌤の猫) @angel_p_57

ホストベース認証がどういった機能かと言うと、他の認証方法のように個々人を本人確認するわけではなく「信頼する機器から『ユーザAです』と自己申告があったら、ユーザAであることを認める」と言うような。機器一括で認めるようなやり方。

2022-04-21 21:46:18
angel (as ㌵㌤の猫) @angel_p_57

あ、もちろんログイン元のユーザ名と、ログイン先のユーザ名が一致してる必要はない。そこはユーザ同士の対応付けを設定すれば良いだけだから。でも一番分かり易いのは同じユーザ名同士で対応させる形態だ。

2022-04-21 21:47:50
angel (as ㌵㌤の猫) @angel_p_57

さてこの方法。「信頼する機器から」ってのをどう判断するかなんだけど、これも公開鍵認証と同じくデジタル署名を使う。

2022-04-21 21:49:26
angel (as ㌵㌤の猫) @angel_p_57

ただし「ユーザAの使う鍵はKa、ユーザBの使う鍵はKb」のように個人毎に鍵があるのではなく、機器を代表する「ホスト鍵」を共通で使う。 このホスト鍵ってのは、「ホスト認証」で使う鍵と基本的には同じ、なのである意味ホスト認証にも似ているわけだ。

2022-04-21 21:51:25
angel (as ㌵㌤の猫) @angel_p_57

機器を代表するホスト鍵を使うからこそ、「信頼する機器からのユーザの自己申告をまるっと受け入れる」ということが可能になる。

2022-04-21 21:52:30
angel (as ㌵㌤の猫) @angel_p_57

そういう方式なので、個人の端末からログインする時に使うようなことは想定していないし、PuTTYなんかのソフトでもサポートしてない。 主な用途は、ユーザ管理の共通化されたサーバクラスタ内でサーバ間の自由な移動に用いられる感じ。

2022-04-21 21:54:39
angel (as ㌵㌤の猫) @angel_p_57

特に一昔前のLinuxベースのスーパーコンピュータシステムだとホストベース認証で多ノード使わせる方式があったと記憶している。 ただ、このやり方も難があって、かつ代替の方式もできているから、今ではそんなに見ない気もするけど。

2022-04-21 21:57:16
angel (as ㌵㌤の猫) @angel_p_57

ここまでの方式 ( 公開鍵認証、パスワード認証、ホストベース認証 ) は RFC4252 に載っている。 unixuser.org/~haruyama/RFC/…

2022-04-21 21:58:34
angel (as ㌵㌤の猫) @angel_p_57

つまり、これ以降説明する方式は別のRFCになっているということでもある。

2022-04-21 22:01:41
angel (as ㌵㌤の猫) @angel_p_57

次に出てくるのは「キーボードインタラクティブ認証」これは RFC4256 で、ただタイトルとしては「汎用インタラクティブ認証 ( Generic Interactive Authentication )」となっている。 unixuser.org/~haruyama/RFC/…

2022-04-21 22:03:10