web-dev-qa-db-ja.com

SSH:「サーバーが理由なくキーを拒否した」

SSHを介してWindowsマシンからLinuxマシンにファイルをコピーする簡単なバックアップスクリプトを自動的に実行するように設定しようとしていました。

多くの簡単なオンラインチュートリアルが示唆しているように、pscpputtygenで生成した秘密鍵とともに使用し、対応する公開鍵(PuTTY自体によってコピー/貼り付け形式で提示)をauthorized_keys Linuxのファイル。同じ構成で、他の2つのWindowsマシンから別のLinuxマシンまで機能することを考えると、これはかなり簡単に思えます。

Linuxマシンにrootとしてログインできることを考えると、AFAICSに接続の問題はなく、sshにも同じことが言えます。設定ファイル(sshd_config)のAuthorizedKeysFile~/.sshd/authorized_keysに設定されています。

「サーバーがキーを拒否しました」というエラーが表示され続けますが、何をしても...ログに認証の問題は表示されません...

さらにテストを行い、logLevelの値をVERBOSEまたはDEBUG2または3に設定する予定ですが、問題の緊急性と、マシンで実際にテストするには、マシンが実際の職場からかなり離れた場所にあることを考えると、多くの手間がかかります...

ご質問

  • 誰かアイデアはありますか?
  • これは誰かに起こったことがありますか?

これは実際にはsshバージョンやある種の問題に関連しているようです...

ルートのフォルダーに作成するのではなく、ユーザーのauthorized_keysディレクトリ(.ssh)内の/user/.ssh/ファイルに公開鍵を挿入する必要がある可能性も検討していました(作成しません) sshd_configAuthorizedKeysFileの値のため、非常に理にかなっています。

私はsshサーバーのLogLevel set o VERBOSEを使用していくつかのテストを行いましたが、情報を取得できませんでした(責任の問題)。代わりに、ここで別のソースから出力/デバッグログを取得します。同じエラーが表示されているようです...

Connection from 192.168.0.101 port 4288
debug1: Client protocol version 2.0; client software version OpenSSH_4.5
debug1: match: OpenSSH_4.5 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_4.5
debug1: permanently_set_uid: 22/22
debug1: list_hostkey_types: ssh-rsa,ssh-dss
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: client->server aes128-cbc hmac-md5 none
debug1: kex: server->client aes128-cbc hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST received
debug1: SSH2_MSG_KEX_DH_GEX_GROUP sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_INIT
debug1: SSH2_MSG_KEX_DH_GEX_REPLY sent
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: KEX done
debug1: userauth-request for user dcowsill service ssh-connection method none
debug1: attempt 0 failures 0
debug1: PAM: initializing for "dcowsill"
debug1: userauth-request for user dcowsill service ssh-connection method publickey
debug1: attempt 1 failures 1
debug1: test whether pkalg/pkblob are acceptable
debug1: PAM: setting PAM_RHOST to "192.168.0.101"
debug1: PAM: setting PAM_TTY to "ssh"
debug1: temporarily_use_uid: 1052/105 (e=0/0)
debug1: trying public key file /testuser/.ssh/authorized_keys
debug1: restore_uid: 0/0
debug1: temporarily_use_uid: 1052/105 (e=0/0)
debug1: trying public key file /testuser/.ssh/authorized_keys
debug1: restore_uid: 0/0
Failed publickey for dcowsill from 192.168.0.101 port 4288 ssh2
debug1: userauth-request for user dcowsill service ssh-connection method publickey
debug1: attempt 2 failures 2
debug1: test whether pkalg/pkblob are acceptable
debug1: temporarily_use_uid: 1052/105 (e=0/0)
debug1: trying public key file /testuser/.ssh/authorized_keys
debug1: restore_uid: 0/0
debug1: temporarily_use_uid: 1052/105 (e=0/0)
debug1: trying public key file /testuser/.ssh/authorized_keys
debug1: restore_uid: 0/0
Failed publickey for dcowsill from 192.168.0.101 port 4288 ssh2
Connection closed by 192.168.0.101

プログラムが所有者の権限でauthorized_keysファイルを開こうとしているようですが、問題の原因に関する詳細はありません。最後に、ファイルとフォルダの権限をチェックして再確認しましたが、すべて問題ありません。

6
besnico

私が知っているいくつかの考えられる理由は、ファイルのアクセス許可に関連しており、これらはほとんどが広すぎるため、特に2つの理由を思い出すことができます

  1. / home/userディレクトリを所有者よりも多く公開する
  2. .sshおよび/またはauthorized_keysファイルのアクセス許可(それ以上の場合は、それぞれ700/600に設定します)

実行できるサーバーにrootアクセス権がある場合、デバッグオプションと非デーモンオプションを使用して別のポートで追加のsshdサーバーを起動すると、キーの正確な理由が拒否されます。

Sudo `which sshd` -p 2020 -Dd

サーバー上

その実行を終了した後、sshを実行します。

ssh -p 2020 -i /path/to/refusedkey

サーバー出力は拒否の理由を教えてくれます

8
Tagwint

明らかなチェック

  • authorized_keys ssh-rsa AA...long_line_of_char comment PuTTY genの形式は、別の形式を提供することがあります。

  • 承認:

    • 〜user/.ssh/authorized_keysは-rw-r--r--
    • 〜user/.ssh /はdrwx ------
    • 〜userは誰でも書き込み可能ではありません。
  • キーは、接続するユーザーに応じて、ID〜rootまたは〜userにデプロイする必要があります。

それほど明白ではない:

  • rootはsshすることができません。 (PermitRootLogin noまたはコメント)
  • authorized_keysのデフォルトの場所AuthorizedKeysFile %h/.ssh/authorized_keys

    • これは〜userのホームディレクトリの下の.sshです。
  • authorized_keys AuthorizedKeysFile /foo/bar/authorized_keys.%hのサンプルカスタムロケーション

    • つまり、キーであり、/foo/bar dirにあります。
    • ルートのファイルauthorized_keys.root
    • ユーザーのファイルauthorized_keys.userでは、ファイルはルートによって所有されています
2
Archemar

実行:

Sudo `which sshd` -p 2020 -Dd

あるセッションおよび別のセッションでrootとして実行:

ssh -p 2020 -i /path/to/refusedkey refusedkeyusername@hostname

理由を理解するために働いた。ユーザーID権限が700に設定されていません。以下のようにo/pを取得しました

debug1: trying public key file /home/userid/.ssh/authorized_keys
debug1: fd 4 clearing O_NONBLOCK
Authentication refused: **bad ownership** or modes for directory /home/sapadmin
debug1: restore_uid: 0/0
Failed publickey for userid from 172.31.2.12 port 27382 ssh2: RSA 
Connection closed by 172.31.2.12 [preauth]
1
Thomas

oK! 1つの理由は、passwdファイルのユーザーホームディレクトリが、ファイルのコピー元のディレクトリではないことです。 rootだけがすべてのウェアからコピーできますが、他のユーザーはできません!

たとえば、/ backupディレクトリからコピーする場合は、scpがauthorized_keys "/backup/.ssh/への正しいパスを見つけるために、認証するユーザーがホームディレクトリを/ backup(所有)に設定していることを確認してください。 authorized_key」

2番目に、 "ssh-rsa AA ...."を使用してPuTTYキージェネレーターからテキストを1行に正確にauthorized_keysファイルにコピーしてください。 「rsa-key-xxx ..」のようなコメントは最後から削除できます。 authorized_keysファイルは、ユーザー/グループの幸運を所有している必要があります!

0
Ove

私の場合、次のようにして解決しました:

chmod 700 myuserdir/.ssh
chmod 600 myuserdir/.ssh/authorized_keys

Windowsボックスでは、puttygenを使用してrsa秘密鍵を生成する代わりに、cygwin.orgからcygwinをダウンロードしました。デフォルトでいくつかのパッケージを提供します。 OpenSSHをインストールするようにNetパッケージを変更しました。これにより、ssh-keygenプログラムがインストールされました。だから、私は走った:

  • ssh-keygen -t rsaおよびパスコードを空のままにした
  • これにより、id_rsac:/cygwin/home/myusername/.sshという名前の秘密鍵が作成されました
  • Puttygenを起動し、メニューオプション[ファイル->秘密鍵の読み込み]を選択して、id_rsaを選択します(公開id_rsa.pubではありません)。
  • [秘密キーの保存]ボタンをクリックしてPuTTY形式で保存します(PuTTY.ppkと呼びます)。
  • PuTTYを起動し、[接続]-> [SSH]-> [認証]-> [認証用の秘密鍵]を選択します。生成されたPuTTY.ppkを入力します。
  • PuTTYにユーザー名を入力します:接続->データ->自動ログインユーザー名

これで、ユーザーもパスワードも入力せずに接続できます。

0
Carlos

共有したデバッグサーバーログから、クライアント側で指定したキーが/testuser/.ssh/authorized_keysで使用可能なものと一致しないように見えます。

/testuser/.ssh/authorized_keysが予想される場所である場合は、クライアント側で使用される秘密鍵と一致する公開鍵行があることを確認する必要があります。つまり、クライアントでid_rsaを使用している場合は、次のid_rsa.pubを確認します/testuser/.ssh/authorized_keysの行の1つと完全に一致します。

サーバー上のauthorized_keysファイルの場所がわからない場合は、クライアント側で正しいユーザー名を指定しているかどうかを確認する必要があります。

0
Tagwint