ssh許可はcronジョブでのみ拒否されました


13

非常に奇妙な問題がある。(公開鍵認証を使用して)sshを介してリモートホストでコマンドを実行する小さなbashスクリプトを作成しました。

このスクリプトをコマンドラインから手動で実行すると正常に動作しますが、/ etc / cron.hourlyに配置するとPermission denied, please try again.エラーで失敗します。

  • を使用して、スクリプトでキーを明示的に設定しましたssh -i /root/.ssh/id_rsa user@remote "command"
  • スクリプトはrootとして実行されています(私echo `id` > /tmp/whoami.logはダブルチェックに追加しました); そして
  • sshキーはパスワードで保護されていません...

システムはUbuntu 12.04サーバーです。リモート側でトラブルシューティングを行うためのアクセス権はあまりありませんが、前述のように、sshを手動で実行するか、コマンドラインから同じbashスクリプトを実行できます。

なぜこれが起こっているのか、それをどのように修正するのか?

更新

私が間違っていたことがわかり、sshキーパスワードで保護されていた(キーチェーンがssh-agentをロードしている)ため、スクリプトから失敗したのに、bashセッションから実行したときに失敗しなかったのです。. ~/.keychain/$HOSTNAME-shスクリプトに追加することで問題が解決しました(正しい方向に私を指して包括的な回答を提供してくれた@grawityに感謝します)。


手動で実行すると、その特定のキーが使用されますか?SSH_AUTH_SOCKKRB5CCNAME環境変数を設定解除した後、もう一度テストします。
user1686 2012

提案をありがとう。よくわかりませんが。手動で実行しているときにリモートホスト上でコマンドを接続/実行できるため、その特定のキーを使用していると確信しています。これらの変数の設定を解除した後、正確に何をもう一度テストする必要がありますか?
Yoav Aner、2012

また、私はssh-agentを使用していないので、どのようSSH_AUTH_SOCKに関連しているのかわかりません(私は何でも試して満足しています)。キーファイルに直接アクセスしていますが、キーファイルはパスワードで保護されていません。KRB5CCNAMEクイック検索これはケルベロスとは何かである示しました。繰り返しますが、この問題への関連性はわかりませんが、ここに何か不足しているかもしれません...
Yoav Aner '19

もちろん、スクリプトをテストします。cronジョブはインタラクティブコマンドとは異なる環境で実行されるため、そうするまでは、「特定のキーが使用されていることを確認」することはできません。-vそのsshコマンドにオプションを追加するとさらに良いでしょう...
user1686

しかし、私はそうします。ssh -iどちらの場合でも、key using コマンドを明示的に使用しています...スクリプトでこれらの変数の設定を解除してみてください。追加する良い提案-v-私も追加します。
Yoav Aner、2012

回答:


11

対話型コマンドとcronジョブはさまざまな環境で実行されます。特に、対話型セッションでは、SSHエージェントが実行されているか、Kerberos TGTが保存されている場合があります。方法のためのssh注文の認証方法、あなたがすることはできません追加したという理由だけで、あなたの鍵が使用されていることを確認してください-iオプションを選択します。

  • SSHエージェントが実行されている場合、sshクライアントは常に明示的に指定されたキーを使用する前にエージェントキーを試行します。

  • ネットワークがKerberosを使用していて、Kerberos TGTが存在する場合、OpenSSHは公開鍵認証を試行する前にそれを使用します。

私はあなたの環境について何も知りませんが、これらの両方の可能性は簡単に確認できます:

  1. 追加unset SSH_AUTH_SOCKunset KRB5CCNAMEsshのコマンド、その後、手動で変更したスクリプトを実行します。

    これにより、スクリプトはエージェントまたはKerberosチケットを参照できなくなり、明示的に指定されたキーのみが使用されます。

  2. -vオプションをに追加しますssh。これにより、認証の発生方法に関する詳細が表示されます。

また、追加することができます-oIdentitiesOnly=yessshコマンド。これにより、指定されたキーを使用するように強制されます


そして、cronからエージェントにアクセスするためのヒントを追加した場合-さらに良い

エージェントは通常、インタラクティブなログインセッションに密接に関連付けられているため、これは一般に推奨されません。特に、ログイン時にのみ開始され、ログアウト時に強制終了されます。SSHキーを実際にロック解除するにはパスワードが必要です(パスワードが保護されている場合)。

「キーチェーン」とおっしゃっていましたが、これはOS Xプログラムですか、それともLinuxスクリプトですか?(Mac OS Xのアーキテクチャについてはよくわかりませんが、私の知る限り、cronジョブからユーザーのssh-agentにアクセスするのが非常に難しくなります...)


1
ssh-cronを使用すると、SSHキーを公開せずにSSHエージェントを使用して、サーバーを保護するためにスケジュールされたSSH接続を設定できます。superuser.com/questions/463540/…–
Luchostein

5

この問題の別の回避策は、ローカルの絶対パスでファイルまたはコマンドを実行するのではなく、ローカルボックスにsshを設定してsshコマンドを実行することです。これはKRB5CCNAMEをキャッシュし、/ path / commandが機能しない場所で機能します。

# Fails:
0 * * * * /home/user/sshscript.sh

# Works:
0 * * * * /usr/bin/ssh user@localhost /home/user/sshscript.sh

#!/bin/bash
# Works:
unset SSH_AUTH_SOCK
unset KRB5CCNAME
/usr/bin/ssh user@localhost /home/user/sshscript.sh

1

ssh-cronを使用して、SSHキーを公開せずに、SSHエージェントを使用して、セキュアサーバーへのスケジュールされたSSH接続をセットアップできます。


Homebrewでは依存関係を利用できないため、インストールは複雑なようです。パスワードなしのキーだと思います…:-/
チャーリーゴリチャナズ

-1

次のようにcrontabでスクリプトまたはコマンドを実行できます。

0 * * * * bash -c -l "/home/user/sshscript.sh"

または

0 * * * * bash -c -l "ssh root @ yourhost 'echo $ HOSTNAME'"


1
OPは既にを介してスクリプトを実行しようとしていますcron。したがって、これは実際には答えを提供しないようです。
bertieb 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.