- ベストアンサー
webからroot権限のコマンドを実行したい
はじめまして。 プロキシサーバの閲覧許可サイトを変更するCGIを作っています。 許可サイトのリストを更新して、 my $res=system("/etc/rc.d/init.d/squid restart"); または、sudoersの設定も可能なので、 my $res=system("sudo /etc/rc.d/init.d/squid restart"); を実行したいのですが、方法が分かりません。 どなたか、実行方法を教えてください。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
具体的に対処する部分だけを抜き出すと エラーメッセージ: Insecure $ENV{PATH} while running setuid at perl_script.cgi line 43. こんなエラーが出たときには、↓これを書きます。 $ENV{PATH} = '/bin:/usr/bin'; エラーメッセージ: Insecure dependency in `` while running with -T switch at perl_script.cgi line 53. それでもこんなエラーが出たときには、例えばsystemの中で実行しているコマンドを system "/bin/rm"," -f ", $file; こんな風に分けて書いたら実行できました。 参考URLには別の方法(正規表現で値をチェック)が書いてあります。私がやった方法はごまかしになるので、参考URLの方法の方がよさそうです。 私は実際こんな方法でやったのですが、「PerlのTaintモード」のことについてはよく理解しているわけではないので解説はできません。 それとapacheのsuExecの方は試したことがないので説明できませんが、こちらの方がたぶん検索していろいろ解説をみつけられると思います。もちろん、apacheを使っていないのでしたらだめですが。 それとこれは、suidperlを使って上記のようなエラーがでた場合の対処法で、すんなり実行できるのでしたらする必要はありません。
その他の回答 (1)
- whitia
- ベストアンサー率100% (1/1)
suidperl、sperlを使うか、 apacheのsuExecを使うか等の方法があると思います。 方法についての参考) http://www.tohoho-web.com/lng/r200006/00060081.htm suidperlを使う場合は、CGIスクリプトファイルのパーミッションを4755にします。 chmod 4755 perl_script.cgi suidperlはスクリプトをファイルオーナーのUIDで実行するので、root権限で動かしたい場合はそのファイルのオーナーをrootにします。 またsystem関数を使う場合などはセキュリティの問題でエラーがでると思うので、以下のURLを参考にしてみてください。 http://www.ipa.go.jp/security/awareness/vendor/programming/a04_03_main.html http://www.kt.rim.or.jp/~kbk/perl5.005/perlsec.html
お礼
ありがとうございます、whitiaさん。 suidperl、sperl、suExecなどで試してみます。 先ほどから参考URLを見ていますが、いまひとつ理解しきれていませんが、がんばってみます。
お礼
今回は解決のタイムリミットの時間があったため(他の問題に比べて)、後回しになって、結果報告が遅くなってすみませんでした。 今回は結果的にはsuidperlを使いませんでしたが、色々勉強になりました。 >system "/bin/rm"," -f ", $file; >こんな風に分けて書いたら実行できました。 これは参考になりました。 whitiaさん、ありがとうございました。 これからも何かあったらよろしくお願いします。
補足
返事が遅くなってすみません。 問題続発で、期限が今月中のこの問題が後回しになってしまいました。 最終的には解決が必要な事なので、時々作業してはいました。 結論から言うと、sudoersを変更する事で、当初の問題は解決しました。 結果的には、今回はsuidperlを使いませんでしたが、whitiaさんのアドバイスで出来た所までの事を報告します。 まず、参考URLなどを参考に、suidperlをインストールしました。 yum install perl-suidperl ----who.cgi(ここから)------ #!/usr/bin/perl print "Content-type: text/html\n\n"; printf "I am %s.<br>\n",(getpwuid($>))[0]; ----who.cgi(ここまで)------ [実行結果] chmod 755 who.cgi の場合 I am apache. chmod 4755 who.cgi の場合 I am [ユーザ名]. chmod 4755 who.cgi chown root who.cgi の場合 I am root. この結果から、rootの権限が取得できたと考え、ほぼ成功を確信しました。 それで、下のようなプログラムを作りました。 ----test.cgi(ここから)------ #!/usr/bin/perl print "Content-type: text/html\n\n"; printf "I am %s.<br>\n",(getpwuid($>))[0]; print "restart proxy..."; $res=system("/etc/rc.d/init.d/squid","restart"); if($res==0){ print "ok<br>\n"; }else{ print "ng<br>\n"; } ----test.cgi(ここまで)------ [実行結果] I am root. restart proxy... 表示すべき文字(エラーの場合のng)を表示せずに、アドバイスにあったエラー表示もないし、なすすべない状態でした。 で、色々試している時に、ふとユーザーでログインして試してみました。 [実行結果] I am root.<br> Insecure $ENV{PATH} while running setuid at ./test.cgi line 6. restart proxy... この時、whitiaさんの回答にあったメッセージが出たので、これで解決かと思って、 $ENV{PATH} = '/bin:/usr/bin'; を追加。 [実行結果] Content-type: text/html I am root.<br> restart proxy...sed: /etc/squid/squid.confを読み込めません: 許可がありません squid を停止中: /etc/rc.d/init.d/squid: line 84: /var/log/squid/squid.out: 許可がありません [失敗] init_cache_dir /var/spool/squid... /etc/rc.d/init.d/squid: line 57: /var/log/squid/squid.out: 許可がありません squid を起動中: /etc/rc.d/init.d/squid: line 61: /var/log/squid/squid.out: 許可がありません [失敗] ng<br> そこで、 chmod 666 /etc/squid/squid.conf chmod 777 /var/log/squid [実行結果] I am root.<br> restart proxy...squid を停止中: 2006/06/19 09:02:28| ALERT: setgid: (1) Operation not permitted squid: ERROR: Could not send signal 15 to process 4393: (1) Operation not permitted rm: cannot remove `/var/lock/subsys/squid': 許可がありません ...........................................ng<br> .(ドット)が出続けたので、途中で止めたら、ng<br>を表示。 ここまでくると、あまりシステムのパーミッションを書き換えるのもどうかと思ってしまいました。 以上が出来た事と、出来なかった事をまとめた物です。 実際は試行錯誤しながら途切れ途切れにわかった事です。 whitiaさんにはお世話になりました、ありがとうございました。