アプリ版:「スタンプのみでお礼する」機能のリリースについて

PHPからLinux(Fedora10)にアクセスしようとしています。

[PHP]
system("sudo su user1");
system("whoami");

[Browser]
apache

出力結果としましては、「user1」を期待しているのですが、「apache」のまま変更されません。
ちなみに、sudoの設定でエラーは出ていないようです。

どのようにすれば、ブラウザのユーザ(apache)を変更することができるでしょうか?

A 回答 (3件)

system関数で子プロセスでsudoしても、sudoで権限が変わるのはsudoが実行した子プロセスだけです。



system("sudo su user1")した場合、
1. PHP が sudo を起動する
2. sudo がroot権限で su user1 を起動する
3. su は権限をuser1に変えるが、suに他の引数がなく、入力も無いため、何もせずに終了。
という流れになります。呼び出し元のPHP実行環境側はユーザー権限は変わってません。

system関数を呼び出すたびに、毎回子プロセスが起動されますから、
次にsystem("whoami")しても、元の権限で実行されます。

sudoで「権限を変えてから何かのコマンドを実行する」場合は、

system("sudo -u user1 whoami");

といった形で、sudoに実行すべきコマンドを指定する必要があります。

あるいは、sudo で su は使えるが whoami を使えるようにしていないのなら、

system("sudo su user1 -c whoami");

という方法もあります。

ですが、sudo 経由で su を起動するのは回りくどいですし、一旦 root を経由するのはセキュリティ的にも非常に危険です。
sudo の設定で、ユーザー apache は user1 にはなれるが、rootにはなれないように設定してから、sudo から直接user1権限でコマンドを実行すべきです。
    • good
    • 0
この回答へのお礼

コメントどうもありがとうございます。

system("whoami")の出力結果はapacheです。
現在の環境では、whoamiにsudoをする必要はなさそうです。

ちなみに、
system("sudo -u user1 whoami")はエラーを生じますが、
system("sudo su user1 -c whoami")の出力結果はuser1です。

しかしながら、実際的にはユーザは変更されていないようです。
それはその直後にメールを発信してみたのですが、
発信元はapache@mydomain.domとなり、user1@mydomain.domとはなりませんでした。
(mydomain.domは所有ドメイン)

表面的ではなく、実効的にユーザを変更したい、というのが主旨なのです。

お礼日時:2010/04/23 14:20

> 表面的ではなく、実効的にユーザを変更したい、というのが主旨なのです。



それは根本的に考え方が間違えてます。

system 関数は、「子プロセスを作る」関数ですから、子プロセス側で実効ユーザーを変えるようなコマンドを実行したところで、呼び出し元であるPHP実行環境側のユーザーIDは変わりません。

セキュリティ的に、PHPの実行環境側の実効ユーザーIDを変更するような機能は提供されていません。そういうことは不可能です。


> system("sudo su user1 -c whoami")の出力結果はuser1です。
> しかしながら、実際的にはユーザは変更されていないようです。

これは当然の結果です。あくまで「whoamiコマンドをuser1権限で実行した」だけですから。

質問の「PHPからLinux(Fedora10)にアクセス」という意味の問題になりますが、
質問者さんが「Linux にアクセス」というのが、「権限を変えてコマンドを実行したい」のだったら、
実行したいコマンドごとにsudoを実行してください。

繰り返しになりますが、PHPの実行環境側の実効ユーザーIDを変更することは不可能です。



> 発信元はapache@mydomain.domとなり、user1@mydomain.domとはなりませんでした。

単にメールの発信元を変えたいだけでしたら、実効ユーザを変えてからメール送信なんてしなくても、
正しいヘッダを設定して送信するだけで可能です。

メール送信に mail 関数か、mb_send_mail 関数を使ってるのであれば、第4引数に追加ヘッダを指定できますから、
mb_send_mail($to, $subject, $message, "From: user1@mydomain.dom", "-fuser1@mydomain.dom");
とすれば、送信者を変えてメール送信できます。
    • good
    • 0
この回答へのお礼

度々ご回答いただきありがとうございました。

mtaka2さんが仰るsudoの概念が少しだけでも分かったような気がします。
試行錯誤だけでは到底分かり得ない問題で、貴重なご説明を賜ることができて、
とても嬉しいです。

お礼日時:2010/04/23 16:06

なんか書き込みに失敗?したみたいなので再挑戦。


返答がダブってしまったらごめんなさい。

> 表面的ではなく、実効的にユーザを変更したい、というのが主旨なのです。

それは根本的に考え方が間違えてます。

system 関数は、「子プロセスを作る」関数ですから、子プロセス側で実効ユーザーを変えるようなコマンドを実行したところで、呼び出し元であるPHP実行環境側のユーザーIDは変わりません。

セキュリティ的に、PHPの実行環境側の実効ユーザーIDを変更するような機能は提供されていません。そういうことは不可能です。


> system("sudo su user1 -c whoami")の出力結果はuser1です。
> しかしながら、実際的にはユーザは変更されていないようです。

これは当然の結果です。あくまで「whoamiコマンドをuser1権限で実行した」だけですから。

質問の「PHPからLinux(Fedora10)にアクセス」という意味の問題になりますが、
質問者さんが「Linux にアクセス」というのが、「権限を変えてコマンドを実行したい」のだったら、
実行したいコマンドごとにsudoを実行してください。

繰り返しになりますが、PHPの実行環境側の実効ユーザーIDを変更することは不可能です。



> 発信元はapache@mydomain.domとなり、user1@mydomain.domとはなりませんでした。

単にメールの発信元を変えたいだけでしたら、実効ユーザを変えてからメール送信なんてしなくても、
正しいヘッダを設定して送信するだけで可能です。

メール送信に mail 関数か、mb_send_mail 関数を使ってるのであれば、第4引数に追加ヘッダを指定できますから、
mb_send_mail($to, $subject, $message, "From: user1@mydomain.dom", "-fuser1@mydomain.dom");
とすれば、送信者を変えてメール送信できます。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!