スクリプトでcronがsudoを実行するのに静かに失敗するのはなぜですか?


30

を使用していくつかのコマンドを呼び出す非特権ユーザーのcrontabからスクリプトを実行していますsudo。そうでないことを除いて。スクリプトは正常に実行されますが、sudoされたコマンドは黙って失敗します。

  • スクリプトは、問題のユーザーとしてシェルから完全に実行されます。

  • sudoはパスワードを必要としません。問題のユーザーにはで(root) NOPASSWD: ALLアクセスが許可されてい/etc/sudoersます。

  • Cronはスクリプトを実行および実行しています。シンプルdate > /tmp/logを追加すると、適切なタイミングで出力が生成されます。

  • 権限の問題ではありません。繰り返しますが、スクリプトは実行されますが、sudoされたコマンドではありません。

  • パスの問題ではありません。実行env中のスクリプト内から実行$PATHすると、sudoへのパスを含む正しい変数が表示されます。完全なパスを使用して実行しても役に立ちません。実行中のコマンドにはフルパス名が与えられています。

  • STDERRを含むsudoコマンドの出力をキャプチャしようとしても、有用なものは何も表示されません。sudo echo test 2>&1 > /tmp/logスクリプトに追加すると、空のログが生成されます。

  • sudoバイナリ自体は正常に実行され、スクリプト内のcronから実行された場合でもアクセス許可があることを認識します。sudo -l > /tmp/logスクリプトに追加すると、出力が生成されます。

    ユーザーec2-userは、このホストで次のコマンドを実行できます:
    (root)NOPASSWD:ALL

を使用してコマンドの終了コードを調べると、$?エラーが返されています(終了コード:)1が、エラーは発生していないようです。/usr/bin/sudo /bin/echo test同じエラーコードを返すような単純なコマンド。

他に何が起こっているのでしょうか?

これは、最新のAmazon Linux AMIを実行する最近作成された仮想マシンです。crontabはユーザーに属しec2-user、sudoersファイルが配布のデフォルトです。


1
私は解決策について話すつもりでしたが、それから私は読みましたThe user in question has (root) NOPASSWD: ALL access granted in /etc/sudoers、そして、私の脳は読み続けるにはあまりにも大声で叫び始めました。
シャドゥール

@Shadur:手を話してください。それはマシンをセットアップする私の方法でもありませんが、これらのマシンは箱から出してこのようになります。マシンを通してでも、rootパスワードは取得できません。ボックスの所有者としてのキーは、(前述のように)完全なsudoアクセスを持つec2-userアカウントに入ります。パスワードを設定しない限り、ec2-userのパスワードは取得されません。これはキーのみのログインです。
カレブ

1
その後、最初に行うことをお勧めしますがsudo、スクリプトで必要なコマンドに対して/ only /権限が制限された別のユーザーを設定し、ログイン機能を完全に無効にします。
シャドゥール

rootがあり、cronジョブをrootとして実行する場合、なぜそれをec2-userのcrontabに入れるのですか?rootのcrontabはより適切ではないでしょうか?または/ etc / crontab?
cas

@CraigSanders:cronジョブをrootとして実行したくありません。実際、ほとんどのジョブはユーザーとして実行する必要があります。問題は、rootとしてジョブを実行することではなく、sudoを介して1つの機能に特別にアクセスできるスクリプトについてです。
カレブ

回答:


40

sudoのパーミッションファイルにはいくつかの特別なオプションがあります。そのうちの1つは、TTY内で実行されているシェルへの使用を制限できますが、cronはそうではありません。

Amazon Linux AMIを含む一部のディストリビューションでは、これがデフォルトで有効になっています。/etc/sudoersファイルには、次のようになります。

# Disable "ssh hostname sudo <cmd>", because it will show the password in clear.
#         You have to run "ssh -t hostname sudo <cmd>".
#
Defaults    requiretty

#
# Refuse to run if unable to disable echo on the tty. This setting should also be
# changed in order to be able to use sudo without a tty. See requiretty above.
#
Defaults   !visiblepw

sudoコマンド自体ではなくシェルスクリプトのレベルでSTDERRに出力をキャプチャした場合、次のようなメッセージが表示されます。

申し訳ありませんが、sudoを実行するにはttyが必要です

解決策は、これらのオプションを削除するかコメントアウトすることにより、非TTY環境でsudoを実行できるようにすることです。

#Defaults    requiretty
#Defaults   !visiblepw

1
CentOSにはこれらの制限があることを確認できます。
19:31のaeu

requirettyがCentOS 7に追加されたように見えるので、これはCentOS 6では必要ありませんでしたが、CentOS 7+では必要です。私の経験では、cronからのsudoコマンドは、CentOS 6で有効になっている場合でもDefaults !visiblepwコメントアウトされていない場合でも機能します。
kevinmicke
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.