公開鍵認証における第三者介入の可能性について

このQ&Aのポイント
  • 公開鍵認証における第三者介入の可能性について解説します。
  • 公開鍵認証では、中間者攻撃やなりすましの可能性があるが、防御策が存在する。
  • 公開鍵認証において、復号済みデータの盗難や中間者攻撃に対する安全性を解説します。
回答を見る
  • ベストアンサー

公開鍵認証における第三者介入の可能性について

公開鍵認証、例えばSSHによるアクセスにおける「クライアント(ユーザ)認証」のやり取りについて、中間者攻撃やなりすましの可能性、及びそれに対する防御がどう考慮されているのかがわからず、質問させていただきます。 まず、チャレンジ・レスポンス方式によるクライアント認証は、以下のような流れだと認識しています。 (1)サーバ側が、公開鍵(あらかじめユーザが配置したauthorized_keys)を用いて認証用のランダムデータを暗号化し、クライアント側に送る(チャレンジ)。 ※ここで第三者がデータを盗っても、正しいユーザ以外は対応する秘密鍵を持ってないのでどうすることもできない (2)クライアント側は、公開鍵に対応する秘密鍵によってデータを復号し、サーバへ送り返す(レスポンス)。 ※これは安全なのでしょうか…?(疑問点として詳細後述) (3)サーバ側では、クライアントから送られてきた復号済みデータと、元データと比較し、 合っていれば正しいクライアント(ユーザ)であると認証できる。 ここで、何か大きな思い違いをしているのかもしれませんが、 以下の疑問が生じています。 -------------------------------------- ◆疑問点1 (2)において、復号済みデータ自体がネット回線上に流れた際に、それが盗まれる可能性は存在すると思います。 第三者による不正な認証に使われてしまったりしないのでしょうか? もしかして、先に正しいクライアントが認証されれば、同じ復号済みデータは二度と使えなくなるから安全、とか…? でも、正しいクライアントが認証される前に悪意ある第三者が認証されてしまう可能性はないのでしょうか?(疑問点2に繋がります。 ◆疑問点2 (2)において、悪意ある第三者が介入し、サーバ側には届かないように復号済みデータを横取りし、あたかも自身が復号したデータであるかのようにそのままサーバへ送り、認証自体を横取りしてしまう(第三者が正しいクライアントとして認証されてしまう)ことはありうるのでしょうか? (→中間者攻撃:man-in-the-middle attack?なりすまし?) -------------------------------------- 上記、2つの疑問点についてご教授いただきたいです。 公開鍵、秘密鍵の性質は理解しているつもりなのですが、 データの暗号化・復号化自体をそれぞれの正しいクライアント・サーバにやらせつつ 第三者がやり取りの中間に立つようなことが可能なのであれば、 認証自体が第三者に横取りされ、そこでアクセスが確立しまうのではないかと思った次第です。 (この方法がおそらく無理だからこそ、公開鍵認証が安全なセキュリティ技術として普及しているのだと思いますが、何故無理なのかがわからず…。) お手数ですがどうぞよろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.12

No.3,6,7です。 回答が遅くなりましたが、まず1点訂正させてください。 No.3回答で、クライアント認証が完了したら 共通鍵を生成して、以後全てのデータ通信は 共通鍵で暗号化してデータ送受信すると書きましたが、 共通鍵で暗号化を開始するのは、クライアント認証後ではなく クライアント認証の前のサーバー認証完了時点からでした。 つまりクライアント認証を行う時点では、既に通信路は 共通鍵で暗号化された状態になっています。 このため「(2)のレスポンスデータは暗号化しない生データが送られる」 と書きましたが、実際には共通鍵で暗号化した状態で送られます。 また(1)のチャレンジデータも実際のところはクライアントの公開鍵 で暗号化したものをさらに共通鍵で暗号化した状態で送られます。 http://www.omoikane.co.jp/man30/w_ssh.html の図がサーバ認証(=ホスト認証)、クライアント認証(=ユーザ認証) 合わせた全体で解説されており、わかりやすいと思います。 これを踏まえて回答します。 > ◆サーバ認証 > サーバ側の公開鍵Sを、クライアント側のknown_hosts情報と照らし合わせるもの > > [X]⇔[サーバ] > サーバが公開鍵Sを送ってくる。悪意あるXは特に検証もする必要なくOKを返せば、この関係上でのサーバ認証は完了 > > [クライアント]⇔[X] > Xは、サーバから送られてきた公開鍵Sを、クライアントに送る。クライアントのknown_hostsに公開鍵Sが保管されているとすると、比較検証によって一致する。(known_hostsに保管されていない場合でも、ユーザがyesと入力、つまり許可すれば新たに保管され、通る。) > よって認証OKと見なされ、この関係上でのサーバ認証も完了。 今回紹介したURLの解説図にある通り、クライアントは公開鍵Sを受け取った後、サーバに対して チャレンジレスポンスのやりとりを行います。あなたが想定している攻撃者[X]は、 おそらくこのデータも素通りさせて、サーバー認証を完了させるのだと思いますが、 その後、クライアントはデータ通信用の共通鍵を生成し、公開鍵Sで暗号化し サーバに送付します。以後、全てのデータ送受信はこの共通鍵で暗号化して通信します。 このため、これ以降(クライアント認証含め)攻撃者[X]は、データの中身を見ることも 改ざんすることもできません。 それなら、サーバ認証のチャレンジレスポンス時にレスポンスデータは 生データが流れるので、その時点で横取りすればよいとお考えかもしれません。 その場合、あなたの想定する中間者攻撃は以下のようになりますよね。 -------------------------------------------------- [クライアント]→[X] クライアントは公開鍵Sを用いてチャレンジデータを生成、Xに送る。 Xはこれをサーバーに投げる [X]→[サーバ] Xからチャレンジを受け取ったサーバは、正しい秘密鍵Sを持っているため、正しいレスポンスをXに返す。 悪意あるXが、サーバ側とやり取りしたいならば、Xはレスポンスを検証する必要もなく認証をOKとすれば、サーバとXの間でSSH通信が開始される。 一方、Xがクライアント側に用があるならサーバは用済みなのでレスポンスエラーなどを返して切断する。 [X]→[クライアント] > クライアントとやり取りしたい場合のXは、上の過程で正しいレスポンスを手に入れているため、それをクライアントに返す。クライアントはXを正しいサーバと認めるため、Xとクライアントの間でSSH通信が開始される。 -------------------------------------------------- この中で[X]→[クライアント]の 「クライアントはXを正しいサーバと認めるため、Xとクライアントの間でSSH通信が開始される。」 というのが認識不足なのだと思います。 この処理は具体的には 1.クライアントがデータ通信用の共通鍵を生成 2.公開鍵Sで暗号化してサーバに送付 3.サーバが秘密鍵Sで復号化し、共通鍵を取得 4.以後、全てのデータ送受信はこの共通鍵で暗号化して通信 ということです。 今回の場合、サーバの代わりにXが公開鍵Sで暗号化した共通鍵を受け取るのだと 思いますが、Xは秘密鍵Sを持っていないので、共通鍵を取りだせないのです。 したがって、Xはそのデータを破棄するかそのままサーバに伝えるかしかできず、 サーバに伝えればサーバとクライアントの間でSSH通信が開始されるということに なります。 もう一方の[X]→[サーバ]の 「Xはレスポンスを検証する必要もなく認証をOKとすれば、サーバとXの間でSSH通信が開始される。」 という部分は、上述の手順でクライアントがデータ通信用の共通鍵を生成して サーバに送付しない限りデータ通信開始できません。Xがそれをクライアントに促すには、 Xからクライアントに正しいレスポンスを送信するしかなく、その後は上述の通りです。 結局、その後のやりとりはクライアントとサーバの間で共通鍵で暗号化してやりとりするため、 攻撃者Xは何もできないということです。 納得いただけましたでしょうか?

multivitamin99
質問者

お礼

明快なご回答、まことにありがとうございます。 共通鍵を用いる流れと、介入した第三者が共通鍵を得られないがためにその後何もできなくなるというお話で、おかげさまで納得・理解ができました。 論理立ったご説明をいただき、感謝いたします。

その他の回答 (11)

  • foomufoomu
  • ベストアンサー率36% (1018/2761)
回答No.1

公開鍵方式の鍵の意味ですが、 公開鍵:普通の文書を暗号文にするのに使う鍵 秘密鍵:暗号文を普通の文書にもどすのに使う鍵 秘密鍵と公開鍵は、もちろん、ふか~い関係がありますが、 秘密鍵から公開鍵を作るのは簡単ですが、公開鍵から秘密鍵を作るには何億年もコンピュータを動かさないとできない、という性質を持っています。 でもって、(2)は間違っています。正しくは、 クライアント側は、公開鍵によってデータを復号し、サーバへ送り返す(レスポンス)。 です。 普通の文書を暗号に変換するのに秘密鍵は必要ありません。秘密鍵は一切公開することはないので、第3者は暗号を横取りしても普通の文書に戻すことはできません。

関連するQ&A

  • sftp時の公開鍵認証

    windowsサーバにSFTPサーバを構築し、公開鍵での認証をかけ、SFTPでファイルやり取りを行いたいのですが、 ファイルやり取りはできるのですが、公開鍵での認証がうまくいきません。 色々なサイトを調べながら以下手順で構築していったのですが、 公開鍵、秘密鍵での認証がうまくいってないように見えます。 なんでもいいので、何か分かる方いましたらご教授お願いします。 ※クライアントPC、サーバともにwindows ◆秘密鍵、公開鍵ファイルの作成(クライアントPC) 1.クライアントPCにSFTP接続ソフト「WinSCP」をインストール 2.「WinSCP」の補助ツール「PuTTYgen」により、秘密鍵ファイル、公開鍵ファイルを作成 3.作成した公開鍵ファイルをサーバへコピー ◆SFTPサーバ構築、公開鍵認証設定(サーバ) 4.サーバにSFTP環境構築ソフト「freeFTPd」をインストール 5.SFTPの接続先(アドレス、ポート22)を設定 6.ユーザー(ID、パスワード)を作成。そのユーザーのSFTP時ホームディレクトリを設定 7.SFTPのサービスを開始 8.6で設定したホームディレクトリの直下に「.ssh」ディレクトリ作成 9.「.ssh」ディレクトリの直下に「authorized_keys」ファイルを作成 10.3でコピーした公開鍵ファイルの中身を、「authorized_keys」ファイルに追加(テキストベースでのコピペ) ◆サーバへのSFTP接続(クライアントPC) 11.クライアントPCで「WinSCP」を起動。SFTPサーバのIP、6で設定したユーザーのID、2で作成した秘密鍵を設定しログイン 12.「Further authentication required Authenticating with public key "dsa-key-20140512" Access denied.」 と表示され、ログインできない 13.秘密鍵を使わず6で設定したユーザーIDとパスワードであれば、ログイン可能。SFTPサーバとのファイルのやり取りも可能 また、「.ssh」ディレクトリと「authorized_keys」ファイルに書き込み権限があるユーザーの場合に、認証が失敗するという情報があったので、 クライアントPCに書き込み権限を持っていないユーザーでログインし、WinSCPを起動してアクセスしてみたのですが、同じ結果でした。

  • 公開鍵と秘密鍵

    サーバ側で ssh-keygen -t rsa と入力すると,公開鍵と秘密鍵が生成されますが どうしてクライアント側に秘密鍵をもたせるのでしょうか? 逆でも通信できる気がします. あと,サーバ1台に対して,クライアントが複数いる場合に 公開鍵と秘密鍵のペアはクライアントの人数分生成するのが適切なのでしょうか? (複数のサーバに1台のクライアントが接続する場合も,各サーバが1台のクライアントに対して公開鍵・秘密鍵を生成するのが適切なのでしょうか?) よろしくおねがいします.

  • SSHのホスト認証について

    現在VineLinux3.2を使ってサーバの勉強をしている、ド素人です。 SSHのユーザ認証が、 (1)サーバ側で乱数生成→クライアントの公開鍵で暗号化→ (2)クライアントに送信→ (3)クライアントが受信→ (4)秘密鍵で複合化→サーバに送信→ (5)サーバはクライアントから送られた乱数を確認して認証 という流れで、なるほど、これでユーザを認証できるってのは分かるのですが、 ホスト認証がよくわかりません、 SSHでサーバにアクセスすると、 サーバの公開鍵が ~/.ssh/knows_hosts に登録されますが、 この公開鍵を使って、ユーザ認証と同じ方法で接続先ホストを認証してるのでしょうか? そうだとしたら、 2度目のアクセスからはホストを認証するのに、 この~/.ssh/known_hostsの 公開鍵を使った方法が有効だというのは分かりますが、 一番最初のアクセスではこの公開鍵を使ってもホストの認証は出来ないと思うのですが(接続先から送られてくる公開鍵を使うだけなので) どういう仕組みになってるのでしょうか? よろしくおねがいします。

  • リモート認証について

    本日学校の課題としてでた問題についてお聞きしたいのですが、調べても理解できなかったので質問させていただきました。 「問題」 以下の認証プロトコルを考えたとき、どのような問題点があるか具体的に述べよ。 1, 各ユーザは公開鍵をそれぞれもち、サーバは対応する公開鍵を保持する。(公開鍵からは秘密鍵はわからない。また、秘密鍵は各ユーザによって厳重に管理されているものとする) 2, 各ユーザは認証の際に決められた自分のユーザIDを自分の秘密鍵で暗号化したものをサーバに認証のための情報として送る。 3,サーバは送られてきたものを対応する公開鍵で複合し、ユーザIDを確認する。 という問題です。 特に問題点がないように思われます。 どなたか解説をしていただけませんでしょうか? 長々と失礼しました。

  • 自己署名証明書によるSSL通信について教えてください!

    SSL通信により、データを暗号化してWeb上でやりとりするシステムの構築を考えています。 そこで自己署名というのを考えているのですが、署名の流れがいまいち分かりません。 認証局利用の場合、私の理解では、 【サーバ側】 1.サーバ側でRSA秘密鍵を生成 2.RSA秘密鍵を元にCSRを作成 3.CSRファイルを認証局に送信 【認証局】 4.CA秘密鍵により暗号化し、サーバ証明書を作成 5.サーバ側にサーバ証明書を送信 【サーバ側】 6.クライアント側にサーバ証明書を送信 【クライアント側】 7.サーバ側よりサーバ証明書を受信する 8.認証局より公開鍵を取得する 9.認証局の公開鍵でサーバ証明書の暗号化された鍵(認証局の秘密鍵で暗号化されたもの)を復号する 10.復号した鍵により、サーバ証明書の暗号文を復号する となります。(間違いがある場合はご指摘下さい) では、自己署名を行う場合はどうなるのでしょうか? 単純にサーバ証明書を自分で作成すると考えてよろしいのでしょうか? CSRファイルの作成などもやはり行うのでしょうか? クライアント側の流れは変わらないのでしょうか? また、この操作は接続毎に毎回行うことになるのでしょうか? (秘密鍵、サーバ証明書は毎回変わるのでしょうか?) 初歩的な質問とは思いますが、よろしくお願いいたします。

  • SSHの公開鍵方式の接続について

     SSHの公開鍵(&秘密鍵)の認証での接続について質問です。  現在、Mac OSXのターミナルからLinuxのFC5サーバーに接続しようとしているのですが、うまく接続できません。  FC5側のSSHサーバーはすでに起動しているのですが、最初のホスト認証で躓いています。最初のアクセスの歳にSSHサーバー側から認証鍵を渡されるのですが、その時点で謝ってnoを選択してしまいました。以後、公開鍵が使えない状態になってしまい、接続しても「Permission denied (publickey,gssapi-with-mic).」になってしまいます。最初の接続時の公開鍵を再発行してもらうにはどうしたらよいのでしょうか?  ホスト認証の後は、ユーザー認証となると思いますが、この設定もちょっとよくわからない部分があります。  サーバー側で公開鍵と秘密鍵のセットをssh-kegenで作りますが、MacのOSXのターミナルから接続する場合は、この秘密鍵をどこに保存すればようのでしょうか?また保存後にこの秘密鍵を呼び出すにはどうしたらようでしょうか?  OSXも基本的にはUNIXなので、ホームディレクトリに.sshディレクトリなどを作成して保存するのでしょうか?    詳細な設定方法を教えて頂けると幸いです。

  • RSA公開鍵によるクライアント認証について

    teratermなどでRSAの公開鍵を使ってクライアント認証ができますが、これはパスワード認証のように総当たり攻撃を食らうことがないので、セキュリティー的に安全だと聞きました。 そこで思ったのですが、RSAの公開鍵を使ったクライアント認証をする場合は、パスワード認証はできないように設定しないとまずいですよね?そうしないと結局総当たり攻撃を食らってしまいますよね? 周りの人はパスワード認証もRSAの公開鍵による認証もできる状態で、後者を使っているのですが、これは意味がないように思えるのですが。。。。

  • [VPS] 公開鍵認証を設定できません

    閲覧ありがとうございます さくらVPSを借契約して色々と試しているのですが 公開鍵認証の設定ができずに困っています どこが抜けて、あるいは間違えているのか教えてください VPSのOSは"ubuntu 14.04" clientのOSは"windows7"です ssh_config で設定を以下のように変更 ssh 12345 PermitRootLogin no PubkeyAuthentication yes UsePAM no PasswordAuthentication yes #失敗した時のために"yes"にしています .ssh ディレクトリを作成 $mkdir .ssh $chmod 700 .ssh client側でPuTTYを使い公開鍵と秘密鍵を作成 公開鍵をOpenSSHに変換し、VPSに送信 公開鍵を登録、パーミッションの変更 $cat xxx.pub >> $HOME/.ssh/authorized_keys $sudo chmod 600 authorized_keys ユーザーのパーミッションの変更 $chmod 755 /home/user ファイアーウォールは"ufw"で設定しています 変更したsshポートは許可しているので問題はないはずです 公開鍵の登録にコピペをしたいですが、できないため回りくどい方法になっています 何をしても設定ができないようであれば、長いPWを設定して使おうと考えていますが 大丈夫でしょうか?

  • ssh鍵認証

    Aサーバーでsshで秘密鍵と公開鍵をを作成し、公開鍵のみをBサーバーへ置きました。 AサーバーからBサーバーへノンパスでログインはできたのですが、 BサーバーからAサーバーへのノンパスでのログインはできません。 (パスワードが聞かれてしまう) BサーバーからAサーバーへノンパスログイン(鍵認証)するにはどのようにすればよろしいでしょうか? ご存知の方、宜しくお願いします。

  • SSHでの公開鍵認証接続時のログイン画面

    CentOSクライアントからのCentOSサーバへ公開鍵認証によるSSH接続をしたいと思っています。公開鍵認証なのでパスワードではなくパスフレーズでの認証ができるようにしたいです。 しかし、設定操作を一通りやってクライアントからサーバへログインしようとすると添付画像のとおり「パスワード」と書かれたログイン画面が出てきます。 一応パスフレーズとして設定した文字列を入力しないとログインできないようにはなってるのですが、これはちゃんと公開鍵認証ができるようになっているのでしょうか。また、ログイン時に入力した文字列はパスワードではなくパスフレーズとして登録されているのでしょうか。 以下、環境/前提条件および操作手順の詳細です。 ■環境/前提条件 ・OSは両方ともCentOS6.5 ・OpenSSHのバージョンは両方とも5.3 ・仮にサーバ側のホスト名をtestserver、その中にあるユーザー名をtest1とする ■操作手順 (1)クライアント側でssh-keygenでid_rsaとid_rsa.pubをローカルに作成し、パスフレーズを登録。 (2)サーバ側で  .ssh/authorized_keysを作成し、   chmod 700 .ssh  chmod 600 .ssh/authorized_keys  を実行 (3)クライアント側で以下のコマンドを打ち公開鍵ファイルをサーバへ転送  cat .ssh/id_rsa.pub |ssh test1@testserver 'cat >>  .ssh/authorized_keys' (4)両マシーン共再起動させた後、クライアントからサーバへ   ssh test1@testserver  でログインしようとしたら添付画像が出てきた。 パスワード欄にはtest1@testserverのパスワードではなく、(1)で登録したパスフレーズを入力しないとログインできないようになっているが、 このログイン画面に書かれてるのがパスフレーズではなくパスワードとなっているのが気がかりです(パスフレーズとして認識されていない?) これはちゃんと公開鍵認証ができるようになっているのでしょうか。また、ログイン時に入力した文字列はパスワードではなくパスフレーズとして登録されているのでしょうか。 目標が達成できていなければ、問題点および解決策を教えてくださいますようお願いします。