2016-04-06 5 views
2

私は、アクセス権の巨大な穴を開けたり、ファイルのユーザー所有権を変更したりすることによって、これを行う多くの疑問を見つけました。私の現在のアプリケーションでは、どちらもオプションではありません。私がやろうとしているのは、私のウェブページ上のボタンがクリックされたときに、shell_execまたは類似のPHP関数を使用して、システム上の全く別のフォルダに.shスクリプトを実行することです。 。このスクリプトは、それがであるフォルダから実行する必要があり、私は、debianの午前とapacheのユーザーがこれらの行追加してコマンドを実行できるようにsudoをインストールしている:所有していないフォルダのapacheユーザーからスクリプトを実行するには?

www-data ALL=(ALL) NOPASSWD:/opt/folder/run.sh start 
www-data ALL=(ALL) NOPASSWD:/opt/folder/run.sh stop 
www-data ALL=(ALL) NOPASSWD:/opt/folder/run.sh status 

run.shは私が何かではありませんallowdは編集できるので、可能であればapacheの終わりでこれを管理する必要があります。 run.shのパーミッションや所有権を変更することはできません。あなたは私のジレンマを見ることができます。私が使用しているPHPコールは次のようになります。

$test=shell_exec('cd /opt/folder/ && ./run.sh start&& cd -'); 

私は$ testを使ってコマンドの出力をエコーし​​ています。ここでそれは奇妙になる。コマンドからの出力が良好です。 run.shスクリプトは、他のプログラムのリストの開始と停止、およびその状態の表示に使用されます。私は./run.sh statusを実行し、$ test変数に良い結果を戻すことができます。私が./run.sh stopを試してみると、それはうまくいっていると言います(run.shスクリプトにはたくさんのチェックが組み込まれていないと確信していますが)。私は正常性チェックとしてps -ef | grepを実行し、停止されるはずだったすべてのプロセスを見ることができます。 ./run.sh startを実行しても同じですが、開始されたプログラムはありません。

だから、私が間違っていることを理解しようとしているだけです。私はPHPがbashスクリプトを実行していると確信していますが、何らかの理由で実際にスクリプト内の開始コマンドまたは停止コマンドを実行する能力がありません。 run.shをOSからrootとして完全に実行できます。私は本当にこのロープの端にありますので、どんな助けも非常に高く評価されています。これが不可能な場合は、別のプログラムのインストールが必要ない代替手段があります。

答えて

0

私はこれを後で保存することにしました。私は、Apacheのユーザーがrootとしてスクリプトを実行することを許可していましたが、私はそれを完全には伝えていませんでした。この問題を解決するために、私は変更

$test=shell_exec('cd /opt/folder/ && sudo ./run.sh start&& cd -'); 

追加sudoが今rootとして実行するスクリプトを告げると、visudoをのエントリは、それはパスワードを求めずにそうすることを可能にしました。私はvisoduファイルをもう少しスリムにするように変更しました。今は1行しかありません。

www-data ALL=(ALL) NOPASSWD:/opt/folder/run.sh

これは、セキュリティ要件とユーザーの両方の制約に適合します。 chmod 777などが原因で攻撃ベクトルがほとんど開いておらず、apacheユーザーは、それに含まれるハードコードされた直径を持つrun.shスクリプトにのみアクセスできます。

0

私は最近、PHPが実際のBashシェルを取得して(要求されればrootとして)、それが必要だと思っていないプロジェクトを公開しました。これはexec()とshell_exec()の制限を解決します。ここでそれを取得します:あなたがルートを必要といけないので、すべてのセキュリティ上の問題が実際に存在しない

$shell = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', false); 
$return1 = $shell->exeCmd('cd /opt/folder/'); 
$return2 = $shell->exeCmd('./run.sh start'); 
$return3 = $shell->exeCmd('cd -'); 
//the return will be a string containing the return of the command 
echo $return1; 
echo $return2; 
echo $return3; 

:あなたは、単に次のコードを使用しますダウンロードした後https://github.com/merlinthemagic/MTS

を。パッケージをインストールするときは、sudoの設定に関する部分をスキップしてください。

また、「実行してください。sh 'が完了するまでに時間がかかります。そのようなコマンドのタイムアウトを変更する必要があります:

//is one hour enough? 
$timeout = 3600000; 
$return2 = $shell->exeCmd('./run.sh start', null, $timeout);