🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

SSH

SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

3回答

3529閲覧

ssh接続におけるホスト間認証に中間者攻撃への耐性はあるのでしょうか

NirohShimashita

総合スコア19

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

SSH

SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

1クリップ

投稿2021/02/21 00:42

今リナックスの勉強をしている初学者です。ssh接続におけるホスト間認証について、有用性がいまいち理解できず、中間者攻撃に対してなぜ耐性を持つと言えるのかがどうしても納得できません。知識がないためにトンチンカンな質問をしていたら申し訳ないです。

#ホスト間認証に対する自分の理解
sshサーバーに接続しようとすると、サーバー側から指紋が提示されます。ホスト間認証というのは、この指紋が自分の.ssh/known_hostsに保管された公開鍵よって導きされるものと断定できるとき、この指紋を提示したサーバーを接続した経験があるサーバーであると判断するシステム、だという風に理解しています。

#悪意のある者が本物の指紋を示してくる可能性はないのでしょうか
どの教材やネット記事を眺めても、このホスト間認証は中間者攻撃を防ぐためのシステムだと書いてあります。たしかに、悪意を持った何者かがDNSを乗っ取るかなんかの方法で自分のサーバーへ接続を誘導してきた場合、相手が示してきた指紋がおかしければ「こいつなんかやべぇな」と判断できるというのは理解できます。

なのですが、sshサーバーが提示する指紋は誰に対しても提示されるはずのものなので、悪意を持った者も予め知っておくことができるのではないか、という点が疑問として残っています。悪意を持った者がサーバーが提示する指紋を予め入手しておいて、DNSを乗っ取った後、接続を試みてきたクライエントに入手しておいたその指紋を提示してくるといった可能性はないのでしょうか。

もしそれができてしまったらホスト間認証に中間者攻撃への耐性はないような気がします。そんな訳はないというのは分かっているのですが、だとしたらどのような仕組みがそういった手口から守ってくれているのでしょうか。

文章が分かりづらかったら申し訳ないです。
ご教示いただけるととても有り難いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

中間者攻撃

これ、よく使われる言葉なんですが、個人的にあんまり好きではないです。話が分かり難くなるだけなので。
もっとシンプルに「なりすまし」で済むはずです。中間者攻撃は、なりすましの一形態に過ぎないので。サーバのなりすましを防ぐのが「ホスト認証」という機能です。
参考: 「SSL/TLSの見落とされがちな『認証』という基本機能」の「なぜ認証が重要なの?」 ※SSL/TLSに関する記事ですが、根っこは同じです。

サーバー側から指紋が提示されます。

サーバから提示されるのは「公開鍵」そのものです。公開鍵がないと処理ができないので、指紋では不十分です。あくまで指紋は、利用者に公開鍵を見やすく表示するために、クライアント自身が計算しているものです。

この指紋を提示したサーバーを接続した経験があるサーバーであると判断するシステム

もっと単純に「サーバを識別するための情報が公開鍵」です。つまり、鍵Aを持ってるならサーバAだな、とか。known_hostsは「経験がある」というよりも、公開鍵とサーバ(ホスト名/IPアドレス)を紐づける名簿のようなものと見てください。
※「経験がある」というのは、初回接続時の登録から来ている印象かと思いますが。

顔写真の載った名簿を持っていれば、本人に会って誰だか分かる、それと同じことです。
( 写真で判断というのは、必ずしも精度の高い方法ではないですが ) ホスト認証の場合は、サーバに「デジタル署名」を作らせて公開鍵で本物かどうかを検証する、そのことで「対応する秘密鍵を確かに持っているから本物のサーバだ」という本人確認の方法を採っています。

参考資料としては、例えば「SSHの公開鍵ってなに?」をどうぞ。
なお、「本物の署名と確認できたとしても、何らかの方法で通信を乗っ取っている可能性もあるのでは?」と思うかも知れませんが、もちろんそれは単に署名を確認するだけでなく、暗号化通信に関わる「鍵交換」と連携することで乗っ取りを防いでいます。( サーバ自身が乗っ取られてたらダメですが )
その話は、別の方へのコメントにも載せていますが、「SSHのハイブリッド暗号に関する良くある誤解の話」を参考にどうぞ。

投稿2021/02/21 08:33

angel_p_57

総合スコア1681

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NirohShimashita

2021/02/22 03:14

angel_p_57さん とてもわかり易いご回答をいただき有難うございます。 QiitaやTogetterの記事も読ませていただきました。 本当に勉強になりました。 正直なところ拝読したことをすべて理解できたとはとても言えないのですが、基本的なところで自分が大きな誤解をしていたことがはっきりして、胸のつかえが取れました。 自分はてっきり、「署名を用いてお互いが秘密鍵の所持者であることを確認しあい、それ後は機密性の高い通信を行う」というssh通信の基本的な機能は、相手のサーバーのauthorized_keyに自分の公開鍵を登録してからでないと始められないものだと勘違いをしていました。それが誤解の大本でした。質問がトンチンカンになっていたのはこの誤解があったためです。実際にはホスト認証の時点でそうしたやり取りが行われていて、authorized_keyに公開鍵を置くというのはあくまで「自分に会ったことがあるの、覚えておいてね」というような行為でしかない、ということになるでしょうか。この点をようやく理解することができました。 その他にも ・中間者攻撃というのはなりすまし行為の一形態でしかないこと ・サーバーの指紋の算出はあくまでクライエント側で利用者(人間)のために行っていること など教えてくださってありがとうございます。 他のQiitaの記事などを拝読して一番びっくりしたといいますか、勉強になったのは、sshが共通鍵を用いて通信しているという点です。よくある誤解としてangel_p_57さんも上げていらっしゃることですが、自分はssh通信において『通信内容の公開鍵を用いた暗号化→秘密鍵を用いた復号化』が繰り返されているのだとばかり思っていました。実際には共通鍵さえ安全に生成できればその後はそんな複雑なプロセスはいらない訳ですね。 まだまだ理解できていないことが多いので、これからも理解を深めるため折々記事などを読ませていただこうと思います。見識を分けていただいたこと、重ねてお礼申し上げます。有難うございます。
doda

2021/02/25 12:23

「中間者攻撃」という言葉を使わずに「なりすまし」に含めるというのには反対します。 中間者攻撃はなりすましの一形態だと言えるかもしれませんが、単純ななりすましと中間者攻撃では色々と特性が違います。 例えば他のコメントにあった「クライアントからサーバにランダムな値を送り、サーバがそれに秘密鍵で署名して返送」という手順は単純ななりすましに対しては効果が有りますが、中間者攻撃への耐性が有りません。 また、公開鍵を使ったユーザ認証は中間者攻撃に対する耐性が有りますが、単純ななりすましについては依然として気を使う必要が有ります。 このように大きく特性が違う物を「なりすまし」にまとめてしまうのは逆に理解を妨げる要因になると考えます。
angel_p_57

2021/02/27 01:55

「中間者攻撃」が単純な「なりすまし」ではないというのは認識してますが、「なりすましの一種である」という点の方が遥かに意味が大きいと考えているため、そこは意見が合わないところかと思います。 「単純な『認証』でも全て『中間者攻撃』も防ぐもの」と誤認されると懸念されているのでしょうか。それは単に認証が成立する条件や特性の違いでしかないと思います。( その前提をすっとばされないように、というのは注意した方が良いかもしれませんが ) SSHのホスト認証なり、SSL/TLSのサーバ認証は、通信の保護が成立していない段階で行うものですから、最も条件が厳しいと。そういう話ではないかと。 ついでに言うと、( 私も手抜きで使うことありますが ) 「中間者攻撃(MITM)」という言葉は好きではありません。「中間」という「形態」にしか目が行っていない、イケてない用語だからです。特性が全く違うのに、用語として紛らわしい MITB なんかも含めて。 dodaさんはもちろん認識されてるとは思いますが、「ランダム値に署名してもらう」という方法と、SSHのホスト認証で、中間者攻撃の成立是非が変わるポイント、少なくともこれを見える形にしないと、単に言葉が独り歩きするだけだろうと思っています。( 「SSLは実は中間者攻撃に弱い」とか言い出す人も見たりしてますし ) そのポイントが「なりすまし」の文脈にある、というのが私の認識ですので、これに優先的に触れるのは自然なところだろうと考えます。
guest

0

悪意を持った者がサーバーが提示する指紋を予め入手しておいて、DNSを乗っ取った後、接続を試みてきたクライエントに入手しておいたその指紋を提示してくるといった可能性はないのでしょうか。

提示するのは公開鍵の指紋であり、その後通信を成り立たせるには対応する秘密鍵が必要です。「サーバーが提示する指紋を予め入手」はできても、秘密鍵は手に入りません。

投稿2021/02/21 01:05

maisumakun

総合スコア145963

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NirohShimashita

2021/02/21 01:46

maisumakunさん ご回答いただきありがとうございます。付け加えて一点教えていただきたいですが、いつまでたっても公開鍵暗号通信を使わずにパスワードを使ってssh接続をし続けていた場合、ある日突然悪者にDNSを乗っ取られて、しかも正しい指紋を提示された場合、こちらは乗っ取りに気づかないままパスワードを相手に伝えてしまうことになる、という認識で正しいのでしょうか。だとすると中間者攻撃から守ってくれるのは秘密鍵を用いた通信の方であって、ホスト間認証は実質そんなに役に立っていないんじゃないかという気がしてしまいます。
maisumakun

2021/02/21 01:51

> いつまでたっても公開鍵暗号通信を使わずにパスワードを使ってssh接続をし続けていた場合 クライアントの認証とサーバの認証は別途行われます。クライアントの認証がパスワードでも、サーバの認証は公開鍵を使います。
maisumakun

2021/02/21 02:02 編集

サーバ認証が済んでからクライアントの認証に移りますので、秘密鍵無しで偽の公開鍵を提示したとしても、サーバ認証が成立せずパスワードを入力する場面まで進みません。
NirohShimashita

2021/02/21 02:50

maisumakunさん ご回答いただきありがとうございます。自分が理解したいことに近づいていて本当に勉強になっています。とても有り難いです。 サーバ認証についてなのですが、どのような手順で行われているのでしょうか。 maisumakunさんがおっしゃっている通り、どこかで秘密鍵が絡んでこないと認証としては不備があるような気はしていたのですが、その秘密鍵がホスト間認証においてどういった手順で絡んでくるのかが、ネットをどう調べてもなかなか出てきません。教材ではサーバー側が提示した指紋が自分が持っているサーバーの公開鍵から導き出されると確認できたらそれだけで終わり、というような書き方をしています。それ以外に秘密鍵を利用したプロセスが存在しているということでしょうか。
maisumakun

2021/02/21 04:18

> それ以外に秘密鍵を利用したプロセスが存在しているということでしょうか。 はい、クライアントからサーバにランダムな値を送り、サーバがそれに秘密鍵で署名して返送します。受け取ったクライアントで署名を検証することで、「サーバが確かに対応する秘密鍵を持っている」ことを確認します。 https://goteleport.com/blog/ssh-handshake-explained/
angel_p_57

2021/02/21 07:32

> クライアントからサーバにランダムな値を送り、サーバがそれに秘密鍵で署名して返送します。 流石にそんなことはしないです。「署名できるのは秘密鍵を持っているサーバだけ」というコンセプトは合ってますが、「何に対して署名するか」という問題は単純ではないので。 こちらを参考にどうぞ。 https://qiita.com/angel_p_57/items/30a12a0d45457b5f76d5
NirohShimashita

2021/02/22 03:22

maisumakunさん 質問にご協力いただきありがとうございました。maisumakunさんが仰っていた秘密鍵を用いた認証プロセスなのですが、サーバーに自分の公開鍵を置いてからでないと始められないものだばかり思っていまして、その誤解のためにトンチンカンな質問をしてしまいました。おかげさまで誤解が解けまして理解を深めることができました。お時間をいただきありがとうございました。
doda

2021/02/25 12:14

> クライアントからサーバにランダムな値を送り、サーバがそれに秘密鍵で署名して返送します。 この手順は実際のSSH通信とは違うという指摘は既に出ていますが、何より問題なのはこの手順では中間者攻撃が防げない事です。 この手順だと、中間の攻撃者はクライアントから受け取ったランダムな値をそのままサーバに送り、サーバから返って来た署名データをクライアントに送る事でクライアントを騙せます。 中間者攻撃への耐性を持たせる為には、署名するデータや署名の仕方にも気を配る必要が有ります。
guest

0

イマドキのSSH接続では、公開鍵形式の鍵認証が使われてます
接続鍵は公開鍵と秘密鍵というセットになってまして、原理上公開鍵からは秘密鍵は算出できない(されにくい?)ようになってるので、ネット上でやり取りされる公開鍵からはなりすましできないようになってます

#そりゃ無限の計算資源があればどーにかできるんでしょうけどね

投稿2021/02/21 01:11

y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NirohShimashita

2021/02/21 01:37

y_waiwaiさん ご回答をいただきありがとうございます。 とても勉強になります。 付け加えてもう一点だけお伺いしたいのですが、もし公開鍵認証を設定せず、いつまでもパスワード認証だけを使っていた場合、ある日突然悪意のある者にDNSを乗っ取られて、指紋は正しいものを提示された場合、気づくことはできない、という理解は正しいでしょうか。もしそうだとすると、ホスト間認証には中間者攻撃に対する耐性は実質ほとんどなく、中間者攻撃に耐性を持っているのは教えていただいた公開鍵認証の方であるというふうな理解で間違っていないでしょうか。
y_waiwai

2021/02/21 01:54

まあ、パスワードだと、それ自体をやり取りさせないと認証できない、ってのが弱点となりますね パスワードを暗号化するなりしたところで、その暗号化方法を解読さえすればいいってはなしになりますし、 その暗号化方法ってのも、あまねくクライアントにばらまく必要があり、クライアント側から漏れるリスクも大きいですね。 それに対し鍵認証では、秘密鍵はサーバから漏らさないようにすればそれでいいってことになります
NirohShimashita

2021/02/22 03:26

y_waiwaiさん 質問にご協力いただきありがとうございました。 てっきりホスト認証というのはもっと単純なものだと思っていまして、公開鍵方式を用いた相互認証(正確さにかける言い方なんだと思いますが)がホスト認証の段階で行われていたということを知りませんでした。おかげさまで誤解を解くことができとても理解を深めることができました。ご協力いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問