質問: 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 の中に入っているデータはいったいなんなんでしょうか??(相手の公開鍵??) /* 長くなりましたが、答えれる部分でいいので、よろしければお答えいただけないでしょうか。どうか、よろしくお願いします。
回答: (クライアントの設定) 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) その通りです。相手先の公開鍵によって、本当に目的のホストかどうかを確認することができますよね? (あらかじめ、相手の公開鍵を知っていることが前提ですが。) 毎回確認するのも面倒なので、一度確認したら、確認しないようにできます。 その記録がこれです。