dポイントプレゼントキャンペーン実施中!

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 の中に入っているデータはいったいなんなんでしょうか??(相手の公開鍵??)

/*
長くなりましたが、答えれる部分でいいので、よろしければお答えいただけないでしょうか。どうか、よろしくお願いします。

A 回答 (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は、暗号理論の話が前提ですし、単純な仕組みではないので、この程度の文章で書き尽くせません。しっかり理解したければ、ちゃんとした本を読んでみてくださいね。
 (うまく説明できなくてすいません...)
    • good
    • 0
この回答へのお礼

どうもありがとうございました。
非常に助かりました。

本を買って勉強したいのですが、色々と、秋の試験勉強をしなくては・・・泣

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

本当にみなさまありがとうございました。

お礼日時:2002/09/18 22:21

>(質問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 の中に入っているデータはいった
>いなんなんでしょうか??(相手の公開鍵??)

リモート"ホスト"の公開鍵です。リモートの"ユーザ"の
公開鍵では無いことに注意してください。
    • good
    • 0

(回答1)に関して...


送信されるのは、rsa鍵自体でも、暗号化されたパスフレーズではなく、
プロトコル1では、サーバが送信したチャレンジ値を暗号化したもの(レスポンス値)、
プロトコル2では、共有の Diffie-Hellman 値から取り出されたセッション識別子を暗号化したものですよ。

RSA認証(公開鍵方式による認証)に失敗すると、自動的にパスワード認証を試すので、RSA認証の手順を間違えていても、パスワードとパスフレーズが同じだったりすると、間違いに気づかないことが多いです。
パスワードとパスフレーズは違うものを使うことをお勧めします。

known_hostsは、1の方の回答のほかに、通信先サーバの公開鍵が登録されているものから変更されると、パスワード認証を不可にすることで、サーバに化けてユーザのパスワードを奪おうとするトロイの木馬対策になります。
    • good
    • 0

(クライアントの設定)


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)
その通りです。相手先の公開鍵によって、本当に目的のホストかどうかを確認することができますよね?
(あらかじめ、相手の公開鍵を知っていることが前提ですが。)
毎回確認するのも面倒なので、一度確認したら、確認しないようにできます。
その記録がこれです。

この回答への補足

書き込み本当にありがとうございます。

あなたのアドバイスを元に僕的に解釈をしなおしてみたのですが、

・ログイン先ホストのknown_hostにログイン元ホストのid_ras.pubの内容をあらかじめ入れておく。
・ログイン元ホストはパスフレーズを自分の秘密鍵で暗号→ログイン先ホストはknown_hostに入っている(入れておいた)ログイン元の公開鍵で、復号する事によって、本人認証する。
・つまり、パスフレーズは本人認証するためのもの(フレーズ)・・・と言ったところでしょうか??


(疑問)しかし、その場合、ログイン元ホストが複数ある場合は、ログイン先ホスト(known_host)に公開鍵がたくさんあるという事ですよね。という事は、ログイン先ホストはパスフレーズを復号する場合、どの公開鍵を使えばいいのかわからなくなるような気もするのですが・・・???


また、なんか間違った事言ってしまったでしょうか・・・汗

補足日時:2002/09/18 00:15
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!