• ベストアンサー

ssh の仕組み

ssh の仕組みについて、よくわからない事があるので、よろしくお願いします。 (サーバの設定) ・/etc/ssh/sshd_config ファイルの編集をして、ルート権限ログインできないようにする。 ・デーモンを起動する。 (クライアントの設定) 1#ssh-keygen -t rsa 2#mv id_rsa.pub authorized_keys2 3#ssh hoge@192.168.x.x 4#rsa を入力 5#known_hostに関してのプロンプトに、yesで答える 6#パスワードを入力 上記の手順を踏んだとき、 まず、 (質問1:) 4のrsaを入力というのは、 相手側に自分の公開鍵を渡すと言う事でいいのでしょうか?? (質問2) これで、ログインした場合、サーバはその公開鍵を使って、暗号化→クライアントはそれを自分の秘密鍵(id_rsa)により、復号化。という解釈でいいのでしょうか? (質問3) 質問2の場合、クライアントから、サーバに送信するメッセージは暗号化されていないのでしょうか? (質問4) /etc/ssh/sshd_configの設定で、RSAAuthorized no にしてしまったら、 暗号化されないで、平分で、データが流れてしまうのでしょうか? (質問5) 結局のところ、SSHというものは、ユーザのパスワードを知っていたら、簡単に侵入ができるようなものなのでしょうか? (質問6) 上記の手順自体が全く間違っているのでしょうか? (質問7) ~/.ssh/known_hosts の中に入っているデータはいったいなんなんでしょうか??(相手の公開鍵??) /* 長くなりましたが、答えれる部分でいいので、よろしければお答えいただけないでしょうか。どうか、よろしくお願いします。

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

  • ベストアンサー
noname#4147
noname#4147
回答No.4

まず、ユーザの秘密鍵、公開鍵と、ホストの秘密鍵、公開鍵を、しっかり区別してください。 ユーザの鍵はkey-genで作成し、ホストの鍵は、sshdインストール時に作成されているはずです。名前も違います。 id_rsa、id_rsa.pubは、各ユーザの秘密鍵・公開鍵で、 id_rsaは、ログイン元ホストの、~/.ssh/に、そのままの名前で、 id_rsa.pubは、ログイン先ホストの、~/.ssh/に、authorized_keys2という名で保存しておきます。 authorized_keys2には、改行すれば、いくつでも公開鍵を追加できます。 (ログイン元によって異なる鍵の組み合わせでログインしたい場合もあるので。) この場合も、各公開鍵の末尾に、どの秘密鍵に対応しているかを示す文字列が書かれているので、混乱はありません。 また、同じ鍵のセットを、いろいろなホストで使えます。鍵をホストごとに変える必要はありません。 自分が関係する全てのホストに、同じid_rsaとauthorized_keys2をおいておけば、ホストが何台あっても1種類の鍵のセットで事足ります。 各ホストの鍵はredhatであれば、/etc/ssh/に入っているssh_host_rsa_key、ssh_host_rsa_key.pubなどです。 各ユーザは、ログイン時に、known_hostにログイン先ホストの公開鍵が登録されます。 これは、手動でもできますが、通常は、ログイン時にyesとすることで、自動的に登録されます。 複数のホストにログインした場合、複数のホストの公開鍵が登録されますが、各ホストの公開鍵の先頭に識別の文字列が書かれているので混乱はありません。 あと、大事なことですが、 hoge君が作った、鍵のセット(秘密鍵Aと、公開鍵B)があったとすると、 ファイルをAで暗号化すると、それは、Bでしか復号化できません。 ファイルをBで暗号化すると、それは、Aでしか復号化できません。 Aは自分だけが持っていて、Bは他人に持たせておきます。 すると、あるファイルが、Bで復号化できたとすると、そのファイルは必ずAで暗号化したということなので、そのファイルを作ったのは、間違いなくhoge君です。 このしくみが、公開鍵暗号方式で、RSA認証の本人確認の基本的な考え方です。 (質問に関して) 1つめ. ログイン元ホストのid_ras.pubではなくて、ログインユーザのid_ras.pubをです。 ホストごとにid_ras.pubが違うとは限りません。上記のように、複数のホストで共用できるので。 また、入れておくのは、ログイン先ホストのauthorized_keys2にです。 どうも、tomatosukiさんは、known_hostの事を気にしすぎです。このファイルは、RSAやDSAによる認証そのものには無関係です。 ただ、相手先が偽者ではないことを一度確認したか(yesと答えたか)どうか示しているだけです。 (yesと聞かれるのは、「ここはあなたの意図した通信先であることを確認できましたか?」という意味です。) いわば、ただのログファイルです。あらかじめ用意する必要も、手動で何かする必要もありません。なくても平気です。 まず、このファイルの存在を忘れることからはじめてください。 2つめ. 認証には、ホストの秘密鍵、公開鍵は使いません! ただ、ホストの公開鍵がユーザのknown_hostに自動登録されるだけです。認証自体には関係しません! 正しく書き直すと、 ログイン元ホストはユーザのパスフレーズをユーザの秘密鍵で暗号して送信する→ログイン先ホストはユーザのauthorized_keys2に入っているユーザの公開鍵で、送られてきた暗号を復号化する事によって、本人認証する。 3つめ. そうですね。 実際は、送信内容については、暗号化されたパスフレーズ自体ではなく、retrさんがおっしゃっている事がより正しいのですが、 方法はこれであっています。安全策として、さらにひねくってあるだけです。 (疑問に関して) 公開鍵を登録するのはauthorized_keys2です。 authorized_keys2もknown_hostも複数の鍵が登録できますが、上記のように、ちゃんと区別できるようになっています。 # SSHは、暗号理論の話が前提ですし、単純な仕組みではないので、この程度の文章で書き尽くせません。しっかり理解したければ、ちゃんとした本を読んでみてくださいね。  (うまく説明できなくてすいません...)

tomatosuki
質問者

お礼

どうもありがとうございました。 非常に助かりました。 本を買って勉強したいのですが、色々と、秋の試験勉強をしなくては・・・泣 こんなんで、テクニカル(ネットワーク)受かるのでしょうか・・・笑 問題集を解いていて、イマイチ、公開鍵暗号方式とか、秘密鍵とか色々でてきたので、つい実践をしてみたくなって、Linuxというものに、手をつけたばかりです。(笑)みなさん、非常にわかりやすい説明で、本当に感謝しています。逆に、こんなにできる人がたくさんいると、なんか、へこんでしまいますよ。 本当にみなさまありがとうございました。

その他の回答 (3)

回答No.3

>(質問1:) >4のrsaを入力というのは、 >相手側に自分の公開鍵を渡すと言う事でいいのでしょうか?? いいえ、公開鍵はsshによる認証でリモートホストには 渡されません。sshを使用する前にあらかじめ、sshとは 別の手段で、リモートホストに公開鍵をコピーしておく 必要があります。 >(質問2) >(質問3) >(質問4) >(質問5) 全部"いいえ"です。特に質問5ですが、ちゃんと秘密鍵と 公開鍵で認証を行うように設定されているsshで使われ るのは、"パスフレーズ"であって、"パスワード"では ありません。"パスフレーズ"が他人に分かっても、秘密 鍵さえ分からなければ、認証されることは有りません。 # PasswordAuthentication がyesの場合、パスワード # で認証が行われますが、普通これはnoにするでしょう。 また、2,3,4ですが、作成した公開鍵と秘密鍵が使われる のは、最初だけで、その後は、新たに作成される共通鍵 で全てのメッセージが暗号化されます。 >(質問6) >上記の手順自体が全く間違っているのでしょうか? 基本的にsshの仕組みを理解されていないとお見受けし ます。と思って検索したんですが、わかりやすく説明 したサイトがなかなか無いようなので、以下の書籍を 紹介しておきます 秀和システム 「OpenSSH セキュリティ管理ガイド」 >(質問7) >~/.ssh/known_hosts の中に入っているデータはいった >いなんなんでしょうか??(相手の公開鍵??) リモート"ホスト"の公開鍵です。リモートの"ユーザ"の 公開鍵では無いことに注意してください。

  • retr
  • ベストアンサー率75% (30/40)
回答No.2

(回答1)に関して... 送信されるのは、rsa鍵自体でも、暗号化されたパスフレーズではなく、 プロトコル1では、サーバが送信したチャレンジ値を暗号化したもの(レスポンス値)、 プロトコル2では、共有の Diffie-Hellman 値から取り出されたセッション識別子を暗号化したものですよ。 RSA認証(公開鍵方式による認証)に失敗すると、自動的にパスワード認証を試すので、RSA認証の手順を間違えていても、パスワードとパスフレーズが同じだったりすると、間違いに気づかないことが多いです。 パスワードとパスフレーズは違うものを使うことをお勧めします。 known_hostsは、1の方の回答のほかに、通信先サーバの公開鍵が登録されているものから変更されると、パスワード認証を不可にすることで、サーバに化けてユーザのパスワードを奪おうとするトロイの木馬対策になります。

noname#4147
noname#4147
回答No.1

(クライアントの設定) 1では、id_rsa、id_rsa.pubができますね。前者は秘密鍵、後者は公開鍵です。 2の操作は、ログイン先ホストで行います。 つまり、ログイン元ホストにid_rsa、ログイン先ホストに、authorized_keys2に名を変えたid_rsa.pubがある状態です。 同じホストに両方があっても鍵を使ったsshはできません。 (ここを勘違いされている気がします...) 4で入力するのはパスフレーズといって、1のときに指定した文字列です。 rsaを入力している訳ではありません。また、パスフレーズは、Linuxのパスワードとは別物です。 (質問1) 秘密鍵(id_rsa)で暗号化されたパスフレーズを渡しています。 鍵自体を渡すわけありません。 (というか、あらかじめauthorized_keys2という名で公開鍵を渡しておかないと認証できません。) (質問2) サーバ(ログイン先ホスト)は各ユーザのauthorized_keys2(公開鍵)を使って受信したパスフレーズを復号化します。 そして複号化されたパスフレーズが合致しているかの確認を行います。 暗号化はここでは行いません。 (質問3) 質問1の段階で暗号化されています。 (質問4) RSAAuthenticationのことでしょうか? これをnoにしても、プロトコルバージョン1のRSA認証を許可しなくするだけです。 sshには認証方法がいくつかあるので、別の認証方法を使ってログインことになります。 また、上記手順でのrsaはバージョン2ですので、PubkeyAuthenticationで指定します。 sshでは平文で認証をおこなうことはありません。 (質問5) 鍵を使わない、パスワード認証(PasswordAuthentication)を利用すればそうなりますね。 ただし、公開鍵認証(RSA認証またはDSA認証)でないとログインできなくもしておけます。 そうすれば、秘密鍵を手に入れた上、その鍵に指定されたパスフレーズも知らないといけません。 (秘密鍵を入手されないよう、パーミッションに注意してください。) 重要なサーバでは、パスワード認証は使わず、公開鍵認証(PubkeyAuthentication)のみを使うのが普通です。 rsaよりもdsaを使うことが多いですね。秘密鍵の扱いを間違えなければ、簡単に侵入されることはないでしょう。 (質問6) そうですね、sshでの認証方法の種類と、その手順を整理してみてください。 手順と仕組みを間違って理解されているようです。 秘密鍵と公開鍵の性質(sshに限らず、一般的な公開鍵暗号方式)についても、調べなおされたほうがよろしいかと思います。 (質問7) その通りです。相手先の公開鍵によって、本当に目的のホストかどうかを確認することができますよね? (あらかじめ、相手の公開鍵を知っていることが前提ですが。) 毎回確認するのも面倒なので、一度確認したら、確認しないようにできます。 その記録がこれです。

tomatosuki
質問者

補足

書き込み本当にありがとうございます。 あなたのアドバイスを元に僕的に解釈をしなおしてみたのですが、 ・ログイン先ホストのknown_hostにログイン元ホストのid_ras.pubの内容をあらかじめ入れておく。 ・ログイン元ホストはパスフレーズを自分の秘密鍵で暗号→ログイン先ホストはknown_hostに入っている(入れておいた)ログイン元の公開鍵で、復号する事によって、本人認証する。 ・つまり、パスフレーズは本人認証するためのもの(フレーズ)・・・と言ったところでしょうか?? (疑問)しかし、その場合、ログイン元ホストが複数ある場合は、ログイン先ホスト(known_host)に公開鍵がたくさんあるという事ですよね。という事は、ログイン先ホストはパスフレーズを復号する場合、どの公開鍵を使えばいいのかわからなくなるような気もするのですが・・・??? また、なんか間違った事言ってしまったでしょうか・・・汗

関連するQ&A

  • パソコンを買い替えたら、SSH でサーバに入れなくなってしまいました。

    パソコンを買い替えたら、SSH でサーバに入れなくなってしまいました。 CentOS5.4 で自宅サーバを構築しています。クライアント機は、このたび Windows7 搭載のPC に買い替え、Teraterm TTSSH (Ver 2.53) をインストールしました。認証方式は RSA です。 旧 PC からはサーバに円滑にログインできます。 クライアント(新PC)のid_rsaファイルは読取専用のチェックを外し、サーバの authorized_keys ファイルのパーミッションは 755 としています。 /etc/ssh/sshd_config の最後に次の行を追加しています。 AllowUsers abc@192.168.0.11 abc@192.168.0.12 (0.11が旧PC、0.12が新PCです)。 この状態で 1.旧PC の id_rsa を新PCにコピーし、ssh でログインしようとしたら、鍵照合画面で 「開く」ボタンを押しても無反応で画面が動きません。 2.そのため、新PCで改めて公開鍵と秘密鍵を作成し、公開鍵をサーバの authorized_keys に次の通り追記しましたが、やはり、新 PC の鍵照合画面で「開く」ボタンを押しても無反応で画面が動かないのです。 cat /home/abc/.ssh/authorized_keys ssh-rsa AAAAB3・・・・・・5BCWh8= pqr@********** ssh-rsa AAAAB3・・・・・6/bJ2w==  xyz@********** 何故ログインできないのでしょうか? どうすれば解決できるでしょうか? 大変困っています。よろしくお願いします。

  • SSHアクセスが出来ない

    Ubuntuにsshを入れて、公開鍵認証でwindowsからリモートアクセスしようとしましたができません。 Ubuntu側手順としては、 1. sudo ssh-keygen -t rsaで、パスフレーズ設定 2. sudo mv /root/.ssh/id_rsa.pub /root/.ssh/authorized_keysで公開鍵設定 3. sudo mv /root/.ssh/id_rsa /media/usbでUSBメモリに秘密鍵をコピー そしてwindows側は、TeraTermを使って、 ユーザ名、パスフレーズ(上記で設定したもの)、秘密鍵(USBメモリのid_rsaファイルを指定)を設定してログイン(SSH2) といった、通常の操作をしております。パスワード認証にすると問題なくできましたので、ネットワークの問題ではなさそうです。 なお、ubuntu側で事前にやった事としては、 /etc/.ssh/sshd_configファイルのPermitRootLoginをyes->noに変更、PasswordAutheticationをyes->noに変更のみです。設定後にSSHサーバを再起動させています。 詳しい方がいましたら、よろしくお願い致します。

  • sshの公開鍵認証の基本的な仕組みについて

    ネットワークセキュリティの初心者です。教えてください。 sshの認証を使用して、サーバのファイルをクライアントにコピーしようとしています。 こちらで行った手順は以下のとおりです。(クラサバ共にSolaris) クライアントにて:  ・ssh-keygen -t rsa で秘密鍵(id_rsa)と公開鍵(id_rsa.pub)を作成。  ・scp id_rsa.pub hoge@192.168.10.10:/tmp でサーバに転送  (パスワードを入力すれば転送できた) サーバにて  ・cat /tmp/id_rsa.pub >> ~/.ssh/authorizedkeys で設定 上記にて、クライアントから scp testfile hoge@192.168.10.10:/tmpをしたところ、パスワード入力なしで無事転送することができました。 ここまではOKなのですが(前置き長くてすみません) この状態で、クライアントにて再度 ssh-keygenを実行してしまうと、またサーバのauthorizedkeysを設定しなおさなければならないのでしょうか? また、クライアントでのssh-keygen実行時に、id_rsa以外の名前で鍵を作成したときはどうなのでしょうか?(やはりサーバでの設定が必要?) そもそも鍵を作成する仕組みや鍵を管理している仕組みがわかっていれば簡単な問題かもしれませんが、どなたか教えてください。 こちらでは安易にテストする環境がないため、宜しくお願いします。

  • SSHのパスワード無し認証、dsa 方式だけ?

    職場の Solaris サーバにSSHのパスワード無し認証(公開鍵暗号方式)をしようと頑張ったのですがなかなかうまく行かず、結局、6時間くらい頑張って  「 DSA 方式しか使えない 」 ということが分かりました。 RSA1 や RSA でも、単にパスフレーズでログインできないだけで、特にエラーメッセージも出なかったので、なかなか気づきませんでした。 質問ですが、、、 あるサーバの公開鍵暗号方式が、RSA1 か RSA か DSA かを判別する方法はないでしょうか?

  • ssh:RSA鍵を利用してのログインが出来ない

    ノートPCにRedHatLinux7.3、デスクトップPCにWinME、の2台でLANを構築 しました。WinMEからLinuxにsshでRSA鍵を利用してのログインが出来ません。 SSHプロトコルVersion1のRSA鍵をLinux側で作成し、WinMEのTeraTermフォルダに identityを入れました。 Linuxの ~/.ssh/ (755)には authorized_key(664)、identity(600)、 identity.pub(644) が存在します。 /etc/ssh/sshd_config はデフォルトのままです。 WinMEにはTeraTerm、TTsshを利用しています。 RSA鍵を利用してログインしようとすると、「認証は失敗しました」となります。 プレインテキストを利用してのログインはOKです。 購入した書籍にはsshd_configはデフォルトのままで構わないような事が 記載されていましたが、ほぼ # が入り、コメントアウトのようなかたちに なってますがこれは問題ないでしょうか? Linuxを入れたばかりでよく分からないのですが、何か分かることが あれば教えていただければと思います。

  • SSHでTELNET

     こんにちは、honiyonです。  SSHの知識について確認をしたいのですが...  サーバー側で、SSHの設定を行いクライアントからSSHで保護されたTELNETを使用する場合、SSH(Port22)に接続し、設定を行ったユーザー名とパスフレーズ、RSA公開鍵を使用してログインします。  ・・・で合っていますか?  TELNET(Port23)からログインしたのでは、SSHで保護されませんよね?    基本的な所で申し訳ないのですが、宜しくお願いします(..

  • LinuxへTeratermにてSSH接続できない

    TeratermにてSSHリモート接続ができなくなりました。WindowsマシンよりTeratermにて接続していましたが、公開鍵のパスワードを忘れてしまい、再度鍵パスワード無しで設定しようとしましたが、TeratermよりLinuxへ全く繋げません。 そもそも鍵認証なしでもSSH接続ができません。  pingはWindowsマシンからLinuxへは疎通はできています。 # cat /etc/ssh/sshd_config # RSA秘密鍵 identityを必須にする( no で“必須”を指定 ) PasswordAuthentication no # rootでのログインを禁止する PermitRootLogin no # パスワード無しのログインを許すか PermitEmptyPasswords no # .rhosts等を信用するか(RSA認証付き) RhostsRSAAuthentication no # ユーザuserのみ接続許可をする(不特定多数に接続させない為) AllowUsers user 何か原因があれば再設定手順をご教授頂きますよう、お願いいたします。

  • SSH通信で秘密鍵の読み込みが失敗

    ●質問の主旨 クライアントコンピューターとサーバー間で SSH通信を行いたいと考えています。 公開鍵暗号方式でSSHサーバーに対して、 クライアントコンピュータからリモート接続を行おうとして クライアントのTeraTermを使って秘密鍵でアクセスしようとしたところ、 「SSH2秘密鍵の読み込みに失敗しました」という添付画像のような メッセージが出ます。 このメッセージ出されることなく、クライアント~サーバー間で SSH通信を行うためには、どこをチェックすればよいでしょうか? ご存知の方がいらっしゃいましたら、ご教示願います。 ●質問の補足 現在の状況は以下の通りです。 1.クライアントのTeraTermで秘密鍵(id_rsa)と公開鍵(id_rsa.pub)を作成 2.秘密鍵(id_rsa)はクライアントのCドライブのRSAという任意の名前のフォルダに保存 3. 公開鍵(id_rsa.pub)はSFTPでサーバーの一般ユーザのホームディレクトリに転送 4. 一般ユーザのホームディレクトリ配下に/.ssh/authorized_keysディレクトリを追加 (cat id_rsa.pub > /home/user/.ssh/authorized_keys) 5.chmodコマンドで.ssh及び.ssh/authorized_keysのアクセス権を変更 6.cat authorized_keysで中身を見ると、 公開鍵(id_rsa.pub)の文字の羅列が並んでいる ●環境 上記で言う、クライアントコンピュータはWindows8を使用しています SSHサーバーは、CentOS6.0をディストリビューションとするLinuxを使用しています

  • RedHat6 SSH

    おそれいります。 RedHatEnterpriseにて、sshを開通させようとしているのですがうまくいきません。 ssh-keygen -t rsa ⇒ ssh-copy-idにてauthorized_keysを作成しました。 デーモンで立ち上げると接続できず、/usr/sbin/sshdで立ち上げると、クライアントからログインできるので、鍵のペアはとおっている模様です。 sshd_configの設定の問題なのか、様々試しましたがダメでした。 StrictModes yes PubkeyAuthentication yes RSAAuthentication yes PermitRootLogin no ChallengeResponseAuthentication no PermitEmptyPasswords no PasswordAuthentication no GSSAPIAuthentication yes GSSAPICleanupCredentials yes IgnoreRhosts yes IgnoreUserKnownHosts no PrintMotd yes StrictModes yes 以上のように設定しています。 よろしくお願いします。

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

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