2011-12-21 7 views
3

cとcgiコードで、apache、bind、proftpdなどのlinuxサービスを再起動します。cでのlinuxサービスの再ロード

私は、たとえば、これを行うためのシステムを()を使用します

system ("service httpd reload"); 

も、私はコンパイルされたプログラムにSUID設定し、それを実行します。権限でエラーを返すことはできません。

どうすればよいですか?

編集: 私のApacheのログのエラー:名前の、proftpdのため

[Wed Dec 21 21:07:13 2011] [error] [client *] cannot remove `/var/run/httpd.pid' 
[Wed Dec 21 21:07:13 2011] [error] [client *] : Permission denied 
[Wed Dec 21 21:07:13 2011] [error] [client *] 
[Wed Dec 21 21:07:13 2011] [error] [client *] touch: 
[Wed Dec 21 21:07:13 2011] [error] [client *] cannot touch `/var/lock/subsys/httpd' 
[Wed Dec 21 21:07:13 2011] [error] [client *] : Permission denied 

と同じログなどここで

+1

システムコールが呼び出すシェルのパスに 'service'がありますか?もしそうでなければ、 "service:command not found"というメッセージが吐き出されます。絶対パスを試してください(例:代わりに '/ usr/sbin/service http reload'を実行してください。 –

+0

これは私の問題ではありません。私は、このサービスが削除または再定義するいくつかのPIDファイルに対してパーミッションエラーを出します。 –

答えて

1

をチェックする物事のカップルです:

  1. を確認してくださいコンパイルされたプログラムはsuid rootを持ちます(つまり、プログラムの所有者はrootです)。
  2. プログラムを実行しているパーティションが "noexec"オプションなしでマウントされていることを確認してください。
+1

3.コンパイルされたプログラムにバグがなく、実行に認証が必要であることも確認してください。 CGIを介して実行されている盗んだルートSUIDアプリケーションはかなりのセキュリティホールです。 –

+0

また、マウントされたファイルシステムに 'nosuid'オプションが設定されていないことを確認してください。 – Hasturkun

+0

1.チェックしても問題ありません。 2.どのようにチェックする必要がありますか? 3.コードのすべてのスニペットが正常に実行され、私はCGIのセキュリティを認識しています。 –

0

/usr/sbin/serviceコマンドを正常に実行するには、ルートにする必要があります。

あなたの質問はどのようにしてアプリケーションにroot権限を得ることができるのですか?

あなたのアプリケーションが(正式に)ルートアクセスを許可したくないCGIの場合、setuid rootであり、CGIからしか実行できないラッパープログラムをコードすることができます(少なくとも、それが実行されているuid)。

本当にCGIからこのようなことを実行してもよろしいですか? (あなたはwebminの仕組みを勉強することができます)。

+0

はい、絶対に! CGIを実行すると、実際のUIDが0になります。必要なラッパーについてもっと説明できますか? - また最後の質問については、管理のためにrootユーザーでlighttpdを実行し、7778ポートでリッスンし、users.but directadminがWebサーバーを1つだけ使用して同じものを使用するapache Webサーバーから分離する、kloxoで少し時間を過ごします。私のように。 - 一般に私はcでいくつかのapiを持っており、同じサーバーにないWebサーバーから要求します。特定のポート、e.xが必要です。 7777、および不明な場所からのすべてのリクエストをiptablesで制限しますが、webminもチェックします。 –

+0

* setuid *は説明と把握が難しいので、Unixプログラミングに関する良い本を読んでください。例:http://basepath.com/aup/ –

関連する問題