FreeBSD Jail はプロセス空間とディレクトリを指定した空間に閉じ込めるための基本システムです。Jail内で実行されたプログラムはJail空間から出ることができないためクラックされたとしてもホスト環境を攻撃される可能性を極力抑えることができる。
jailの管理を簡単に行うためのスクリプトです。jail環境内のベースシステムをnullfsを用いて共有するためディスク容量を節約できます。
sysutils/ezjailを使用する。パッケージをインストール後、ezjail-adminコマンドが使えるようになる。初回はezjail-admin install を実行し、ベースシステムのビルドを行う。
pkg install ezjail
# ベースシステムのビルドが始まります
# /usr/jails ディレクトリが作成される。
ezjail-admin install
jailには任意の名前とIPアドレスをひとつ振ることができる。ezjailを使って作成する場合は ezjal-admin コマンドを使う。
ezjail-admin create JAIL名 JAILのIPアドレス
/usr/local/etc/rc.d/ezjail スクリプトを使って制御できるので、service コマンドを使う。
# JAIL名を省略した場合はすべてのjailを起動する
service ezjail onestart JAIL名
# jlsで起動中のjailを確認できる
jls
# ---------------------------------
JID IP Address Hostname Path
1 JAILのIPアドレス JAIL名 /usr/jails/パス
# ---------------------------------
jexec コマンドを使う。jexecの後ろにjlsで確認した JID とjail内で起動したいプログラム名を指定する。この時シェルコマンドを指定すればjail内で生活できるようになる。
例えば、以下のようにjexecでシェルを起動し、jail内でpsコマンドを使うとホスト環境のプロセスが隠蔽されているのがわかる。
root@ホスト名# jexec 1 csh
# これでjail内で生活できる。
root@JAIL名# ps -auxw
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
root 20970 0.0 0.0 11396 2764 - SsJ 00:35 0:00.01 /usr/sbin/syslogd -s
root 21053 0.0 0.0 11264 2600 - IsJ 00:35 0:00.01 /usr/sbin/cron -s
root 21341 0.0 0.1 13092 3860 0 SJ 01:10 0:00.01 csh
root 21343 0.0 0.0 11684 2916 0 R+J 01:10 0:00.00 ps -auxw
root@JAIL名# exit
アーカイブを作成し、ついでにrsyncで別サーバーに転送する。
#!/bin/sh
SYNCTO=RSYNCUSER@RSYNCSERVER:RSYNCPATH
ARCDIR=/usr/jails/ezjail_archives
rm /usr/jails/*/var/cache/pkg/*.txz
for jailname in `ls /usr/local/etc/ezjail`
do
service ezjail stop ${jailname}
ezjail-admin archive ${jailname}
service ezjail start ${jailname}
done
find ${ARCDIR} -mtime +7 -name "*.tar.gz" | xargs rm
rsync -avz --delete ${ARCDIR}/ ${SYNCTO}