Apacheの環境をjailに移行する

Apacheの環境をmod_security2を利用してjail環境へ移行してみました。jail環境とはchrootでルートディレクトリを別のところへ変更した環境。シェルも/etc/passwdも無いので万が一バックドアを仕掛けられても限定的な被害ですみます。
mod_securityはインストール済というのが前提。

chroot先を作成

適当なところへ作成します。今回は/chroot/apacheというところをchrootにします。

# mkdir /chroot/apache

環境をコピー

既存環境の$APACHEROOTからリンクを作成。

# mkdir -p /chroot/apache/usr/local
# cd /chroot/apache/usr/local
# ln -s /usr/local/apache2 ./apache2

httpd.confにSecChrootDirをいれる

以下のディレクティブをいれます。

<IfModule mod_security2.c>
    SecChrootDir        /chroot/apache
</IfModule>

とりあえず動かしてみる

これで環境整ったはず。とりあえず動作させてみる。

# /usr/local/apache2/bin/apachctl start

む、Listenしない。errorlogを参照するとこんなエラーがでています。

[Fri Sep 13 13:34:34.000446 2013] [core:error] [pid 9767:tid 139892587153152] (40)Too many levels of symbolic links: AH00099: could not create /usr/local/apache2/logs/httpd.pid
[Fri Sep 13 13:34:34.000497 2013] [core:error] [pid 9767:tid 139892587153152] AH00100: httpd: could not log pid to file /usr/local/apache2/logs/httpd.pid

pidファイルが作成できないっていっています。リンクが循環しているときによくみるエラーだな。なんかよくわからん。オライリーApacheセキュリティにこんな記述があるのを発見。

Apache2.Xでは最後のモジュールが初期化された後も初期化作業が続く。このため、ログディレクトリが外側にあるようなジャイル環境を構築する際に、これが問題となる可能性がある。解決策は、ジャイル内部に別のログディレクトリを作成することである。このディレクトリはApache2.Xに必要なファイル(pidファイルなど)の格納場所として使用される。一時ファイルを作成するモジュールの多くは、それらのファイルへのパスを変更するためのディレクティブを備えているため、それらのディレクティブを使って一時ファイルをどこか別の(ただしジャイル環境内の)場所に作成することができる。

ふむ。logs以下が初期化途中でよくわからん状況になってるんだな。logsだけはリンクを外すことにする。

# cd /chroot/apache/usr/local
# rm apache2
# mkdir apache2
# cd apache2
# ln -s /usr/local/apache2/* .
# rm logs
# mkdir logs

リトライ

これでいいはずってことでまた動作させてみる。いやぁ、親は動作するけど子がforkできないみたい。errorlogをみるとこんなエラー。

[Fri Sep 13 11:55:17.014904 2013] [core:notice] [pid 15723:tid 139746959931136] AH00052: child pid 16070 exit signal Aborted (6)
libgcc_s.so.1 must be installed for pthread_cancel to work

libgcc_s.so.1が見えないみたい。見たことがあるエラーだなぁ。
RHEL6の64bit環境なので件のライブラリは/lib64にあります。
これをchroot以下で参照できるようにリンクを作成。

# ln -s /lib64 /chroot/apache

これで再起動。ダメ。
なんでだ。
こんな情報を発見。

http://unicus.jp/jir/archives/229

このとおりにhttpd.confへ以下を追加。

LoadFile  /lib64/libgcc_s.so.1

おっと、これで動作しました。
実際の環境ではCGIを動作させるためのperlだとかphpのライブラリとかが必要なので一筋縄では行かなかったりする。