1509 suExecについて

<<トップページへ

suExecについて
日時: 2009/10/27 22:28
名前: noahcross
suExecがどうしてもapacheユーザで実行されてしまいます。

当サイトを参考にWEBサーバを構築させて頂いております。
参考にといっても、VirtualHostの設定をしていないこと以外は全く同じ設定をしておりますが、
サブディレクトリのURLでアクセスする形式になっております。

ただし、suExecの機能を/homeの配下で使用したく、下記のように設定しております。

suexec -V

-D AP_DOC_ROOT="/home"
-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/testuser/public_html に下記CGIを配置しました

#!/usr/bin/perl
ntent-type: text/plain\n\n";
print `whoami`;

suExecが動作し、実行できている場合、このcgiはブラウザに“testuser”と表示する
と認識しております。
なお、下記の事は確認しております。

・uid,gid いずれも500以上
・/etc/passwdに実際に存在するユーザ
・/etc/groupに実際に存在するグループ
・rootの権限は持っていない
・/home/testuser/ディレクトリを含めてすべて当該ユーザの所有(ls -l で確認>testuser:testuser)
・ディレクトリに他のユーザからの書き込みはできない。
・apacheを再起動した場合、エラーログには下記の通りの表示がでる。
 suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
・cgiのパーミッションは755

ここ一月くらい調べましたが、全く解決いたしません。
CGIの実行は可能ですが、ユーザ権限で動作いたしません。

当方、Linuxは初心者ですのでsuExecの考え方やLinuxの理解に根本的な思い違いが
あるかも知れませんが、どうかお力を貸して頂けると幸いです。


Re: suExecについて(1)
日時: 2009/10/28 05:37
名前: stranger
URL: http://ja.528p.com/
>上記設定で、/home/testuser/public_html に下記CGIを配置しました
>
>#!/usr/bin/perl
>ntent-type: text/plain\n\n";
>print `whoami`;

書き間違いとすれば訂正

#!/usr/bin/perl
print "Content-type: text/plain", "\n\n";
print `whoami`;

httpd.confの修正 [矢印以降は書かないこと]

<Directory "/home/*/public_html">
AllowOverride All ← .htaccessの許可
Options IncludesNoExec ExecCGI FollowSymLinks ← CGI,SSI(Exec命令以外)の許可
AddHandler cgi-script .cgi ← httpd.confの別の場所で設定してない場合ここで設定
<Limit GET POST OPTIONS>
Order allow,deny
Allow from all
</Limit>
<LimitExcept GET POST OPTIONS>
Order deny,allow
Deny from all
</LimitExcept>
</Directory>

/var/log/httpd/suexec.log"をみる
suexecでcgiの実行に成功しているならそのログが残ります

わたしの環境

/usr/local/apache2/bin/suexec -V

-D AP_DOC_ROOT="/home/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/hoge (hoge hoge 711)
/home/hoge/public_html (hoge hoge 711)
/home/hoge/public_html/whoami.cgi (hoge hoge 711)

Re: suExecについて(2)
日時: 2009/10/28 09:08
名前: ななしの権兵衛
手っ取り早い方法としては下記のホームページからRPMをDLしてインストールし直してみてはいかがでしょうか?

http://cmf.ohtanz.com/centos5.2.rpm.html

当方の環境ではここからDLしたものを使用して何の問題もなく動いております。

Re: suExecについて(3)
日時: 2009/10/28 11:31
名前: ZED
ななしの権兵衛さん

>http://cmf.ohtanz.com/centos5.2.rpm.html

お〜楽だね。postfixのsleep pach入りも出してくれてるんだ。。
taRgreyの時も楽ちんだね・・・

ここでも、ビルダーやったら面白いかも。。

Re: suExecについて(4)
日時: 2009/10/29 00:10
名前: noahcross
>>strangerさん

設定の方はstrangerさんと同じでしたが、なぜかログファイルがsuexec -Vで
表示された場所にありませんでした。

多分、普通に動作していないような気がします。
ななしの権兵衛さんのご紹介のものを使用して再インストールしてみようと
おもいます。

当方、suExecのドキュメントルートをデフォルトから変更するために、rpm
からの再インストールではなく、バイナリエディタを使用して強制的に変更
しております。
そのせいで動かないのかもしれません。

>>ななしの権兵衛さん
よいサイトのご紹介、ありがとうございます。
早速試して一通りはまってから結果をご報告させて頂きます。

>>ZEDさん
suExecだけでなく、suPHPもガッチャンコして、ホームディレクトリを/home
にしているやつがあるとさらにうれしい気がします。

Re: suExecについて(5)
日時: 2009/10/29 01:56
名前: noahcross
今回、ご紹介頂いたサイトからパッケージをダウンロードし、下記手順にて
インストールしました。
cgiのパーミッション711では下記に記載のエラーが表示され、755にすると実行
可能ですが、やはり“apache”と表示されます。
また、/var/log/httpd/suexec.logには何も書き込まれていません。
 やはり、当方の設定に原因があるとしか考えられませんが、どれだけ調べても
それがどこなのかわかりません。
OSのインストールもこのサイトを参考に同じ設定をさせて頂いております。

かなり見ずらいかも知れませんが、設定箇所等を下記に洗い出しました。
漏れや間違い等がありましたらご指摘頂くと幸いです。

※実際のユーザは'croknox'ですので、そのまま記載しました。

[インストール]

・パッケージ
http://cmf.ohtanz.com/download/centos5.2/httpd/2.2.11/httpd-2.2.11-1.el5_2.centos.1.src.rpm
・参考サイト
http://www.exacteye.com/wiki/index.cgi?page=Apache%2BsuExec%B9%BD%C3%DB%A5%E1%A5%E2#p3
・インストール
rpm -ihv --force --nodeps /usr/src/redhat/RPMS/i386/httpd-2.2.11-1.el5_2.centos.1.i386.rpm \
/usr/src/redhat/RPMS/i386/httpd-debuginfo-2.2.11-1.el5_2.centos.1.i386.rpm \
/usr/src/redhat/RPMS/i386/httpd-devel-2.2.11-1.el5_2.centos.1.i386.rpm \
/usr/src/redhat/RPMS/i386/httpd-manual-2.2.11-1.el5_2.centos.1.i386.rpm \
/usr/src/redhat/RPMS/i386/mod_ssl-2.2.11-1.el5_2.centos.1.i386.rpm

[httpd.conf設定]
※気になる部分と関連する部分を記載しました。

LoadModule suexec_module modules/mod_suexec.so

User apache
Group apache

DocumentRoot "/var/www/html"
<Directory "/var/www/html">
 Options Includes ExecCGI FollowSymLinks
 AllowOverride All
 Order allow,deny
 Allow from all
</Directory>

<IfModule mod_userdir.c>
#UserDir disable
UserDir public_html
AliasMatch ^/croknox(.*) /home/croknox/public_html/$1
</IfModule>

<Directory /home/*/public_html>
AllowOverride All
Options IncludesNoExec ExecCGI FollowSymLinks
<Limit GET POST OPTIONS>
Order allow,deny
Allow from all
</Limit>
<LimitExcept GET POST OPTIONS>
Order deny,allow
Deny from all
</LimitExcept>
</Directory>

AddHandler cgi-script .cgi .pl

↓気になる箇所(一部のサイトではコメント化していました)
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

<Directory "/var/www/cgi-bin">
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>

[パーミッション(ls -l)]
drwx--x--x 4 croknox croknox 4096 10月 24 18:40 croknox >> 711
-rwx--x--x 1 croknox croknox 76 10月 29 01:18 test.cgi >> 711
drwx--x--x 4 croknox croknox 4096 10月 29 01:18 public_html >> 711

[UID/GID]
croknox:x:505:505::/home/croknox:/bin/bash

[suexec -V]
-D AP_DOC_ROOT="/home"
-D AP_GID_MIN=500
-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"

[実行するCGI(test.cgi)]

#!/usr/local/bin/perl
print "Content-type: text/plain\n\n";
print `whoami`;

[表示される結果(メールアドレスは変更)]
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator, webmaster@aaaa.cccc.jp and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.

[Apacheのerror_log(restartしてからtest.cgiを表示するまで)]

 [Thu Oct 29 01:21:53 2009] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
 [Thu Oct 29 01:21:53 2009] [notice] Digest: generating secret for digest authentication ...
 [Thu Oct 29 01:21:53 2009] [notice] Digest: done
 [Thu Oct 29 01:21:53 2009] [notice] Apache/2.2.11 (Unix) DAV/2 mod_ssl/2.2.11 OpenSSL/0.9.8e-fips-rhel5 configured -- resuming normal operations
 [Thu Oct 29 01:22:52 2009] [error] [client 192.168.11.3] mod_mime_magic: can't read `/home/croknox/public_html/test.cgi'
 [Thu Oct 29 01:22:52 2009] [error] [client 192.168.11.3] Can't open perl script "/home/croknox/public_html/test.cgi": Permission denied
 [Thu Oct 29 01:22:52 2009] [error] [client 192.168.11.3] Premature end of script headers: test.cgi

Re: suExecについて(6)
日時: 2009/10/29 07:49
名前: stranger
URL: http://ja.528p.com/
↓気になる箇所(一時的にAliasMatchを止めてみる)

><IfModule mod_userdir.c>
>#UserDir disable
>UserDir public_html
>AliasMatch ^/croknox(.*) /home/croknox/public_html/$1
></IfModule>

↓気になる箇所(-D AP_DOC_ROOT="/home"の部分をオリジナルに戻してみる)

>[suexec -V]
> -D AP_DOC_ROOT="/home"

↓気になる箇所 #!/usr/bin/perlでないか

>#!/usr/local/bin/perl
>print "Content-type: text/plain\n\n";
>print `whoami`;

Re: suExecについて(7)
日時: 2009/10/29 22:31
名前: noahcross
>>strangerさん
ご指示頂いた全てについて検証してみましたが、変化ありませんでした。
AliasMatchのところは、httpd.confの部分をコメントアウトして、
# vi /etc/httpd/conf.d/croknox.conf でただのAliasにして実験
してみましたが、変化ありませんでした。

ApacheのsuExecに関するドキュメントを読んでいて気になったの
ですが、Apacheが所有者のユーザに化けるために、Apacheに
setuid setgidできる権限が無いとだめといった旨の記述があったと
思いますが、これはApacheの実行ユーザ、すなわちapacheに何か特別
な権限を与えないといけないのでしょうか?

また、現在検証しているサーバのHDD&パーティション構成は下記の
通りの構成でクリーンインストール(後からHDDを追加していない)
しているのですが、こういったものは関係するのでしょうか。

ディスクの構成↓

HDD1:/dev/sda = boot,swap,/
HDD2:/dev/sdb = /home
HDD3:/dev/sdc = /var

切り分けになるかはわかりませんが、VirtualBoxにCentOSをインストールして
同じディスク構成、手順にて検証環境を構築し、どうなるかを実験してみたい
と思います。
Virtual環境でも同じ現象が出るようでしたら、十中八九 私の設定ミスだと
断定できますので、少し時間が空きますが、その時またご報告させて頂きます。

Re: suExecについて(8)
日時: 2009/11/03 15:37
名前: noahcross
CentOS 5.3 を当サイトのインストール方法にてクリーンインストールし、
かつ初期設定+iptables.shも80番ポートを開放した状態にて上記でご紹介
頂いたパッケージを正常にインストールしました。
他の設定は何もしていません。
何のエラーも出ていません。

その上で検証してみたのですが、やはり結果に変化がありません。
フォルダのパーミッションは711,755,701,705と全て指定してみました
が、変化無く、test.cgiのパーミッションのみ、実行権限付(755,705,605等)
で実行可能ですが、Perlスクリプトの'whoami'実行結果はapacheとしか表示
されません。

2台のPCとVirtualBoxの環境でそれぞれ3回に渡り、実験してみましたが変化
ありません。
環境の設定は上記の通りですが、やはりsuexecのログは存在していません。
また、httpdのerror_logの結果も変わりません。

Linuxに慣れている方なら当たり前のように行っている作業が何か抜けている
のかも知れません。おそらくは設定ミスというよりは設定漏れではないかと
考えておりますが、何か情報はお持ちで無いでしょうか?

home以下でsuExecを有効にする場合、DocumentRootを/homeにしないといけない
等といったことはあるのでしょうか。

Re: suExecについて(9)
日時: 2009/11/03 16:22
名前: stranger
URL: http://ja.528p.com/
virtualホストではなく通常の設定の結果ですか

suexec -V の結果は?
user・groupが条件を満たしていますか

httpd -M の結果は?
suexecは組み込まれていますか

apacheのマニュアルでsuexecの説明がありますが
条件を満たしていますか

http://httpd.apache.org/docs/2.2/ja/suexec.html

Re: suExecについて(10)
日時: 2009/11/03 18:29
名前: noahcross
>>strangerさん

下記の通り確認致しました。
なお、運用環境ですが、VirtualHostは使用しておりません。
サブディレクトリの方法をとっております。
ex)http://sample.com/~アカウント名

httpd.conf
LoadModule suexec_module modules/mod_suexec.so

httpd -M
suexec_module (shared)

suexec -V
-D AP_DOC_ROOT="/home"
-D AP_GID_MIN=500
-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"

/etc/passwd
croknox:x:501:501::/home/croknox:/bin/bash

Apacheのドキュメントについて下記の事項がよくわかりません。

 wrapper が正常に対象となるユーザとグループになれるか?
  →なれていないことが現状の問題です

 wrapper が適切な数の引数で呼び出されたか?
  →確認方法がわかりません

 安全な動作を保証するための環境変数クリアが可能か?
  →確認方法がわかりません
 
 この正当なユーザは wrapper の実行を許可されているか?
 →httpd.confに記載されているapacheにwrapperを許可する設定が
  必要なのでしょうか?

他は特に問題ないと思います。 

Re: suExecについて(11)
日時: 2009/11/03 19:47
名前: stranger
URL: http://ja.528p.com/
>>>strangerさん
>
>下記の通り確認致しました。
>なお、運用環境ですが、VirtualHostは使用しておりません。
>サブディレクトリの方法をとっております。
>ex)http://sample.com/~アカウント名

>suexec -V
> -D AP_DOC_ROOT="/home"
> -D AP_GID_MIN=500
> -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"
 
suexecコマンドはオリジナルですか
改変している場合は、httpdのパッケージを入れ直してsuexecをオリジナルに戻す
それから、なるべくデフォルトの設定で、suexecを試す

centosのデフォルトは

/usr/sbin/suexec (root apache 4510)

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"

httpd.conf

User apache
Group apache

DocumentRoot "/var/www/html"

public_htmlにcgiをおいて試す

Re: suExecについて(12)
日時: 2009/11/04 11:41
名前: stranger
URL: http://ja.528p.com/
CentOSのhttpdパッケージ httpd-2.2.3-31.el5.centosで試しました

/usr/sbin/suexec (root apache 4510)

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"

httpd.confの変更部分

Listen 80
#Include conf.d/*.conf
ServerName xxx.528p.com:80

<IfModule mod_userdir.c>
# UserDir Disable
UserDir public_html
</IfModule>

<Directory /home/*/public_html>
AllowOverride FileInfo AuthConfig Limit
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec ExecCGI
AddHandler cgi-script .cgi
<Limit GET POST OPTIONS>
Order allow,deny
Allow from all
</Limit>
<LimitExcept GET POST OPTIONS>
Order deny,allow
Deny from all
</LimitExcept>
</Directory>

ディレクトリ構成
/home (root root 755)
/home/foo (foo foo 711)
/home/foo/public_html (foo foo 711)
/home/foo/public_html/whoami.cgi (foo foo 711)

whoami.cgi

#!/usr/bin/perl
print "Content-type: text/plain", "\n\n";
print `whoami`;

追伸
ここでDocumentRootを/home/wwwに変更してもうまくいきます

mkdir /home/www
chmod 711 /home/www
chown apache:apache /home/www

httpd.conf

#DocumentRoot "/var/www/html"
DocumentRoot "/home/www"

#<Directory "/var/www/html">
<Directory "/home/www">

httpdの再起動

Re: suExecについて(13)
日時: 2009/11/04 22:46
名前: noahcross
>>strangerさん

毎度アドバイスありがとうございます。
上記内容にて試して見ましたがやはり無理でした。

もちろんhttpdを再インストールし、バージョンもご紹介
頂いた内容です。

ただし、httpdはhomeディレクトリにアクセスするために
AliasMatchを追加しました。
パーミッションも全く同じにしてみたのですが、通常
のhtmlにはアクセス可能ですが、cgiファイルの場合、
Permission Denidedとエラーログに残り、表示できませんでした。

ただしcgiのパーミッションを755に変更すると、実行できますが
やはりapacheと表示されてしまいます。

なお、デフォルトでは/var/www以降がsuExecのディレクトリのはず
なので、/var/www/html配下にcgiを設置してみましたが、やはり
755でないと実効できず、結果もapacheとなります。
もちろんディレクトリとファイルの所有者は一般ユーザです。

パーミッションが711の場合httpdのerror_logには下記のログが記録
されています。

Can't open perl script "/var/www/html/test.cgi": Permission denied

なお、ファイルの所有者となる実際のユーザは下記「useradd ユーザ名」
で作成しており、特別な権限は一切付与しておりません。

あと、確認なのですが、strangerさんの場合、whoami.cgiの結果はブラウザ
上で’apache’ではなく'foo'と表示されるという認識でよろしいでしょうか。

以上、よろしくお願いいたします。

Re: suExecについて(14)
日時: 2009/11/05 10:07
名前: stranger
URL: http://ja.528p.com/
>ただし、httpdはhomeディレクトリにアクセスするために
>AliasMatchを追加しました。

私の示した条件は httpdをインストールした状態で
変更した部分だけです
最近のCentOSはDesktopの標準インストールでhttpdがインストールされるので
それで試しています
実際の運営はhttpd-2.2.14をソースからいれています

whoami.cgiを実行するだけなので
他のディレクトリにアクセスすればindex表示されます

>あと、確認なのですが、strangerさんの場合、whoami.cgiの結果はブラウザ
>上で’apache’ではなく'foo'と表示されるという認識でよろしいでしょうか。

fooと表示されます

Re: suExecについて(15)
日時: 2009/11/05 21:27
名前: noahcross
>>strangerさん

申し訳ございません。
少しついていくのが苦しくなってきました。

示して頂いた例だとCentOSのsuExec環境は、-D AP_DOC_ROOT="/var/www"
であったとしても、/home/*/public_htmlの配下でsuExecが動作する
という事でしょうか?

あと、httpdのDocumentRootが/var/www/htmlの状態でエイリアス無しで
/home配下にアクセスするのはどうすれば良いのでしょうか?

私もGNOMEのDesktop環境をインストールした環境で、httpdのIndexesを
有効にしてアクセスして見ましたが、http://でアクセスした場合、
suExecを実行できるとされるパーミッションでは権限が無く閲覧できず、
またfile:/でアクセスした場合、htmlは表示できますがcgiファイルは
もちろんApacheを経由していないので確認することができませんでした。

なにか私は決定的な事を理解していないような気がしてきましたが、
どうかご指示の程、よろしくお願いいたします。

Re: suExecについて(16)
日時: 2009/11/05 21:39
名前: stranger
URL: http://ja.528p.com/
>>>strangerさん
>
>申し訳ございません。
>少しついていくのが苦しくなってきました。
>
>示して頂いた例だとCentOSのsuExec環境は、-D AP_DOC_ROOT="/var/www"
>であったとしても、/home/*/public_htmlの配下でsuExecが動作する
>という事でしょうか?
-D AP_USERDIR_SUFFIX="public_html"だから
/home/user/public_htmlの配下で動作します
(userは登録されているユーザ)

>あと、httpdのDocumentRootが/var/www/htmlの状態でエイリアス無しで
>/home配下にアクセスするのはどうすれば良いのでしょうか?
UserDir public_htmlが有効なら
/home/user/public_htmlにアクセスできます
それ以外はaliasの設定が必要

http://example.com/~user/whoami.cgi
のようにアクセスすれば
/home/user/public_html/whoami.cgi
がuserと返す

Re: suExecについて(17)
日時: 2009/11/05 21:59
名前: noahcross
>>strangerさん(^_^)

ありがとうございます。解決しました。
AliasMatchが全ての原因だったようです。
普通にhttp://servername/~croknox/でアクセスするとちゃんとcroknox
と表示されました。

非常にはずかしながら、AliasMatch抜きの~userでアクセス
できる事を知りませんでした。
さんざん騒いでおいて本当に申し訳ありませんでした。お恥ずかしい。

本当にありがとうございました。

次はそういう事も念頭に置いてsuPHPに挑戦してみようと思います。


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


■関連コンテンツ




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

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