FreeBSD7.0でJailの作成

※ 書きかけ。個人的なメモ。

最新のportsツリーをダウンロード/展開しておく。

$ cd
$ fetch ftp://ftp.freebsd.org/pub/FreeBSD/ports/ports/ports.tar.gz
$ cd /usr
$ sudo tar zxf ~/ports.tar.gz

ezjailのインストール

$ whereis ezjail
ezjail: /usr/ports/sysutils/ezjail

$ sudo make install
...
mkdir -p /usr/local/etc/ezjail/ /usr/local/man/man1/ /usr/local/man/man5/ /usr/local/etc/rc.d/ /usr/local/bin/ /usr/local/share/examples/ezjail
cp -p ezjail.conf.sample /usr/local/etc/
cp -R -p examples/example /usr/local/share/examples/ezjail/
cp -R -p examples/nullmailer-example /usr/local/share/examples/ezjail/
sed s:EZJAIL_PREFIX:/usr/local: ezjail.sh > /usr/local/etc/rc.d/ezjail.sh
sed s:EZJAIL_PREFIX:/usr/local: ezjail-admin > /usr/local/bin/ezjail-admin
sed s:EZJAIL_PREFIX:/usr/local: man1/ezjail-admin.1 > /usr/local/man/man1/ezjail-admin.1
sed s:EZJAIL_PREFIX:/usr/local: man5/ezjail.conf.5 > /usr/local/man/man5/ezjail.conf.5
sed s:EZJAIL_PREFIX:/usr/local: man5/ezjail.5 > /usr/local/man/man5/ezjail.5
chmod 755 /usr/local/etc/rc.d/ezjail.sh /usr/local/bin/ezjail-admin
chown -R root:wheel /usr/local/man/man1/ezjail-admin.1 /usr/local/man/man5/ezjail.conf.5 /usr/local/man/man5/ezjail.5 /usr/local/share/examples/ezjail/
chmod 0440 /usr/local/share/examples/ezjail/example/usr/local/etc/sudoers
===>   Compressing manual pages for ezjail-3.1
===>   Registering installation for ezjail-3.1
...

設定ファイルの編集
「man ezjail.conf」を見ると、ほとんどデフォルトでOKな気がする…。「ezjail_ftphost」は近いところを指定しておいたほうがよさそう。

設定ファイルの雛形をコピーして利用する
$ sudo cp  /usr/local/etc/ezjail.conf.sample /usr/local/etc/ezjail.conf

$ sudo vim /usr/local/etc/ezjail.conf
ezjail_jaildir=/usr/jails
ezjail_ftphost=ftp.jp.freebsd.org

basejailの作成1回目。失敗した。

$ sudo ezjail-admin install
Could not fetch base from ftp.jp.freebsd.org.
  Maybe your release (7.0-RELEASE) is specified incorrectly or the host ftp.jp.freebsd.org does not provide that release build.
  Use the -r option to specify an existing release or the -h option to specify an alternative ftp server.
Querying your ftp-server... The ftp server you specified (ftp.jp.freebsd.org) seems to provide the following builds:
total 24
lrwxrwxrwx   1 600   100    10 Aug 29  2007 4.11 moved to ftp-archive -> README.TXT
lrwxrwxrwx   1 600   100    10 Oct 26  2007 5.3 moved to ftp-archive -> README.TXT
lrwxrwxrwx   1 600   100    10 Aug 29  2007 5.4 moved to ftp-archive -> README.TXT
lrwxrwxrwx   1 600   100    10 Oct 26  2007 5.5 moved to ftp-archive -> README.TXT
lrwxrwxrwx   1 600   100    10 Aug 29  2007 6.0 moved to ftp-archive -> README.TXT
lrwxrwxrwx   1 600   100    10 Oct 23  2007 6.1 moved to ftp-archive -> README.TXT
lrwxr-xr-x   1 root  100    10 Sep 11  2008 6.2 moved to ftp-archive -> README.TXT
lrwxr-xr-x   1 root  100    10 Apr  4  2009 6.3 moved to ftp-archive -> README.TXT
lrwxr-xr-x   1 root  100    10 Apr  3  2010 6.4 moved to ftp-archive -> README.TXT
lrwxr-xr-x   1 root  100    10 Apr  4  2009 7.0 moved to ftp-archive -> README.TXT
lrwxr-xr-x   1 root  100    10 Oct  7  2009 7.1 moved to ftp-archive -> README.TXT
lrwxr-xr-x   1 root  100    10 Nov 12 01:44 7.2 moved to ftp-archive -> README.TXT
drwxr-xr-x  14 root  100   512 Mar 22  2010 7.3-RELEASE
drwxr-xr-x  14 root  100   512 Dec 25 03:45 7.4-RC1
lrwxr-xr-x   1 root  100    10 Nov 12 01:44 8.0 moved to ftp-archive -> README.TXT
drwxr-xr-x  13 root  100   512 Jul 19 21:42 8.1-RELEASE
drwxr-xr-x  13 root  100   512 Dec 25 03:46 8.2-RC1
drwxr-xr-x   8 300   300  1024 Dec  7 03:49 ISO-IMAGES
-rw-r--r--   1 600   100   637 Nov 24  2005 README.TXT
Ignore the next question, ezjail answers it for you.
Error: Package install script for base failed.

Jailホストのバージョンを7.0-RELEASEから7.3-RELEASEに上げてしまうことにする。
参考: FreeBSD 7.3-RELEASE Announcement

$ sudo freebsd-update upgrade -r 7.3-RELEASE
※ 結構時間が掛かるので気長に待つ…。

$ sudo freebsd-update install
Installing updates...
Kernel updates have been installed.  Please reboot and run
"/usr/sbin/freebsd-update install" again to finish installing updates.

$ shutdown -r now

$ freebsd-update install

$ shutdown -r now


basejailの作成2回目。成功した。

$ sudo ezjail-admin install

basejailをupdateする。同じリリース内でセキュリティパッチレベルを上げるために使用するコマンドのfreebsd-updateを利用する。

$ sudo mkdir /usr/jails/freebsd-update

$ sudo freebsd-update -b /usr/jails/basejail -d /usr/jails/freebsd-update fetch
$ sudo freebsd-update -b /usr/jails/basejail -d /usr/jails/freebsd-update install
Installing updates... done.

jail用のalias IPアドレスの付与

$ sudo ifconfig le0 alias 192.168.11.5 netmask 255.255.255.0

jailの作成

$ sudo ezjail-admin create trafficbuild.dip.jp 192.168.11.5
...
Warning: Some services already seem to be listening on all IP, (including 192.168.11.5)
  This may cause some confusion, here they are:
root     sshd       651   4  tcp4   *:22                  *:*
root     syslogd    541   7  udp4   *:514                 *:*

/etc/rc.confの編集

$ sudo vim /etc/rc.conf
# syslog関連
yslogd_flags="-b 192.168.11.4"
※ JailホストのIPアドレスを指定する。ここでは192.168.11.4# jailを自動起動
ezjail_enable="YES"

# jailのIPアドレスを起動時に割り当てる
ifconfig_le0_alias0="inet 192.168.11.5 netmask 255.255.255.0"

/etc/ssh/sshd_configの編集
詳しくは「man sshd_config」を参照。

$ sudo vim /etc/ssh/sshd_config
ListenAddress 192.168.11.4
※ JailホストのIPアドレスを指定する。ここでは192.168.11.4

再起動して設定を反映する

$ sudo shutdown -r now

IPアドレスの割り当て、jailの起動を確認

IPアドレスが設定されているか確認
$ ifconfig

jailの起動確認
$ jls 
   JID  IP Address      Hostname                      Path
     1  192.168.11.5    trafficbuild.dip.jp           /usr/jails/trafficbuild.dip.jp

手動でのjail起動/停止

$ sudo /usr/local/etc/rc.d/ezjail.sh forcestart trafficbuild.dip.jp
$ sudo /usr/local/etc/rc.d/ezjail.sh forcestop trafficbuild.dip.jp

jail内の環境整備

JIDを調べる
$ jls
   JID  IP Address      Hostname                      Path
     1  192.168.11.5    trafficbuild.dip.jp           /usr/jails/trafficbuild.dip.jp

jail内に入る (追記: 「sudo ezjail-admin console trafficbuild.dip.jp」がより正しかったかもしれない)
$ sudo jexec 1 /bin/sh

自分のアカウント追加
# vipw
※ jailホストのやつをコピーしてくれば楽(ログインシェルだけ/bin/shにしておく)

ホームディレクトリ作成
# mkdir -p /home/username
# chown -R username /home/username

sshdをjail起動時に起動させる設定を追加
# vi /etc/rc.conf
sshd_enable="YES"

jailを抜けて、jailホストをリスタート(jailをリスタートするだけでは何故かsshできなかった…)
$ sudo shutdown -r now

jailにsshできるか確認。jail以外のホストからsshログインを試みる。

hostsにjailのIPアドレスを設定
$ vi /etc/hosts
192.168.11.5 trafficbuild.dip.jp

$ ssh trafficbuild.dip.jp

とりあえずパスワードログインできるようになった。あとはauthorized_keysに公開鍵置いておく。

$ scp .ssh/id_rsa.pub  trafficbuild.dip.jp

$ ssh trafficbuild.dip.jp
$ mkdir .ssh
$ cat id_rsa.pub >> .ssh/authorized_keys


jail内でportsツリーをダウンロード

$ sudo ezjail-admin update -P

内部ではportsnapを利用している模様
初回(/usr/jails/basejail/usr/portsが存在しない場合)は以下が実行される
$ sudo portsnap fetch
$ sudo portsnap -p /usr/jails/basejail/usr/ports extract

次回(/usr/jails/basejail/usr/portsが存在する場合)は以下が実行される
$ sudo portsnap fetch
$ sudo portsnap -p /usr/jails/basejail/usr/ports update


jailホストのportツリーをjail内で共有する ← ezjailだとbasejail以下のportsツリーを使う考え方みたいなので、これは違う気がしてきた。。素直にbasejail/usr/portを使うことにする。そもそも、jail内の/usr/portsは/basejail/usr/portsを指すシムリンクとして作成されるので、やはりbasejail以下のports(portsに限らずか…)をマスタとして使用するという考え方らしい。

jailホストのportsツリーをjail内にマウントする
jail_host$ sudo mount_nullfs -o ro /usr/ports /usr/jails/trafficbuild.dip.jp/usr/ports

確認
jail_host$ df

マウントがうまくいっていたら、fstabにも追加しておく
jail_host$ sudo vim /etc/fstab
/usr/ports              /usr/local/jail1/usr/ports  nullfs ro,noauto    0   0


jail内のmake.conf編集
(書き込みが発生するディレクトリだけ、デフォルトの/usr/portsではないところにしておく)
jail# vi /etc/make.conf 
WRKDIRPREFIX=/var/tmp
DISTDIR=/var/tmp/usr/ports/distfiles
WITHOUT_IPV6="yes"

これでjail内でもportsが利用できるようになった。portsツリーはbasejailのだけメンテすればよいから楽。

TODO

jail内でportsを使えるようにする
Flavourの設定(次回以降のjail作成を楽にするための設定)