1853 suExecの設定

<<トップページへ

suExecの設定
日時: 2010/07/29 22:48
名前: kawasaki
suExecの設定について伺いたい事があるので質問させていただきます。
当方、CentOS5.5にて当サイトのWWWサーバ構築手順を踏み、各ユーザディレクトリにて、cgiやPHPのsuExec化を行ないたかったのですが、どうも上手く行きません。

# suexec -V の結果は、
-D AP_DOC_ROOT="/var/www"
-D AP_GID_MIN=100
-D AP_HTTPD_USER="apache"
-D AP_LOG_EXEC="/var/log/httpd/suexec.log"
-D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
-D AP_UID_MIN=500
-D AP_USERDIR_SUFFIX="public_html"

と、標準のままです。
そして、ユーザディレクトリの設定も当サイトの手順を踏み、
/home/ユーザ名/public_html
のような形で作成しました。

そして、suexecの結果を確かめるために、CGI(Perl)とPHPでwhoamiを使って実行ユーザ名を表示するプログラムをユーザディレクトリに置き、ブラウザから確認した所、

/~ユーザ名/test.cgi
でアクセスした場合は、実行ユーザ名がディレクトリの所有者となり、正しい表示なのですが、
/ユーザ名/test.cgi(チルダなし)でアクセスした場合や、/userdir/ユーザ名/test.cgi
でアクセスした場合は、ユーザ名が「Apache」と表示され、suexecが上手く機能しません。

又、PHPのプログラム(who.php)でアクセスした場合は、全てにおいて実行ユーザ名がApacheとなり、suexecが全く機能してくれません。

これではセキュリティが不安ですので、どなたかご教授いただければと思います。

プログラムは以下の通りです。

test.cgi
#!/usr/bin/perl


print "Content-type: text/plain", "\n\n";
print `whoami`;


who.php
<?php
echo exec('whoami');
?>

----------追記-----------

どうやら調べているうちに、PHPはCGIとして処理しないと実行ユーザ権限を変えれない事が分かりました。よって、PHPはsuPHPの導入や、PHPをCGIモードで処理させる事で解決できそうですが、
単純にユーザディレクトリにアクセス擦る際に、
チルダ無しや、/userdir/ユーザ名/test.cgi
でアクセスしたら実行ユーザがApacheになってしまう問題について、解決策はありませんでしょうか?



Re: suExecの設定(1)
日時: 2010/07/29 22:47
名前: ZED
ん?docroot=/homeにしてビルドしないとだめでしょ?

それか、今のままで行くなら、
/var/www/hoge/public_html
で作らんと…

Re: suExecの設定(2)
日時: 2010/07/29 22:51
名前: kawasaki
>ZED様

やはり/homeにしないと駄目ですか…
http://centossrv.com/bbshtml/webpatio/1509.shtml
このページを見ると、/homeにしなくてもいいような記載が有りましたので…。

でも実際今のままで、
チルダでアクセスした場合に、CGIの実行ユーザはディレクトリの所有者となっているということは、どういうことなのでしょうか?
suexecが働いてなければApacheと表示されると思うのですが…。

Re: suExecの設定(3)
日時: 2010/07/30 01:10
名前: ペングイン
URL: http://blog.trippyboy.com
>kawasaki様

恐れ入りますが設置されたCGIとPHPに関し、"/"からのフルパスで
お教えいただけますでしょうか。

また、アクセスした際のURLもhttpからお願いいたします。
(もちろんドメインは伏せていただいて結構です)

なお本サイトとは異なるWebサーバの設定があればお教えください。

Re: suExecの設定(4)
日時: 2010/07/30 01:32
名前: kawasaki
>ペングイン様

PHPに関しては、CGIモードで実行しないとsuexecでの対処ができないという事なので、とりあえずCGIに関してだけお助けをお願いしたいと思います…。

CGIを設置したのは、ユーザディレクトリ
/home/ユーザ名/public_html/
です。この直下にtest.cgiを入れて確認していました。

ブラウザからアクセスする際は、
http://hogehoge.jp/~ユーザ名/test.cgi

という具合でアクセスしています。
このように、ユーザ名の前にチルダを付ける一般的な方法では、test.cgiはそのディレクトリの所有者を表示してくれるので、おそらくsuExecが働いている物だと考えています。

ただし、本サイトの設定項目にありました、
http://hogehoge.jp/ユーザ名/
http://hogehoge.jp/UserDir/ユーザ名/

でアクセスするようにする記載
AliasMatch ^/centos(.*) /home/centos/public_html/$1
 ← centosユーザーのみhttp://centossrv.com/centos/のように~(チルダ)なしでアクセスできるようにする
AliasMatch ^/userdir/([^/]+)/(.*) /home/$1/public_html/$2
 ← 全てのユーザーでhttp://centossrv.com/userdir/ユーザー名/でアクセスできるようにする

ですが、これに関しては、チルダ以外で先程のtest.cgiにアクセスすると、ユーザ名は「Apache」となっています。
つまりsuExecが働いてないと考えました。

何かとんだ勘違いをしていたら申し訳ありません。
もちろん上記の設定のcentosの部分は自分の環境に合わせて変更しています。

今は、上記の設定をコメントアウトして、チルダを付けないとアクセス出来ないようにしています。

そして、もう一つ重要なことなのですが、
# suexec -V の結果は、
-D AP_DOC_ROOT="/var/www"
-D AP_GID_MIN=100
-D AP_HTTPD_USER="apache"
-D AP_LOG_EXEC="/var/log/httpd/suexec.log"
-D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
-D AP_UID_MIN=500
-D AP_USERDIR_SUFFIX="public_html"

と記載しました。
にも関わらず、肝心な/var/www 以下ではsuExecが機能していないようなのです。泣

具体的な検証方法としては、私の環境では/var/www/html に全てのindexファイル等を保存して公開していましたので、念のため/var/www/public_html というフォルダを、作成し、
# chown ユーザ名:ユーザ名 public_html
でpublic_htmlを完全に一般ユーザの所有フォルダとして、

httpd.confに、

ScriptAlias /public_html/ "/var/www/public_html/"

<Directory "/var/www/public_html">
Options Includes ExecCGI FollowSymLinks
Order allow,deny
Allow from all
</Directory>

の記載を加えて、ブラウザから
http://hogehoge.jp/public_html/test.cgi

でアクセスしたところ、やはりユーザ名は「Apache」と表示されてしまいました。

Re: suExecの設定(5)
日時: 2010/07/30 01:56
名前: ペングイン
URL: http://blog.trippyboy.com
kawasaki様

/var/www/html/test/test.cgi を置いたと仮定し
chown noapache:noapache /var/www/html/test/test.cgi とした場合、
/var/www/html/test/test.cgiは「Apache」で実行されます。

suexecは、httpd.conf等を用いて特定ディレクトリ(DocumentRoot)の所有ユーザ・グループを
指定した場合に有効になるものです。

現在/var/www/html/配下はUser/GroupともにApacheで動くようになっていると思います(ディフォルト)。
そのために、suexecは必要なく単純にApacheで起動しているのではないでしょうか。
これはAliasの設定でも同じことが言えます。

ファイルのパーミッションを750にして動きますか?
動かない場合には、実行しているのは希望の「noapache」ユーザではなく、apache
ですね。

こんな感じにするとsuexecでCGI実行できると思います。

<VirtualHost ***.***.***.***:80>
SSLEngine off
SuexecUserGroup username groupname
ServerName suexec.shitaino.com #ホスト
ServerAlias www.suexec.shitaino.com #www.ホストをする場合
ServerAdmin root@suexec.shitaino.com
DocumentRoot /var/www/suexec/
ScriptAlias /cgi-bin/ "/var/www/cgi-bin2/"
<Directory /var/www/cgi-bin2>
AllowOverride None
Options ExecCGI
Order allow,deny
Allow from all
</Directory>
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteOptions inherit
</IfModule>
CustomLog /www/logs/username/suexec.shitaino.com-access_log combined
ErrorLog /www/logs/username/suexec.shitaino.com-error_log
</VirtualHost>

Re: suExecの設定(6)
日時: 2010/07/30 01:59
名前: kawasaki
>ペングイン様

頭が混乱してまいりました…。

確かに、/var/www/public_html/test.cgi をパーミッション750にしてアクセスした場合、500エラーが帰ってきました。

つまり、/var/www 以下はApacheが実行するように設定されているのですよね。
間違っていたらゴメンなさい…。

ということは何らかの設定で、/var/www 以下の実行ユーザを変えなければ/var/www 以下においてはsuExecが働かないということでしょうか?無論設定方法は分からないのですが…。

ちなみに、ユーザディレクトリに配置してあるtest.cgiは、パーミッション750でも動いた事から、suExecが働いていると判断してよいのでしょうか。

Re: suExecの設定(7)
日時: 2010/07/30 02:12
名前: ペングイン
URL: http://blog.trippyboy.com
>kawasaki様

中途半端な説明をお許しください。

/var/www/html 配下はApacheで実行されます。

UserDir(/home/username/public_html)のアクセスはsuexecが有効になります。


># suexec -V の結果は、
>-D AP_DOC_ROOT="/var/www"
省略
>-D AP_USERDIR_SUFFIX="public_html"

suexecのオプションの説明は以下
--------------------------------
--with-suexec-userdir=DIR
suEXEC がアクセスを許されるユーザホームディレクトリ配下の サブディレクトリを指定します。 このディレクトリ以下の全実行ファイルは、"安全な"プログラムになるよう、 suEXEC がそのユーザとして実行できるようにします。 "単純な" UserDir ディレクティブを使っている場合 (すなわち "*" を含まないもの)、これと同じ値を設定すべきです。 Userdir ディレクティブがそのユーザのパスワードファイル内の ホームディレクトリと同じ場所を指していなければ、 suEXEC は適切に動作しません。デフォルトは "public_html" です。
各 UserDir が異なった仮想ホストを設定している場合、 それらを全て一つの親ディレクトリに含めて、 その親ディレクトリの名前をここで指定する必要があります。 このように指定されなければ "~userdir" cgi へのリクエストが動作しません。

よって少し遅く追記いたしましたhttpd.confの設定のように/var/www/配下に
ドキュメントルートを持つ場合、該当ユーザでのsuexecが有効になります。

これを/home/username/www/domain.com/などとされたい場合は、
suexecのバイナリ編集か、やり直しが必要と思われます。

suexecのオプションの記述が正しいか確認をするには、
httpd.confにてUserDirの公開フォルダ名を変更しsuexecが動くか動かないかお試しください。

たとえば・・・
<IfModule mod_userdir.c>
#UserDir public_html
UserDir publico2000
</IfModule>

CGI-
/home/username/publico2000/test.cgi

Re: suExecの設定(8)
日時: 2010/07/30 02:19
名前: kawasaki
>ペングイン様

私こそ理解が及ばずに申し訳ないです…。

中途半端な解釈ですが、多分、ドキュメントルートが/var/www/html にある環境では、Apacheで実行されてしまうということですね…。
それで、バーチャルホストでドキュメントルートを/var/www/ に持つユーザーからだとsuExecでの実行が可能になる…。

その方法で試してみたいと思います。
詳細な情報に感謝です。


それから、どうしても上手く行かない場合TOPページ編集専用のユーザを作っておいて、そのユーザのホームディレクトリをTOPページのドキュメントルートにしてもいいかもしれないですね。

Re: suExecの設定(9)
日時: 2010/07/30 02:23
名前: ペングイン
URL: http://blog.trippyboy.com
>kawasaki様

おっしゃるとおりです。

/var/www/htmlの公開をやめて(ApacheユーザでCGIが実行されること)、suexec
環境を利用されたいのであれば、ご利用のホスト名でVirtualHostを
/var/www/* をDocumentRootとして公開してください。

そうすればApacheユーザ以外のユーザでのコンテンツ編集が可能になります。

ご検討をお祈りします。

Re: suExecの設定(10)
日時: 2010/07/30 03:11
名前: kawasaki
>ペングイン様
>suexecのオプションの記述が正しいか確認をするには、
>httpd.confにてUserDirの公開フォルダ名を変更しsuexecが動くか動かないかお試しください。

当方で、public_htmlが変更された場合を試してみましたが、表示することはできませんでした。
これで正しい設定と考えてよいのでしょうか?

ちなみに、教えていただきましたバーチャルホスト設定を自分の環境に合わせて使ったところ、CGIが見事suExec環境で実行されました。
本当に感謝いたします。
suExecのログにも結果が表示されてましたので、無事に設定ができたんだと思います。

これでCGIは裁けたので後はPHPをどうにか裁かないといけませんね。
PHPをApacheで実行されるとセキュリティ的に問題ありですから。

ペングイン様に感謝です。

Re: suExecの設定(11)
日時: 2010/07/30 07:19
名前: stranger
URL: http://ja.528p.com/
Filesコンテナ で.phpをDeny from allに設定すれば?

使わないのであれば 全体に設定
userに使わせたくなければ userのディレクトリに設定

参考
http://httpd.apache.org/docs/2.0/ja/mod/core.html#files

Re: suExecの設定(12)
日時: 2010/07/30 20:39
名前: kawasaki
>stranger様

遅ればせながら、情報提供ありがとうございます。
PHPを禁止してしまうとそれはそれで問題が出てきますので…。
PHPをモジュールとしてApacheから実行するのではなく、CGIとして各ユーザ権限で実行するようにしたいと考えています。

※古いスレッドには返信できない場合があります


■関連コンテンツ




▲このページのトップへ戻る

ご自由にリンクしてください(連絡は不要です)
本ページへのご意見・ご要望、誤字・脱字・リンク切れ等のご連絡はこちらからお願いします