web-dev-qa-db-ja.com

Apacheが別のユーザーとしてコマンドを実行できるようにする

ユーザーのホームディレクトリでいくつかのコマンドを実行するスクリプトがあります。ファイルはユーザーによって所有され、Apache(_www-data_グループ)はそれらに対する読み取り特権のみを持っています。スクリプトは、PHP via exec())によってオンデマンドで実行する必要があり、Apacheにはディレクトリへの書き込み権限がないため失敗するファイルの削除/展開を実行します。

私はsudoersファイルを次のように編集してみました:

_www-data ALL=(user) NOPASSWD: /bin/su user -c /home/user/bin/script.sh
_

ユーザーのパスワードを要求する

私も試しました

_www-data ALL=(root) NOPASSWD: /usr/bin/Sudo su user -c /home/user/bin/script.sh
_

しかし、それは_www-data_のSudoパスワードを要求します

パスワードなしでこれを機能させるにはどうすればよいですか?

6
Andrei

最後にそれをこの行で動作させました:

www-data ALL=(ALL) NOPASSWD: /usr/bin/Sudo -u user /home/user/bin/script.sh

スクリプトに引数が必要なため、行の最後に「シェルスタイルのワイルドカード」を追加する必要がありました。

www-data ALL=(ALL) NOPASSWD: /usr/bin/Sudo -u user /home/user/bin/script.sh [[\:alpha\:]]*

それは正確に私が探していたものではありませんが、それは機能します(つまり、私の引数がアルファベット文字で始まる場合がありますが、実際には式が英数字、ダッシュ、ピリオドのみに一致するようにしたいと思います)。

私はシェルのワイルドカードとPOSIX文字クラスにまったく詳しくありません。私が使用するものは、基本的にsudoersのマニュアルからコピーして貼り付けたものです。これらがこの種の問題にどのように適用されるかを知っている人は、コメントを残してください!

5
Andrei

なぜsudo内でsuを実行しているのですか? (さらに悪いことに、Sudo内のSudo)

www-data ALL=(user) NOPASSWD: /bin/bash /home/user/bin/script.sh

これはうまくいくはずです。

3
mr_daemon

Apacheユーザーが指定したユーザーにSudoを実行してすべてのコマンドを実行できるようにするために、これとは異なるアプローチをとっています(または、1つまたはいくつかしか必要ない場合はリストを指定できます)。

APACHEUSER        ALL=(USERNAME)        ALL
Defaults:APACHEUSER       targetpw
Defaults:APACHEUSER             !requiretty

これにより、次のコードを使用してパスワードをコードから送信できます(データベースから読み取るなど)。

echo password | Sudo -u username -S bash -c command_here arguments_here

このために専用のユーザーを使用していることを確認し、そのユーザーをwheelグループに含めないでください。

参照 ここ

geer

1

スクリプトでなかった場合は、実行可能ファイルをsuidし、グループと権限を設定して、Webサーバーだけが実行できるようにすることができます。

suExec (Apacheのみ)または CGIWrap (任意のWebサーバー)を使用して、他のユーザーの下でCGIを実行することもできます。 suPHP も特にあり、Apacheの非CGIモードにはPHP向けです。

それらはわずかに異なるオプションを提供します(例えば、CGIwrapはリソース制限を設定することができます)が、一般に、それらは代替ユーザーとしてプログラムを実行します。

1
Joe H.