- ベストアンサー
PHPからLinux(Fedora10)にアクセスしようとしています。
PHPからLinux(Fedora10)にアクセスしようとしています。 [PHP] system("sudo su user1"); system("whoami"); [Browser] apache 出力結果としましては、「user1」を期待しているのですが、「apache」のまま変更されません。 ちなみに、sudoの設定でエラーは出ていないようです。 どのようにすれば、ブラウザのユーザ(apache)を変更することができるでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> 表面的ではなく、実効的にユーザを変更したい、というのが主旨なのです。 それは根本的に考え方が間違えてます。 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"); とすれば、送信者を変えてメール送信できます。
その他の回答 (2)
- mtaka2
- ベストアンサー率73% (867/1179)
なんか書き込みに失敗?したみたいなので再挑戦。 返答がダブってしまったらごめんなさい。 > 表面的ではなく、実効的にユーザを変更したい、というのが主旨なのです。 それは根本的に考え方が間違えてます。 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"); とすれば、送信者を変えてメール送信できます。
- mtaka2
- ベストアンサー率73% (867/1179)
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権限でコマンドを実行すべきです。
お礼
コメントどうもありがとうございます。 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は所有ドメイン) 表面的ではなく、実効的にユーザを変更したい、というのが主旨なのです。
お礼
度々ご回答いただきありがとうございました。 mtaka2さんが仰るsudoの概念が少しだけでも分かったような気がします。 試行錯誤だけでは到底分かり得ない問題で、貴重なご説明を賜ることができて、 とても嬉しいです。