こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

visudo execコマンド sudo

失礼します
phpからexecを実行する際に、visudoを編集して指定のユーザーの場合execコマンドだけsudoを許可するように編集をしていきたいのですが、execコマンドがどこにあるのかがわかりません

サンプルを見てみると例えばshutdownコマンドをhogeユーザーに許可する場合は
hoge ALL=NOPASSWD: /sbin/shutdown
のように記載するとあったので
whereis shutdownで調べてみると確かにshutdownのパスが出てくれるのですが
execは上記のようにパスが出てきてくれません。
そもそもphpから呼び出しているのでlinuxコマンドとして考えるのは見当違いなのでしょうか?ご教授頂けると幸いです。
宜しくお願い致します。

投稿日時 - 2017-07-14 11:06:34

QNo.9351734

困ってます

質問者が選んだベストアンサー

つまりは、phpから
exec('sudo /usr/local/bin/php XXXXX.php XXX', ~);
(ユーザー名指定していないからroot権限で実行)
ができるようにしたい、ということですね。

この場合、visudoで権限許可するコマンドは、単純に考えると
/usr/local/bin/php になってしまいますが、
ただ、そんな設定をしてしまうと、引数で指定するどんなphpスクリプトでも、
root権限で実行できるようになってしまい、非常に危険です。

なので、こんなときは、まずXXXXX.php ファイルの先頭に
#!/usr/local/bin/php
と記載した上で、このファイルのパーミッションとして実行権限を与えて
XXXXX.phpというファイル自体が コマンドとして使えるようします。
つまり、exec('sudo /path/XXXXX.php XXX' ,~); というコマンドで実行できるようにします。

この状態にしてから、visudoで、/path/XXXX.phpに権限許可すればよいでしょう。

ただし、XXXXX.phpの内部でも 引数次第で何でも実行できるようにするのではなく、
引数(XXX)の内容 (ファイルのパスや内部で実行するコマンドなど)をしっかりチェックしてから処理するようにします。
また、このファイルが、修正できてしまわないように、
オーナーをrootにしてパーミッションも555にするなど、工夫する必要があります。

でないと、クラッカーにバックドアをまんまと提供してしまうことになりますので。
(ルーズに設置すると自分だけでなく、よそにも大きな迷惑をかけることになります)

投稿日時 - 2017-07-14 18:37:12

補足

ご返信ありがとうございます。
ここで打ち切った方がいいのか悩みましたが、内容が違う質問ですいません、exec('sudo /usr/local/bin/php XXXXX.php XXX', ~);
の内容が
exec('sudo -u YYY /usr/local/bin/php XXXXX.php XXX', ~);
のように指定ユーザーYYYでsudoを実行していきたいのですがこの場合
apacheユーザーでsudoをしているだけでYYYでしている事にならないのでしょうか?
今実験的にapache、YYY両者にsudoの権限は与えてありまが、期待通りの動きはしてくれないので上記の理由なのかなと思っているのですが、、、
ご教授宜しくお願い致します。

理想としてはYYYユーザーで
exec('sudo /usr/local/bin/php XXXXX.php XXX', ~);
を実行してくれるイメージです。

投稿日時 - 2017-07-18 14:21:16

お礼

解決しました。
ありがとうございます。

投稿日時 - 2017-07-18 17:23:12

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

> exec('sudo -u YYY /usr/local/bin/php XXXXX.php XXX', ~);
> のように指定ユーザーYYYでsudoを実行していきたいのですがこの場合
> apacheユーザーでsudoをしているだけでYYYでしている事にならないのでしょうか?

ちょっと質問内容が、いまいちわかりませんが、
PHPでexec()するとき
(1) exec('/usr/local/bin/php XXXXX.php XXX', ~);  →apacheユーザー権限のままで実行
(2) exec('sudo /usr/local/bin/php XXXXX.php XXX', ~); →rootユーザー権限で実行
(3) exec('sudo -u YYY /usr/local/bin/php XXXXX.php XXX', ~);→YYYユーザー権限で実行

です。

なお、
(1)は、sudoを使っていないので、当然 事前にvisudoで許可する作業は不要です
(2)は、apacheユーザーがrootユーザー権限で該当コマンドを実行できる許可がvisudoで必要です。
(3)は、apacheユーザーがYYYユーザー権限で該当コマンドを実行できる許可がvisudoで必要です。

投稿日時 - 2017-07-18 15:36:13

ANo.2

> exec($cmd,$output);の$cmdになるのでしょうか?
> ちなみに$cmdには'/usr/local/bin/php XXXXX.php XXXX'

execに使っている$cmdの中身として、
別のユーザー権限で実行するためのsudoコマンドがある訳ではないのですね。
それならば、そもそもvisudoを使って特権を許可する必要がありませんよ。

投稿日時 - 2017-07-14 17:32:10

補足

失礼しました。
今回は指定ユーザーの場合許可をしたいのですが毎回パスワードを打つのは
手間なので、$cmdには$cmdには'sudo /usr/local/bin/php XXXXX.php XXXX'になります、失礼しました。

そしてもしブラウザ、apacheユーザーから実行した場合はapacheユーザーに上記で記載したコマンドを出来るようにしたいです。

上手く説明できず申し訳ございません

投稿日時 - 2017-07-14 18:07:06

ANo.1

phpでexecを実行するのではなく
phpのexec()を使って、”何かの”コマンドを実行するのです。
なので、権限を与えるためにvisudoで記述する必要があるのであれば、
その"何かの”コマンドのほうです。

投稿日時 - 2017-07-14 12:05:45

補足

ご返信ありがとうございます。
例ですが、phpで記載した
exec($cmd,$output);の$cmdになるのでしょうか?
ちなみに$cmdには'/usr/local/bin/php XXXXX.php XXXX'
とPHP自体と動的に値が変わる引数を与えているのですが、その場合
はどのように考えていけばよろしいでしょうか?
宜しくお願い致します。

投稿日時 - 2017-07-14 13:14:23

あなたにオススメの質問