httpd-2.4のFOREGROUND解除

Apache httpdの2.4系は,-DFOREGROUND で起動するとしばらく通信した後だんまりになってしまう。なんでじゃ。 daemontools制御したいのに。

とりあえず,普通のapache経由でバックグラウンド起動すれば 固まらないようだ。しゃーない,svc管理から外そう。

ただ,これまでの起動ではセキュリティ確保のために

していた。apachectlではそういう気の利いたことはしてくれない。 え,httpd.conf の User, Group だだめかって? これもポートを bind() するまでの間,rootで動くのでプロセスにroot権限のものがどうしても1個残る。 ここに穴があったらどうすんの?

てことで,起動するときから一般ユーザで行なう。そのために, apachectlを以下のように書き換え。

####HTTPD='/usr/local/httpd/bin/httpd'
HTTPD='chroot /r setuidgid www /usr/local/httpd/bin/httpd'

setuidgidはchroot環境内にインストールした daemontools コマンド。chrootするためにはどうしてもroot権限が必要なので, 最初にchrootした上で,setuidさせる。そうすると,特権ポートを 掴めないので必然的に10080番とか非特権ポートを使わざるを得ない。 てなときは,PFでポートのリダイレクトをする。

rdr proto tcp from any to $me port 80 -> $me port 10080

誰でもサーバを建てられる時代に特権ポートって意味あんのかなーとは思うが, 全て非特権ポートで動く完全一般ユーザプロセスに誘導すれば ネットワークサービスでrootを取られることはなくなる。

関連

2003年12月13日の記事 も参照。