www.msmrrenda.net リプレース計画day2
いままではごちゃまぜに置いていた非公開ページを別ホストに分離しようとしてはまった件。
通常、公開用ページは ~/public_html に置きますが、ホームは全ホスト共有です。
したがって、非公開ページを ~/private_html に分離しました。
ところが、なにやってもcgiが呼び出せません。
Mar 4 22:22:24 ainya suexec[1158]: command not in docroot (/home/renda/private_html/env.cgi)
で、suexec -V とかしてみるとこんなことが書いてあります。
-D AP_DOC_ROOT="/var/www"
-D AP_GID_MIN=100
-D AP_HTTPD_USER="apache"
-D AP_LOG_SYSLOG
-D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
-D AP_UID_MIN=500
-D AP_USERDIR_SUFFIX="public_html"
public_htmlでしか動かないんかーい。
安全上このディレクトリ設定はハードコードされており変更できないようです。
選択肢は二つ。apache全体のリビルドか、バイナリ弄ってGORIOSHI。
ま、手間的に後者かな!!!!
public_htmlよりもprivate_htmlの方が1文字長いので、この際private_htmになっていただきました。が、なぜか動かない。
Mar 4 22:50:08 ainya suexec[1375]: uid: (500/renda) gid: (500/renda) cmd: env.cgi
Mar 4 22:50:08 ainya suexec[1375]: failed to setgid (500: env.cgi)
あれ?suidかsgidでもついてたかなん?と思い、他ホストと見比べます。
パーミッションは変わらないけどなんか赤い。これはいったい・・・。最悪apacheのリビルドも覚悟し、srpmの中身を覗いてみたら・・・
%caps(cap_setuid,cap_setgid+pe) %attr(510,root,%{suexec_caller}) %{_sbindir}/suexec
そっかー。
# setcap 'cap_setgid,cap_setuid+ep' /sbin/suexec
したら動きましたとさ。善い子の皆さんは横着せずにapacheをrpmbuildしましょう・・・
Fedora18のApache2.4の罠
Fedora17までApache2.2がデフォルトだったのですが、Fedora18からApache2.4がデフォルトとなりました。
その影響でACL周りが大幅に変更され、以前の設定が機能しなくなります。
場合によってはアップグレードの結果全てのACL設定が無効になって公開されてしまう可能性があるので注意。
(具体的には/var/www/htmlの下や~/public_htmlあたりはデフォルトがAllowなので.htaccessに書いてあったACLが無効になってしまう可能性有。)
さて、今まで当然のように使っていた
Order allow,deny
allow from 192.0.2.0/24
deny from all
ですが、一応mod_access_compatで提供されるもののApache2.4では使用が推奨されません。
Fedora18のApacheではデフォルトでは使用できないようです。デフォルトがDenyのところをDirectoryでAllowしても
[authz_core:error] [pid 25916] [client 192.0.2.100:50340] AH01630: client denied by server configuration:
となりました。
新しいmod_authz系だけではこの記述を無視するようです。
ホワイトリストの新しい書き方は
Require ip 192.0.2.0/24
のようです。
逆に、ブラックリストは
<RequireAll>
Require not ip 192.0.2.100
Require all granted
</RequireAll>
とします。ちょっと掴みづらい。
ipではなくhostとするとドメイン名を指定できます。「host」なのにドメイン。ipは単純なIPv4/v6アドレスの他、prefix表記のサブネット、mask表記のサブネットも受け付ける模様。
RequireAllとRequireAny、RequireNoneを組み合わせて複雑な指定が可能になった上、
意味のない指定(RequireAnyの中でall grantedとnot ipを同時に記述するなど)をすると500を吐いてアクセスできなくなります。安全側に倒しているということでしょう。
公式の移行ガイドはこちら。
mod_authz_coreのマニュアルとmod_authz_hostのマニュアルも参照。