- ベストアンサー
SSHのパスワード無し認証(公開鍵暗号方式)
過去ログに似た質問がいくつかあり、それらを参考にしましたが、何故か私の環境では上手く行かないので、何が原因なのか、どうすればよいのか、どなたか教えて頂けると嬉しく思います。 ■やりたいこと ・SSHでパスワード無しログイン ■環境条件 ・ローカルマシン(接続元) VineLinux 3.1 ・ホストマシン(接続先) VineLinux 3.1 ・両方のマシンに同じユーザ(hikaly)があり、ログインパスワードは同じものになっている。 ■手順 ローカルマシンにhikalyでログインし、 $ ssh-keygen -t rsa -N "" でパスフレーズ無しの鍵を作成する。 /home/hikaly/.ssh/id_rsa.pub というファイルを、ホストの /home/hikaly/.ssh/ にコピー。この際、WinSCP3を使って、ローカル→作業用Windowsマシン→ホスト とコピーを行いました。 ホストの /home/hikaly/.ssh/ には authorized_keys が存在しなかったので、コピーした rsa_id.pub を authorized_keys に改名。 ホスト側で root になって sshd_config を編集。 RSAAuthenticationを「yes」にして保存。sshdを再起動させました。 ■結果 これでローカル側からホスト側にパスワード無しで接続できるはずだと思いますが、 hikaly@hostmachine's password: とパスワードを尋ねられてしまいます。 いろいろとググッて調べてみたところ、「接続先(ホスト側)でssh-keygenしてできたrsa_id.pubを接続元(ローカル側)にコピーせよ。」と読める資料を見つけましたが、多くのものは「接続元でssh-keygenして接続先にコピーせよ。」と書かれています。ワケ分からなくなってきました。(;´ρ`) 私の質問もややこしくてワケ分からなくてすいません。
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
リモートのsshdを止めたくないんですね。 オーケー、そんなときは違うポートを使ってテストしよう。リモートで、以下のコマンドでデバッグモードのsshdを立ち上げる。 その前に、使われてないポートのチェックだ。 /etc/servicesによれば 122 は空いてるようだが、netstatを使って確認してみる。 $ netstat -ln LISTEN されてなければOK。 sshd をデバッグモードで起動する。 # /usr/sbin/sshd -D -e -d -d -d -p 122 -f /etc/ssh/sshd_config netstat で見てみると 122 がLISTEN されてる。 こいつがデバッグモードのsshdだ。 さて、ローカルからリモートへsshしてみよう。 $ ssh -p 122 user@remotehost これでばっちりログが取れるので、問題解決まであと少しだっ。 #8 さんが整理してくれたおかげで、やっと問題が理解できました。thx
その他の回答 (8)
- anmochi
- ベストアンサー率65% (1332/2045)
確認だが、 1.自宅Win(putty)→ローカルVine 2.自宅Win(putty)→ホストVine の2接続だけであって、 3.ローカルVine→ホストVine の接続は無いんだね? 今まで3をやってると思っていた。 puttyで公開鍵を作ってOpenSSHで使う場合、 a.Winのputty-keygenで「Export OpenSSH Key」を使う。 b.Vineのssh-keygenでインポートする。 の二通りがあるが、どちらを採用しているのかな? 具体的には、Vine側では次の2行のうちどちらを行ったかだ。 $ cat id_rsa.pub >> authorized_keys $ ssh-keygen -i -f id_rsa.pub >> authorized_keys 今までの話の流れからすると、前者のようだけど、その場合、putty-keygenで鍵を作り直した方が早いかもしれない。私としては、putty-keygenでOpenSSH公開鍵を作るよりも、putty用(?)の公開鍵を作ってOpenSSHでインポートする手順の方がお勧めだ。 ところで、#7さんへのお礼に > この最後の「RSA key~」の後に止まってしまいます。 > プロンプトに戻りません。 > 10分ほど待ちましたが反応がないので、[ctrl]+[C]で抜け出しました。 とあるが、これはプロンプトに戻らないのが正しい。その状態で、別のコンソールや別のKTermやWinのputtyからssh接続してみてごらんと#7さんはおっしゃっている。
お礼
複雑な環境を分かりにくく説明してしまって申し訳ありません。 本来の目的は、ローカルVine→ホストVineの公開鍵&パスワード入力無しログインです。 ローカルVineで $ ssh-keygen -t rsa -N "" として鍵を作成。念のため、-t rsa1 と -t dsa も実行。出来上がった三つの公開鍵をホストVineにコピーして $ cd ~/.ssh $ cat identity.pub >> authorized_keys $ cat id_rsa.pub >> authorized_keys $ cat id_dsa.pub >> authorized_keys と行って登録しました。 しかし、ローカルVineからホストVineにログインしようとすると、いつもLinuxのログインパスワードを求められてしまいます。 そこで、Windows上のputtygen.exeで鍵を作成し、ローカルVineとホストVineの両方のauthorized_keysに登録して、両者の動作の違いを確認してみることにしました。すると、ホストVineは相変わらずパスワード入力を求めてくるのに対し、ローカルVineには鍵だけですんなりと入れたのです。 つまり、 1.自宅Win(putty)→ローカルVine 2.自宅Win(putty)→ホストVine 3.ローカルVine→ホストVine の三つとも行いました。 3が目的で、1と2はテストのために、です。 puttyで公開鍵を作ってOpenSSHで使う場合についてですが、「Export OpenSSH Key」ではなく、「save private key」というボタンを押して秘密鍵を作成し(拡張子がppkになる)、公開鍵は「Public key for pasting into OpenSSH authorized_keys file」という欄に表示された文字列を「全て選択」→「コピー」し、テキストエディタに貼り付け、「identity.pub」などの名前で保存していました。そうやって出来た公開鍵をローカルVineやホストVineにコピー&登録し、秘密鍵をTeraTermから使って上記接続テストを行いました。 SSHをデバッグモードで動作させて接続ログを取る方法についてですが、ホストVineのsshdを停止させてデバッグモード動作させることは避けたいです。というのは、ホストVineは遠距離にあり、sshdを停止させるとこちらからのSSHによるコントロールが効かなくなる(ターミナルが落ちる)からです。これじゃ話にならないかも知れませんが…。 ローカルVineのsshdをデバッグモードにして試してみました。ここに載せきれないほどの長いログが出来ましたが、こちらのVineマシンには元々鍵でログインできるので、問題はありません。
- daling_2004
- ベストアンサー率55% (19/34)
#3です。 えっと、言葉足らずですいませんでした。 デバッグモードのsshdを起動した状態で、ローカルからsshしたときのログを取得してみてください。 やみくもに試行錯誤するより近道です。
お礼
バックアップ作業に奔走されて遅くなりました。普段はディスプレイ無しの自宅サーバマシンにディスプレイを繋いだらIOエラーメッセージが山のように表示されていました。HDDが故障する予兆らしい。(T_T) さて、ローカル(自宅サーバ)側で教えて頂いた通りに実行してみました。 [root@hoge root]# /usr/sbin/sshd -D -e -d -d -d -f /etc/ssh/sshd_config debug2: load_server_config: filename /etc/ssh/sshd_config debug2: load_server_config: done config len = 212 debug2: parse_server_config: config /etc/ssh/sshd_config len 212 debug1: sshd version OpenSSH_3.9p1 debug1: private host key: #0 type 0 RSA1 debug3: Not a RSA1 key file /etc/ssh/ssh_host_rsa_key. debug1: read PEM private key done: type RSA debug1: private host key: #1 type 1 RSA debug3: Not a RSA1 key file /etc/ssh/ssh_host_dsa_key. debug1: read PEM private key done: type DSA debug1: private host key: #2 type 2 DSA debug1: rexec_argv[0]='/usr/sbin/sshd' debug1: rexec_argv[1]='-D' debug1: rexec_argv[2]='-e' debug1: rexec_argv[3]='-d' debug1: rexec_argv[4]='-d' debug1: rexec_argv[5]='-d' debug1: rexec_argv[6]='-f' debug1: rexec_argv[7]='/etc/ssh/sshd_config' debug2: fd 3 setting O_NONBLOCK debug1: Bind to port 22 on 0.0.0.0. Server listening on 0.0.0.0 port 22. socket: Address family not supported by protocol Generating 768 bit RSA key. RSA key generation complete. この最後の「RSA key~」の後に止まってしまいます。プロンプトに戻りません。10分ほど待ちましたが反応がないので、[ctrl]+[C]で抜け出しました。
- tropic_snow
- ベストアンサー率61% (51/83)
再びNo.2です。 私が紛らわしい書き方をしたばっかりに誤解を与えてしまって申し訳ないですが、 > それと、sshd_configのAuthorizedKeysFileで > $HOME/.ssh/authorized_keys > を指定しているのに、 ここの "$HOME/" は無い方が良いと思います。 つまり、 AuthorizedKeysFile .ssh/authorized_keys ↑が正しくて AuthorizedKeysFile $HOME/.ssh/authorized_keys ↑は正しくない ということ。 私の環境(パスワード無しでログインできる)で試しに$HOMEを付けてみると、「パスワード入れてね」状態になったので。。。 No.2で言いたかったのは、sshd_config内のファイル名と実ファイル名が異なっている場合、 mv $HOME/.ssh/間違ったファイル名 $HOME/.ssh/sshd_configのファイル名 と、実ファイル名をsshd_configに合わせた方が良いでしょう、ということです。 言葉足らずで申し訳ありませんでしたm(__)m
お礼
いえいえ、ありがとうございました。こちらこそ、Linux強制電源切断リセットのショックから、この部分に関して返信し忘れていました。(^_^;) sshd_configのAuthorizedKeysFileは.ssh/authorized_keysとなっています。 $ cd /home/hikaly/ssh $ cat id_rsa.pub >> authorized_keys 他の公開鍵も同様に追加して $ chmod 600 authorized_keys …とやりましたので、私の踏んだ手順に間違いはないと思うんですが…未だにパスワード無しのログインが出来ません。 ローカルマシンへはパスワード無しでログインできるのに、ホストに出来ないのはどーして? 謎は深まるばかりです。 何はともあれ、ありがとうございました。
- anmochi
- ベストアンサー率65% (1332/2045)
> 結果は同じ。 う~ん・・・・(´・ω・`)・・・・。 そうだなぁ・・・・。他には・・・・。・・・・。・・・・。 ・・・・まずありえないと思うが、sshd_configの中でPubkeyAuthentication yes となっているか確かめてみよう・・・・。 私はホスト側にVine Linux3.1を使っている(ローカルはWindowsのputty-jp)が、SSH2でDSAキーを使っているので、RSAキーは正確には分からない。お役に立てず申し訳ない。
お礼
接続先(ホスト)のsshd_configでは # PubkeyAuthentication yes とコメントアウトされていました。 #を取って PubkeyAuthentication yes にしてsshdを再起動させてみましたが、ローカル側からの接続には変化はなく、相変わらず「パスワードを入れてね♪」と尋ねられます。 接続に使うキーがDSAでもRSAでもSSH1でもSSH2でも何でも良いのです。本来の目的は、rsync+sshのバックアップ作業をcronに登録して毎晩自動的に行わせることにあります。 で、ローカル側で $ ssh-keygen -t dsa -N "" $ ssh-keygen -t rsa -N "" $ ssh-keygen -t rsa1 -N "" を実行して出来た id_dsa.pub id_rsa.pub identity.pub の三つのファイルをホストの /home/hikaly/.ssh にコピー。 $ cat id_dsa.pub >> authorized_keys2 $ cat id_rsa.pub >> authorized_keys2 $ cat identity.pub >> authorized_key と立て続けに行いましたが、それでもローカル側からの接続時にパスワードを求められてしまいます。authorized_keyもauthorized_key2もパーミッションは600になっていますし…。 皆目見当が付かなくなってきました。この迷宮はクノッソス宮殿より深いんじゃないかという気がしてきています。(;´ρ`)
補足
どこに補足するべきか迷いましたが、とりあえず最新の#5に付けておきます。 ローカルやホストの呼称が紛らわしいので、私の環境ももう少し丁寧に解説しておきます。 手元にはLinuxマシン(ローカル:接続元)とWindowsマシンがあり、両方とも同じ家庭内LANにぶら下がっています。ネット越しにホストマシン(某社のLinuxマシン)があります。ローカル&ホスト両方のLinuxマシンとも、WindowsのTeraTermProからSSHログインして操作しています。ですので、ローカルLinuxマシンは正確には「ローカル」ではないのですが、便宜上「ローカル」と呼ぶことにしています。 さて、WindowsからのTeraTermProによるSSHログインにはパスワードを使用していましたが、試しにこれを公開鍵暗号方式にしたらどうだろ?と考えて試してみました。 Windowsのputtygen.exeにて公開鍵と秘密鍵(SSH2-RSA形式)をつくり、公開鍵をローカルLinuxマシン(家庭内Linuxマシン)とホストLinuxマシン(某社Linuxマシン)の /home/hikaly/.ssh に転送、 $ cat id_rsa.pub >> authorized_keys を実行して登録しました。もちろん、両マシンとも $ chmod 600 authorized_keys しました。 次に、WinSCP3を起動し、ユーザ名にhikalyを入力。パスワード欄は空にして、先ほど作ったRSA鍵でログイン出来るかどうか試してみました。(TeraTermProはSSH2に未対応らしいのでWinSCP3を試してみました) 結果、ローカルLinuxマシンにはそのまま正常にログインできましたが、ホストLinuxマシンからはパスワードを入力するように言われました。 ローカルLinuxマシンもホストLinuxマシンも同じOSで動いているのに、この違いはどこから来るのでしょうか。両マシンのsshd_configを比べてみましたが、違っている箇所はありませんでした。 それと、sshd_configのAuthorizedKeysFileで $HOME/.ssh/authorized_keys を指定しているのに、 $ cat id_rsa.pub >> authorized_keys2 のようにauthorized_keys2というファイルに公開鍵情報を追加するのはおかしな話なので、すべて authorized_keys に追加しなおしました。 それでも、WinSCP3からの接続時に、ローカルLinuxマシンへは素直に接続できるのにホストLinuxマシンからはパスワードを求められるという現象に変わりはありません。 おかしいなぁ…。
- tropic_snow
- ベストアンサー率61% (51/83)
No.2です。 > ちなみに、sshd_config の PermitEmptyPasswords は no のままにしておいた方がいいです。 > 少なくとも今回の件には無関係です。 おっと。これは「空のパスワードを許可する」ですね。 たしかに無関係(というか危険?)ですので、私の回答は無視しちゃって下さい。 失礼しました。
お礼
えーと、下記のお礼欄に書いたとおり、とりあえず試してみました。セキュリティとは別のところで恐ろしいことになりかけました。(^_^;) セキュリティ上も好ましくないようなので、noのままにしておきます。
- daling_2004
- ベストアンサー率55% (19/34)
通常のsshdを停止し、以下のコマンドを実行してログを採取してください。 # /sshdのあるパス/sshd -D -e -d -d -d -f /configファイルのあるパス/sshd_config デバッグモードで動作するので山ほどログが出ます。 そこでエラーになってるとこを探してください。 それがあればもっと詳しいことがお答えできます。 追伸 ちなみに、sshd_config の PermitEmptyPasswords は no のままにしておいた方がいいです。 少なくとも今回の件には無関係です。
お礼
実行してみました。以下のようなメッセージが返ってきました。 ----ここから [root@hoge ssh]# /usr/sbin/sshd -D -e -d -d -d -f /etc/ssh/sshd_config debug2: load_server_config: filename /etc/ssh/sshd_config debug2: load_server_config: done config len = 350 debug2: parse_server_config: config /etc/ssh/sshd_config len 350 debug1: sshd version OpenSSH_3.9p1 debug1: private host key: #0 type 0 RSA1 debug3: Not a RSA1 key file /etc/ssh/ssh_host_rsa_key. debug1: read PEM private key done: type RSA debug1: private host key: #1 type 1 RSA debug3: Not a RSA1 key file /etc/ssh/ssh_host_dsa_key. debug1: read PEM private key done: type DSA debug1: private host key: #2 type 2 DSA debug1: rexec_argv[0]='/usr/sbin/sshd' debug1: rexec_argv[1]='-D' debug1: rexec_argv[2]='-e' debug1: rexec_argv[3]='-d' debug1: rexec_argv[4]='-d' debug1: rexec_argv[5]='-d' debug1: rexec_argv[6]='-f' debug1: rexec_argv[7]='/etc/ssh/sshd_config' debug2: fd 3 setting O_NONBLOCK debug1: Bind to port 22 on 0.0.0.0. Server listening on 0.0.0.0 port 22. socket: Address family not supported by protocol Generating 768 bit RSA key. RSA key generation complete. ----ここまで /etc/ssh/ssh_host_dsa_key や /etc/ssh/ssh_host_rsa_key がRSA1の鍵じゃないよ!と怒られている気がします。 そこで、ググッて見つけたこのページを参考に鍵を作り直してみました。 http://www.tcn.zaq.ne.jp/gara_k/pc_unix/pc_unix_019.htm /usr/bin/ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key /usr/bin/ssh-keygen -t rsa1 -f /etc/ssh/ssh_host_rsa_key しかし、これでも接続元から ssh 接続先IP すると、 hikaly@接続先IP's password: とパスワードを求められることには変わりありませんでした。 うーん、何なんでしょう。パスワードログインは正常に出来るので、SSHが挙動不審な行動を取っているわけじゃないと思います。どこかに私の設定ミスがあると思うんですが…それが分からないのでもどかしいです。
- tropic_snow
- ベストアンサー率61% (51/83)
ホストマシン(接続先)の設定を確認してみましょう。 sshデーモンの設定ファイル(sshd_config)がどのファイルかご存知ですか? 私はVineLinuxは使用していないのですが、RedHatだと/etc/ssh/sshd_config です。 このファイルで確認すべきところが2箇所あります。 (1) PermitEmptyPasswords 多くの場合 No が設定されていますので、Yes に書き替えて下さい。コメントアウトされている場合は解除するのを忘れないように! (2) AuthorizedKeysFile authorized_keysのファイル名を指定します。ディストリビューションによっては書き替えられているものがあります。(古いディストリビューションに多いかな?) もし違うようなら合わせて下さい。sshd_configを書き替えてもいいし、$HOME/.ssh/authorized_keys の方をリネームしてもいいでしょう。リネームの方がいいかも。 あとは再起動を忘れずに行って下さい。
お礼
返信ありがとうございます。 VineLinuxのsshd_configの在処も同じ場所です。 /etc/ssh/sshd_config AuthorizedKeysFileの設定は # .ssh/authorized_keys とコメントアウトされていたので、#を除去し、更に$HOMEを付けて次のようにしました。 $HOME/.ssh/authorized_keys /etc/rc.d/init.d/sshd restart で再起動をしてみましたが、ローカル側からの接続時にパスワードを求められることに変化はありません。 #3のdaling_2004さんからPermitEmptyPasswordsはnoの方が良いというコメントがつきましたが、いちおうYesにしてみました。 /etc/rc.d/init.d/sshd restart で再起動。 ん?何やら [failed] という文字が返ってきて再起動に失敗したらしい。Yesは全部小文字でyesじゃないとダメなんだろうか?と再びsshd_configを書き換えて再起動…した次の瞬間、SSHのコネクションが切れてホストマシンへのログインが不可能に!!Σ(´Д`lll) 実はホストマシンは遠いところにある某社のサーバで、こんな私がメンテナンス係をやっているんです。某社で働いているLinux門外漢の社員さんを電話で呼び出し、Linuxサーバ機(ホスト)はディスプレイが接続されていないマシンなので、電源ボタン長押しの強制リセットをしてもらいました。怖~。(><) ということで、私の書き方ミスなんですが、PermitEmptyPasswordsはnoに戻して触れないようにしました。(^_^;)
- anmochi
- ベストアンサー率65% (1332/2045)
check point! ホストのマシンで、/home/hikaly/.sshのパーミッションは755になっているか。具体的には、 /home/hikaly>$ ls -ld .ssh drwxr-xr-x 2 hikaly hikaly 4096 May 23 08:46 .ssh/ などとなっていれば良い。 check point! ホストのマシンで、/home/hikaly/.ssh/authorized_keysのパーミッションは600になっているか。 check point! ローカルマシンで/home/hikaly/.ssh/id_rsaのパーミッションは600になっているか。 check point! sshのパラメータで秘密鍵を指定しているか。まぁ、大抵のsshコマンドで、SSH2を使う場合、id_dsaとid_rsaは自動で探してくれるので問題無いとは思うのだが・・・・。一応試してみて欲しい。ローカル側で $ ssh -i ~/.ssh/id_rsa ホストのIPアドレス だ。 まぁ、基本としては~/.sshは755、~/.ssh/*は600に変更すると良いだろう。 > ワケ分からなくなってきました。 君の説明では、後者だな。ssh-keygenを実行するのはローカル側の方が良いだろう。まぁ、安全ならどちらでも良いのだが、「id_dsa.pub(公開鍵)」はホスト側、「id_dsa(秘密鍵)」はローカル側だ。「サーバはインターネットに公開(パブリック)するものだ~」と覚えておこう。なんか年号早覚えみたい。いいくにつくろ~♪
お礼
回答ありがとうございました! 早速check pointsを確認してみました パーミッションについて、そうなっていなかったものは変更しました。 ホスト /home/hikaly/.ssh → 755 ホスト /home/hikaly/.ssh/authorized_keys → 600 ローカル /home/hikaly/.ssh/id_rsa → 600 ここまで行ってSSHログインを試してみました。 ローカル側で、 $ ssh ホストIPアドレス hikaly@ホストIPアドレス's password: やっぱりパスワードを求められるので、 $ ssh -i ~/.ssh/id_rsa ホストのIPアドレス を実行してみましたが、結果は同じでした。 ホスト側の sshd_config に Protocol という項目があったので、これを 1, 2, 2.1, コメントアウトなどに変更してsshdを再起動させましたが、結果は同じ。 以前、ローカルマシンをRedHat8で動かしていたとき、同じ事をやろうとしてその時はすんなり動いたんですが…うーん、今回はわけがわかりません。(´・ω・`)
お礼
度々どうもありがとうございます! なるほど、デーモンで動いているsshdとは別のsshdを別ポートで待機させて、そこに接続してあげるわけですか。Good idea ですね! …が、ここまで親身に相談に乗って頂いているのに申し訳ないのですが、ホストVineと回線との間にファイアーウォールがありまして、これが一切の不要ポートを塞いでいるのです。 httpを止めて80番ポートを解放して、そこにsshdを待機させようかと考えましたが、さすがにそれはマズイです。なので、せっかく教えて頂いたにも関わらず、最後までテストすることが出来ませんでした。 それと、更に申し上げにくいのですが、実は先ほど、全く別の、とても初歩的な方法で解決してしまいました。 ホストVineとローカルVineにて、~/.ssh 以下のファイルを全部削除。ssh-keygenによる鍵作成も、authorized_keysやknown_hostsへの登録も、全てを一からやり直しました。すると、これまでの挙動不審が嘘のように、あっさりと鍵方式で接続できるではありませんか。何度やっても大丈夫なので、今度こそ…喜んで良いのだと思います。 ただ、解決したことは嬉しいのですが、回答者の皆さんの労力は何だったの?ということになりかねないので、とても複雑な心境です。すいません…。(´・ω・`) せめてお礼を全員に差し上げたいのですが、システム上そうすることもできませんし。どうかお許し下さい。 少々時間をおいて、締め切らせて頂きます。m(__)m